r10512: 05 May 2005 Kevin Rosenberg <kevin@rosenberg.net>
[clsql.git] / sql / db-interface.lisp
index 939af1fa68ff89356e7f35bc4d8a56ca258348cf..d1466e780cae8c38cf6907a5f8ec91dad95f4821 100644 (file)
@@ -56,6 +56,10 @@ was called with the connection-spec."))
   (:method (query-expression (database t) result-types field-names)
           (declare (ignore query-expression result-types field-names))
           (signal-no-database-error database))
+  (:method (query-expression (database database) result-types field-names)
+            (declare (ignore query-expression result-types field-names))
+            (warn "database-query not implemented for database type ~A."
+                  (database-type database)))
   (:documentation "Internal generic implementation of query."))
 
 
@@ -63,6 +67,10 @@ was called with the connection-spec."))
   (:method (sql-expression (database t))
           (declare (ignore sql-expression))
           (signal-no-database-error database))
+  (:method (sql-expression (database database))
+          (declare (ignore sql-expression))
+          (warn "database-execute-command not implemented for database type ~A."
+                (database-type database)))
   (:documentation "Internal generic implementation of execute-command."))
 
 ;;; Mapping and iteration
@@ -72,6 +80,11 @@ was called with the connection-spec."))
           (declare (ignore query-expression full-set result-types))
           (signal-no-database-error database)
           (values nil nil nil))
+  (:method (query-expression (database database) &key full-set result-types)
+          (declare (ignore query-expression full-set result-types))
+          (warn "database-query-result-set not implemented for database type ~A."
+                (database-type database))
+          (values nil nil nil))
   (:documentation
    "Internal generic implementation of query mapping.  Starts the
 query specified by query-expression on the given database and returns
@@ -91,12 +104,20 @@ function should signal a sql-database-data-error."))
   (:method (result-set (database t))
           (declare (ignore result-set))
           (signal-no-database-error database))
+    (:method (result-set (database database))
+          (declare (ignore result-set))
+          (warn "database-dump-result-set not implemented for database type ~A."
+                (database-type database)))
   (:documentation "Dumps the received result-set."))
 
 (defgeneric database-store-next-row (result-set database list)
   (:method (result-set (database t) list)
           (declare (ignore result-set list))
           (signal-no-database-error database))
+    (:method (result-set (database database) list)
+          (declare (ignore result-set list))
+          (warn "database-store-next-row not implemented for database type ~A."
+                (database-type database)))
   (:documentation
    "Returns t and stores the next row in the result set in list or
 returns nil when result-set is finished."))
@@ -128,12 +149,6 @@ if not found. May signal an error if unable to communicate with database server.
     (signal-no-database-error database))
   (:documentation "Remove all data from database."))
 
-(defgeneric database-describe-table (database table)
-  (:method ((database t) table)
-    (declare (ignore table))
-    (signal-no-database-error database))
-  (:documentation "Return a list of name/type for columns in table"))
-
 (defgeneric database-destory (connection-spec type)
   (:documentation
    "Destroys a database, returns T if successfull or signals an error
@@ -178,6 +193,10 @@ the given lisp type and parameters."))
 
 (defgeneric database-list-tables (database &key owner)
   (:documentation "List all tables in the given database")
+  (:method ((database database) &key owner)
+          (declare (ignore owner))
+          (warn "database-list-tables not implemented for database type ~A."
+                (database-type database)))
   (:method ((database t) &key owner)
           (declare (ignore owner))
           (signal-no-database-error database)))
@@ -192,24 +211,40 @@ the given lisp type and parameters."))
  
 (defgeneric database-list-views (database &key owner)
   (:documentation "List all views in the DATABASE.")
+  (:method ((database database) &key owner)
+          (declare (ignore owner))
+          (warn "database-list-views not implemented for database type ~A."
+                (database-type database)))
   (:method ((database t) &key owner)
           (declare (ignore owner))
           (signal-no-database-error database)))
 
 (defgeneric database-list-indexes (database &key owner)
   (:documentation "List all indexes in the DATABASE.")
-  (:method ((database t) &key owner)
+  (:method ((database database) &key owner)
           (declare (ignore owner))
-          (signal-no-database-error database)))
+          (warn "database-list-indexes not implemented for database type ~A."
+                (database-type database)))
+  (:method ((database t) &key owner)
+    (declare (ignore owner))
+    (signal-no-database-error database)))
 
 (defgeneric database-list-table-indexes (table database &key owner)
   (:documentation "List all indexes for a table in the DATABASE.")
+  (:method (table (database database) &key owner)
+          (declare (ignore table owner))
+          (warn "database-list-table-indexes not implemented for database type ~A."
+                (database-type database)))
   (:method (table (database t) &key owner) 
           (declare (ignore table owner))
           (signal-no-database-error database)))
 
 (defgeneric database-list-attributes (table database &key owner)
   (:documentation "List all attributes in TABLE.")
+  (:method (table (database database) &key owner)
+          (declare (ignore table owner))
+          (warn "database-list-attributes not implemented for database type ~A."
+                (database-type database)))
   (:method (table (database t) &key owner)
           (declare (ignore table owner))
           (signal-no-database-error database)))
@@ -217,18 +252,30 @@ the given lisp type and parameters."))
 (defgeneric database-attribute-type (attribute table database &key owner)
   (:documentation "Return the type of ATTRIBUTE in TABLE. Returns multiple values
 of TYPE_NAME (keyword) PRECISION SCALE NULLABLE.")
+  (:method (attribute table (database database) &key owner)
+          (declare (ignore attribute table owner))
+          (warn "database-list-attribute-type not implemented for database type ~A."
+                (database-type database)))
   (:method (attribute table (database t) &key owner)
           (declare (ignore attribute table owner))
           (signal-no-database-error database)))
 
 (defgeneric database-add-attribute (table attribute database)
   (:documentation "Add the attribute to the table.")
+  (:method (table attribute (database database))
+          (declare (ignore table attribute))
+          (warn "database-add-attribute not implemented for database type ~A."
+                (database-type database)))
   (:method (table attribute (database t))
           (declare (ignore table attribute))
           (signal-no-database-error database)))
 
 (defgeneric database-rename-attribute (table oldatt newname database)
   (:documentation "Rename the attribute in the table to NEWNAME.")
+  (:method (table oldatt newname (database database))
+          (declare (ignore table oldatt newname))
+          (warn "database-rename-attribute not implemented for database type ~A."
+                (database-type database)))
   (:method (table oldatt newname (database t))
           (declare (ignore table oldatt newname))
           (signal-no-database-error database)))
@@ -307,6 +354,12 @@ of TYPE_NAME (keyword) PRECISION SCALE NULLABLE.")
           t)
   (:documentation "T [default] if database can supports transactions."))
 
+(defgeneric db-type-has-prepared-stmt? (db-type)
+  (:method ((db-type t))
+    nil)
+  (:documentation "T if database backend supports prepared statements."))
+
+
 ;;; Large objects support (Marc Battyani)
 
 (defgeneric database-create-large-object (database)
@@ -321,6 +374,38 @@ of TYPE_NAME (keyword) PRECISION SCALE NULLABLE.")
 (defgeneric database-delete-large-object (object-id database)
   (:documentation "Deletes the large object in the database"))
 
+;; Prepared statements
+
+(defgeneric database-prepare (stmt types database result-types field-names)
+  (:method (stmt types (database t) result-types field-names)
+    (declare (ignore stmt types result-types field-names))
+    (signal-no-database-error database))
+  (:method (stmt types (database database) result-types field-names)
+    (declare (ignore stmt types result-types field-names))
+    (error 'sql-database-error
+          :message
+          (format nil "DATABASE-PREPARE not implemented for ~S" database)))
+  (:documentation "Prepare a statement for later execution."))
+
+(defgeneric database-bind-parameter (prepared-stmt position value)
+  (:method ((pstmt t) position value)
+    (declare (ignore position value))
+    (error 'sql-database-error
+          :message
+          (format nil "database-bind-paremeter not implemented for ~S" pstmt)))
+  (:documentation "Bind a parameter for a prepared statement."))
+
+(defgeneric database-run-prepared (prepared-stmt)
+  (:method ((pstmt t))
+    (error 'sql-database-error
+          :message (format nil "database-run-prepared not specialized for ~S" pstmt)))
+  (:documentation "Execute a prepared statement."))
+
+(defgeneric database-free-prepared (prepared-stmt)
+  (:method ((pstmt t))
+    ;; nothing to do by default
+    nil)
+  (:documentation "Free the resources of a prepared statement."))
 
 ;; Checks for closed database
 
@@ -367,6 +452,4 @@ of TYPE_NAME (keyword) PRECISION SCALE NULLABLE.")
   (unless (is-database-open database)
     (signal-closed-database-error database)))
 
-(defgeneric describe-table (table &key database)
-  (:documentation "Describes a table, returns a list of name/type for columns in table"))