fetchCol(); foreach ($result as $var) { variable_del($var); } } /** * Implementation of hook_schema(). */ function location_schema() { $schema['location'] = array( 'description' => 'Locational data managed by location.module.', 'fields' => array( 'lid' => array( 'description' => 'Primary Key: Unique location ID.', 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, ), 'name' => array( 'description' => 'Place Name.', 'type' => 'varchar', 'length' => 255, 'default' => '', 'not null' => TRUE, ), 'street' => array( 'description' => 'Street address, line 1.', 'type' => 'varchar', 'length' => 255, 'default' => '', 'not null' => TRUE, ), 'additional' => array( 'description' => 'Street address, line 2.', 'type' => 'varchar', 'length' => 255, 'default' => '', 'not null' => TRUE, ), 'city' => array( 'description' => 'City.', 'type' => 'varchar', 'length' => 255, 'default' => '', 'not null' => TRUE, ), 'province' => array( 'description' => 'State / Province code.', 'type' => 'varchar', 'length' => 16, 'default' => '', 'not null' => TRUE, ), 'postal_code' => array( 'description' => 'Postal / ZIP code.', 'type' => 'varchar', 'length' => 16, 'default' => '', 'not null' => TRUE, ), 'country' => array( 'description' => 'Two letter ISO country code.', 'type' => 'char', 'length' => 2, 'not null' => TRUE, 'default' => '', ), 'latitude' => array( 'description' => 'Location latitude (decimal degrees).', 'type' => 'numeric', 'precision' => 10, 'scale' => 6, // @@@ Shouldn't these all be 7? 'not null' => TRUE, 'default' => 0.0, ), 'longitude' => array( 'description' => 'Location longitude (decimal degrees).', 'type' => 'numeric', 'precision' => 10, 'scale' => 6, 'not null' => TRUE, 'default' => 0.0, ), 'source' => array( 'description' => 'Source of the latitude and longitude data (Geocoder, user entered, invalid, etc.)', 'type' => 'int', 'size' => 'tiny', 'default' => 0, 'not null' => TRUE, ), // @@@ Historical civicrm field that isn't applicable to location, I think.. 'is_primary' => array( 'description' => 'Is this the primary location of an object? (unused, civicrm legacy field?).', 'type' => 'int', 'size' => 'tiny', 'default' => 0, 'not null' => TRUE, ), ), 'primary key' => array('lid'), ); $schema['location_instance'] = array( 'description' => 'N:M join table to join locations to other tables.', 'fields' => array( 'nid' => array( 'description' => 'Reference to {node}.nid.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, ), 'vid' => array( 'description' => 'Reference to {node_revision}.vid.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, ), 'uid' => array( 'description' => 'Reference to {users}.uid.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, ), 'genid' => array( 'description' => 'Generic reference key.', 'type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '', ), 'lid' => array( 'description' => 'Reference to {location}.lid.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, ), ), 'indexes' => array( 'nid' => array('nid'), 'vid' => array('vid'), 'uid' => array('uid'), 'genid' => array('genid'), 'lid' => array('lid'), ), ); $schema['zipcodes'] = array( 'description' => 'Location.module zipcode database.', 'fields' => array( 'zip' => array( 'description' => 'Postal / ZIP code.', 'type' => 'varchar', 'length' => 16, 'not null' => TRUE, 'default' => '0', // @@@ Why? ), 'city' => array( 'description' => 'City.', 'type' => 'varchar', 'length' => 30, 'not null' => TRUE, 'default' => '', ), 'state' => array( 'description' => 'Province / State.', 'type' => 'varchar', 'length' => 30, 'not null' => TRUE, 'default' => '', ), 'latitude' => array( 'description' => 'Location latitude (decimal degrees).', 'type' => 'numeric', 'precision' => 10, 'scale' => 6, 'not null' => TRUE, 'default' => 0.0, ), 'longitude' => array( 'description' => 'Location longitude (decimal degrees).', 'type' => 'numeric', 'precision' => 10, 'scale' => 6, 'not null' => TRUE, 'default' => 0.0, ), // @@@ Not used, an artifact of the original data dump format. 'timezone' => array( 'description' => 'Timezone (unused).', 'type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 0, ), // @@@ Not used, an artifact of the original data dump format. 'dst' => array( 'description' => 'Daylight Savings Time (unused).', 'type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 0, ), 'country' => array( 'description' => 'Two letter ISO country code.', 'type' => 'char', 'length' => 2, 'not null' => TRUE, 'default' => '', ), ), // @@@ This pk is invalid, see issue queue. //'primary key' => array('country', 'zip'), // @@@ These need reworked. 'indexes' => array( 'pc' => array('country', 'zip'), 'zip' => array('zip'), // @@@ No combined one? 'latitude' => array('latitude'), 'longitude' => array('longitude'), 'country' => array('country'), ), ); // Copied from system.module. $schema['cache_location'] = array( 'description' => 'Generic cache table for caching things not separated out into their own tables. Contributed modules may also use this to store cached items.', 'fields' => array( 'cid' => array( 'description' => 'Primary Key: Unique cache ID.', 'type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''), 'data' => array( 'description' => 'A collection of data to cache.', 'type' => 'blob', 'not null' => FALSE, 'size' => 'big'), 'expire' => array( 'description' => 'A Unix timestamp indicating when the cache entry should expire, or 0 for never.', 'type' => 'int', 'not null' => TRUE, 'default' => 0), 'created' => array( 'description' => 'A Unix timestamp indicating when the cache entry was created.', 'type' => 'int', 'not null' => TRUE, 'default' => 0), 'headers' => array( 'description' => 'Any custom HTTP headers to be added to cached data.', 'type' => 'text', 'not null' => FALSE), 'serialized' => array( 'description' => 'A flag to indicate whether content is serialized (1) or not (0).', 'type' => 'int', 'size' => 'small', 'not null' => TRUE, 'default' => 0) ), 'indexes' => array('expire' => array('expire')), 'primary key' => array('cid'), ); return $schema; } /** * Legacy update 1. * Convert tables to utf8. */ function location_update_1() { // return _system_update_utf8(array('location', 'zipcodes')); } /** * Legacy update 2. * Fix a bug with the "us" entry in the "location_configured_countries" var. */ function location_update_2() { $configured_countries = variable_get('location_configured_countries', array()); if ($configured_countries['us']) { $configured_countries['us'] = 'us'; variable_set('location_configured_countries', $configured_countries); } return array(); } /** * Legacy update 3. * Allow for postgresql support by renaming the oid column, which is a reserved * name on postgresql. */ function location_update_3() { db_change_field('location', 'oid', 'eid', array( 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, )); if (module_exists('views')) { views_invalidate_cache(); } return t("The schema for location module has been updated. The update is such that you may want to re-resave any views you have that may include locations."); } /*************************************************************** PostgreSQL must be supported in all updates after this comment ***************************************************************/ /** * Legacy update 4. * Add "lid" as the new location key. */ function location_update_4() { db_add_field('location', 'lid', array( 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, 'description' => 'Primary Key: Unique location ID.', )); $result = db_query("SELECT eid, type FROM {location}"); $next_id = 0; foreach ($result as $row) { $next_id++; db_update('location') ->fields(array( 'lid' => $next_id, )) ->condition('eid', $row->eid) ->condition('type', $row->type) ->execute(); } db_drop_primary_key('location'); db_add_primary_key('location', array('lid')); db_insert('sequences') ->fields(array( 'name' => '{location}_lid', 'id' => $next_id, )) ->execute(); db_add_field('location', 'is_primary', array( 'description' => 'Is this the primary location of an object? (unused, civicrm legacy field?).', 'type' => 'int', 'size' => 'tiny', 'default' => 0, 'not null' => TRUE, )); db_update('location') ->fields(array( 'is_primary' => 1, )) ->condition('type', 'user') ->execute(); foreach (node_type_get_types() as $type) { $new_setting = variable_get('location_' . $type->type, 0) ? 1 : 0; variable_del('location_' . $type->type); variable_set('location_maxnum_' . $type->type, $new_setting); variable_set('location_defaultnum_' . $type->type, $new_setting); } } /** * Legacy update 5. * Postgresql support that was missing from previous update. * * This update is redundant now that we have db api functions * that are database independant. */ function location_update_5() { } /** * Legacy update 6. * Use correct country code for Sweeden. */ function location_update_6() { db_update('location') ->fields(array( 'country' => 'se', )) ->condition('country', 'sw') ->execute(); } /** * Update 7 (Location 2.x) * Generalize google geocoding so you don't have to enter the api key over and over. */ function location_update_7() { $services = array('google'); $general_geocoders_in_use = array(); $result = db_query("SELECT * FROM {variable} WHERE name REGEXP '^location_geocode_[a-z][a-z]$'"); foreach ($result as $row) { $value_decoded = unserialize($row->value); if (!in_array($value_decoded, $services)) { db_update('variable') ->fields(array( 'value' => serialize($value_decoded . '|' . substr($row->name, 17)), )) ->condition('name', $row->name) ->execute(); } else { $general_geocoders_in_use[$value_decoded] = $value_decoded; } } $key = db_query("SELECT value FROM {variable} WHERE name REGEXP '^location_geocode_[a-z][a-z]_google_apikey$'")->fetchField(); db_delete('variable') ->where("name REGEXP '^location_geocode_[a-z][a-z]_google_apikey$'") ->execute(); db_insert('variable') ->fields(array( 'name' => 'location_geocode_google_apikey', 'value' => $key, )) ->execute(); db_delete('cache') ->condition('cid', 'variables') ->execute(); variable_set('location_general_geocoders_in_use', $general_geocoders_in_use); } /** * Location 3.x update 1. * Add location specific cache table. */ function location_update_5300() { $schema['cache_location'] = array( 'description' => 'Generic cache table for caching things not separated out into their own tables. Contributed modules may also use this to store cached items.', 'fields' => array( 'cid' => array( 'description' => 'Primary Key: Unique cache ID.', 'type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '', ), 'data' => array( 'description' => 'A collection of data to cache.', 'type' => 'blob', 'not null' => FALSE, 'size' => 'big', ), 'expire' => array( 'description' => 'A Unix timestamp indicating when the cache entry should expire, or 0 for never.', 'type' => 'int', 'not null' => TRUE, 'default' => 0, ), 'created' => array( 'description' => 'A Unix timestamp indicating when the cache entry was created.', 'type' => 'int', 'not null' => TRUE, 'default' => 0, ), 'headers' => array( 'description' => 'Any custom HTTP headers to be added to cached data.', 'type' => 'text', 'not null' => FALSE, ), ), 'indexes' => array('expire' => array('expire')), 'primary key' => array('cid'), ); db_create_table('cache_location', $schema['cache_location']); } /** * Location 3.x update 2. * Normalize the location table. * This allows: * - Making the loading and saving code cleaner. * - Fixing a longstanding bug with revisions. * - Having the same location on multiple nodes/users/both. * - Garbage collecting unused locations periodically. * - Having full support for deletions. * - Full revisions support. * Note that the location_instance table does NOT have a primary key. * This is on purpose. It's a N:M join table. */ function location_update_5301() { $schema['location_instance'] = array( 'description' => 'N:M join table to join locations to other tables.', 'fields' => array( 'nid' => array( 'description' => 'Reference to {node}.nid.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, ), 'vid' => array( 'description' => 'Reference to {node_revision}.vid.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, ), 'uid' => array( 'description' => 'Reference to {users}.uid.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, ), 'genid' => array( 'description' => 'Generic reference key.', 'type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '', ), 'lid' => array( 'description' => 'Reference to {location}.lid.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, ), ), 'indexes' => array( 'nid' => array('nid'), 'vid' => array('vid'), 'uid' => array('uid'), 'genid' => array('genid'), 'lid' => array('lid'), ), ); db_create_table('location_instance', $schema['location_instance']); // Synthesise node location data based on what we have. // Storage of locations was previously stored against node revision, BUT the // data was not properly duplicated by revision (i.e. only the latest revision // carried the data.) // Joining like this allows us to backfill all the old revisions with the current // data, which is not nice but better than having no data at all when viewing // old revisions. $query = db_select('node_revision', 'nr'); $query->join('node_revision', 'nr2', 'nr.nid = nr2.nid'); $query->join('location', 'l', "nr2.vid = l.eid AND l.type = 'node'"); $query->addField('nr', 'nid'); $query->addField('nr', 'vid'); $query->addField('l', 'lid'); db_insert('location_instance') ->fields(array('nid', 'vid', 'lid')) ->from($query) ->execute(); // Users is much simpler. $query = db_select('location', 'l'); $query->addField('l', 'eid'); $query->addField('l', 'lid'); $query->condition('type', 'user'); db_insert('location_instance') ->fields(array('uid', 'lid')) ->from($query) ->execute(); // Aug 18 2008: // Save everything else in genid. $query = db_select('location', 'l'); $query->addExpression("CONCAT(l.type, ':', l.eid)"); $query->addField('l', 'lid'); $query->condition('type', 'user', '<>'); $query->condition('type', 'node', '<>'); db_insert('location_instance') ->fields(array('genid', 'lid')) ->from($query) ->execute(); // Remove now unused columns. db_drop_field('location', 'type'); db_drop_field('location', 'eid'); // General cleanup. variable_del('location_user'); // Removed in favor of permission check. // Variable consolidation (as part of the element based system) // We're doing this "raw" so we can be sure we got everything moved over, // INCLUDING content types that were deleted in the past. // This will let us do better cleanup sometime in the future. $data = array(); $todelete = array(); foreach(array('name', 'street', 'additional', 'city', 'province', 'postal_code', 'country', 'phone', 'fax') as $field) { $result = db_query("SELECT name, value FROM {variable} WHERE name > :name", array(':name' => "location_$field%")); foreach ($result as $row) { $data[substr($row->name, strlen($field) + 10)][$field] = (string)(int)unserialize($row->value); $todelete[] = $row->name; } } foreach ($data as $type => $value) { // We aren't going to trust that hook_locationapi is operational. // So, stick with some conservative defaults. $value = array_merge(array( 'name' => '1', 'street' => '1', // additional is left out of this list intentionally. 'city' => '0', 'province' => '0', 'postal_code' => '0', 'country' => '1', ), $value); if (!isset($value['additional'])) { // Initialize additional to match street. $value['additional'] = $value['street']; } variable_set('location_fields_'. $type, $value); } foreach ($todelete as $key) { variable_del($key); } // This update was retrofitted on Aug 18, 2008. Set a flag for use by // the next update in order to handle the case where someone has already // updated to EXACTLY schema revision 5301 before the retrofit took effect. // People who migrated past this point before that date may have the following // inconsistencies: // A) location_{field}_{type} variables were not collected for content types // that had been deleted in the past. // B) Any locations with the 'type' field set to something other than 'node' // or 'user' did not get entries in {location_instance}. variable_set('location_update_5301_retrofit', TRUE); } /** * Location 3.x update 3. * Add genid to {location_instance}. */ function location_update_5302() { // OK, here's the deal. I retrofitted 5301 on Aug 18 2008 to integrate the genid. // This was needed to fix the pre location 3.x todo item regarding keeping non // user, non node data intact. People doing an update after Aug 18 will already // have the genid column in place, so it can be safely skipped. if (!variable_get('location_update_5301_retrofit', FALSE)) { db_add_field('location_instance', 'genid', array( 'description' => 'Generic reference key.', 'type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '', )); db_add_index('location_instance', 'genid', array('genid')); } } /** * Location 3.x update 4. * Shuffle more variables around. */ function location_update_5303() { $types = array(); $result = db_query("SELECT name FROM {variable} WHERE name LIKE 'location_display_teaser_%'"); foreach ($result as $row) { $type = substr($row->name, 24); $types[$type]['teaser'] = variable_get('location_display_teaser_'. $type, TRUE); $types[$type]['full'] = variable_get('location_display_full_'. $type, TRUE); $types[$type]['weight'] = variable_get('location_display_weight_'. $type, 0); // @@@ Combine location_suppress_country and country require settings to set this up? $types[$type]['hide'] = array(); } foreach ($types as $type => $value) { variable_set("location_display_$type", $value); variable_del("location_display_teaser_$type"); variable_del("location_display_full_$type"); variable_del("location_display_weight_$type"); } } // @@@ Does 5303 need rerun in some circumstances? /** * Drupal 6 location 3.x update. */ function location_update_6301() { $message = ''; // Update cache table. db_drop_table('cache_location'); $schema['cache_location'] = array( 'description' => 'Generic cache table for caching things not separated out into their own tables. Contributed modules may also use this to store cached items.', 'fields' => array( 'cid' => array( 'description' => 'Primary Key: Unique cache ID.', 'type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''), 'data' => array( 'description' => 'A collection of data to cache.', 'type' => 'blob', 'not null' => FALSE, 'size' => 'big'), 'expire' => array( 'description' => 'A Unix timestamp indicating when the cache entry should expire, or 0 for never.', 'type' => 'int', 'not null' => TRUE, 'default' => 0), 'created' => array( 'description' => 'A Unix timestamp indicating when the cache entry was created.', 'type' => 'int', 'not null' => TRUE, 'default' => 0), 'headers' => array( 'description' => 'Any custom HTTP headers to be added to cached data.', 'type' => 'text', 'not null' => FALSE), 'serialized' => array( 'description' => 'A flag to indicate whether content is serialized (1) or not (0).', 'type' => 'int', 'size' => 'small', 'not null' => TRUE, 'default' => 0) ), 'indexes' => array('expire' => array('expire')), 'primary key' => array('cid'), ); db_create_table('cache_location', $schema['cache_location']); // LID 0 causes all sorts of issues, and will break our update routine // unless we handle it beforehand. // Since we're so nice, we're gonna renumber it for the user. $has_rows = (bool) db_query_range('SELECT 1 FROM {location} WHERE lid = 0', 0, 1)->fetchField(); if ($has_rows) { $lid = 1 + db_query('SELECT MAX(lid) FROM {location}')->fetchField(); $message = t('Note: A location with lid 0 was found in your database. It has been moved to lid %lid. You may wish to verify it manually, as lid 0 is usually a corrupt entry.', array('%lid' => $lid)); db_update('location') ->fields(array( 'lid' => $lid, )) ->condition('lid', 0) ->execute(); db_update('location_instance') ->fields(array( 'lid' => $lid, )) ->condition('lid', 0) ->execute(); } // Field changes // {location} // {location}.lid -- Becomes a serial. db_drop_primary_key('location'); db_change_field('location', 'lid', 'lid', array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE), array('primary key' => array('lid'))); // (The rest of the changes to this table were moved to update 6302 due to a bug.) // {location_instance} // Fix oddly named indexes -- Was using the postgresql method for both. db_drop_index('location_instance', '{location_instance}_nid_idx'); db_drop_index('location_instance', '{location_instance}_vid_idx'); db_drop_index('location_instance', '{location_instance}_uid_idx'); db_drop_index('location_instance', '{location_instance}_genid_idx'); db_drop_index('location_instance', '{location_instance}_lid_idx'); db_drop_index('location_instance', 'nid'); db_drop_index('location_instance', 'vid'); db_drop_index('location_instance', 'uid'); db_drop_index('location_instance', 'genid'); db_drop_index('location_instance', 'lid'); // Fill in nulls. db_update('location_instance') ->fields(array( 'nid' => 0, )) ->isNull('nid') ->execute(); db_update('location_instance') ->fields(array( 'vid' => 0, )) ->isNull('vid') ->execute(); db_update('location_instance') ->fields(array( 'uid' => 0, )) ->isNull('uid') ->execute(); db_update('location_instance') ->fields(array( 'genid' => 0, )) ->isNull('genid') ->execute(); // {location_instance}.nid db_change_field('location_instance', 'nid', 'nid', array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0)); // {location_instance}.vid db_change_field('location_instance', 'vid', 'vid', array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0)); // {location_instance}.uid db_change_field('location_instance', 'uid', 'uid', array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0)); // {location_instance}.genid db_change_field('location_instance', 'genid', 'genid', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '')); // {location_instance}.lid db_change_field('location_instance', 'lid', 'lid', array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0)); // Readd indexes. db_add_index('location_instance', 'nid', array('nid')); db_add_index('location_instance', 'vid', array('vid')); db_add_index('location_instance', 'uid', array('uid')); db_add_index('location_instance', 'genid', array('genid')); db_add_index('location_instance', 'lid', array('lid')); // {zipcodes} // Drop primary key. db_drop_primary_key('zipcodes'); if ($message) { $message .= '

'; } return $message . t('Note: Location.module update 6301 will generate several warnings/failures regarding indexes and primary keys if you are upgrading from one of the 6.x test releases. These warnings can be safely disregarded in this case.'); } /** * Drupal 6 location 3.x update, part 2. */ function location_update_6302() { // OK, here's the update to fix the previous update which had a few problems // when upgrading from pre-rc 6.x versions. // The "mismatch between mysql and postgresql" was actually applicable to // 6.x-3.0 pre-rc1 as well, but I didn't notice because I accidentally added // the not null when reformatting the schema. db_update('location') ->fields(array( 'is_primary' => 0, )) ->isNull('is_primary') ->execute(); db_change_field('location', 'is_primary', 'is_primary', array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'not null' => TRUE)); // Fix zipcode mismatches caused by the same problem. // There shouldn't be any rows like this, but it doesn't hurt to be sure. db_update('zipcodes') ->fields(array( 'zip' => 0, )) ->isNull('zip') ->execute(); // Set not null. db_change_field('zipcodes', 'zip', 'zip', array('type' => 'varchar', 'length' => 16, 'not null' => TRUE, 'default' => '0')); // Prepare latitude and longitude for the same. db_update('zipcodes') ->fields(array( 'latitude' => 0.0, )) ->isNull('latitude') ->execute(); db_update('zipcodes') ->fields(array( 'longitude' => 0.0, )) ->isNull('longitude') ->execute(); // Set not null. db_change_field('zipcodes', 'latitude', 'latitude', array('type' => 'numeric', 'not null' => TRUE, 'default' => 0, 'precision' => 10, 'scale' => 6)); db_change_field('zipcodes', 'longitude', 'longitude', array('type' => 'numeric', 'not null' => TRUE, 'default' => 0, 'precision' => 10, 'scale' => 6)); // Prepare country. update_sql("UPDATE {zipcodes} SET country = '' WHERE country IS NULL"); db_update('zipcodes') ->fields(array( 'country' => '', )) ->isNull('country') ->execute(); // Set not null. db_change_field('zipcodes', 'country', 'country', array('type' => 'char', 'length' => 2, 'not null' => TRUE, 'default' => '')); // Fix up possible {location} problems from previous update that could be caused if you had NULLed fields. // Set defaults $fields = array( 'name' => '', 'street' => '', 'additional' => '', 'city' => '', 'province' => '', 'postal_code' => '', 'latitude' => 0.0, 'longitude' => 0.0, 'source' => 0, ); foreach ($fields as $field => $value) { db_update('location') ->fields(array( $field => $value, )) ->isNull($field) ->execute(); } // {location}.name -- NOT NULL db_change_field('location', 'name', 'name', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '')); // {location}.street -- NOT NULL db_change_field('location', 'street', 'street', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '')); // {location}.additional -- NOT NULL db_change_field('location', 'additional', 'additional', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '')); // {location}.city -- NOT NULL db_change_field('location', 'city', 'city', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '')); // {location}.province -- NOT NULL db_change_field('location', 'province', 'province', array('type' => 'varchar', 'length' => 16, 'not null' => TRUE, 'default' => '')); // {location}.postal_code -- NOT NULL db_change_field('location', 'postal_code', 'postal_code', array('type' => 'varchar', 'length' => 16, 'not null' => TRUE, 'default' => '')); // {location}.country -- NOT NULL db_change_field('location', 'country', 'country', array('type' => 'char', 'length' => 2, 'not null' => TRUE, 'default' => '')); // {location}.latitude db_change_field('location', 'latitude', 'latitude', array('type' => 'numeric', 'precision' => 10, 'scale' => 6, 'not null' => TRUE, 'default' => 0.0)); // {location}.longitude db_change_field('location', 'longitude', 'longitude', array('type' => 'numeric', 'precision' => 10, 'scale' => 6, 'not null' => TRUE, 'default' => 0.0)); // {location}.source db_change_field('location', 'source', 'source', array('type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 0)); } /** * Drupal 6 location 3.x update, part 3. */ function location_update_6303() { if (!variable_get('location_update_5304_done', FALSE)) { // Do the same updates as 5304. // Delete unused variables. variable_del('location_configured_countries'); variable_del('location_garbagecollect'); // Update province code for Italy/Forlì-Cesena. db_update('location') ->fields(array( 'province' => 'FC', )) ->condition('country', 'it') ->condition('province', 'FO') ->execute(); // Update province code for Italy/Pesaro e Urbino. db_update('location') ->fields(array( 'province' => 'PU', )) ->condition('country', 'it') ->condition('province', 'PS') ->execute(); // Do one final garbage collection by hand. $query = db_select('location_instance', 'li') ->addField('li', 'lid'); db_delete('location') ->condition('lid', $query, 'NOT IN') ->execute(); // Garbage collect {location_phone} by hand. if (db_table_exists('location_phone')) { $query = db_select('location', 'l') ->addField('l', 'lid'); db_delete('location_phone') ->condition('lid', $query, 'NOT IN') ->execute(); } // Garbage collect {location_fax} by hand. if (db_table_exists('location_fax')) { $query = db_select('location', 'l') ->addField('l', 'lid'); db_delete('location_fax') ->condition('lid', $query, 'NOT IN') ->execute(); } variable_del('location_update_5304_done'); } } /** * Upgrade all of the settings variables to the new unified system. */ function location_update_6304() { // Skip this update if it was already done on the 5.x side. if (variable_get('location_update_5305_done', FALSE)) { variable_del('location_update_5305_done'); return array(); } $variables = array(); $todelete = array(); $base = array( 'multiple' => array( 'min' => 0, 'max' => 0, 'add' => 3, ), 'form' => array( 'weight' => 0, 'collapsible' => TRUE, 'collapsed' => TRUE, 'fields' => array(), ), 'display' => array( 'weight' => 0, 'hide' => array(), ), ); // Pull in user settings. $variables['location_settings_user'] = $base; $tmp = &$variables['location_settings_user']; // Users previously could not have multiple locations, initialize with those // settings. $tmp['multiple'] = array( 'min' => 0, 'max' => 1, 'add' => 3, ); $tmp['form']['weight'] = variable_get('location_user_weight', 9); $tmp['form']['collapsible'] = variable_get('location_user_collapsible', TRUE); $tmp['form']['collapased'] = variable_get('location_user_collapsed', TRUE); $tmp['form']['fields'] = variable_get('location_user_fields', array()); // Pull in node settings. $result = db_query("SELECT name FROM {variable} WHERE name LIKE 'location_maxnum_%'"); foreach ($result as $row) { $type = substr($row->name, 16); $todelete[] = $type; $variables["location_settings_node_$type"] = $base; $tmp = &$variables["location_settings_node_$type"]; $tmp['multiple']['min'] = 1; // Old behavior was to have the first one be required. $tmp['multiple']['max'] = variable_get("location_maxnum_$type", 0); $tmp['multiple']['add'] = variable_get("location_defaultnum_$type", 3); $tmp['form']['weight'] = variable_get("location_weight_$type", 9); $tmp['form']['collapsible'] = variable_get("location_collapsible_$type", TRUE); $tmp['form']['collapsed'] = variable_get("location_collapsed_$type", TRUE); $tmp['form']['fields'] = variable_get("location_fields_$type", array()); $tmp['rss']['mode'] = variable_get("location_rss_$type", 'simple'); $tmp['display'] = variable_get("location_display_$type", array( 'teaser' => TRUE, 'full' => TRUE, 'weight' => 0, 'hide' => array(), )); } foreach ($variables as $name => $value) { variable_set($name, $value); } // Delete old node variables. foreach ($todelete as $key) { // variable_del("location_maxnum_$key"); // variable_del("location_defaultnum_$key"); variable_del("location_weight_$key"); variable_del("location_collapsible_$key"); variable_del("location_collapsed_$key"); variable_del("location_fields_$key"); variable_del("location_rss_$key"); variable_del("location_display_$key"); } // Delete old user variables. variable_del('location_user_weight'); variable_del('location_user_collapsible'); variable_del('location_user_collapsed'); variable_del('location_user_fields'); } /** * Disabled due to some typos, moved to 6306. */ function location_update_6305() { return array(); } /** * Add per-location-field weights and defaults. */ function location_update_6306() { // Skip this update if it was already done on the 5.x side. if (variable_get('location_update_5306_done', FALSE)) { variable_del('location_update_5306_done'); return array(); } $result = db_query("SELECT name FROM {variable} WHERE name LIKE 'location_settings_%'"); foreach ($result as $row) { $var = variable_get($row->name, array()); $collect = $var['form']['fields']; $var['form']['fields'] = array(); foreach ($collect as $k => $v) { $var['form']['fields'][$k]['collect'] = $v; } // Country 3 has changed to 4 to make requirements code easier. if (isset($var['form']['fields']['country']['collect']) && $var['form']['fields']['country']['collect'] == 3) { $var['form']['fields']['country']['collect'] = 4; } // Weight and default values don't need to get set for now. variable_set($row->name, $var); } } /** * Tell users about the new location_user module and enable it. */ function location_update_6307() { $message = t("Note: Location module has now split off user location support into a seperate module, called User Locations. It has been enabled for you. If you don't want user locations, visit the modules page and disable it.", array('!url' => url('admin/modules'))); if (module_exists('location')) { module_enable(array('location_user')); } else { $message .= '
' . t("Note: Refusing to enable location_user.module, as location.module is not currently enabled."); } return $message; } /** * Tell users about the new location_node module and enable it. */ function location_update_6308() { $message = t("Note: Location module has now split off node location support into a seperate module, called Node Locations. It has been enabled for you. If you don't want node locations, visit the modules page and disable it.", array('!url' => url('admin/modules'))); if (module_exists('location')) { module_enable(array('location_node')); } else { $message .= '
' . t("Note: Refusing to enable location_node.module, as location.module is not currently enabled."); } return $message; } /** * There has been a change in the options for the views distance/proximity filter. * The old options need to be migrated into the new. */ function location_update_6309() { $updated_views = array(); if (module_exists('views')) { $views = views_get_all_views(); foreach ($views as $view) { $modified = FALSE; // For each view check all filters of all displays for the distance field filter. foreach ($view->display as $did => $display) { if (isset($display->display_options['filters']) && !empty($display->display_options['filters'])) { foreach ($display->display_options['filters'] as $fid => $filter) { if ($filter['table'] == 'location' && $filter['field'] == 'distance') { // Set the origin (new option) from the type (old option). $origin = ''; switch ($filter['type']) { case 'latlon': $origin = 'static'; break; case 'postal': case 'postal_default': case 'latlon_gmap': $origin = $filter['type']; break; } if ($origin) { $view->display[$did]->display_options['filters'][$fid]['origin'] = $origin; unset($view->display[$did]->display_options['filters'][$fid]['type']); $modified = TRUE; } } } } } // Save the view if we changed any options on any diplays. // Views caches are cleared during save so we don't have to do it. if ($modified) { $updated_views[] = $view->name; $view->save(); } } } if (!empty($updated_views)) { return t("Note: The 'Form type' option for the 'Location: Distance / Proximity' filter in views has been changed and is now the 'Origin' option. The following views were using that setting and have been updated to use the new setting: %views.", array('%views' => implode(', ', $updated_views))); } } /** * Updates the ISO code for United Kingdom from 'uk' to 'gb' in the location * table, the zipcodes table, and for any variable names and variable values * where it is used. */ function location_update_7301() { db_update('location') ->fields(array( 'country' => 'gb', )) ->condition('country', 'uk') ->execute(); db_update('zipcodes') ->fields(array( 'country' => 'gb', )) ->condition('country', 'uk') ->execute(); $uk = variable_get('location_geocode_uk', ''); $gb = variable_get('location_geocode_gb', ''); if ($uk) { variable_set('location_geocode_gb', $uk); } $uk = variable_get('location_map_link_uk', ''); $gb = variable_get('location_map_link_gb', ''); if ($uk) { variable_set('location_map_link_gb', $uk); } cache_clear_all('*', 'cache_location', TRUE); return; }