r1857: Completed connection pool.
[clsql.git] / sql / sql.cl
index 2d8ab3f239e6aac3035173992c0ab426b9d2f77e..6d2d8bb1a8b0478b35ff640d931a658824c88248 100644 (file)
@@ -8,7 +8,7 @@
 ;;;;                 Original code by Pierre R. Mai 
 ;;;; Date Started:  Feb 2002
 ;;;;
-;;;; $Id: sql.cl,v 1.8 2002/03/29 07:42:10 kevin Exp $
+;;;; $Id: sql.cl,v 1.14 2002/05/01 20:22:16 marc.battyani Exp $
 ;;;;
 ;;;; This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
 ;;;; and Copyright (c) 1999-2001 by Pierre R. Mai
 (defvar *loaded-database-types* nil
   "Contains a list of database types which have been defined/loaded.")
 
+(defmethod database-type-load-foreign :after (database-type)
+  (when (database-type-library-loaded database-type)
+     (pushnew database-type *loaded-database-types*)))
+
 (defun reload-database-types ()
   "Reloads any foreign code for the loaded database types after a dump."
   (mapc #'database-type-load-foreign *loaded-database-types*))
 
-
 (defvar *default-database-type* nil
   "Specifies the default type of database.  Currently only :mysql is
 supported.")
@@ -73,36 +76,6 @@ initialized, as indicated by `*initialized-database-types*'."
 (defvar *default-database* nil
   "Specifies the default database to be used.")
 
-(defclass database ()
-  ((name :initarg :name :reader database-name))
-  (:documentation
-   "This class is the supertype of all databases handled by CLSQL."))
-
-(defmethod print-object ((object database) stream)
-  (print-unreadable-object (object stream :type t :identity t)
-    (write-string (if (slot-boundp object 'name)
-                     (database-name object)
-                     "<unbound>")
-                 stream)))
-
-(defclass closed-database ()
-  ((name :initarg :name :reader database-name))
-  (:documentation
-   "This class represents all databases after they are closed via
-`disconnect'."))
-
-(defmethod print-object ((object closed-database) stream)
-  (print-unreadable-object (object stream :type t :identity t)
-    (write-string (if (slot-boundp object 'name)
-                     (database-name object)
-                     "<unbound>")
-                 stream)))
-
-(defun signal-closed-database-error (database)
-  (cerror "Ignore this error and return nil."
-         'clsql-closed-error
-         :database database))
-
 (defun find-database (database &optional (errorp t))
   (etypecase database
     (database
@@ -120,56 +93,59 @@ initialized, as indicated by `*initialized-database-types*'."
 
 (defun connect (connection-spec
                &key (if-exists *connect-if-exists*)
-               (database-type *default-database-type*))
+               (database-type *default-database-type*)
+               (pool nil))
   "Connects to a database of the given database-type, using the type-specific
 connection-spec.  if-exists is currently ignored."
   (let* ((db-name (database-name-from-spec connection-spec database-type))
-        (old-db (find-database db-name nil))
+        (old-db (unless (eq if-exists :new) (find-database db-name nil)))
         (result nil))
-    (if old-db
-       (case if-exists
-         (:new
-          (setq result
-                (database-connect connection-spec database-type)))
-         (:warn-new
-          (setq result
-                (database-connect connection-spec database-type))
-          (warn 'clsql-exists-warning :old-db old-db :new-db result))
-         (:error
-          (restart-case
-              (error 'clsql-exists-error :old-db old-db)
-            (create-new ()
-              :report "Create a new connection."
-              (setq result
-                    (database-connect connection-spec database-type)))
-            (use-old ()
-              :report "Use the existing connection."
-              (setq result old-db))))
-         (:warn-old
-          (setq result old-db)
-          (warn 'clsql-exists-warning :old-db old-db :new-db old-db))
-         (:old
-          (setq result old-db)))
+    (if pool
+       (setq result (acquire-from-pool connection-spec database-type))
+      (if old-db
+         (case if-exists
+;          (:new
+;           (setq result
+;             (database-connect connection-spec database-type)))
+           (:warn-new
+            (setq result
+              (database-connect connection-spec database-type))
+            (warn 'clsql-exists-warning :old-db old-db :new-db result))
+           (:error
+            (restart-case
+                (error 'clsql-exists-error :old-db old-db)
+              (create-new ()
+                  :report "Create a new connection."
+                (setq result
+                  (database-connect connection-spec database-type)))
+              (use-old ()
+                  :report "Use the existing connection."
+                (setq result old-db))))
+           (:warn-old
+            (setq result old-db)
+            (warn 'clsql-exists-warning :old-db old-db :new-db old-db))
+           (:old
+            (setq result old-db)))
        (setq result
-             (database-connect connection-spec database-type)))
+         (database-connect connection-spec database-type))))
     (when result
       (pushnew result *connected-databases*)
       (setq *default-database* result)
       result)))
 
 
-
-(defun disconnect (&key (database *default-database*))
+(defun disconnect (&key (database *default-database*)
+                  (pool nil))
   "Closes the connection to database. Resets *default-database* if that
 database was disconnected and only one other connection exists."
-  (when (database-disconnect database)
-    (setq *connected-databases* (delete database *connected-databases*))
-    (when (eq database *default-database*)
-      (setq *default-database* (car *connected-databases*)))
-    (change-class database 'closed-database)
-    t))
-
-
+  (if pool
+      (release-to-pool database)
+    (when (database-disconnect database)
+      (setq *connected-databases* (delete database *connected-databases*))
+      (when (eq database *default-database*)
+       (setq *default-database* (car *connected-databases*)))
+      (change-class database 'closed-database)
+      t)))
 
 ;;; Basic operations on databases
 
@@ -295,5 +271,20 @@ specified in output-type-spec and returned like in MAP."
                    ,@body))
             (database-dump-result-set ,result-set ,db)))))))
 
+;;; Marc Battyani : Large objects support
+
+(defun create-large-object (&key (database *default-database*))
+  "Creates a new large object in the database and returns the object identifier"
+  (database-create-large-object database))
+
+(defun write-large-object (object-id data &key (database *default-database*))
+  "Writes data to the large object"
+  (database-write-large-object object-id data database))
 
+(defun read-large-object (object-id &key (database *default-database*))
+  "Reads the large object content"
+  (database-read-large-object object-id database))
 
+(defun delete-large-object (object-id &key (database *default-database*))
+  "Deletes the large object in the database"
+  (database-delete-large-object object-id database))