Révision b720ea3e
Ajouté par Assos Assos il y a plus de 8 ans
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
Weekly update of contrib modules