From ca52ddacb16c3fde4427645a253889b763a11b6a Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Wed, 30 Jul 2014 18:42:49 +0200 Subject: [PATCH] SQLite: transform "0" timestamps to NULL, see #100. --- src/sources/sqlite.lisp | 4 +++- src/transforms.lisp | 27 ++++++++++++++++++++++++++- test/sqlite/sqlite.db | Bin 61440 -> 65536 bytes 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/sources/sqlite.lisp b/src/sources/sqlite.lisp index 7e3aef5..6eeeb6d 100644 --- a/src/sources/sqlite.lisp +++ b/src/sources/sqlite.lisp @@ -17,7 +17,9 @@ ("double precision" . pgloader.transforms::float-to-string) ("numeric" . pgloader.transforms::float-to-string) ("text" . nil) - ("bytea" . pgloader.transforms::byte-vector-to-bytea)) + ("bytea" . pgloader.transforms::byte-vector-to-bytea) + ("timestamp" . pgloader.transforms::sqlite-timestamp-to-timestamp) + ("timestamptz" . pgloader.transforms::sqlite-timestamp-to-timestamp)) "Transformation functions to use when migrating from SQLite to PostgreSQL.") ;;; diff --git a/src/transforms.lisp b/src/transforms.lisp index 040e476..51a0e77 100644 --- a/src/transforms.lisp +++ b/src/transforms.lisp @@ -24,7 +24,8 @@ empty-string-to-null set-to-enum-array right-trim - byte-vector-to-bytea)) + byte-vector-to-bytea + sqlite-timestamp-to-timestamp)) ;;; @@ -197,3 +198,27 @@ (setf (aref bytea pos) (aref hex-digits high)) (setf (aref bytea (+ pos 1)) (aref hex-digits low))) finally (return bytea))))) + +(defun sqlite-timestamp-to-timestamp (date-string-or-integer) + (declare (type (or integer simple-string) date-string-or-integer)) + (when date-string-or-integer + (cond ((and (typep date-string-or-integer 'integer) + (= 0 date-string-or-integer)) + nil) + + ((typep date-string-or-integer 'integer) + ;; a non-zero integer is a year + (format nil "~a-01-01" date-string-or-integer)) + + ((stringp date-string-or-integer) + ;; default values are sent as strings + (let ((maybe-integer + (ignore-errors (parse-integer date-string-or-integer)))) + (cond ((and maybe-integer (= 0 maybe-integer)) + nil) + + (maybe-integer + (format nil "~a-01-01" maybe-integer)) + + (t + date-string-or-integer))))))) diff --git a/test/sqlite/sqlite.db b/test/sqlite/sqlite.db index 997fffcdf39e4b1f536022d32d27f93bfc6ebfd0..f1f49f0227a6ba6162ec28bda11889818c9255a0 100644 GIT binary patch delta 223 zcmZp8z}(QlGC^8Uf`NfS0El6LXQGa=tOSGZBUN6Y5C_k92L9drd3>+=Ci2}Brz!`wYVfPx1bn83OEP3I)=C^gg83+xGF%zG=fVKi%LQ= zb5j*ufN~+8zOD)`u5ON@J|PMQIts3NDLCXbH^=iXe8dBC3KRcB2L9jt4>t=6T;-RS jU}83AGBPkU(KRsFH8xN%G_x|aurf7df5FVi%)tQwP!~EY delta 67 zcmZo@U}<>3JV9DejDdlHABbUqd!ml9v>1c#BUN6Y5Ib)?1OIORJiga_6Z!0UkMqWF O78H2OvpJr3;UfT