r9519: add prepared statements for postgresql
[clsql.git] / sql / db-interface.lisp
index 3c2f7468326d3adc9ce2c9cd67699ca1864f544d..f48d00d7dad945d90f8d502f0b3336929262589b 100644 (file)
@@ -174,16 +174,21 @@ if unable to destory."))
 
 (defgeneric database-get-type-specifier (type args database db-underlying-type)
   (:documentation "Return the type SQL type specifier as a string, for
-the given lisp type and parameters.")
-  (:method (type args database db-underlying-type)
-          (declare (ignore type args db-type))
-          (signal-no-database-error database)))
+the given lisp type and parameters."))
 
 (defgeneric database-list-tables (database &key owner)
   (:documentation "List all tables in the given database")
   (:method ((database t) &key owner)
           (declare (ignore owner))
           (signal-no-database-error database)))
+
+(defgeneric database-list-tables-and-sequences (database &key owner)
+  (:documentation "List all tables in the given database, may include seqeneces")
+  (:method ((database t) &key owner)
+          (declare (ignore owner))
+          (signal-no-database-error database))
+  (:method ((database database) &key owner)
+          (database-list-tables database :owner owner)))
  
 (defgeneric database-list-views (database &key owner)
   (:documentation "List all views in the DATABASE.")
@@ -302,6 +307,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)
@@ -316,6 +327,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))
+    (declare (ignore stmt types))
+    (signal-no-database-error database))
+  (:method (stmt types (database database))
+    (declare (ignore stmt types))
+    (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