'For storing configured date format types.', 'fields' => array( 'type' => array( 'description' => 'The date format type, e.g. medium.', 'type' => 'varchar', 'length' => 200, 'not null' => TRUE, ), 'title' => array( 'description' => 'The human readable name of the format type.', 'type' => 'varchar', 'length' => 255, 'not null' => TRUE, ), 'locked' => array( 'description' => 'Whether or not this is a system provided format.', 'type' => 'int', 'size' => 'tiny', 'default' => 0, 'not null' => TRUE, ), ), 'primary key' => array('type'), ); $schema['date_formats'] = array( 'description' => 'For storing configured date formats.', 'fields' => array( 'dfid' => array( 'description' => 'The date format identifier.', 'type' => 'serial', 'not null' => TRUE, 'unsigned' => TRUE, ), 'format' => array( 'description' => 'The date format string.', 'type' => 'varchar', 'length' => 100, 'not null' => TRUE, ), 'type' => array( 'description' => 'The date format type, e.g. medium.', 'type' => 'varchar', 'length' => 200, 'not null' => TRUE, ), 'locked' => array( 'description' => 'Whether or not this format can be modified.', 'type' => 'int', 'size' => 'tiny', 'default' => 0, 'not null' => TRUE, ), ), 'primary key' => array('dfid'), 'unique keys' => array('formats' => array('format', 'type')), ); $schema['date_format_locale'] = array( 'description' => 'For storing configured date formats for each locale.', 'fields' => array( 'format' => array( 'description' => 'The date format string.', 'type' => 'varchar', 'length' => 100, 'not null' => TRUE, ), 'type' => array( 'description' => 'The date format type, e.g. medium.', 'type' => 'varchar', 'length' => 200, 'not null' => TRUE, ), 'language' => array( 'description' => 'A {languages}.language for this format to be used with.', 'type' => 'varchar', 'length' => 12, 'not null' => TRUE, ), ), 'primary key' => array('type', 'language'), ); return $schema; } /** * Implementation of hook_schema_alter(). We alter $schema by reference. * * @param $schema * The system-wide schema collected by drupal_get_schema(). */ function date_api_schema_alter(&$schema) { // Add field to existing schema. $schema['users']['fields']['timezone_name'] = array( 'type' => 'varchar', 'length' => 50, 'not null' => TRUE, 'default' => '', 'description' => t('Per-user timezone name.'), ); } /** * Implementation of hook_install(). */ function date_api_install() { drupal_install_schema('date_api'); // date_api_set_variables can install date_timezone and date_php4. The // date_timezone_install() function does a module_enable('date_api'). This // means that date_api_enable() can be called before date_api_install() // finishes! So the date_api schema needs to be installed before this line! date_api_set_variables(); $ret = array(); db_add_field($ret, "users", "timezone_name", array('type' => 'varchar', 'length' => 50, 'not null' => TRUE, 'default' => '')); // Make sure MYSQL does not stupidly do case-insensitive // searches and indexes on our formats. // @see http://pure.rednoize.com/2006/11/26/mysql-collation-matters-when-using-unique-indexes/ // @see http://jjinux.blogspot.com/2009/03/mysql-case-sensitivity-hell.html // @see http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html global $db_type; if ($db_type == 'mysql' || $db_type == 'mysqli') { $sql = "ALTER TABLE {date_formats} CHANGE format format VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL"; $ret[] = update_sql($sql); $sql = "ALTER TABLE {date_format_locale} CHANGE format format VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL"; $ret[] = update_sql($sql); } return $ret; } /** * Implementation of hook_enable(). */ function date_api_enable() { // When module is enabled, build the list of date formats and types. This // includes those provided by this module and other contrib modules. As the // date_format tables are created but the schema hasn't been updated, force // a refresh so we can use the schema API. drupal_get_schema('', TRUE); // Ensure schema has been installed - order of things gets out of sync because // date_api_set_variables() in date_api_install() enables the 'date_timezone' // module, which in return enables the 'date_api' module! if (db_table_exists('date_format_types')) { date_formats_rebuild(); } date_api_set_variables(); } /** * Implementation of hook_uninstall(). */ function date_api_uninstall() { $ret = array(); db_drop_field($ret, "users", "timezone_name"); cache_clear_all('date_timezone_identifiers_list', 'cache'); $variables = array( 'date_api_version', 'date_min_year', 'date_max_year', 'date_php_min_year', 'date_db_tz_support', 'date_api_use_iso8601', ); foreach ($variables as $variable) { variable_del($variable); } if (db_table_exists('views_display')) { $displays = array( 'date_nav', ); db_query("DELETE FROM {views_display} WHERE display_plugin IN ('". implode("','", $displays) ."')"); db_query("DELETE FROM {cache_views}"); } drupal_uninstall_schema('date_api'); return $ret; } /** * Implementation of hook_requirements(). * Make sure Date PHP4 is installed if running less than PHP 5.2. */ function date_api_requirements($phase) { $requirements = array(); $t = get_t(); switch ($phase) { case 'runtime': $tz_name = variable_get('date_default_timezone_name', NULL); $error = FALSE; if (version_compare(PHP_VERSION, '5.2', '<') && !module_exists('date_php4')) { $error = TRUE; $severity = REQUIREMENT_ERROR; $value = $t('The Date API module requires the Date PHP4 module for PHP versions less than 5.2.', array('@link' => url('admin/build/modules'))); } if ($error) { $requirements['date_php4'] = array( 'title' => $t('Date API requirements'), 'value' => $value, 'severity' => $severity, ); } break; case 'install': break; } return $requirements; } function date_api_update_last_removed() { return 5201; } /** * Make sure all the appropriate modules get enabled. * Repeated again just to be sure they are set. */ function date_api_update_6000() { $ret = array(); // don't attempt to upgrade if views is not yet upgraded. if (module_exists('views') && drupal_get_installed_schema_version('views', TRUE) < 6000) { $ret = array(); drupal_set_message(t('date module cannot be updated until after Views has been updated. Please return to update.php and run the remaining updates.', array('@update-php' => base_path() .'update.php?op=selection')), 'warning', FALSE); $ret['#abort'] = array('success' => FALSE, 'query' => t('date.module has updates, but cannot be updated until views.module is updated first.')); return $ret; } date_api_set_variables(); return $ret; } /** * Rebuild the theme registry and all the caches. * needed to pick up changes created by updated Views API. */ function date_api_update_6001() { $ret = array(); // don't attempt to upgrade if views is not yet upgraded. if (module_exists('views') && drupal_get_installed_schema_version('views', TRUE) < 6000) { $ret = array(); drupal_set_message(t('date module cannot be updated until after Views has been updated. Please return to update.php and run the remaining updates.', array('@update-php' => base_path() .'update.php?op=selection')), 'warning', FALSE); $ret['#abort'] = array('success' => FALSE, 'query' => t('date.module has updates, but cannot be updated until views.module is updated first.')); return $ret; } if (db_table_exists('cache_content')) { db_query('DELETE FROM {cache_content}'); } if (db_table_exists('cache_views')) { db_query('DELETE FROM {cache_views}'); } if (db_table_exists('views_object_cache')) { db_query('DELETE FROM {views_object_cache}'); } db_query("DELETE FROM {cache} where cid LIKE 'theme_registry%'"); return $ret; } /** * Create new date format tables. */ function date_api_update_6002() { $ret = array(); // don't attempt to upgrade if views is not yet upgraded. if (module_exists('views') && drupal_get_installed_schema_version('views', TRUE) < 6000) { $ret = array(); drupal_set_message(t('date module cannot be updated until after Views has been updated. Please return to update.php and run the remaining updates.', array('@update-php' => base_path() .'update.php?op=selection')), 'warning', FALSE); $ret['#abort'] = array('success' => FALSE, 'query' => t('date.module has updates, but cannot be updated until views.module is updated first.')); return $ret; } $schema['date_format_types'] = array( 'fields' => array( 'type' => array( 'type' => 'varchar', 'length' => 200, 'not null' => TRUE, ), 'title' => array( 'type' => 'varchar', 'length' => 255, 'not null' => TRUE, ), 'locked' => array( 'type' => 'int', 'size' => 'tiny', 'default' => 0, 'not null' => TRUE, ), ), 'primary key' => array('type'), ); $schema['date_format'] = array( 'fields' => array( 'dfid' => array( 'type' => 'serial', 'not null' => TRUE, 'unsigned' => TRUE, ), 'format' => array( 'type' => 'varchar', 'length' => 100, 'not null' => TRUE, ), 'type' => array( 'type' => 'varchar', 'length' => 200, 'not null' => TRUE, ), 'locked' => array( 'type' => 'int', 'size' => 'tiny', 'default' => 0, 'not null' => TRUE, ), ), 'primary key' => array('dfid'), 'unique keys' => array('format' => array('format', 'type')), ); $schema['date_format_locale'] = array( 'fields' => array( 'format' => array( 'type' => 'varchar', 'length' => 255, 'not null' => TRUE, ), 'type' => array( 'type' => 'varchar', 'length' => 200, 'not null' => TRUE, ), 'language' => array( 'type' => 'varchar', 'length' => 12, 'not null' => TRUE, ), ), 'primary key' => array('type', 'language'), ); db_create_table($ret, 'date_format_types', $schema['date_format_types']); db_create_table($ret, 'date_format', $schema['date_format']); db_create_table($ret, 'date_format_locale', $schema['date_format_locale']); return $ret; } function date_api_update_6003() { $ret = array(); db_change_field($ret, 'date_format_types', 'type', 'type', array('type' => 'varchar', 'length' => 200, 'not null' => TRUE)); db_change_field($ret, 'date_format', 'type', 'type', array('type' => 'varchar', 'length' => 200, 'not null' => TRUE)); db_change_field($ret, 'date_format', 'format', 'format', array('type' => 'varchar', 'length' => 100, 'not null' => TRUE)); db_change_field($ret, 'date_format_locale', 'type', 'type', array('type' => 'varchar', 'length' => 200, 'not null' => TRUE)); db_change_field($ret, 'date_format_locale', 'format', 'format', array('type' => 'varchar', 'length' => 100, 'not null' => TRUE)); db_drop_unique_key($ret, 'date_format', 'format'); db_add_unique_key($ret, 'date_format', 'format', array('format', 'type')); return $ret; } /** * The "date_format" table is missing on boxes having MySQL 5.0.67 installed. * There seems to be a bug in MySQL that prevents the creation of tables with * a name "date_format" and indexes with the name "format". * * We rename the table and index as a workaround. */ function date_api_update_6004() { $ret = array(); $schema['date_formats'] = array( 'description' => 'For storing configured date formats.', 'fields' => array( 'dfid' => array( 'description' => 'The date format identifier.', 'type' => 'serial', 'not null' => TRUE, 'unsigned' => TRUE, ), 'format' => array( 'description' => 'The date format string.', 'type' => 'varchar', 'length' => 100, 'not null' => TRUE, ), 'type' => array( 'description' => 'The date format type, e.g. medium.', 'type' => 'varchar', 'length' => 200, 'not null' => TRUE, ), 'locked' => array( 'description' => 'Whether or not this format can be modified.', 'type' => 'int', 'size' => 'tiny', 'default' => 0, 'not null' => TRUE, ), ), 'primary key' => array('dfid'), 'unique keys' => array('formats' => array('format', 'type')), ); // Create missing table. if (!db_table_exists('date_format')) { db_create_table($ret, 'date_formats', $schema['date_formats']); date_formats_rebuild(); } // Rename existing table and index. else { db_drop_unique_key($ret, 'date_format', 'format'); if (db_table_exists('date_formats')) { db_drop_table($ret, 'date_format'); } else { db_rename_table($ret, 'date_format', 'date_formats'); db_add_unique_key($ret, 'date_formats', 'formats', array('format', 'type')); } } return $ret; } /** * Make sure MYSQL does not stupidly do case-insensitive * searches and indexes on our formats. * @see http://pure.rednoize.com/2006/11/26/mysql-collation-matters-when-using-unique-indexes/ * @see http://jjinux.blogspot.com/2009/03/mysql-case-sensitivity-hell.html * @see http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html */ function date_api_update_6005() { global $db_type; $ret = array(); if ($db_type == 'mysql' || $db_type == 'mysqli') { $sql = "ALTER TABLE {date_formats} CHANGE format format VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL"; $ret[] = update_sql($sql); $sql = "ALTER TABLE {date_format_locale} CHANGE format format VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL"; $ret[] = update_sql($sql); } return $ret; } /** * Rename the date_format_dfid_seq to date_formats_dfid_seq, as this was missed in 6004 * and causes inserts via the UI to fail on PostgreSQL. */ function date_api_update_6006() { global $db_type; $ret = array(); if ($db_type == 'pgsql' && db_table_exists('date_format_dfid_seq')) { $sql = "ALTER TABLE {date_format}_dfid_seq RENAME TO {date_formats}_dfid_seq"; $ret[] = update_sql($sql); } return $ret; }