r8983: add missing methods
[clsql.git] / db-aodbc / aodbc-sql.lisp
index b55cb411e574612850f15cf23cc4dd066e260b3b..181c3edeee490678d82963ce2ef9a9f33c7f11cf 100644 (file)
@@ -16,9 +16,7 @@
 ;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
 ;;;; *************************************************************************
 
-(declaim (optimize (debug 3) (speed 3) (safety 1) (compilation-speed 0)))
-(in-package :clsql-aodbc)
-
+(in-package #:clsql-aodbc)
 
 ;; interface foreign library loading routines
 (defmethod clsql-base-sys:database-type-library-loaded ((database-type (eql :aodbc)))
   (setf (database-aodbc-conn database) nil)
   t)
 
-(defmethod database-query (query-expression (database aodbc-database) types) 
+(defmethod database-query (query-expression (database aodbc-database) result-types) 
   #+aodbc-v2
   (handler-case
       (dbi:sql query-expression :db (database-aodbc-conn database)
-              :types types)
+              :types result-types)
     (error ()
       (error 'clsql-sql-error
             :database database
   (types nil :type cons)
   (full-set nil :type boolean))
 
-(defmethod database-query-result-set (query-expression (database aodbc-database) 
-                                     &key full-set types)
+(defmethod database-query-result-set ((query-expression string)
+                                     (database aodbc-database) 
+                                     &key full-set result-types)
   #+aodbc-v2
   (handler-case 
       (multiple-value-bind (query column-names)
                   :row-count nil
                   :column-names t
                   :query t
-                  :types types
+                  :types result-types
                   )
        (values
         (make-aodbc-result-set :query query :full-set full-set 
-                               :types types)
+                               :types result-types)
         (length column-names)
         nil ;; not able to return number of rows with aodbc
         ))
              (setf (car rest) elem))
        list))))
 
+;;; Sequence functions
+
+(defun %sequence-name-to-table (sequence-name)
+  (concatenate 'string "_clsql_seq_" (sql-escape sequence-name)))
+
+(defun %table-name-to-sequence-name (table-name)
+  (and (>= (length table-name) 11)
+       (string= (subseq table-name 0 11) "_clsql_seq_")
+       (subseq table-name 11)))
+
+(defmethod database-create-sequence (sequence-name
+                                    (database aodbc-database))
+  (let ((table-name (%sequence-name-to-table sequence-name)))
+    (database-execute-command
+     (concatenate 'string "CREATE TABLE " table-name
+                 " (id int NOT NULL PRIMARY KEY AUTO_INCREMENT)")
+     database)
+    (database-execute-command 
+     (concatenate 'string "INSERT INTO " table-name
+                 " VALUES (0)")
+     database)))
+
+(defmethod database-drop-sequence (sequence-name
+                                  (database aodbc-database))
+  (database-execute-command
+   (concatenate 'string "DROP TABLE " (%sequence-name-to-table sequence-name)) 
+   database))
+
+(defmethod database-list-sequences ((database aodbc-database)
+                                    &key (owner nil))
+  (declare (ignore owner))
+  (mapcar #'(lambda (s) (%table-name-to-sequence-name (car s)))
+          (database-query "SHOW TABLES LIKE '%clsql_seq%'" 
+                          database nil)))
+
+(defmethod database-set-sequence-position (sequence-name
+                                           (position integer)
+                                           (database aodbc-database))
+  (database-execute-command
+   (format nil "UPDATE ~A SET id=~A" (%sequence-name-to-table sequence-name)
+           position)
+   database)
+  position)
+
+(defmethod database-sequence-next (sequence-name (database aodbc-database))
+  (warn "Not implemented."))
+
+(defmethod database-sequence-last (sequence-name (database aodbc-database))
+  (declare (ignore sequence-name)))
+
+(defmethod database-create (connection-spec (type (eql :aodbc)))
+  (warn "Not implemented."))
+
+(defmethod database-destroy (connection-spec (type (eql :aodbc)))
+  (warn "Not implemented."))
+
+(defmethod database-probe (connection-spec (type (eql :aodbc)))
+  (warn "Not implemented."))
+
 #+ignore                      
 (when (clsql-base-sys:database-type-library-loaded :aodbc)
   (clsql-base-sys:initialize-database-type :database-type :aodbc))