| [ Index ] |
PHP Cross Reference of Drupal 6 (yi-drupal) |
[Summary view] [Print] [Text view]
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 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Mon Jul 9 18:01:44 2012 | Cross-referenced by PHPXref 0.7 |