fixed a bug where it was ignoring the new parameters passed in on a setf-er
[clsql.git] / sql / pool.lisp
index 7aa3c994b4a0f7a1ea7e45766dcc93457a0009e5..f3645086e6920decb5c87a9ba7a624f5c6ca47b0 100644 (file)
          :initform (make-process-lock "Connection pool"))))
 
 (defun acquire-from-conn-pool (pool)
+  "Try to find a working database connection in the pool or create a new
+one if needed. This performs 1 query against the DB to ensure it's still
+valid. When possible (postgres, mssql) that query will be a reset
+command to put the connection back into its default state."
   (or (with-process-lock ((conn-pool-lock pool) "Acquire from pool")
         (when (plusp (length (free-connections pool)))
           (let ((pconn (vector-pop (free-connections pool))))
             ;; test if connection still valid.
            ;; (e.g. db reboot -> invalid connection )
            (handler-case
-               (case (database-type pconn)
-                 (:mysql 
+               (case (database-underlying-type pconn)
+                 (:postgresql
+                    ;; This resets the connection to "New" state
+                    (database-execute-command "DISCARD ALL;" pconn))
+                 (:mysql
                     (database-query "SHOW ERRORS LIMIT 1" pconn nil nil))
+                 (:mssql
+                    ;; rpc escape sequence since this can't be called as a normal sp.
+                    ;;http://msdn.microsoft.com/en-us/library/aa198358%28SQL.80%29.aspx
+                    (database-execute-command "{rpc sp_reset_connection}" pconn))
                  (T
                     (database-query "SELECT 1;"  pconn '(integer) nil)))
              (sql-database-error (e)
@@ -64,7 +75,7 @@ Disconnecting.~%"
           (setf (conn-pool conn) pool))
         conn)))
 
-(defun release-to-conn-pool (conn)
+(defmethod release-to-conn-pool (conn)
   (let ((pool (conn-pool conn)))
     (with-process-lock ((conn-pool-lock pool) "Release to pool")
       (vector-push-extend conn (free-connections pool)))))