[ Index ]

PHP Cross Reference of Drupal 6 (yi-drupal)

title

Body

[close]

/sites/all/modules/date/ -> date_api.install (source)

   1  <?php
   2  
   3  function date_api_set_variables() {
   4    // Set absolute minimum and maximum year for dates on this site.
   5    // There is actually no maximum and minimum year in PHP 5, but a date with
   6    // a year less than 0 would result in negative ISO and DATETIME dates,
   7    // like -1250-01-01T00:00:00, which probably won't make sense or work
   8    // correctly anywhere.
   9    // 
  10    // The odd construct of using variable_get() instead of variable_set()
  11    // is so we don't accidentally write over an existing value. If
  12    // no value is set, variable_get() will set it.
  13    variable_get('date_max_year', 4000);
  14    variable_get('date_min_year', 1);
  15    variable_get('date_php_min_year', 1901);
  16  
  17    // Set an API version in a way that other modules can test for compatibility.
  18    variable_set('date_api_version', '5.2');
  19  
  20    if (version_compare(PHP_VERSION, '5.2', '<') && !module_exists('date_php4')) {
  21      module_enable(array('date_php4'));
  22    }
  23    // The timezone module was originally going to be optional
  24    // but too many things break without it.
  25    if (!module_exists('date_timezone')) {
  26      module_enable(array('date_timezone'));
  27    }
  28  
  29    // NULL is used for the default setting of date_default_timezone_name
  30    // to have a way to tell that no site timezone name has been implemented.
  31    // Otherwise, many functions would use 'UTC' incorrectly and
  32    // produce unreliable and odd results. This way functions can test for a
  33    // value and not use this if it is empty.
  34    // 
  35    // The odd construct of using variable_get() instead of variable_set()
  36    // is so we don't accidentally write over an existing value. If
  37    // no value is set, variable_get() will set it to NULL.
  38    variable_get('date_default_timezone_name', NULL);
  39  }
  40  
  41  /**
  42   * Implementation of hook_schema().
  43   */
  44  function date_api_schema() {
  45    $schema['date_format_types'] = array(
  46      'description' => 'For storing configured date format types.',
  47      'fields' => array(
  48        'type' => array(
  49          'description' => 'The date format type, e.g. medium.',
  50          'type' => 'varchar',
  51          'length' => 200,
  52          'not null' => TRUE,
  53        ),
  54        'title' => array(
  55          'description' => 'The human readable name of the format type.',
  56          'type' => 'varchar',
  57          'length' => 255,
  58          'not null' => TRUE,
  59        ),
  60        'locked' => array(
  61          'description' => 'Whether or not this is a system provided format.',
  62          'type' => 'int',
  63          'size' => 'tiny',
  64          'default' => 0,
  65          'not null' => TRUE,
  66        ),
  67      ),
  68      'primary key' => array('type'),
  69    );
  70  
  71    $schema['date_formats'] = array(
  72      'description' => 'For storing configured date formats.',
  73      'fields' => array(
  74        'dfid' => array(
  75          'description' => 'The date format identifier.',
  76          'type' => 'serial',
  77          'not null' => TRUE,
  78          'unsigned' => TRUE,
  79        ),
  80        'format' => array(
  81          'description' => 'The date format string.',
  82          'type' => 'varchar',
  83          'length' => 100,
  84          'not null' => TRUE,
  85        ),
  86        'type' => array(
  87          'description' => 'The date format type, e.g. medium.',
  88          'type' => 'varchar',
  89          'length' => 200,
  90          'not null' => TRUE,
  91        ),
  92        'locked' => array(
  93          'description' => 'Whether or not this format can be modified.',
  94          'type' => 'int',
  95          'size' => 'tiny',
  96          'default' => 0,
  97          'not null' => TRUE,
  98        ),
  99      ),
 100      'primary key' => array('dfid'),
 101      'unique keys' => array('formats' => array('format', 'type')),
 102    );
 103  
 104    $schema['date_format_locale'] = array(
 105      'description' => 'For storing configured date formats for each locale.',
 106      'fields' => array(
 107        'format' => array(
 108          'description' => 'The date format string.',
 109          'type' => 'varchar',
 110          'length' => 100,
 111          'not null' => TRUE,
 112        ),
 113        'type' => array(
 114          'description' => 'The date format type, e.g. medium.',
 115          'type' => 'varchar',
 116          'length' => 200,
 117          'not null' => TRUE,
 118        ),
 119        'language' => array(
 120          'description' => 'A {languages}.language for this format to be used with.',
 121          'type' => 'varchar',
 122          'length' => 12,
 123          'not null' => TRUE,
 124        ),
 125      ),
 126      'primary key' => array('type', 'language'),
 127    );
 128  
 129    return $schema;
 130  }
 131  
 132  /**
 133   * Implementation of hook_schema_alter(). We alter $schema by reference.
 134   *
 135   * @param $schema
 136   * The system-wide schema collected by drupal_get_schema().
 137   */
 138  function date_api_schema_alter(&$schema) {
 139    // Add field to existing schema.
 140    $schema['users']['fields']['timezone_name'] = array(
 141      'type' => 'varchar',
 142      'length' => 50,
 143      'not null' => TRUE,
 144      'default' => '',
 145      'description' => t('Per-user timezone name.'),
 146    );
 147  }
 148  
 149  /**
 150   * Implementation of hook_install().
 151   */
 152  function date_api_install() {
 153    drupal_install_schema('date_api');
 154  
 155    // date_api_set_variables can install date_timezone and date_php4.  The
 156    // date_timezone_install() function does a module_enable('date_api').  This
 157    // means that date_api_enable() can be called before date_api_install()
 158    // finishes!  So the date_api schema needs to be installed before this line!
 159    date_api_set_variables();
 160  
 161    $ret = array();
 162    db_add_field($ret, "users", "timezone_name", array('type' => 'varchar', 'length' => 50, 'not null' => TRUE, 'default' => ''));
 163  
 164    // Make sure MYSQL does not stupidly do case-insensitive 
 165    // searches and indexes on our formats.
 166    // @see http://pure.rednoize.com/2006/11/26/mysql-collation-matters-when-using-unique-indexes/
 167    // @see http://jjinux.blogspot.com/2009/03/mysql-case-sensitivity-hell.html
 168    // @see http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html
 169    global $db_type;
 170    if ($db_type == 'mysql' || $db_type == 'mysqli') {
 171      $sql = "ALTER TABLE {date_formats} CHANGE format format VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL";
 172      $ret[] = update_sql($sql);
 173      $sql = "ALTER TABLE {date_format_locale} CHANGE format format VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL";
 174      $ret[] = update_sql($sql);
 175    }
 176  
 177    return $ret;
 178  }
 179  
 180  /**
 181   * Implementation of hook_enable().
 182   */
 183  function date_api_enable() {
 184    // When module is enabled, build the list of date formats and types.  This
 185    // includes those provided by this module and other contrib modules.  As the
 186    // date_format tables are created but the schema hasn't been updated, force
 187    // a refresh so we can use the schema API. 
 188    drupal_get_schema('', TRUE);
 189    // Ensure schema has been installed - order of things gets out of sync because
 190    // date_api_set_variables() in date_api_install() enables the 'date_timezone'
 191    // module, which in return enables the 'date_api' module!
 192    if (db_table_exists('date_format_types')) {
 193      date_formats_rebuild();
 194    }
 195    date_api_set_variables();
 196  
 197  }
 198  
 199  /**
 200   * Implementation of hook_uninstall().
 201   */
 202  function date_api_uninstall() {
 203    $ret = array();
 204    db_drop_field($ret, "users", "timezone_name");
 205  
 206    cache_clear_all('date_timezone_identifiers_list', 'cache');
 207    $variables = array(
 208      'date_api_version',
 209      'date_min_year',
 210      'date_max_year',
 211      'date_php_min_year',
 212      'date_db_tz_support',
 213      'date_api_use_iso8601',
 214      );
 215    foreach ($variables as $variable) {
 216      variable_del($variable);
 217    }
 218  
 219    if (db_table_exists('views_display')) {
 220      $displays = array(
 221        'date_nav', 
 222      );
 223      db_query("DELETE FROM {views_display} WHERE display_plugin IN ('". implode("','", $displays) ."')");
 224      db_query("DELETE FROM {cache_views}");
 225    }
 226  
 227    drupal_uninstall_schema('date_api');
 228    return $ret;
 229  }
 230  
 231  /**
 232   * Implementation of hook_requirements().
 233   * Make sure Date PHP4 is installed if running less than PHP 5.2.
 234   */
 235  function date_api_requirements($phase) {
 236    $requirements = array();
 237    $t = get_t();
 238    switch ($phase) {
 239      case 'runtime':
 240        $tz_name = variable_get('date_default_timezone_name', NULL);
 241        $error = FALSE;
 242        if (version_compare(PHP_VERSION, '5.2', '<') && !module_exists('date_php4')) {
 243          $error = TRUE;
 244          $severity = REQUIREMENT_ERROR;
 245          $value = $t('The Date API module requires the <a href="@link">Date PHP4 module</a> for PHP versions less than 5.2.', array('@link' => url('admin/build/modules')));
 246        }
 247        if ($error) {
 248          $requirements['date_php4'] = array(
 249            'title' => $t('Date API requirements'),
 250            'value' => $value,
 251            'severity' => $severity,
 252            );
 253        }
 254        break;
 255       case 'install':
 256        break;
 257    }
 258    return $requirements;
 259  }
 260  
 261  function date_api_update_last_removed() {
 262    return 5201;
 263  }
 264  
 265  /**
 266   * Make sure all the appropriate modules get enabled.
 267   * Repeated again just to be sure they are set.
 268   */
 269  function date_api_update_6000() {
 270    $ret = array();
 271    // don't attempt to upgrade if views is not yet upgraded.
 272    if (module_exists('views') && drupal_get_installed_schema_version('views', TRUE) < 6000) {
 273      $ret = array();
 274      drupal_set_message(t('date module cannot be updated until after Views has been updated. Please return to <a href="@update-php">update.php</a> and run the remaining updates.', array('@update-php' => base_path() .'update.php?op=selection')), 'warning', FALSE);
 275      $ret['#abort'] = array('success' => FALSE, 'query' => t('date.module has updates, but cannot be updated until views.module is updated first.'));
 276  
 277      return $ret;
 278    }
 279    date_api_set_variables();
 280    return $ret;
 281  }
 282  
 283  /**
 284   * Rebuild the theme registry and all the caches.
 285   * needed to pick up changes created by updated Views API.
 286   */
 287  function date_api_update_6001() {
 288    $ret = array();
 289    // don't attempt to upgrade if views is not yet upgraded.
 290    if (module_exists('views') && drupal_get_installed_schema_version('views', TRUE) < 6000) {
 291      $ret = array();
 292      drupal_set_message(t('date module cannot be updated until after Views has been updated. Please return to <a href="@update-php">update.php</a> and run the remaining updates.', array('@update-php' => base_path() .'update.php?op=selection')), 'warning', FALSE);
 293      $ret['#abort'] = array('success' => FALSE, 'query' => t('date.module has updates, but cannot be updated until views.module is updated first.'));
 294  
 295      return $ret;
 296    }
 297    if (db_table_exists('cache_content')) {
 298      db_query('DELETE FROM {cache_content}');
 299    }
 300    if (db_table_exists('cache_views')) {
 301      db_query('DELETE FROM {cache_views}');
 302    }
 303    if (db_table_exists('views_object_cache')) {
 304      db_query('DELETE FROM {views_object_cache}');
 305    }    
 306    db_query("DELETE FROM {cache} where cid LIKE 'theme_registry%'");
 307    return $ret;
 308  }
 309  
 310  /**
 311   * Create new date format tables.
 312   */
 313  function date_api_update_6002() {
 314    $ret = array();
 315    // don't attempt to upgrade if views is not yet upgraded.
 316    if (module_exists('views') && drupal_get_installed_schema_version('views', TRUE) < 6000) {
 317      $ret = array();
 318      drupal_set_message(t('date module cannot be updated until after Views has been updated. Please return to <a href="@update-php">update.php</a> and run the remaining updates.', array('@update-php' => base_path() .'update.php?op=selection')), 'warning', FALSE);
 319      $ret['#abort'] = array('success' => FALSE, 'query' => t('date.module has updates, but cannot be updated until views.module is updated first.'));
 320  
 321      return $ret;
 322    }
 323  
 324    $schema['date_format_types'] = array(
 325      'fields' => array(
 326        'type' => array(
 327          'type' => 'varchar',
 328          'length' => 200,
 329          'not null' => TRUE,
 330        ),
 331        'title' => array(
 332          'type' => 'varchar',
 333          'length' => 255,
 334          'not null' => TRUE,
 335        ),
 336        'locked' => array(
 337          'type' => 'int',
 338          'size' => 'tiny',
 339          'default' => 0,
 340          'not null' => TRUE,
 341        ),
 342      ),
 343      'primary key' => array('type'),
 344    );
 345  
 346    $schema['date_format'] = array(
 347      'fields' => array(
 348        'dfid' => array(
 349          'type' => 'serial',
 350          'not null' => TRUE,
 351          'unsigned' => TRUE,
 352        ),
 353        'format' => array(
 354          'type' => 'varchar',
 355          'length' => 100,
 356          'not null' => TRUE,
 357        ),
 358        'type' => array(
 359          'type' => 'varchar',
 360          'length' => 200,
 361          'not null' => TRUE,
 362        ),
 363        'locked' => array(
 364          'type' => 'int',
 365          'size' => 'tiny',
 366          'default' => 0,
 367          'not null' => TRUE,
 368        ),
 369      ),
 370      'primary key' => array('dfid'),
 371      'unique keys' => array('format' => array('format', 'type')),
 372    );
 373  
 374    $schema['date_format_locale'] = array(
 375      'fields' => array(
 376        'format' => array(
 377          'type' => 'varchar',
 378          'length' => 255,
 379          'not null' => TRUE,
 380        ),
 381        'type' => array(
 382          'type' => 'varchar',
 383          'length' => 200,
 384          'not null' => TRUE,
 385        ),
 386        'language' => array(
 387          'type' => 'varchar',
 388          'length' => 12,
 389          'not null' => TRUE,
 390        ),
 391      ),
 392      'primary key' => array('type', 'language'),
 393    );
 394  
 395    db_create_table($ret, 'date_format_types', $schema['date_format_types']);
 396    db_create_table($ret, 'date_format', $schema['date_format']);
 397    db_create_table($ret, 'date_format_locale', $schema['date_format_locale']);
 398  
 399    return $ret;
 400  }
 401  
 402  function date_api_update_6003() {
 403    $ret = array();
 404    db_change_field($ret, 'date_format_types', 'type', 'type', array('type' => 'varchar', 'length' => 200, 'not null' => TRUE));
 405    db_change_field($ret, 'date_format', 'type', 'type', array('type' => 'varchar', 'length' => 200, 'not null' => TRUE));
 406    db_change_field($ret, 'date_format', 'format', 'format', array('type' => 'varchar', 'length' => 100, 'not null' => TRUE));
 407    db_change_field($ret, 'date_format_locale', 'type', 'type', array('type' => 'varchar', 'length' => 200, 'not null' => TRUE));
 408    db_change_field($ret, 'date_format_locale', 'format', 'format', array('type' => 'varchar', 'length' => 100, 'not null' => TRUE));
 409    db_drop_unique_key($ret, 'date_format', 'format');
 410    db_add_unique_key($ret, 'date_format', 'format', array('format', 'type'));
 411    return $ret;
 412  }
 413  
 414  /**
 415   * The "date_format" table is missing on boxes having MySQL 5.0.67 installed.
 416   * There seems to be a bug in MySQL that prevents the creation of tables with
 417   * a name "date_format" and indexes with the name "format".
 418   * 
 419   * We rename the table and index as a workaround.
 420   */
 421  function date_api_update_6004() {
 422    $ret = array();
 423  
 424    $schema['date_formats'] = array(
 425      'description' => 'For storing configured date formats.',
 426      'fields' => array(
 427        'dfid' => array(
 428          'description' => 'The date format identifier.',
 429          'type' => 'serial',
 430          'not null' => TRUE,
 431          'unsigned' => TRUE,
 432        ),
 433        'format' => array(
 434          'description' => 'The date format string.',
 435          'type' => 'varchar',
 436          'length' => 100,
 437          'not null' => TRUE,
 438        ),
 439        'type' => array(
 440          'description' => 'The date format type, e.g. medium.',
 441          'type' => 'varchar',
 442          'length' => 200,
 443          'not null' => TRUE,
 444        ),
 445        'locked' => array(
 446          'description' => 'Whether or not this format can be modified.',
 447          'type' => 'int',
 448          'size' => 'tiny',
 449          'default' => 0,
 450          'not null' => TRUE,
 451        ),
 452      ),
 453      'primary key' => array('dfid'),
 454      'unique keys' => array('formats' => array('format', 'type')),
 455    );
 456  
 457    // Create missing table.
 458    if (!db_table_exists('date_format')) {
 459      db_create_table($ret, 'date_formats', $schema['date_formats']);
 460      date_formats_rebuild();
 461    }
 462    // Rename existing table and index.
 463    else {
 464      db_drop_unique_key($ret, 'date_format', 'format');
 465      if (db_table_exists('date_formats')) {
 466        db_drop_table($ret, 'date_format');
 467      } 
 468      else {
 469        db_rename_table($ret, 'date_format', 'date_formats');
 470        db_add_unique_key($ret, 'date_formats', 'formats', array('format', 'type'));
 471      }    
 472    }
 473  
 474    return $ret;  
 475  }
 476  
 477  /**
 478   * Make sure MYSQL does not stupidly do case-insensitive 
 479   * searches and indexes on our formats.
 480   * @see http://pure.rednoize.com/2006/11/26/mysql-collation-matters-when-using-unique-indexes/
 481   * @see http://jjinux.blogspot.com/2009/03/mysql-case-sensitivity-hell.html
 482   * @see http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html
 483   */
 484  function date_api_update_6005() {
 485    global $db_type;
 486    $ret = array();
 487    if ($db_type == 'mysql' || $db_type == 'mysqli') {
 488      $sql = "ALTER TABLE {date_formats} CHANGE format format VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL";
 489      $ret[] = update_sql($sql);
 490      $sql = "ALTER TABLE {date_format_locale} CHANGE format format VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL";
 491      $ret[] = update_sql($sql);
 492    }
 493    return $ret;
 494  }
 495  
 496  /**
 497   * Rename the date_format_dfid_seq to date_formats_dfid_seq, as this was missed in 6004
 498   * and causes inserts via the UI to fail on PostgreSQL.
 499   */
 500  function date_api_update_6006() {
 501    global $db_type;
 502    $ret = array();
 503    if ($db_type == 'pgsql' && db_table_exists('date_format_dfid_seq')) {
 504      $sql = "ALTER SEQUENCE {date_format}_dfid_seq RENAME TO {date_formats}_dfid_seq";
 505      $ret[] = update_sql($sql);
 506    }
 507    return $ret;
 508  }


Generated: Mon Jul 9 18:01:44 2012 Cross-referenced by PHPXref 0.7