From 33b80bc24835fb26d7a831e99aea3fb9a805b809 Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Mon, 4 Apr 2005 00:47:21 +0000 Subject: [PATCH] r10376: 03 Apr 2005 Kevin Rosenberg * sql/time.lisp: Patch from Keith James for parsing ISO-8601 timestamps --- ChangeLog | 3 +++ debian/changelog | 6 ++++++ sql/time.lisp | 41 ++++++++++++++++++++++++----------------- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index d8f10b3..a53f07d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +03 Apr 2005 Kevin Rosenberg + * sql/time.lisp: Patch from Keith James for parsing ISO-8601 timestamps + 18 Mar 2005 Kevin Rosenberg * sql/oodml.lisp: Add missing database argument [Patch from Alan Caulkins] diff --git a/debian/changelog b/debian/changelog index f3186fb..fe22a3d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +cl-sql (3.1.8-1) unstable; urgency=low + + * New upstream + + -- Kevin M. Rosenberg Sun, 3 Apr 2005 18:42:47 -0600 + cl-sql (3.1.7-1) unstable; urgency=low * New upstream (closes:295769) diff --git a/sql/time.lisp b/sql/time.lisp index c5e78a6..e5281d6 100644 --- a/sql/time.lisp +++ b/sql/time.lisp @@ -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))) -- 2.34.1