r9199: fold clsql-base and clsql-base-sys into clsql-base
[clsql.git] / base / basic-sql.lisp
index ea9245e5aa8e03b8a070e1b0ff68a20eaa096592..eaccc03315e1770b8139e0be2a10cbd27bd7a757 100644 (file)
@@ -1,8 +1,18 @@
 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
 ;;;; *************************************************************************
-;;;;  $Id: $
+;;;;
+;;;; $Id$
+;;;;
+;;;; Base SQL functions
+;;;;
+;;;; This file is part of CLSQL.
+;;;;
+;;;; CLSQL users are granted the rights to distribute and use this software
+;;;; as governed by the terms of the Lisp Lesser GNU Public License
+;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
+;;;; *************************************************************************
 
-(in-package #:clsql-base-sys)
+(in-package #:clsql-base)
 
 ;;; Query
 
@@ -20,16 +30,17 @@ one result per row. Returns a list of lists of values of the result of
 that expression and a list of field names selected in sql-exp."))
 
 (defmethod query ((query-expression string) &key (database *default-database*)
-                  (result-types nil) (flatp nil))
-  (record-sql-command query-expression database)
-  (let* ((res (database-query query-expression database result-types))
-         (res (if (and flatp (= (length
-                                 (slot-value query-expression 'selections))
-                                1))
-                  (mapcar #'car res)
-                  res)))
-    (record-sql-result res database)
-    res))
+                  (result-types :auto) (flatp nil) (field-names t))
+  (record-sql-action query-expression :query database)
+  (multiple-value-bind (rows names) (database-query query-expression database result-types
+                                                    field-names)
+    (let ((result (if (and flatp (= 1 (length (car rows))))
+                      (mapcar #'car rows)
+                    rows)))
+      (record-sql-action result :result database)
+      (if field-names
+         (values result names)
+       result))))
 
 ;;; Execute
 
@@ -44,14 +55,13 @@ pair."))
 
 (defmethod execute-command ((sql-expression string)
                             &key (database *default-database*))
-  (record-sql-command sql-expression database)
+  (record-sql-action sql-expression :command database)
   (let ((res (database-execute-command sql-expression database)))
-    (record-sql-result res database))
+    (record-sql-action res :result database))
   (values))
 
-
 (defmacro do-query (((&rest args) query-expression
-                    &key (database '*default-database*) (types nil))
+                    &key (database '*default-database*) (result-types nil))
                    &body body)
   "Repeatedly executes BODY within a binding of ARGS on the attributes
 of each record resulting from QUERY. The return value is determined by
@@ -64,7 +74,7 @@ the result of executing BODY. The default value of DATABASE is
     `(let ((,db ,database))
       (multiple-value-bind (,result-set ,columns)
           (database-query-result-set ,query-expression ,db
-                                     :full-set nil :types ,types)
+                                     :full-set nil :result-types ,result-types)
         (when ,result-set
           (unwind-protect
                (do ((,row (make-list ,columns)))
@@ -76,7 +86,7 @@ the result of executing BODY. The default value of DATABASE is
 
 (defun map-query (output-type-spec function query-expression
                  &key (database *default-database*)
-                 (types nil))
+                 (result-types nil))
   "Map the function over all tuples that are returned by the query in
 query-expression.  The results of the function are collected as
 specified in output-type-spec and returned like in MAP."
@@ -84,21 +94,21 @@ specified in output-type-spec and returned like in MAP."
               `(if (atom ,type) ,type (car ,type))))
     (case (type-specifier-atom output-type-spec)
       ((nil) 
-       (map-query-for-effect function query-expression database types))
+       (map-query-for-effect function query-expression database result-types))
       (list 
-       (map-query-to-list function query-expression database types))
+       (map-query-to-list function query-expression database result-types))
       ((simple-vector simple-string vector string array simple-array
        bit-vector simple-bit-vector base-string
        simple-base-string)
-       (map-query-to-simple output-type-spec function query-expression database types))
+       (map-query-to-simple output-type-spec function query-expression database result-types))
       (t
        (funcall #'map-query (cmucl-compat:result-type-or-lose output-type-spec t)
-              function query-expression :database database :types types)))))
+              function query-expression :database database :result-types result-types)))))
 
-(defun map-query-for-effect (function query-expression database types)
+(defun map-query-for-effect (function query-expression database result-types)
   (multiple-value-bind (result-set columns)
       (database-query-result-set query-expression database :full-set nil
-                                :types types)
+                                :result-types result-types)
     (when result-set
       (unwind-protect
           (do ((row (make-list columns)))
@@ -107,10 +117,10 @@ specified in output-type-spec and returned like in MAP."
             (apply function row))
        (database-dump-result-set result-set database)))))
                     
-(defun map-query-to-list (function query-expression database types)
+(defun map-query-to-list (function query-expression database result-types)
   (multiple-value-bind (result-set columns)
       (database-query-result-set query-expression database :full-set nil
-                                :types types)
+                                :result-types result-types)
     (when result-set
       (unwind-protect
           (let ((result (list nil)))
@@ -122,10 +132,10 @@ specified in output-type-spec and returned like in MAP."
        (database-dump-result-set result-set database)))))
 
 
-(defun map-query-to-simple (output-type-spec function query-expression database types)
+(defun map-query-to-simple (output-type-spec function query-expression database result-types)
   (multiple-value-bind (result-set columns rows)
       (database-query-result-set query-expression database :full-set t
-                                :types types)
+                                :result-types result-types)
     (when result-set
       (unwind-protect
           (if rows