source: sipes/modules_contrib/date/date_api.install

stableversion-3.0
Last change on this file was 177a560, checked in by José Gregorio Puentes <jpuentes@…>, 8 años ago

se agrego el directorio de modulos contribuidos de drupal

  • Propiedad mode establecida a 100755
File size: 16.5 KB
Línea 
1<?php
2
3function 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 */
44function 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 */
138function 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 */
152function 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 */
183function 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 */
202function 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 */
235function 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
261function 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 */
269function 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 */
287function 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 */
313function 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
402function 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 */
421function 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 */
484function 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 */
500function 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 TABLE {date_format}_dfid_seq RENAME TO {date_formats}_dfid_seq";
505    $ret[] = update_sql($sql);
506  }
507  return $ret;
508}
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.