(defvar *default-database* nil
"Specifies the default database to be used.")
+(defun is-database-open (database)
+ (eql (database-state database) :open))
+
(defun find-database (database &key (errorp t) (db-type nil))
"The function FIND-DATABASE, given a string DATABASE, searches
amongst the connected databases for one matching the name DATABASE. If
(when (stringp connection-spec)
(setq connection-spec (string-to-list-connection-spec connection-spec)))
+ (unless (member database-type *loaded-database-types*)
+ (asdf:operate 'asdf:load-op (ensure-keyword
+ (concatenate 'string
+ (symbol-name '#:clsql-)
+ (symbol-name database-type)))))
+
(if pool
(acquire-from-pool connection-spec database-type pool)
(let* ((db-name (database-name-from-spec connection-spec database-type))
(setq result
(database-connect connection-spec database-type)))
(when result
+ (setf (slot-value result 'state) :open)
(pushnew result *connected-databases*)
(when make-default (setq *default-database* result))
result))))
(setf *connected-databases* (delete database *connected-databases*))
(when (eq database *default-database*)
(setf *default-database* (car *connected-databases*)))
- (change-class database 'closed-database)
+ (setf (slot-value database 'state) :closed)
t)))))
closed. When non-nil (this is the default value) the connection is
closed without error checking. When FORCE is nil, an error is signaled
if the database connection has been lost."
- ;; TODO: just a placeholder
- (declare (ignore database error force)))
-
+ (let ((db (etypecase database
+ (database database)
+ ((or string list)
+ (let ((db (find-database database :errorp nil)))
+ (when (null db)
+ (if (and database errorp)
+ (error 'clsql-generic-error
+ :message
+ (format nil "Unable to find database with connection-spec ~A." database))
+ (return-from reconnect nil)))
+ db)))))
+
+ (when (is-database-open db)
+ (if force
+ (ignore-errors (disconnect db))
+ (disconnect db :error nil)))
+
+ (connect (connection-spec db))))
(defun status (&optional full)