You are here

function geofield_update_7202 in Geofield 7.2

Drops unused table fields srid, accuracy and source, adds geohash field, populates it.

File

./geofield.install, line 329
Install, update and uninstall functions for the geofield module.

Code

function geofield_update_7202(&$sandbox) {
  foreach (field_info_fields() as $field_name => $field) {
    if ($field['type'] != 'geofield') {

      // Not a geofield field.
      continue;
    }
    $table_name = _field_sql_storage_tablename($field);
    $revision_table_name = _field_sql_storage_revision_tablename($field);
    db_add_field($table_name, $field_name . '_geohash', array(
      'type' => 'varchar',
      'length' => 16,
      'not null' => FALSE,
    ));
    db_add_field($revision_table_name, $field_name . '_geohash', array(
      'type' => 'varchar',
      'length' => 16,
      'not null' => FALSE,
    ));

    // Populate geohash column.
    geophp_load();
    $results = db_query('SELECT ' . $field_name . '_geom AS geom, entity_id, revision_id, delta FROM {' . $table_name . '}');
    foreach ($results as $record) {
      if (!empty($record->geom)) {
        $geom = geoPHP::load($record->geom);

        // Truncate geohash to max length.
        $geohash_truncated = substr($geom
          ->out('geohash'), 0, GEOFIELD_GEOHASH_LENGTH);
        db_update($table_name)
          ->fields(array(
          $field_name . '_geohash' => $geohash_truncated,
        ))
          ->condition('entity_id', $record->entity_id)
          ->condition('revision_id', $record->revision_id)
          ->condition('delta', $record->delta)
          ->execute();
      }
    }
    $results = db_query('SELECT ' . $field_name . '_geom AS geom, entity_id, revision_id, delta FROM {' . $revision_table_name . '}');
    foreach ($results as $record) {
      if (!empty($record->geom)) {
        $geom = geoPHP::load($record->geom);

        // Truncate geohash to max length.
        $geohash_truncated = substr($geom
          ->out('geohash'), 0, GEOFIELD_GEOHASH_LENGTH);
        db_update($revision_table_name)
          ->fields(array(
          $field_name . '_geohash' => $geohash_truncated,
        ))
          ->condition('entity_id', $record->entity_id)
          ->condition('revision_id', $record->revision_id)
          ->condition('delta', $record->delta)
          ->execute();
      }
    }
    $deleted_columns = array(
      'srid',
      'accuracy',
      'source',
    );
    foreach ($deleted_columns as $column) {
      db_drop_field($table_name, $field_name . '_' . $column);
      db_drop_field($revision_table_name, $field_name . '_' . $column);
    }
  }
}