You are here

weight.install in Weight 7.2

Same filename and directory in other branches
  1. 5 weight.install
  2. 6 weight.install
  3. 7.3 weight.install
  4. 7 weight.install

File

weight.install
View source
<?php

/**
 * Implements hook_schema().
 */
function weight_schema() {
  $schema['weight_settings'] = array(
    'description' => 'Table for storing Weight configuration',
    'fields' => array(
      'type' => array(
        'type' => 'varchar',
        'length' => 32,
        'not null' => TRUE,
        'default' => '',
      ),
      'weight_enabled' => array(
        'type' => 'int',
        'size' => 'tiny',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0,
      ),
      'weight_range' => array(
        'type' => 'int',
        'size' => 'tiny',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 20,
      ),
      'menu_weight' => array(
        'type' => 'int',
        'size' => 'tiny',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0,
      ),
      'weight_default' => array(
        'type' => 'int',
        'size' => 'tiny',
        'unsigned' => FALSE,
        'not null' => TRUE,
        'default' => 0,
      ),
      'sync_translations' => array(
        'type' => 'int',
        'size' => 'tiny',
        'unsigned' => FALSE,
        'not null' => TRUE,
        'default' => 0,
      ),
    ),
    'primary key' => array(
      'type',
    ),
    'foreign keys' => array(
      'node_type' => array(
        'table' => 'node_type',
        'columns' => array(
          'type' => 'type',
        ),
      ),
    ),
  );
  $schema['weight_weights'] = array(
    'fields' => array(
      'entity_id' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
      ),
      'entity_type' => array(
        'type' => 'varchar',
        'length' => 32,
        'not null' => TRUE,
      ),
      'weight' => array(
        'type' => 'int',
        'not null' => TRUE,
        'default' => 0,
      ),
    ),
    'primary key' => array(
      'entity_id',
    ),
  );
  return $schema;
}

/**
 * Initial schema for update 7200().
 */
function weight_schema_7200() {
  $schema['weight_settings'] = array(
    'description' => 'Table for storing Weight configuration',
    'fields' => array(
      'type' => array(
        'type' => 'varchar',
        'length' => 32,
        'not null' => TRUE,
        'default' => '',
      ),
      'weight_enabled' => array(
        'type' => 'int',
        'size' => 'tiny',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0,
      ),
      'weight_range' => array(
        'type' => 'int',
        'size' => 'tiny',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 20,
      ),
      'menu_weight' => array(
        'type' => 'int',
        'size' => 'tiny',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0,
      ),
      'weight_default' => array(
        'type' => 'int',
        'size' => 'tiny',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0,
      ),
    ),
    'primary key' => array(
      'type',
    ),
    'foreign keys' => array(
      'node_type' => array(
        'table' => 'node_type',
        'columns' => array(
          'type' => 'type',
        ),
      ),
    ),
  );

  // n.b. weight_weights was not in the original schema, but some of the
  // subsequent update hooks were written as if it were, so it's simpler
  // to include it.
  $schema['weight_weights'] = array(
    'fields' => array(
      'entity_id' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
      ),
      'entity_type' => array(
        'type' => 'varchar',
        'length' => 32,
        'not null' => TRUE,
      ),
      'weight' => array(
        'type' => 'int',
        'not null' => TRUE,
        'default' => 0,
      ),
    ),
    'primary key' => array(
      'entity_id',
    ),
  );
  return $schema;
}

/**
 * Insert existing settings into {weight_settings}.
 */
function weight_update_7200() {
  $types = node_type_get_names();
  $weight_types = variable_get('weight_node_types', array());
  $range = variable_get('weight_range', 20);
  $menu_weight = (int) variable_get('weight_use_menu', 0);
  $default = (int) variable_get('weight_default', 0);

  // This is essentially the same as calling drupal_install_schema(), but
  // using weight_schema_7200() rather than the default weight_schema().
  // This is important for processing subsequent table updates.
  $schema = weight_schema_7200();
  _drupal_schema_initialize($schema, 'weight');
  foreach ($schema as $name => $table) {
    db_create_table($name, $table);
  }

  // If there are no content types, there is nothing to convert.
  if (empty($types)) {
    return;
  }
  foreach ($types as $type => $name) {
    if (in_array($type, $weight_types)) {
      $enabled = 1;
    }
    else {
      $enabled = 0;
    }
    $query = db_insert('weight_settings')
      ->fields(array(
      'type' => $type,
      'weight_enabled' => $enabled,
      'weight_range' => $range,
      'menu_weight' => $menu_weight,
      'weight_default' => $default,
    ))
      ->execute();
  }
}

/**
 * We don't need weight_update_7201 anymore.
 *
 * This originally created a new field_weight and associated
 * instances, but this approach is deprecated. Updates 7206
 * and 7207 will clean up any remnants of this.
 */

/**
 * Move existing node weights to weight_weights table and restore sticky values.
 */
function weight_update_7202(&$sandbox) {
  if (!isset($sandbox['progress'])) {
    $sandbox['progress'] = 0;
    $sandbox['last'] = 0;
    $sandbox['max'] = db_query("SELECT COUNT(nid) FROM {node}")
      ->fetchField();
  }
  $query = db_select('node', 'n');
  $query
    ->fields('n', array(
    'nid',
    'type',
    'sticky',
  ))
    ->condition('n.nid', $sandbox['last'], '>')
    ->orderBy('n.nid')
    ->range(0, 200);
  $nodes = $query
    ->execute();
  foreach ($nodes as $node) {
    $values = _weight_update_7202_decode($node->sticky);
    if ($values['weight'] != NULL) {
      $query = db_insert('weight_weights')
        ->fields(array(
        'entity_id' => $node->nid,
        'entity_type' => 'node',
        'weight' => $values['weight'],
      ))
        ->execute();
    }
    db_update('node')
      ->fields(array(
      'sticky' => $values['sticky'],
    ))
      ->condition('nid', $node->nid)
      ->execute();
    db_update('node_revision')
      ->fields(array(
      'sticky' => $values['sticky'],
    ))
      ->condition('nid', $node->nid)
      ->execute();
    $sandbox['progress']++;
    $sandbox['last'] = $node->nid;
  }
  $sandbox['#finished'] = empty($sandbox['max']) ? 1 : $sandbox['progress'] / $sandbox['max'];
}

/**
 * Remove existing variables.
 */
function weight_update_7203() {
  variable_del('weight_node_types');
  variable_del('weight_range');
  variable_del('weight_use_menu');
  variable_del('weight_default');
  variable_del('weight_label');
  variable_del('weight_position');
}

/**
* Alter database to allow for negative default weights.
*/
function weight_update_7204() {
  $spec = array(
    'type' => 'int',
    'size' => 'tiny',
    'unsigned' => FALSE,
    'not null' => TRUE,
    'default' => 0,
  );
  db_change_field('weight_settings', 'weight_default', 'weight_default', $spec);
}

/**
 * Set default weights for enabled types.
 */
function weight_update_7205(&$sandbox) {
  if (!db_table_exists('weight_weights')) {
    $types = array();
    $defaults = array();
    $result = db_query('SELECT type, weight_default FROM {weight_settings} WHERE weight_enabled=1');
    foreach ($result as $row) {
      $types[] = $row->type;
      $defaults[$row->type] = $row->weight_default;
    }
    if (!empty($types)) {
      if (!isset($sandbox['progress'])) {
        if (!db_table_exists('weight_weights')) {
          db_create_table('weight_weights', drupal_get_schema_unprocessed('weight', 'weight_weights'));
        }
        $sandbox['progress'] = 0;
        $sandbox['last'] = 0;
        $sandbox['max'] = db_query("SELECT COUNT(nid) FROM {node} WHERE type IN (:types)", array(
          ':types' => $types,
        ))
          ->fetchField();
      }
      $query = db_select('node', 'n');
      $query
        ->fields('n', array(
        'nid',
        'type',
      ))
        ->condition('n.type', $types, 'IN')
        ->condition('n.nid', $sandbox['last'], '>')
        ->orderBy('n.nid')
        ->range(0, 200);
      $nodes = $query
        ->execute();
      foreach ($nodes as $node) {
        db_insert('weight_weights')
          ->fields(array(
          'entity_id' => $node->nid,
          'entity_type' => 'node',
          'weight' => $defaults[$node->type],
        ))
          ->execute();
        $sandbox['progress']++;
        $sandbox['last'] = $node->nid;
      }
      $sandbox['#finished'] = empty($sandbox['max']) ? 1 : $sandbox['progress'] / $sandbox['max'];
    }
  }
}

/**
 * Move existing node weights to weight_weights from field_data_weight.
 * @see weight_update_7201().
 */
function weight_update_7206(&$sandbox) {
  if (db_table_exists('field_data_weight')) {
    if (!isset($sandbox['progress'])) {
      $sandbox['progress'] = 0;
      $sandbox['last'] = 0;
      $sandbox['max'] = db_query("SELECT COUNT(entity_id) FROM {field_data_weight}\n        WHERE language=:lang", array(
        ':lang' => LANGUAGE_NONE,
      ))
        ->fetchField();
    }
    $query = db_select('field_data_weight', 'fw');
    $query
      ->fields('fw', array(
      'entity_id',
      'weight_value',
    ))
      ->condition('fw.language', LANGUAGE_NONE)
      ->condition('fw.entity_id', $sandbox['last'], '>')
      ->orderBy('fw.entity_id')
      ->range(0, 200);
    $nodes = $query
      ->execute();
    foreach ($nodes as $node) {
      db_update('weight_weights')
        ->fields(array(
        'entity_id' => $node->entity_id,
        'entity_type' => 'node',
        'weight' => $node->weight_value,
      ))
        ->condition('entity_id', $node->entity_id)
        ->execute();
      $sandbox['progress']++;
      $sandbox['last'] = $node->entity_id;
    }
    $sandbox['#finished'] = empty($sandbox['max']) ? 1 : $sandbox['progress'] / $sandbox['max'];
  }
}

/**
 * Remove unneeded weight field.
 * @see weight_update_7201().
 */
function weight_update_7207() {
  if (field_info_field('weight')) {
    field_delete_field('weight');
    field_sync_field_status();
    $limit = variable_get('field_purge_batch_size', 10);
    field_purge_batch($limit);
  }
}

/**
 * Remove unused id column from weight_settings and add primary key to type.
 */
function weight_update_7208() {
  db_drop_field('weight_settings', 'id');
  db_add_primary_key('weight_settings', array(
    'type',
  ));
}

/**
 * Add sync_translations column to weight_settings.
 */
function weight_update_7209() {

  // Due to previous schema mix-ups in update 7200, this field may already exist.
  if (db_field_exists('weight_settings', 'sync_translations')) {
    return;
  }
  $spec = array(
    'type' => 'int',
    'size' => 'tiny',
    'unsigned' => FALSE,
    'not null' => TRUE,
    'default' => 0,
  );
  db_add_field('weight_settings', 'sync_translations', $spec);
}

/**
 * Ensure all nodes of enabled types have a weight.
 */
function weight_update_7210(&$sandbox) {
  $types = array();
  $defaults = array();
  $result = db_query('SELECT type, weight_default FROM {weight_settings} WHERE weight_enabled=1');
  foreach ($result as $row) {
    $types[] = $row->type;
    $defaults[$row->type] = $row->weight_default;
  }
  if (!empty($types)) {

    // Form the base query.
    $query = db_select('node', 'n');
    $query
      ->leftJoin('weight_weights', 'w', "w.entity_type = 'node' AND w.entity_id = n.nid");
    $query
      ->fields('n', array(
      'nid',
      'type',
    ))
      ->condition('n.type', $types, 'IN')
      ->isNull('w.entity_id');

    // The first time through, establish the total number of nodes.
    if (!isset($sandbox['progress'])) {
      $sandbox['progress'] = 0;
      $sandbox['last'] = 0;
      $sandbox['max'] = $query
        ->countQuery()
        ->execute()
        ->fetchField();
    }

    // Add the query conditions for the current iteration only.
    $query
      ->condition('n.nid', $sandbox['last'], '>')
      ->orderBy('n.nid')
      ->range(0, 200);
    $nodes = $query
      ->execute();
    foreach ($nodes as $node) {
      db_insert('weight_weights')
        ->fields(array(
        'entity_id' => $node->nid,
        'entity_type' => 'node',
        'weight' => $defaults[$node->type],
      ))
        ->execute();
      $sandbox['progress']++;
      $sandbox['last'] = $node->nid;
    }
    $sandbox['#finished'] = empty($sandbox['max']) ? 1 : $sandbox['progress'] / $sandbox['max'];
  }
}

/**
 * Make sure all content types have an entry in {weight_settings}.
 */
function weight_update_7211() {
  $types = node_type_get_names();
  $settings = _weight_get_settings();
  $range = variable_get('weight_range', 20);
  $menu_weight = (int) variable_get('weight_use_menu', 0);
  $default = (int) variable_get('weight_default', 0);
  foreach ($types as $type => $name) {
    if (!array_key_exists($type, $settings)) {
      $query = db_insert('weight_settings')
        ->fields(array(
        'type' => $type,
        'weight_enabled' => 0,
        'weight_range' => $range,
        'menu_weight' => $menu_weight,
        'weight_default' => $default,
      ))
        ->execute();
    }
  }
}

/**
 * Remove unused id column from {weight_settings}.
 */
function weight_update_7212() {
  if (db_field_exists('weight_settings', 'id')) {
    db_add_primary_key('weight_settings');
    db_drop_field('weight_settings', 'id');
    db_add_primary_key('weight_settings', array(
      'type',
    ));
  }
}

/**
 * Decode weight from sticky column.
 */
function _weight_update_7202_decode($sticky) {
  $values = array();
  if ($sticky == 0 || $sticky == 1) {
    $values['weight'] = NULL;
    $values['sticky'] = $sticky;
  }
  elseif ($sticky > 0) {
    $values['weight'] = 100 - $sticky;
    $values['sticky'] = 1;
  }
  else {
    $values['weight'] = -($sticky + 100);
    $values['sticky'] = 0;
  }
  return $values;
}

Functions

Namesort descending Description
weight_schema Implements hook_schema().
weight_schema_7200 Initial schema for update 7200().
weight_update_7200 Insert existing settings into {weight_settings}.
weight_update_7202 Move existing node weights to weight_weights table and restore sticky values.
weight_update_7203 Remove existing variables.
weight_update_7204 Alter database to allow for negative default weights.
weight_update_7205 Set default weights for enabled types.
weight_update_7206 Move existing node weights to weight_weights from field_data_weight.
weight_update_7207 Remove unneeded weight field.
weight_update_7208 Remove unused id column from weight_settings and add primary key to type.
weight_update_7209 Add sync_translations column to weight_settings.
weight_update_7210 Ensure all nodes of enabled types have a weight.
weight_update_7211 Make sure all content types have an entry in {weight_settings}.
weight_update_7212 Remove unused id column from {weight_settings}.
_weight_update_7202_decode Decode weight from sticky column.