Projet

Général

Profil

Révision b720ea3e

Ajouté par Assos Assos il y a plus de 8 ans

Weekly update of contrib modules

Voir les différences:

drupal7/sites/all/modules/date/date_api/date_api_sql.inc
23 23
  switch (Database::getConnection()->databaseType()) {
24 24
    case 'mysql':
25 25
      return "CONCAT(" . implode(",", $array) . ")";
26

  
26 27
    case 'pgsql':
27 28
      return implode(" || ", $array);
28 29
  }
29 30
}
30 31

  
31 32
/**
32
 * Helper function to do cross-database NULL replacements
33
 * Helper function to do cross-database NULL replacements.
33 34
 *
34 35
 * @param array $array
35 36
 *   An array of values to test for NULL values.
......
61 62
  switch ($side) {
62 63
    case 'r':
63 64
      return "RPAD($str, $size, '$pad')";
65

  
64 66
    default:
65 67
      return "LPAD($str, $size, '$pad')";
66 68
  }
......
69 71
/**
70 72
 * A class to manipulate date SQL.
71 73
 */
74
// @codingStandardsIgnoreStart
72 75
class date_sql_handler {
73 76
  var $db_type = NULL;
74 77
  var $date_type = DATE_DATETIME;
......
86 89
  /**
87 90
   * The object constuctor.
88 91
   */
89
  function __construct($date_type = DATE_DATETIME, $local_timezone = NULL, $offset = '+00:00') {
92
  public function __construct($date_type = DATE_DATETIME, $local_timezone = NULL, $offset = '+00:00') {
90 93
    $this->db_type = Database::getConnection()->databaseType();
91 94
    $this->date_type = $date_type;
92 95
    $this->db_timezone = 'UTC';
......
97 100
  /**
98 101
   * See if the db has timezone name support.
99 102
   */
100
  function db_tz_support($reset = FALSE) {
103
  public function db_tz_support($reset = FALSE) {
101 104
    $has_support = variable_get('date_db_tz_support', -1);
102 105
    if ($has_support == -1 || $reset) {
103 106
      $has_support = FALSE;
......
108 111
            $has_support = TRUE;
109 112
          }
110 113
          break;
114

  
111 115
        case 'pgsql':
112 116
          $test = db_query("SELECT '2008-02-15 12:00:00 UTC' AT TIME ZONE 'US/Central'")->fetchField();
113 117
          if ($test == '2008-02-15 06:00:00') {
......
136 140
   *   set a fixed offset, not a timezone, so any value other than
137 141
   *   '+00:00' should be used with caution.
138 142
   */
139
  function set_db_timezone($offset = '+00:00') {
143
  public function set_db_timezone($offset = '+00:00') {
140 144
    static $already_set = FALSE;
141 145
    $type = Database::getConnection()->databaseType();
142 146
    if (!$already_set) {
......
144 148
        case 'mysql':
145 149
          db_query("SET @@session.time_zone = '$offset'");
146 150
          break;
151

  
147 152
        case 'pgsql':
148 153
          db_query("SET TIME ZONE INTERVAL '$offset' HOUR TO MINUTE");
149 154
          break;
155

  
150 156
        case 'sqlsrv':
151 157
          // Issue #1201342, This is the wrong way to set the timezone, this
152 158
          // still needs to be fixed. In the meantime, commenting this out makes
......
161 167
  /**
162 168
   * Return timezone offset for the date being processed.
163 169
   */
164
  function get_offset($comp_date = NULL) {
170
  public function get_offset($comp_date = NULL) {
165 171
    if (!empty($this->db_timezone) && !empty($this->local_timezone)) {
166 172
      if ($this->db_timezone != $this->local_timezone) {
167 173
        if (empty($comp_date)) {
......
199 205
          case DATE_UNIX:
200 206
            $field = "FROM_UNIXTIME($field)";
201 207
            break;
208

  
202 209
          case DATE_ISO:
203 210
            $field = "STR_TO_DATE($field, '%Y-%m-%dT%T')";
204 211
            break;
212

  
205 213
          case DATE_DATETIME:
206 214
            break;
207 215
        }
208 216
        break;
217

  
209 218
      case 'pgsql':
210 219
        switch ($this->date_type) {
211 220
          case DATE_UNIX:
212 221
            $field = "$field::ABSTIME";
213 222
            break;
223

  
214 224
          case DATE_ISO:
215 225
            $field = "TO_DATE($field, 'FMYYYY-FMMM-FMDDTFMHH24:FMMI:FMSS')";
216 226
            break;
227

  
217 228
          case DATE_DATETIME:
218 229
            break;
219 230
        }
220 231
        break;
232

  
221 233
      case 'sqlite':
222 234
        switch ($this->date_type) {
223 235
          case DATE_UNIX:
224 236
            $field = "datetime($field, 'unixepoch')";
225 237
            break;
238

  
226 239
          case DATE_ISO:
227 240
          case DATE_DATETIME:
228 241
            $field = "datetime($field)";
229 242
            break;
230 243
        }
231 244
        break;
245

  
232 246
      case 'sqlsrv':
233 247
        switch ($this->date_type) {
234 248
          case DATE_UNIX:
235 249
            $field = "DATEADD(s, $field, '19700101 00:00:00:000')";
236 250
            break;
251

  
237 252
          case DATE_ISO:
238 253
          case DATE_DATETIME:
239 254
            $field = "CAST($field as smalldatetime)";
240 255
            break;
241 256
        }
242 257
        break;
258

  
243 259
      break;
244 260
    }
245 261
    // Adjust the resulting value to the right timezone/offset.
......
254 270
      switch ($this->db_type) {
255 271
        case 'mysql':
256 272
          return "ADDTIME($field, SEC_TO_TIME($offset))";
273

  
257 274
        case 'pgsql':
258
          return "($field + INTERVAL '$offset SECONDS')";;
275
          return "($field + INTERVAL '$offset SECONDS')";
276

  
259 277
        case 'sqlite':
260 278
          return "datetime($field, '$offset seconds')";
279

  
261 280
        case 'sqlsrv':
262 281
          return "DATEADD(second, $offset, $field)";
263 282
      }
......
285 304
        switch ($direction) {
286 305
          case 'ADD':
287 306
            return "DATE_ADD($field, INTERVAL $count $granularity)";
307

  
288 308
          case 'SUB':
289 309
            return "DATE_SUB($field, INTERVAL $count $granularity)";
290 310
        }
......
294 314
        switch ($direction) {
295 315
          case 'ADD':
296 316
            return "($field + INTERVAL '$count $granularity')";
317

  
297 318
          case 'SUB':
298 319
            return "($field - INTERVAL '$count $granularity')";
299 320
        }
......
302 323
        switch ($direction) {
303 324
          case 'ADD':
304 325
            return "datetime($field, '+$count $granularity')";
326

  
305 327
          case 'SUB':
306 328
            return "datetime($field, '-$count $granularity')";
307 329
        }
......
352 374
      switch ($this->db_type) {
353 375
        case 'mysql':
354 376
          return "CONVERT_TZ($field, $db_zone, $localzone)";
377

  
355 378
        case 'pgsql':
356 379
          // WITH TIME ZONE assumes the date is using the system
357 380
          // timezone, which should have been set to UTC.
......
395 418
        );
396 419
        $format = strtr($format, $replace);
397 420
        return "DATE_FORMAT($field, '$format')";
421

  
398 422
      case 'pgsql':
399 423
        $replace = array(
400 424
          'Y' => 'YYYY',
......
421 445
        );
422 446
        $format = strtr($format, $replace);
423 447
        return "TO_CHAR($field, '$format')";
448

  
424 449
      case 'sqlite':
425 450
        $replace = array(
426 451
          // 4 digit year number.
......
460 485
        );
461 486
        $format = strtr($format, $replace);
462 487
        return "strftime('$format', $field)";
488

  
463 489
      case 'sqlsrv':
464 490
        $replace = array(
465 491
          // 4 digit year number.
......
528 554
    switch (strtoupper($extract_type)) {
529 555
      case 'DATE':
530 556
        return $field;
557

  
531 558
      case 'YEAR':
532 559
        return "EXTRACT(YEAR FROM($field))";
560

  
533 561
      case 'MONTH':
534 562
        return "EXTRACT(MONTH FROM($field))";
563

  
535 564
      case 'DAY':
536 565
        return "EXTRACT(DAY FROM($field))";
566

  
537 567
      case 'HOUR':
538 568
        return "EXTRACT(HOUR FROM($field))";
569

  
539 570
      case 'MINUTE':
540 571
        return "EXTRACT(MINUTE FROM($field))";
572

  
541 573
      case 'SECOND':
542 574
        return "EXTRACT(SECOND FROM($field))";
575

  
543 576
      // ISO week number for date.
544 577
      case 'WEEK':
545 578
        switch ($this->db_type) {
......
547 580
            // WEEK using arg 3 in MySQl should return the same value as
548 581
            // Postgres EXTRACT.
549 582
            return "WEEK($field, 3)";
583

  
550 584
          case 'pgsql':
551 585
            return "EXTRACT(WEEK FROM($field))";
552 586
        }
......
556 590
            // MySQL returns 1 for Sunday through 7 for Saturday, PHP date
557 591
            // functions and Postgres use 0 for Sunday and 6 for Saturday.
558 592
            return "INTEGER(DAYOFWEEK($field) - 1)";
593

  
559 594
          case 'pgsql':
560 595
            return "EXTRACT(DOW FROM($field))";
561 596
        }
......
563 598
        switch ($this->db_type) {
564 599
          case 'mysql':
565 600
            return "DAYOFYEAR($field)";
601

  
566 602
          case 'pgsql':
567 603
            return "EXTRACT(DOY FROM($field))";
568 604
        }
......
775 811
  }
776 812

  
777 813
  /**
778
   * Create a complete datetime value out of an
779
   * incomplete array of selected values.
814
   * Create a complete date/time value out of an incomplete array of values.
780 815
   *
781 816
   * For example, array('year' => 2008, 'month' => 05) will fill
782 817
   * in the day, hour, minute and second with the earliest possible
......
795 830
        case 'empty_min':
796 831
        case 'min':
797 832
          return date_format($dates[0], 'Y-m-d H:i:s');
833

  
798 834
        case 'empty_max':
799 835
        case 'max':
800 836
          return date_format($dates[1], 'Y-m-d H:i:s');
837

  
801 838
        default:
802 839
          return;
803 840
      }
......
840 877
  }
841 878

  
842 879
  /**
843
   *  A function to test the validity of various date parts
880
   * A function to test the validity of various date parts.
844 881
   */
845 882
  function part_is_valid($value, $type) {
846 883
    if (!preg_match('/^[0-9]*$/', $value)) {
......
856 893
          return FALSE;
857 894
        }
858 895
        break;
896

  
859 897
      case 'month':
860 898
        if ($value < 0 || $value > 12) {
861 899
          return FALSE;
862 900
        }
863 901
        break;
902

  
864 903
      case 'day':
865 904
        if ($value < 0 || $value > 31) {
866 905
          return FALSE;
867 906
        }
868 907
        break;
908

  
869 909
      case 'week':
870 910
        if ($value < 0 || $value > 53) {
871 911
          return FALSE;
......
890 930
        $formats['display'] = 'Y';
891 931
        $formats['sql'] = 'Y';
892 932
        break;
933

  
893 934
      case 'month':
894 935
        $formats['display'] = date_limit_format($short, array('year', 'month'));
895 936
        $formats['sql'] = 'Y-m';
896 937
        break;
938

  
897 939
      case 'day':
898
        $formats['display'] = date_limit_format($short, array('year', 'month', 'day'));
940
        $args = array('year', 'month', 'day');
941
        $formats['display'] = date_limit_format($short, $args);
899 942
        $formats['sql'] = 'Y-m-d';
900 943
        break;
944

  
901 945
      case 'hour':
902
        $formats['display'] = date_limit_format($short, array('year', 'month', 'day', 'hour'));
946
        $args = array('year', 'month', 'day', 'hour');
947
        $formats['display'] = date_limit_format($short, $args);
903 948
        $formats['sql'] = 'Y-m-d\TH';
904 949
        break;
950

  
905 951
      case 'minute':
906
        $formats['display'] = date_limit_format($short, array('year', 'month', 'day', 'hour', 'minute'));
952
        $args = array('year', 'month', 'day', 'hour', 'minute');
953
        $formats['display'] = date_limit_format($short, $args);
907 954
        $formats['sql'] = 'Y-m-d\TH:i';
908 955
        break;
956

  
909 957
      case 'second':
910
        $formats['display'] = date_limit_format($short, array('year', 'month', 'day', 'hour', 'minute', 'second'));
958
        $args = array('year', 'month', 'day', 'hour', 'minute', 'second');
959
        $formats['display'] = date_limit_format($short, $args);
911 960
        $formats['sql'] = 'Y-m-d\TH:i:s';
912 961
        break;
962

  
913 963
      case 'week':
914 964
        $formats['display'] = 'F j Y (W)';
915 965
        $formats['sql'] = 'Y-\WW';
......
927 977
      '#type' => 'radios',
928 978
      '#default_value' => $granularity,
929 979
      '#options' => $this->date_parts(),
930
      );
980
    );
931 981
    return $form;
932 982
  }
933 983

  
......
1030 1080
    $direction = $results[1];
1031 1081
    $count = $results[2];
1032 1082
    $item = $results[3];
1033

  
1034 1083
    $replace = array(
1035 1084
      'now' => '@',
1036 1085
      '+' => 'P',
......
1051 1100
      'second' => 'S',
1052 1101
      '  ' => '',
1053 1102
      ' ' => '',
1054
      );
1055
    $prefix = in_array($item, array('hours', 'hour', 'minutes', 'minute', 'seconds', 'second')) ? 'T' : '';
1056
    return $prefix . strtr($direction, $replace) . $count . strtr($item, $replace);
1103
    );
1104
    $args = array('hours', 'hour', 'minutes', 'minute', 'seconds', 'second');
1105
    if (in_array($item, $args)) {
1106
      $prefix = 'T';
1107
    }
1108
    else {
1109
      $prefix = '';
1110
    }
1111
    $return = $prefix;
1112
    $return .= strtr($direction, $replace);
1113
    $return .= $count;
1114
    $return .= strtr($item, $replace);
1115

  
1116
    return $return;
1057 1117
  }
1058 1118

  
1059 1119
  /**
1060
   * Use the parsed values from the ISO argument to determine the
1061
   * granularity of this period.
1120
   * Granularity arguments handler.
1121
   *
1122
   * Use the parsed values from the ISO argument
1123
   * to determine the granularity of this period.
1062 1124
   */
1063 1125
  function arg_granularity($arg) {
1064 1126
    $granularity = '';
......
1137 1199
      }
1138 1200
      return array($min_date, $max_date);
1139 1201
    }
1140
     // Intercept invalid info and fall back to the current date.
1202
    // Intercept invalid info and fall back to the current date.
1141 1203
    $now = date_now();
1142 1204
    return array($now, $now);
1143 1205
  }
1144 1206
}
1207
// @codingStandardsIgnoreEnd

Formats disponibles : Unified diff