Advertisement
Guest User

Untitled

a guest
Dec 23rd, 2015
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.75 KB | None | 0 0
  1. diff --git a/js/server/modules/@arangodb/aql.js b/js/server/modules/@arangodb/aql.js
  2. index 594f083..fd3dc3d 100644
  3. --- a/js/server/modules/@arangodb/aql.js
  4. +++ b/js/server/modules/@arangodb/aql.js
  5. @@ -4754,9 +4754,34 @@ function AQL_FAIL (message) {
  6.  
  7. ////////////////////////////////////////////////////////////////////////////////
  8. /// @brief helper function for date creation
  9. +/// @brief creates a UTC date from the args, but adjusts it by the given
  10. +/// timezone offset to it
  11. ////////////////////////////////////////////////////////////////////////////////
  12.  
  13. -function MAKE_DATE (args, func) {
  14. +function MAKE_DATE_LOCAL (date, value) {
  15. + var matches = /([zZ]|[+\-](\d+)(:(\d+))?)$/.exec(value);
  16. + if (! matches) {
  17. + // zulu time or no timezone specified
  18. + return date;
  19. + }
  20. +
  21. + var c = matches[1][0];
  22. + if (c === 'z' || c === 'Z') {
  23. + // zulu time
  24. + return date;
  25. + }
  26. + var offsetMinutes = parseInt(matches[2]) * 60 + parseInt(matches[4]);
  27. + if (c === '-') {
  28. + return new Date(date.getTime() - offsetMinutes * 60000);
  29. + }
  30. + return new Date(date.getTime() + offsetMinutes * 60000);
  31. +}
  32. +
  33. +////////////////////////////////////////////////////////////////////////////////
  34. +/// @brief helper function for date creation
  35. +////////////////////////////////////////////////////////////////////////////////
  36. +
  37. +function MAKE_DATE (args, forceZulu, func) {
  38. 'use strict';
  39.  
  40. var weight;
  41. @@ -4781,12 +4806,19 @@ function MAKE_DATE (args, func) {
  42. }
  43. }
  44.  
  45. - // detect invalid dates ("foo" -> "fooZ" -> getTime() == NaN)
  46. var date = new Date(args[0]);
  47. +
  48. + // detect invalid dates ("foo" -> "fooZ" -> getTime() == NaN)
  49. if (isNaN(date)) {
  50. WARN(func, INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE, func);
  51. return null;
  52. }
  53. +
  54. + if (! forceZulu) {
  55. + // we know that the date is valid already
  56. + date = MAKE_DATE_LOCAL(date, args[0]);
  57. + }
  58. +
  59. return date;
  60. }
  61.  
  62. @@ -4855,7 +4887,7 @@ function AQL_DATE_TIMESTAMP () {
  63. 'use strict';
  64.  
  65. try {
  66. - return MAKE_DATE(arguments, "DATE_TIMESTAMP").getTime();
  67. + return MAKE_DATE(arguments, true, "DATE_TIMESTAMP").getTime();
  68. }
  69. catch (err) {
  70. WARN("DATE_TIMESTAMP", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
  71. @@ -4871,7 +4903,7 @@ function AQL_DATE_ISO8601 () {
  72. 'use strict';
  73.  
  74. try {
  75. - return MAKE_DATE(arguments, "DATE_ISO8601").toISOString();
  76. + return MAKE_DATE(arguments, true, "DATE_ISO8601").toISOString();
  77. }
  78. catch (err) {
  79. WARN("DATE_ISO8601", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
  80. @@ -4887,7 +4919,7 @@ function AQL_DATE_DAYOFWEEK (value) {
  81. 'use strict';
  82.  
  83. try {
  84. - return MAKE_DATE([ value ], "DATE_DAYOFWEEK").getUTCDay();
  85. + return MAKE_DATE([ value ], false, "DATE_DAYOFWEEK").getUTCDay();
  86. }
  87. catch (err) {
  88. WARN("DATE_DAYOFWEEK", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
  89. @@ -4903,7 +4935,7 @@ function AQL_DATE_YEAR (value) {
  90. 'use strict';
  91.  
  92. try {
  93. - return MAKE_DATE([ value ], "DATE_YEAR").getUTCFullYear();
  94. + return MAKE_DATE([ value ], false, "DATE_YEAR").getUTCFullYear();
  95. }
  96. catch (err) {
  97. WARN("DATE_YEAR", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
  98. @@ -4919,7 +4951,7 @@ function AQL_DATE_MONTH (value) {
  99. 'use strict';
  100.  
  101. try {
  102. - return MAKE_DATE([ value ], "DATE_MONTH").getUTCMonth() + 1;
  103. + return MAKE_DATE([ value ], false, "DATE_MONTH").getUTCMonth() + 1;
  104. }
  105. catch (err) {
  106. WARN("DATE_MONTH", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
  107. @@ -4935,7 +4967,7 @@ function AQL_DATE_DAY (value) {
  108. 'use strict';
  109.  
  110. try {
  111. - return MAKE_DATE([ value ], "DATE_DAY").getUTCDate();
  112. + return MAKE_DATE([ value ], false, "DATE_DAY").getUTCDate();
  113. }
  114. catch (err) {
  115. WARN("DATE_DAY", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
  116. @@ -4951,7 +4983,7 @@ function AQL_DATE_HOUR (value) {
  117. 'use strict';
  118.  
  119. try {
  120. - return MAKE_DATE([ value ], "DATE_HOUR").getUTCHours();
  121. + return MAKE_DATE([ value ], false, "DATE_HOUR").getUTCHours();
  122. }
  123. catch (err) {
  124. WARN("DATE_HOUR", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
  125. @@ -4967,7 +4999,7 @@ function AQL_DATE_MINUTE (value) {
  126. 'use strict';
  127.  
  128. try {
  129. - return MAKE_DATE([ value ], "DATE_MINUTE").getUTCMinutes();
  130. + return MAKE_DATE([ value ], false, "DATE_MINUTE").getUTCMinutes();
  131. }
  132. catch (err) {
  133. WARN("DATE_MINUTE", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
  134. @@ -4983,7 +5015,7 @@ function AQL_DATE_SECOND (value) {
  135. 'use strict';
  136.  
  137. try {
  138. - return MAKE_DATE([ value ], "DATE_SECOND").getUTCSeconds();
  139. + return MAKE_DATE([ value ], false, "DATE_SECOND").getUTCSeconds();
  140. }
  141. catch (err) {
  142. WARN("DATE_SECOND", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
  143. @@ -4999,7 +5031,7 @@ function AQL_DATE_MILLISECOND (value) {
  144. 'use strict';
  145.  
  146. try {
  147. - return MAKE_DATE([ value ], "DATE_MILLISECOND").getUTCMilliseconds();
  148. + return MAKE_DATE([ value ], false, "DATE_MILLISECOND").getUTCMilliseconds();
  149. }
  150. catch (err) {
  151. WARN("DATE_MILLISECOND", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
  152. @@ -5015,7 +5047,7 @@ function AQL_DATE_DAYOFYEAR (value) {
  153. 'use strict';
  154.  
  155. try {
  156. - var date = MAKE_DATE([ value ], "DATE_DAYOFYEAR");
  157. + var date = MAKE_DATE([ value ], false, "DATE_DAYOFYEAR");
  158. var m = date.getUTCMonth();
  159. var d = date.getUTCDate();
  160. var ly = AQL_DATE_LEAPYEAR(date.getTime());
  161. @@ -5038,7 +5070,7 @@ function AQL_DATE_ISOWEEK (value) {
  162. 'use strict';
  163.  
  164. try {
  165. - var date = MAKE_DATE([ value ], "DATE_ISOWEEK");
  166. + var date = MAKE_DATE([ value ], false, "DATE_ISOWEEK");
  167. date.setUTCHours(0, 0, 0, 0);
  168. date.setUTCDate(date.getUTCDate() + 4 - (date.getUTCDay() || 7));
  169. return Math.ceil((((date - Date.UTC(date.getUTCFullYear(), 0, 1)) / 864e5) + 1) / 7);
  170. @@ -5057,7 +5089,7 @@ function AQL_DATE_LEAPYEAR (value) {
  171. 'use strict';
  172.  
  173. try {
  174. - var yr = MAKE_DATE([ value ], "DATE_LEAPYEAR").getUTCFullYear();
  175. + var yr = MAKE_DATE([ value ], false, "DATE_LEAPYEAR").getUTCFullYear();
  176. return ((yr % 4 === 0) && (yr % 100 !== 0)) || (yr % 400 === 0);
  177. }
  178. catch (err) {
  179. @@ -5073,7 +5105,7 @@ function AQL_DATE_QUARTER (value) {
  180. 'use strict';
  181.  
  182. try {
  183. - return MAKE_DATE([ value ], "DATE_QUARTER").getUTCMonth() / 3 + 1 | 0;
  184. + return MAKE_DATE([ value ], false, "DATE_QUARTER").getUTCMonth() / 3 + 1 | 0;
  185. }
  186. catch (err) {
  187. WARN("DATE_QUARTER", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
  188. @@ -5089,7 +5121,7 @@ function AQL_DATE_DAYS_IN_MONTH (value) {
  189. 'use strict';
  190.  
  191. try {
  192. - var date = MAKE_DATE([ value ], "DATE_DAYS_IN_MONTH");
  193. + var date = MAKE_DATE([ value ], false, "DATE_DAYS_IN_MONTH");
  194. var month = date.getUTCMonth() + 1;
  195. var ly = AQL_DATE_LEAPYEAR(date.getTime());
  196. return daysInMonth[month === 2 && ly ? 0 : month];
  197. @@ -5111,7 +5143,7 @@ function DATE_CALC (value, amount, unit, func) {
  198. // TODO: check if isNaN? If called by AQL FOR-loop, should query throw
  199. // and terminate immediately, or return a bunch of 'null's? If it shall
  200. // stop, then best handled in MAKE_DATE() itself I guess.
  201. - var date = MAKE_DATE([ value ], func);
  202. + var date = MAKE_DATE([ value ], false, func);
  203.  
  204. if (date === null) {
  205. WARN(func, INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
  206. @@ -5210,8 +5242,8 @@ function AQL_DATE_SUBTRACT (value, amount, unit) {
  207. function AQL_DATE_DIFF (value1, value2, unit, asFloat) {
  208. 'use strict';
  209.  
  210. - var date1 = MAKE_DATE([ value1 ], "DATE_DIFF");
  211. - var date2 = MAKE_DATE([ value2 ], "DATE_DIFF");
  212. + var date1 = MAKE_DATE([ value1 ], false, "DATE_DIFF");
  213. + var date2 = MAKE_DATE([ value2 ], false, "DATE_DIFF");
  214. // Don't return any number if either or both dates are NaN.
  215. if (date1 === null || date2 === null) {
  216. // warning issued by MAKE_DATE() already (duplicate warnings in other date function calls???)
  217. @@ -5276,8 +5308,8 @@ function AQL_DATE_COMPARE (value1, value2, unitRangeStart, unitRangeEnd) {
  218. // TODO: Should we handle leap years, so leapling birthdays occur every year?
  219. // It may result in unexpected behavior if it's used for something else but
  220. // birthday checking however. Probably best to leave compensation up to user query.
  221. - var date1 = MAKE_DATE([ value1 ], "DATE_COMPARE");
  222. - var date2 = MAKE_DATE([ value2 ], "DATE_COMPARE");
  223. + var date1 = MAKE_DATE([ value1 ], false, "DATE_COMPARE");
  224. + var date2 = MAKE_DATE([ value2 ], false, "DATE_COMPARE");
  225. if (TYPEWEIGHT(date1) === TYPEWEIGHT_NULL || TYPEWEIGHT(date2) === TYPEWEIGHT_NULL) {
  226. return null;
  227. }
  228. @@ -5326,7 +5358,7 @@ var dateMapRegExp = [
  229. function AQL_DATE_FORMAT (value, format) {
  230. 'use strict';
  231. try {
  232. - var date = MAKE_DATE([ value ], "DATE_FORMAT");
  233. + var date = MAKE_DATE([ value ], false, "DATE_FORMAT");
  234. var dateStr = date.toISOString();
  235. var yr = date.getUTCFullYear();
  236. var offset = yr < 0 || yr > 9999 ? 3 : 0;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement