Skip to content
Snippets Groups Projects
Select Git revision
  • 7.x-2.x
  • 8.x-3.x default
  • 7.x-3.x
  • 6.x-1.x
  • 7.x-1.x
  • 4.7.x-1.x
  • 5.x-1.x
  • master
  • drop
  • 8.x-3.6
  • 7.x-3.3
  • 8.x-3.5
  • 7.x-3.2
  • 8.x-3.4
  • 8.x-3.3
  • 8.x-3.2
  • 8.x-3.1
  • 8.x-3.1-rc1
  • 8.x-3.1-alpha2
  • 8.x-3.0-alpha1
  • 8.x-3.0-alpha4
  • 8.x-3.1-alpha1
  • 7.x-3.1
  • 7.x-3.0
  • 8.x-3.0
  • 8.x-3.0-beta1
  • 7.x-2.5
  • 7.x-3.0-beta2
  • 7.x-2.4
29 results

weight.install

Blame
  • Ben Davis's avatar
    Issue #2486915 by davisben: Update failed: The object 'weight_settings_pkey'...
    davisben authored
    Issue #2486915 by davisben: Update failed: The object 'weight_settings_pkey' is dependent on column 'id'
    0dd583f0
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    weight.install 13.61 KiB
    <?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}
            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;
    }