| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288 | <?php/** * @file * Install, update and uninstall functions for the location module. *//** * Implentation of hook_uninstall(). */function location_uninstall() {  // Delete variables.  variable_del('location_default_country');  variable_del('location_display_location');  variable_del('location_usegmap');  variable_del('location_locpick_macro');  // Delete geocoder settings.  $result = db_query("SELECT name FROM {variable} WHERE name LIKE 'location_geocode_%'")->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 .= '<br /><br />';  }  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 <em>User Locations</em>. It has been enabled for you. If you don't want user locations, visit the <a href='!url'>modules page</a> and disable it.", array('!url' => url('admin/modules')));  if (module_exists('location')) {    module_enable(array('location_user'));  }  else {    $message .= '<br />' . 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 <em>Node Locations</em>. It has been enabled for you. If you don't want node locations, visit the <a href='!url'>modules page</a> and disable it.", array('!url' => url('admin/modules')));  if (module_exists('location')) {    module_enable(array('location_node'));  }  else {    $message .= '<br />' . 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;}
 |