r9082: fix sequence, error-string
authorKevin M. Rosenberg <kevin@rosenberg.net>
Mon, 19 Apr 2004 01:16:25 +0000 (01:16 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Mon, 19 Apr 2004 01:16:25 +0000 (01:16 +0000)
ChangeLog
db-sqlite/sqlite-api-uffi.lisp
db-sqlite/sqlite-sql.lisp
debian/changelog
tests/test-fddl.lisp

index faa66e6cd991dfe2faacdf1289b63d87cbf8a0a1..3ea33bc2a6425a459e1b1041ef253344c0c2e101 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+18 Apr 2004 Kevin Rosenberg (kevin@rosenberg.net)
+       * Version 2.7.9
+       * db-sqlite/sqlite-sql.lisp: Fix sequence functions.
+       * db-sqlite/sqlite-api-uffi.lisp: Print error string
+       correctly.
+       
 18 Apr 2004 Kevin Rosenberg (kevin@rosenberg.net)
        * Version 2.7.7
        * doc/csql.xml, examples/clsql-tutorial.lisp: Patch for db-kind
index 77649a5d15533817e3eb68ddf56f79abf4bd1395..73a12eb107e81c2d8e6b05084dab61134d38fb17 100644 (file)
@@ -84,7 +84,8 @@
                         :code code
                         :message (if message
                                      message
-                                     (sqlite-error-string code)))))
+                                   (uffi:convert-from-cstring
+                                    (sqlite-error-string code))))))
     (unless (signal condition)
       (invoke-debugger condition))))
 
index 1f3c15855ffdbdd1b16c8ae063ec2fe8488bce40..1ea5599a468753eb2acaf689c420ab96d31f6785 100644 (file)
        (string= (subseq table-name 0 11) "_clsql_seq_")
        (subseq table-name 11)))
 
+
 (defmethod database-create-sequence (sequence-name
                                     (database sqlite-database))
   (let ((table-name (%sequence-name-to-table-name sequence-name)))
     (database-execute-command
      (concatenate 'string "CREATE TABLE " table-name
-                 " (id INTEGER PRIMARY KEY)")
+                 " (last_value integer PRIMARY KEY, increment_by integer, min_value integer, is_called char(1))")
      database)
     (database-execute-command 
-     (format nil "INSERT INTO ~A VALUES (-1)" table-name)
+     (concatenate 'string "INSERT INTO " table-name
+                 " VALUES (1,1,1,'f')")
      database)))
 
 (defmethod database-drop-sequence (sequence-name
                                   (database sqlite-database))
   (database-execute-command
-   (concatenate 'string "DROP TABLE "
-               (%sequence-name-to-table-name sequence-name)) 
+   (concatenate 'string "DROP TABLE " (%sequence-name-to-table-name sequence-name)) 
    database))
 
 (defmethod database-list-sequences ((database sqlite-database)
            database '())))
 
 (defmethod database-sequence-next (sequence-name (database sqlite-database))
-  (let ((table-name (%sequence-name-to-table-name sequence-name)))
-    (database-execute-command
-     (format nil "UPDATE ~A SET id=(SELECT id FROM ~A)+1"
-            table-name table-name)
-     database)
-    (sqlite:sqlite-last-insert-rowid (sqlite-db database))
-    (parse-integer
-     (caar (database-query (format nil "SELECT id from ~A" table-name)
-                           database nil)))))
+  (without-interrupts
+   (let* ((table-name (%sequence-name-to-table-name sequence-name))
+         (tuple
+          (car (database-query 
+                (concatenate 'string "SELECT last_value,is_called FROM " 
+                             table-name)
+                database
+                :auto))))
+     (cond
+       ((char-equal (schar (second tuple) 0) #\f)
+       (database-execute-command
+        (format nil "UPDATE ~A SET is_called='t'" table-name)
+        database)
+       (parse-integer (car tuple)))
+       (t
+       (let ((new-pos (1+ (parse-integer (car tuple)))))
+        (database-execute-command
+         (format nil "UPDATE ~A SET last_value=~D" table-name new-pos)
+         database)
+        new-pos))))))
+            
+(defmethod database-sequence-last (sequence-name (database sqlite-database))
+  (without-interrupts
+    (parse-integer 
+     (caar (database-query 
+           (concatenate 'string "SELECT last_value FROM " 
+                        (%sequence-name-to-table-name sequence-name))
+           database
+           :auto)))))
 
 (defmethod database-set-sequence-position (sequence-name
                                            (position integer)
                                            (database sqlite-database))
-  (let ((table-name (%sequence-name-to-table-name sequence-name)))
-    (database-execute-command
-     (format nil "UPDATE ~A SET id=~A" table-name position)
-     database)
-    (sqlite:sqlite-last-insert-rowid (sqlite-db database))))
-
-(defmethod database-sequence-last (sequence-name (database sqlite-database))
-  (declare (ignore sequence-name)))
+  (database-execute-command
+   (format nil "UPDATE ~A SET last_value=~A,is_called='t'" 
+          (%sequence-name-to-table-name sequence-name)
+           position)
+   database)
+  position)
 
 (defmethod database-create (connection-spec (type (eql :sqlite)))
   (declare (ignore connection-spec))
index 2cac26312dac78f9a06a6fcb9145495767fc9570..b9f28309a10dab930492376fd1b5648a67c32b79 100644 (file)
@@ -1,3 +1,9 @@
+cl-sql (2.7.9-1) unstable; urgency=low
+
+  * New upstream
+
+ -- Kevin M. Rosenberg <kmr@debian.org>  Sun, 18 Apr 2004 19:16:14 -0600
+
 cl-sql (2.7.8-1) unstable; urgency=low
 
   * New upstream
index def32cb07f957cd32f0e141323d6782b9dabb191..bafa1c55c79150e17a3214185c7363c4da4c3c9c 100644 (file)
 
 ;; not in sqlite 
 (deftest :fddl/view/4
-    (if (eql *test-database-type* :sqlite)
-        (values nil '(("Josef" "Stalin" "stalin@soviet.org")))
-        (progn (clsql:create-view [lenins-group]
-                                 :column-list '([forename] [surname] [email])
-                                 :as [select [first-name] [last-name] [email]
-                                             :from [employee]
-                                             :where [= [managerid] 1]])
-               (let ((result 
-                      (list
-                       ;; Shouldn't exist 
+    (progn (clsql:create-view [lenins-group]
+           :column-list '([forename] [surname] [email])
+           :as [select [first-name] [last-name] [email]
+           :from [employee]
+           :where [= [managerid] 1]])
+          (let ((result 
+                 (list
+                  ;; Shouldn't exist 
                        (clsql:select [forename] [surname] [email]
-                                    :from [lenins-group]
-                                    :where [= [surname] "Lenin"])
-                       ;; Should exist 
+                                    :from [lenins-group]
+                                    :where [= [surname] "Lenin"])
+                      ;; Should exist 
                        (car (clsql:select [forename] [surname] [email]
-                                         :from [lenins-group]
-                                         :where [= [surname] "Stalin"])))))
-                 (clsql:drop-view [lenins-group] :if-does-not-exist :ignore)
-                 (apply #'values result))))
+                                         :from [lenins-group]
+                                         :where [= [surname] "Stalin"])))))
+            (clsql:drop-view [lenins-group] :if-does-not-exist :ignore)
+            (apply #'values result)))
   nil ("Josef" "Stalin" "stalin@soviet.org"))
 
 ;; create an index, test for existence, drop it and test again