cl-scopes/storage/storage.lisp

56 lines
1.5 KiB
Common Lisp

;;; cl-scopes/storage/storage.lisp
;;;; Common layer for SQL storage functionality.
(defpackage :scopes/storage
(:use :common-lisp)
(:export #:*db-config* #:*db-engine*
#:make-engine #:make-storage #:db-params
#:db
#:drop-table))
(in-package :scopes/storage)
(defparameter *db-config* nil)
(defparameter *db-engine* nil)
(defparameter *backends*
'(:dbi #'dbi-make-storage))
(defvar *db-params*
'(:sqlite3 (:id-type integer :json-type json)
:postgres (:id-type bigserial :json-type jsonb)))
(defclass db-engine ()
((connect :initarg :connect)
(params :initarg :params)
(config :initarg :config)))
(defclass storage ()
((engine :initarg :engine)
(db :reader db)
(schema)))
(defun make-storage ()
(let ((st (make-instance 'storage :engine *db-engine*))
(db (funcall (slot-value *db-engine* 'connect))))
(setf (slot-value st 'db) db)
st))
(defun db-params (st)
(slot-value (slot-value st 'engine) 'params))
(defun drop-table (st tn)
(let ((sql (sxql:yield (sxql:drop-table tn :if-exists t))))
(print sql)
(dbi:do-sql (db st) sql)))
(defun make-engine ()
(let* ((config *db-config*)
(db-type (getf config :db-type))
(params (getf *db-params* db-type))
(conn-args (getf config :connect-args)))
(make-instance 'db-engine
:params params :config config
:connect #'(lambda ()
(apply #'dbi:connect-cached db-type conn-args)))))