(: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."))
(: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
(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
(: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."))
(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
(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 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)))
+
+(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.")
+ (: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)))
(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)))
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)
(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
(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"))
+(defvar *foreign-library-search-paths* nil
+ "A list of pathnames denoting directories where CLSQL will look
+for foreign libraries \(in addition to the default places).")
+(defun push-library-path (path)
+ "Adds the pathspec PATH \(which should denote a directory) to
+the list *FOREIGN-LIBRARY-SEARCH-PATHS*."
+ (push path *foreign-library-search-paths*))
\ No newline at end of file