r9185: first effort at support field names in QUERY calls, still needs testing
[clsql.git] / db-sqlite / sqlite-sql.lisp
index 5a902c97b024c0bb52eba959890a8076548701b2..ca6124ae2bf4e1dfe0c8f46f031e752201f88d06 100644 (file)
@@ -75,7 +75,7 @@
             :error (sqlite:sqlite-error-message err))))
   t)
 
-(defmethod database-query (query-expression (database sqlite-database) result-types)
+(defmethod database-query (query-expression (database sqlite-database) result-types field-names)
   (declare (ignore result-types))              ; SQLite is typeless!
   (handler-case
       (multiple-value-bind (data row-n col-n)
            nil
            (prog1
                ;; The first col-n elements are column names.
-               (loop for i from col-n below (* (1+ row-n) col-n) by col-n
-                     collect (loop for j from 0 below col-n
-                                   collect
-                                   (#+clisp aref
-                                    #-clisp sqlite:sqlite-aref
-                                            data (+ i j))))
-               #-clisp (sqlite:sqlite-free-table data))
-             ))
+                (values
+                 (loop for i from col-n below (* (1+ row-n) col-n) by col-n
+                       collect (loop for j from 0 below col-n
+                                     collect
+                                     (#+clisp aref
+                                              #-clisp sqlite:sqlite-aref
+                                              data (+ i j))))
+                 (when field-names
+                   (loop for i from 0 below col-n
+                         collect (#+clisp aref
+                                  #-clisp sqlite:sqlite-aref
+                                  data i))))
+              #-clisp (sqlite:sqlite-free-table data))
+            ))
     (sqlite:sqlite-error (err)
-      (error 'clsql-sql-error
-            :database database
-            :expression query-expression
-            :errno (sqlite:sqlite-error-code err)
-            :error (sqlite:sqlite-error-message err)))))
+                         (error 'clsql-sql-error
+                                :database database
+                                :expression query-expression
+                                :errno (sqlite:sqlite-error-code err)
+                                :error (sqlite:sqlite-error-message err)))))
 
 #-clisp
 (defstruct sqlite-result-set
   ;; Query is copied from .table command of sqlite comamnd line utility.
   (remove-if #'(lambda (s)
                  (and (>= (length s) 11)
-                      (string= (subseq s 0 11) "_clsql_seq_")))
+                      (string-equal (subseq s 0 11) "_CLSQL_SEQ_")))
              (mapcar #'car (database-query
                             "SELECT name FROM sqlite_master WHERE type='table' UNION ALL SELECT name FROM sqlite_temp_master WHERE type='table' ORDER BY name"
                             database '()))))
 (defmethod database-list-table-indexes (table (database sqlite-database)
                                        &key (owner nil))
   (declare (ignore owner))
-  (mapcar #'car 
-         (database-query
-          (format
-           nil
-           "SELECT name FROM sqlite_master WHERE type='index' AND tbl_name='~A' UNION ALL SELECT name FROM sqlite_temp_master WHERE type='index' AND tbl_name='~A' ORDER BY name"
-           table table)
-          database nil)))
+  (let ((*print-circle* nil))
+    (mapcar #'car 
+           (database-query
+            (format
+             nil
+             "SELECT name FROM sqlite_master WHERE type='index' AND tbl_name='~A' UNION ALL SELECT name FROM sqlite_temp_master WHERE type='index' AND tbl_name='~A' ORDER BY name"
+             table table)
+            database nil))))
 
 (declaim (inline sqlite-table-info))
 (defun sqlite-table-info (table database)
        return (third field-info)))
 
 (defun %sequence-name-to-table-name (sequence-name)
-  (concatenate 'string "_clsql_seq_" (sql-escape 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_")
+       (string= (subseq table-name 0 11) "_CLSQL_SEQ_")
        (subseq table-name 11)))
 
 
     (or (string-equal ":memory:" name)
        (and (probe-file name) t))))
 
+;;; Database capabilities
+
+(defmethod db-type-has-boolean-where? ((db-type (eql :sqlite)))
+  nil)
+