r10376: 03 Apr 2005 Kevin Rosenberg <kevin@rosenberg.net>
authorKevin M. Rosenberg <kevin@rosenberg.net>
Mon, 4 Apr 2005 00:47:21 +0000 (00:47 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Mon, 4 Apr 2005 00:47:21 +0000 (00:47 +0000)
        * sql/time.lisp: Patch from Keith James for parsing ISO-8601 timestamps

ChangeLog
debian/changelog
sql/time.lisp

index d8f10b3c6f2a614ec30061c6ba2d04e9300697cc..a53f07de7708d5003a718f650cf198bdb26ad9c0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+03 Apr 2005 Kevin Rosenberg <kevin@rosenberg.net>
+       * sql/time.lisp: Patch from Keith James for parsing ISO-8601 timestamps
+       
 18 Mar 2005 Kevin Rosenberg <kevin@rosenberg.net>
        * sql/oodml.lisp: Add missing database argument [Patch from
        Alan Caulkins]
index f3186fb73da3c63449cc0a3fa45980eb882b23dc..fe22a3d42e43331159203333d2fb977c7d01f328 100644 (file)
@@ -1,3 +1,9 @@
+cl-sql (3.1.8-1) unstable; urgency=low
+
+  * New upstream
+
+ -- Kevin M. Rosenberg <kmr@debian.org>  Sun,  3 Apr 2005 18:42:47 -0600
+
 cl-sql (3.1.7-1) unstable; urgency=low
 
   * New upstream (closes:295769)
index c5e78a6738bc7d64122b468b653afe690d24ad3f..e5281d6b74720d353aef9c46bd2372d5ef267840 100644 (file)
@@ -1085,25 +1085,32 @@ formatted date string."
 
 
 (defun syntax-parse-iso-8601 (string)
-  (let (year month day hour minute second gmt-sec-offset)
+  ;; use strlen to determine if fractional seconds are present in timestamp
+  (let ((strlen (length string))
+       year month day hour minute second gmt-sec-offset)
     (handler-case
         (progn
-          (setf year   (parse-integer (subseq string 0 4))
-                month  (parse-integer (subseq string 5 7))
-                day    (parse-integer (subseq string 8 10))
-                hour   (if (<= 13 (length string))
-                           (parse-integer (subseq string 11 13))
-                           0)
-                minute (if (<= 16 (length string))
-                           (parse-integer (subseq string 14 16))
-                           0)
-                second (if (<= 19 (length string))
-                           (parse-integer (subseq string 17 19))
-                           0)
-                gmt-sec-offset (if (<= 22 (length string))
-                                   (* 60 60
-                                      (parse-integer (subseq string 19 22)))
-                                   0))
+         (setf year           (parse-integer string :start 0 :end 4)
+                month          (parse-integer string :start 5 :end 7)
+                day            (parse-integer string :start 8 :end 10)
+                hour           (if (<= 13 strlen)
+                                   (parse-integer string :start 11 :end 13)
+                                  0)
+                minute         (if (<= 16 strlen)
+                                   (parse-integer string :start 14 :end 16)
+                                  0)
+                second         (if (<= 19 strlen)
+                                   (parse-integer string :start 17 :end 19)
+                                  0)
+                gmt-sec-offset (if (<= 20 strlen)
+                                   (let ((skip-to (or (position #\+ string :start 19)
+                                                      (position #\- string :start 19))))
+                                     (if skip-to
+                                         (* 60 60
+                                            (parse-integer string :start skip-to
+                                                          :end (+ skip-to 3)))
+                                        0))
+                                  0))
           (unless (< 0 year)
             (error 'iso-8601-syntax-error
                    :bad-component '(year . 0)))