/ src / db.lisp
db.lisp
 1  (defpackage ami.db
 2    (:use :cl :bedrock)
 3    (:export :connect))
 4  (in-package :ami.db)
 5  
 6  (defparameter *connection-pool* '())
 7  (defvar *current-connection* nil)
 8  
 9  (defun setup-connection-pool (&key (host "127.0.0.1") database-name (num-connections 20))
10    (dotimes (i num-connections)
11      (let ((dbi:connect
12      (push (dbi:connect :postgres :host host :database-name database-name) *connection-pool*)))
13  
14  (defun flush-connection-pool ()
15    (dolist (conn *connection-pool*)
16      (dbi.driver:disconnect conn))
17    (setf *connection-pool* nil))
18  
19  (defmacro with-conn ((conn-name) &body body)
20    `(let* ((,conn-name (pop ami.db::*connection-pool*)))
21       (unwind-protect
22           (progn ,@body)
23         (push ,conn-name ami.db::*connection-pool*))))
24  
25  (defmacro with-tx ((conn-name) &body body)
26    `(with-conn (,conn-name)
27       (handler-case
28           (progn
29             (dbi.driver:begin-transaction ,conn-name)
30             ,@body
31             (dbi.driver:commit ,conn-name)
32             (format T "after commit"))
33         (error () 
34           (dbi.driver:rollback ,conn-name)
35           (format T "after rollback")))))
36  
37    (aif (pop *connection-pool*)
38         it
39         (error "No connections left")))
40