X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=base%2Fdatabase.lisp;h=f3c72b65a2ead44ab85a414296ee959cbad6d2cb;hb=f716bb1161cf9e89a96945c4a444244f9d303691;hp=839204f3c57de01fde008441a32a6b1d858cf2f3;hpb=ce0e343835a040406678dff74a62d1b0cb56f317;p=clsql.git diff --git a/base/database.lisp b/base/database.lisp index 839204f..f3c72b6 100644 --- a/base/database.lisp +++ b/base/database.lisp @@ -1,7 +1,16 @@ ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*- ;;;; ************************************************************************* ;;;; -;;;; $Id: $ +;;;; $Id$ +;;;; +;;;; Base database 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) @@ -23,7 +32,9 @@ (defvar *default-database* nil "Specifies the default database to be used.") -;;; usql +(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 @@ -73,6 +84,19 @@ connection. If make-default is true, then *default-database* is set to the new connection, otherwise *default-database is not changed. If pool is t the connection will be taken from the general pool, if pool is a conn-pool object the connection will be taken from this pool." + + (unless database-type + (error "Must specify a database-type.")) + + (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)) @@ -104,6 +128,7 @@ is a conn-pool object the connection will be taken from this pool." (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)))) @@ -131,7 +156,7 @@ this pool." (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))))) @@ -154,9 +179,24 @@ error should be signaled if the existing database connection cannot be 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 error) + (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 :database db)) + (disconnect :database db :error nil))) + + (connect (connection-spec db)))) (defun status (&optional full) @@ -194,6 +234,25 @@ of full is NIL." (print-separator total-size)))) (values))) +(defun create-database (connection-spec &key database-type) + (when (stringp connection-spec) + (setq connection-spec (string-to-list-connection-spec connection-spec))) + (database-create connection-spec database-type)) + +(defun probe-database (connection-spec &key database-type) + (when (stringp connection-spec) + (setq connection-spec (string-to-list-connection-spec connection-spec))) + (database-probe connection-spec database-type)) + +(defun destroy-database (connection-spec &key database-type) + (when (stringp connection-spec) + (setq connection-spec (string-to-list-connection-spec connection-spec))) + (database-destroy connection-spec database-type)) + +(defun list-databases (connection-spec &key database-type) + (when (stringp connection-spec) + (setq connection-spec (string-to-list-connection-spec connection-spec))) + (database-list connection-spec database-type)) (defmacro with-database ((db-var connection-spec &rest connect-args) &body body) "Evaluate the body in an environment, where `db-var' is bound to the @@ -215,3 +274,4 @@ The connection is automatically closed or released to the pool on exit from the `(progv '(*default-database*) (list ,database) ,@body)) +