You are here

location.install in Location 5.3

Installation / uninstallation routines.

File

location.install
View source
<?php

/**
 * @file
 * Installation / uninstallation routines.
 */

/**
 * Implementation of hook_install().
 */
function location_install() {
  drupal_set_message('Installing location');
  switch ($GLOBALS['db_type']) {
    case 'mysql':
    case 'mysqli':
      db_query("\n      CREATE TABLE {location} (\n        lid int unsigned NOT NULL default '0',\n        name varchar(255) default NULL,\n        street varchar(255) default NULL,\n        additional varchar(255) default NULL,\n        city varchar(255) default NULL,\n        province varchar(16) default NULL,\n        postal_code varchar(16) default NULL,\n        country char(2) default NULL,\n        latitude decimal(10,6) default NULL,\n        longitude decimal(10,6) default NULL,\n        source tinyint default '0',\n        is_primary tinyint NOT NULL default '0',\n        PRIMARY KEY  (lid)\n      ) /*!40100 DEFAULT CHARACTER SET utf8 */;\n      ");
      db_query("\n      CREATE TABLE {location_instance} (\n        nid int UNSIGNED DEFAULT NULL,\n        vid int UNSIGNED DEFAULT NULL,\n        uid int UNSIGNED DEFAULT NULL,\n        genid varchar(255) NOT NULL default '',\n        lid int UNSIGNED NOT NULL DEFAULT '0',\n        INDEX {location_instance}_nid_idx (nid),\n        INDEX {location_instance}_vid_idx (vid),\n        INDEX {location_instance}_uid_idx (uid),\n        INDEX {location_instance}_genid_idx (genid),\n        INDEX {location_instance}_lid_idx (lid)\n      ) /*!40100 DEFAULT CHARACTER SET utf8 */");
      db_query("\n      CREATE TABLE {zipcodes} (\n        zip varchar(16) NOT NULL default '0',\n        city varchar(30) NOT NULL default '',\n        state varchar(30) NOT NULL default '',\n        latitude decimal(10,6) NOT NULL default '0.000000',\n        longitude decimal(10,6) NOT NULL default '0.000000',\n        timezone tinyint NOT NULL default '0',\n        dst tinyint NOT NULL default '0',\n        country char(2) default '',\n        KEY pc (country, zip),\n        KEY zip (zip),\n        KEY latitude (latitude),\n        KEY longitude (longitude),\n        KEY country (country)\n      ) /*!40100 DEFAULT CHARACTER SET utf8 */;\n      ");
      db_query("CREATE TABLE {cache_location} (\n        cid varchar(255) NOT NULL default '',\n        data longblob,\n        expire int NOT NULL default '0',\n        created int NOT NULL default '0',\n        headers text,\n        PRIMARY KEY (cid),\n        INDEX expire (expire)\n      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
      $success = TRUE;
      break;
    case 'pgsql':
      db_query("CREATE TABLE {location} (\n        lid serial CHECK (lid >= 0),\n        name varchar(255) default NULL,\n        street varchar(255) default NULL,\n        additional varchar(255) default NULL,\n        city varchar(255) default NULL,\n        province varchar(16) default NULL,\n        postal_code varchar(16) default NULL,\n        country char(2) default NULL,\n        latitude decimal(10,6) default NULL,\n        longitude decimal(10,6) default NULL,\n        source smallint default '0',\n        is_primary smallint default '0',\n        PRIMARY KEY (lid)\n      )");
      db_query("\n      CREATE TABLE {location_instance} (\n        nid int DEFAULT NULL CHECK (nid >= 0 OR nid IS NULL),\n        vid int DEFAULT NULL CHECK (vid >= 0 OR vid IS NULL),\n        uid int DEFAULT NULL CHECK (uid >= 0 OR uid IS NULL),\n        genid varchar(255) NOT NULL default '',\n        lid int NOT NULL DEFAULT '0' CHECK (lid >= 0)\n      )");
      db_query('CREATE INDEX {location_instance}_nid_idx ON {location_instance} (nid)');
      db_query('CREATE INDEX {location_instance}_vid_idx ON {location_instance} (vid)');
      db_query('CREATE INDEX {location_instance}_uid_idx ON {location_instance} (uid)');
      db_query('CREATE INDEX {location_instance}_lid_idx ON {location_instance} (lid)');
      db_query('CREATE INDEX {location_instance}_genid_idx ON {location_instance} (genid)');
      db_query("CREATE TABLE {zipcodes} (\n        zip varchar(16) NOT NULL default '0',\n        city varchar(30) NOT NULL default '',\n        state varchar(30) NOT NULL default '',\n        latitude decimal(10,6) NOT NULL default '0.000000',\n        longitude decimal(10,6) NOT NULL default '0.000000',\n        timezone smallint NOT NULL default '0',\n        dst smallint NOT NULL default '0',\n        country char(2) default ''\n      )");
      db_query("CREATE INDEX {zipcodes}_pc_idx ON {zipcodes} (country, zip)");
      db_query("CREATE INDEX {zipcodes}_zip_idx ON {zipcodes} (zip)");
      db_query("CREATE INDEX {zipcodes}_latitude_idx ON {zipcodes} (latitude)");
      db_query("CREATE INDEX {zipcodes}_longitude_idx ON {zipcodes} (longitude)");
      db_query("CREATE INDEX {zipcodes}_country_idx ON {zipcodes} (country)");
      db_query("CREATE TABLE {cache_location} (\n        cid varchar(255) NOT NULL default '',\n        data bytea,\n        expire int NOT NULL default '0',\n        created int NOT NULL default '0',\n        headers text,\n        PRIMARY KEY (cid)\n      )");
      db_query("CREATE INDEX {cache_location}_expire_idx ON {cache_location} (expire)");
      $success = TRUE;
      break;
    default:
      break;
  }

  // End case
  if ($success) {
    drupal_set_message(t('Location module installed tables successfully. If you would also like a database of zip codes, please manually import the appropriate zipcode.XX.YYYY file(s) in the %module directory.', array(
      '%module' => drupal_get_path('module', 'location') . '/database',
    )));
  }
  else {
    drupal_set_message(t('The installation of Location module was unsuccessful.'), 'error');
  }
}

/**
 * Implentation of hook_uninstall().
 */
function location_uninstall() {

  // Delete tables.
  if (db_table_exists('location')) {
    db_query('DROP TABLE {location}');
  }
  if (db_table_exists('zipcodes')) {
    db_query('DROP TABLE {zipcodes}');
  }
  if (db_table_exists('cache_location')) {
    db_query('DROP TABLE {cache_location}');
  }
  if (db_table_exists('location_instance')) {
    db_query('DROP TABLE {location_instance}');
  }

  // 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_%'");
  while ($row = db_fetch_object($result)) {
    variable_del($row->name);
  }
}

/**
 * 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() {
  $ret = array();
  switch ($GLOBALS['db_type']) {
    case 'mysql':
    case 'mysqli':
      $ret[] = update_sql("ALTER TABLE {location} CHANGE oid eid int unsigned NOT NULL default '0'");
      break;
  }
  drupal_set_message("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.");
  if (module_exists('views')) {
    views_invalidate_cache();
  }
  return $ret;
}

/***************************************************************
  PostgreSQL must be supported in all updates after this comment
 ***************************************************************/

/**
 * Legacy update 4.
 * Add "lid" as the new location key.
 */
function location_update_4() {
  $ret = array();
  switch ($GLOBALS['db_type']) {
    case 'mysql':
    case 'mysqli':
      $ret[] = update_sql("ALTER TABLE {location} ADD COLUMN lid int(10) unsigned NOT NULL default '0' AFTER eid");
      $result = db_query("SELECT eid, type FROM {location}");
      $next_id = 0;
      while ($row = db_fetch_object($result)) {
        $next_id++;
        db_query("UPDATE {location} SET lid = %d WHERE eid = %d AND type = '%s'", $next_id, $row->eid, $row->type);
      }
      $ret[] = update_sql("ALTER TABLE {location} DROP PRIMARY KEY");
      $ret[] = update_sql("ALTER TABLE {location} ADD PRIMARY KEY (lid)");
      db_query("INSERT INTO {sequences} (name, id) VALUES ('{location}_lid', %d)", $next_id);
      $ret[] = update_sql("ALTER TABLE {location} ADD COLUMN is_primary tinyint NOT NULL default '0'");
      $ret[] = update_sql("UPDATE {location} SET is_primary = 1 WHERE type = 'user'");
      break;
    case 'pgsql':

      // help me
      break;
  }
  foreach (node_get_types() as $type => $name) {
    $new_setting = variable_get('location_' . $type, 0) ? 1 : 0;
    variable_del('location_' . $type);
    variable_set('location_maxnum_' . $type, $new_setting);
    variable_set('location_defaultnum_' . $type, $new_setting);
  }
  return $ret;
}

/**
 * Legacy update 5.
 * Postgresql support that was missing from previous update.
 */
function location_update_5() {
  $ret = array();
  switch ($GLOBALS['db_type']) {
    case 'pgsql':
      $ret[] = update_sql("ALTER TABLE {location} DROP CONSTRAINT {location}_pkey");
      $ret[] = update_sql("ALTER TABLE {location} RENAME TO {location}_old");
      $ret[] = update_sql("CREATE TABLE {location} (\n        lid serial CHECK (lid >= 0),\n        eid int NOT NULL default '0' CHECK (eid >= 0),\n        type varchar(6) NOT NULL default '',\n        name varchar(255) default NULL,\n        street varchar(255) default NULL,\n        additional varchar(255) default NULL,\n        city varchar(255) default NULL,\n        province varchar(16) default NULL,\n        postal_code varchar(16) default NULL,\n        country char(2) default NULL,\n        latitude decimal(10,6) default NULL,\n        longitude decimal(10,6) default NULL,\n        source smallint default '0',\n        is_primary smallint default '0',\n        PRIMARY KEY (lid)\n      )");
      $ret[] = update_sql("INSERT INTO {location}\n        (eid, type, name, street, additional, city, province, postal_code, country, latitude,\n        longitude, source) SELECT eid, type, name, street, additional, city, province,\n        postal_code, country, latitude, longitude, source FROM {location}_old");
      $ret[] = update_sql("DROP TABLE {location}_old");
      $ret[] = update_sql("UPDATE {location} SET is_primary = 1 WHERE type = 'user'");
      break;
  }
  return $ret;
}

/**
 * Legacy update 6.
 * Use correct country code for Sweeden.
 */
function location_update_6() {
  $ret = array();
  switch ($GLOBALS['db_type']) {
    case 'mysql':
    case 'mysqli':
      $ret[] = update_sql("UPDATE {location} SET country = 'se' WHERE country = 'sw'");
      break;
    case 'pgsql':
      $ret[] = update_sql("UPDATE {location} SET country = 'se' WHERE country = 'sw'");
      break;
  }
  return $ret;
}

/**
 * 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() {
  $ret = array();
  $services = array(
    'google',
  );
  $general_geocoders_in_use = array();
  switch ($GLOBALS['db_type']) {
    case 'mysql':
    case 'mysqli':
      $result = db_query('SELECT * FROM {variable} WHERE name REGEXP \'^location_geocode_[a-z][a-z]$\'');
      while ($row = db_fetch_object($result)) {
        $value_decoded = unserialize($row->value);
        if (!in_array($value_decoded, $services)) {
          $ret[] = update_sql('UPDATE {variable} SET value = \'' . serialize($value_decoded . '|' . substr($row->name, 17)) . '\' WHERE name = \'' . $row->name . '\'');
        }
        else {
          $general_geocoders_in_use[$value_decoded] = $value_decoded;
        }
      }
      $key = db_result(db_query('SELECT value FROM {variable} WHERE name REGEXP \'^location_geocode_[a-z][a-z]_google_apikey$\' LIMIT 1'));
      $ret[] = update_sql('DELETE FROM {variable} WHERE name REGEXP \'^location_geocode_[a-z][a-z]_google_apikey$\'');
      $ret[] = update_sql('INSERT INTO {variable} (name, value) VALUES (\'location_geocode_google_apikey\', \'' . $key . '\')');
      $ret[] = update_sql('DELETE FROM {cache} WHERE cid = \'variables\'');
      variable_set('location_general_geocoders_in_use', $general_geocoders_in_use);
      break;
    case 'pgsql':
      $result = db_query('SELECT * FROM {variable} WHERE name REGEXP \'^location_geocode_[a-z][a-z]$\'');
      while ($row = db_fetch_object($result)) {
        $value_decoded = unserialize($row->value);
        if (!in_array($value_decoded, $services)) {
          $ret[] = update_sql('UPDATE {variable} SET value = \'' . serialize($value_decoded . '|' . substr($row->name, 17)) . '\' WHERE name = \'' . $row->name . '\'');
        }
        else {
          $general_geocoders_in_use[$value_decoded] = $value_decoded;
        }
      }
      $key = db_result(db_query('SELECT value FROM {variable} WHERE name REGEXP \'^location_geocode_[a-z][a-z]_google_apikey$\' LIMIT 1'));
      $ret[] = update_sql('DELETE FROM {variable} WHERE name REGEXP \'^location_geocode_[a-z][a-z]_google_apikey$\'');
      $ret[] = update_sql('INSERT INTO {variable} (name, value) VALUES (\'location_geocode_google_apikey\', \'' . $key . '\')');
      $ret[] = update_sql('DELETE FROM {cache} WHERE cid = \'variables\'');
      variable_set('location_general_geocoders_in_use', $general_geocoders_in_use);
      break;
  }
  return $ret;
}

/**
 * Location 3.x update 1.
 * Add location specific cache table.
 */
function location_update_5300() {
  $ret = array();
  switch ($GLOBALS['db_type']) {
    case 'mysql':
    case 'mysqli':
      $ret[] = update_sql("CREATE TABLE {cache_location} (\n        cid varchar(255) NOT NULL default '',\n        data longblob,\n        expire int NOT NULL default '0',\n        created int NOT NULL default '0',\n        headers text,\n        PRIMARY KEY (cid),\n        INDEX expire (expire)\n      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
      break;
    case 'pgsql':
      $ret[] = update_sql("CREATE TABLE {cache_location} (\n        cid varchar(255) NOT NULL default '',\n        data bytea,\n        expire int NOT NULL default '0',\n        created int NOT NULL default '0',\n        headers text,\n        PRIMARY KEY (cid)\n      )");
      $ret[] = update_sql("CREATE INDEX {cache_location}_expire_idx ON {cache_location} (expire)");
      break;
  }
  return $ret;
}

/**
 * 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() {
  $ret = array();
  switch ($GLOBALS['db_type']) {
    case 'mysql':
    case 'mysqli':
      $ret[] = update_sql("\n      CREATE TABLE {location_instance} (\n        nid int UNSIGNED DEFAULT NULL,\n        vid int UNSIGNED DEFAULT NULL,\n        uid int UNSIGNED DEFAULT NULL,\n        genid varchar(255) NOT NULL default '',\n        lid int UNSIGNED NOT NULL DEFAULT '0',\n        INDEX {location_instance}_nid_idx (nid),\n        INDEX {location_instance}_vid_idx (vid),\n        INDEX {location_instance}_uid_idx (uid),\n        INDEX {location_instance}_genid_idx (genid),\n        INDEX {location_instance}_lid_idx (lid)\n      ) /*!40100 DEFAULT CHARACTER SET utf8 */");
      break;
    case 'pgsql':
      $ret[] = update_sql("\n      CREATE TABLE {location_instance} (\n        nid int DEFAULT NULL CHECK (nid >= 0 OR nid IS NULL),\n        vid int DEFAULT NULL CHECK (vid >= 0 OR vid IS NULL),\n        uid int DEFAULT NULL CHECK (uid >= 0 OR uid IS NULL),\n        genid varchar(255) NOT NULL default '',\n        lid int NOT NULL DEFAULT '0' CHECK (lid >= 0)\n      )");
      $ret[] = update_sql('CREATE INDEX {location_instance}_nid_idx ON {location_instance} (nid)');
      $ret[] = update_sql('CREATE INDEX {location_instance}_vid_idx ON {location_instance} (vid)');
      $ret[] = update_sql('CREATE INDEX {location_instance}_uid_idx ON {location_instance} (uid)');
      $ret[] = update_sql('CREATE INDEX {location_instance}_lid_idx ON {location_instance} (lid)');
      $ret[] = update_sql('CREATE INDEX {location_instance}_genid_idx ON {location_instance} (genid)');
      break;
  }

  // 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.
  $ret[] = update_sql("INSERT INTO {location_instance} (nid,vid,lid) (SELECT nr.nid, nr.vid, l.lid FROM {node_revisions} nr INNER JOIN {node_revisions} nr2 ON nr.nid = nr2.nid INNER JOIN {location} l ON nr2.vid = l.eid AND l.type = 'node')");

  // Users is much simpler.
  $ret[] = update_sql("INSERT INTO {location_instance} (uid,lid) (SELECT eid, lid FROM {location} WHERE type = 'user')");

  // Aug 18 2008:
  // Save everything else in genid.
  switch ($GLOBALS['db_type']) {
    case 'mysql':
    case 'mysqli':
      $ret[] = update_sql("INSERT INTO {location_instance} (genid, lid) (SELECT CONCAT(type, ':', eid), lid FROM {location} WHERE type <> 'user' AND type <> 'node')");
      break;
    case 'pgsql':
      $ret[] = update_sql("INSERT INTO {location_instance} (genid, lid) (SELECT type||':'||eid, lid FROM {location} WHERE type <> 'user' AND type <> 'node')");
      break;
  }

  // Remove now unused columns.
  $ret[] = update_sql("ALTER TABLE {location} DROP COLUMN type");
  $ret[] = update_sql("ALTER TABLE {location} DROP COLUMN 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 LIKE 'location_%s%%'", $field);
    while ($row = db_fetch_object($result)) {
      $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);
  return $ret;
}

/**
 * Location 3.x update 3.
 * Add genid to {location_instance}.
 */
function location_update_5302() {
  $ret = array();

  // 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)) {
    switch ($GLOBALS['db_type']) {
      case 'mysql':
      case 'mysqli':
        $ret[] = update_sql("ALTER TABLE {location_instance} ADD COLUMN genid varchar(255) NOT NULL default '' AFTER uid");
        $ret[] = update_sql('CREATE INDEX {location_instance}_genid_idx ON {location_instance} (genid)');
        break;
      case 'pgsql':
        db_add_column($ret, 'location_instance', 'genid', 'varchar(255)', array(
          'not null' => TRUE,
          'default' => "''",
        ));
        $ret[] = update_sql('CREATE INDEX {location_instance}_genid_idx ON {location_instance} (genid)');
        break;
    }
  }
  return $ret;
}

/**
 * Location 3.x update 4.
 * Shuffle more variables around.
 */
function location_update_5303() {
  $ret = array();
  $types = array();
  $result = db_query("SELECT name FROM {variable} WHERE name LIKE 'location_display_teaser_%'");
  while ($row = db_fetch_object($result)) {
    $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}");
  }
  return $ret;
}

/**
 * Location 3.x update 5.
 */
function location_update_5304() {
  $ret = array();
  variable_set('location_update_5304_done', TRUE);

  // Delete unused variables.
  variable_del('location_configured_countries');
  variable_del('location_garbagecollect');

  // Update province code for Italy/Forlì-Cesena.
  $ret[] = update_sql("UPDATE {location} SET province = 'FC' WHERE country = 'it' AND province = 'FO'");

  // Update province code for Italy/Pesaro e Urbino.
  $ret[] = update_sql("UPDATE {location} SET province = 'PU' WHERE country = 'it' AND province = 'PS'");

  // Do one final garbage collection by hand.
  $ret[] = update_sql('DELETE FROM {location} WHERE lid NOT IN (SELECT lid FROM {location_instance})');

  // Garbage collect {location_phone} by hand.
  if (db_table_exists('location_phone')) {
    $ret[] = update_sql('DELETE FROM {location_phone} WHERE lid NOT IN (SELECT lid FROM {location})');
  }

  // Garbage collect {location_fax} by hand.
  if (db_table_exists('location_fax')) {
    $ret[] = update_sql('DELETE FROM {location_fax} WHERE lid NOT IN (SELECT lid FROM {location})');
  }
  return $ret;
}

/**
 * Upgrade all of the settings variables to the new unified system.
 */
function location_update_5305() {
  $ret = array();
  variable_set('location_5305_done', TRUE);
  $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_%'");
  while ($row = db_fetch_object($result)) {
    $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');
  return $ret;
}
function location_update_5306() {
  $ret = array();

  // Set this again because it wasn't put in in the first revision of 5305.
  variable_set('location_5305_done', TRUE);
  variable_set('location_5306_done', TRUE);
  $result = db_query("SELECT name FROM {variable} WHERE name LIKE 'location_settings_%'");
  while ($row = db_fetch_object($result)) {
    $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);
  }
  return $ret;
}

/**
 * I hate to waste a whole update on this, but people will need to know.
 */
function location_update_5307() {
  $ret = array();
  drupal_set_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/build/modules'),
  )));
  if (module_exists('location')) {
    module_enable(array(
      'location_user',
    ));
  }
  else {
    drupal_set_message(t("Note: Refusing to enable location_user.module, as location.module is not currently enabled."));
  }
  return $ret;
}

/**
 * In version 1.116 of location.module, committed 3/5/2008, I broke prefixed sequences.
 * This update is an attempt to repair that.
 */
function location_update_5308() {
  $ret = array();
  global $db_prefix;
  if (empty($db_prefix)) {

    // Return early if the prefix is empty.
    return $ret;
  }
  $prefix = '';
  if (is_string($db_prefix)) {
    $prefix = $db_prefix;
  }
  if (is_array($db_prefix)) {
    $prefix = $db_prefix['default'];
    if (isset($db_prefix['location'])) {
      $prefix = $db_prefix['location'];
    }
  }
  if ($prefix == '') {

    // Location is unprefixed, return early.
    return $ret;
  }
  drupal_set_message(t("Note: Location is now using {location}_lid as the sequence identifier, rather than location_lid. An attempt has been made to repair the sequence, but it is recommended that you double check to make sure this was done correctly."));
  switch ($GLOBALS['db_type']) {
    case 'mysql':
    case 'mysqli':
      db_query('LOCK TABLES {sequences} WRITE, {location} WRITE');
      $old = db_result(db_query("SELECT id FROM {sequences} WHERE name = 'location_lid'"));
      $high = db_result(db_query("SELECT MAX(lid) + 1 FROM {location}"));
      db_query("REPLACE INTO {sequences} (name, id) VALUES ('{location}_lid', %d)", max($old, $high));
      db_query('UNLOCK TABLES');
      break;
    case 'pgsql':

      //////////

      // PostgreSQL
      //
      // I do not expect anyone to ever hit this code, as with the broken sequences, they would have been getting errors
      // during normal operations ever since I broke the db_next_id() call in March 2008.
      // However, if someone DOES somehow turn up with this situation (perhaps they patched the call themselves without opening a bug)
      // then I would like to get in contact with them.
      drupal_set_message(t("Note: You are using a prefixed location table and PostgreSQL. Please post a followup to http://drupal.org/node/342163 (reopen if it is closed) and describe your table prefix situation."), 'error');

      // The initial code I *was* going to use, until I realized it wouldn't actually work because I can't guarantee what the correct name for the sequences is.
      // It all depends on how the table was created in the first place....
      // I'd rather walk people through it by hand anyway.

      /*
      // Note: This isn't transaction-safe, or cluster-aware.
      // You might have to fix sequences by yourself if you are in a clustered scenario.
      $old = db_result(db_query("SELECT nextval('location_lid_seq')"));
      $high = db_result(db_query("SELECT MAX(lid) + 1 FROM {location}"));
      // This will skip several ids because I'm not a postgresql whiz and I don't trust myself
      // not to make counting errors.
      db_query("SELECT setval('%s_seq', %d)", db_prefix_tables('{location}_lid'), max($old, $high) + 5);
      */
      break;
  }
  return $ret;
}

/**
 * Fix #42901.
 * The primary key on zipcodes is ill-advised.
 */
function location_update_5309() {
  $ret = array();
  switch ($GLOBALS['db_type']) {
    case 'mysql':
    case 'mysqli':
      $ret[] = update_sql('ALTER TABLE {zipcodes} DROP PRIMARY KEY');
      break;
    case 'pgsql':
      $ret[] = update_sql('ALTER TABLE {zipcodes} DROP CONSTRAINT {zipcodes}_pkey');
      break;
  }
  return $ret;
}

/**
 * I hate to waste a whole update on this, but people will need to know.
 */
function location_update_5310() {
  $ret = array();
  drupal_set_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/build/modules'),
  )));
  if (module_exists('location')) {
    module_enable(array(
      'location_user',
    ));
  }
  else {
    drupal_set_message(t("Note: Refusing to enable location_user.module, as location.module is not currently enabled."));
  }
  return $ret;
}

/**
 * Well, I do have 99 updates to use :P
 */
function location_update_5311() {
  $ret = array();
  drupal_set_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/build/modules'),
  )));
  if (module_exists('location')) {
    module_enable(array(
      'location_node',
    ));
  }
  else {
    drupal_set_message(t("Note: Refusing to enable location_node.module, as location.module is not currently enabled."));
  }
  return $ret;
}

Functions

Namesort descending Description
location_install Implementation of hook_install().
location_uninstall Implentation of hook_uninstall().
location_update_1 Legacy update 1. Convert tables to utf8.
location_update_2 Legacy update 2. Fix a bug with the "us" entry in the "location_configured_countries" var.
location_update_3 Legacy update 3. Allow for postgresql support by renaming the oid column, which is a reserved name on postgresql.
location_update_4 Legacy update 4. Add "lid" as the new location key.
location_update_5 Legacy update 5. Postgresql support that was missing from previous update.
location_update_5300 Location 3.x update 1. Add location specific cache table.
location_update_5301 Location 3.x update 2. Normalize the location table. This allows:
location_update_5302 Location 3.x update 3. Add genid to {location_instance}.
location_update_5303 Location 3.x update 4. Shuffle more variables around.
location_update_5304 Location 3.x update 5.
location_update_5305 Upgrade all of the settings variables to the new unified system.
location_update_5306
location_update_5307 I hate to waste a whole update on this, but people will need to know.
location_update_5308 In version 1.116 of location.module, committed 3/5/2008, I broke prefixed sequences. This update is an attempt to repair that.
location_update_5309 Fix #42901. The primary key on zipcodes is ill-advised.
location_update_5310 I hate to waste a whole update on this, but people will need to know.
location_update_5311 Well, I do have 99 updates to use :P
location_update_6 Legacy update 6. Use correct country code for Sweeden.
location_update_7 Update 7 (Location 2.x) Generalize google geocoding so you don't have to enter the api key over and over.