Update of /project/elephant/cvsroot/elephant/src/db-clsql In directory clnet:/tmp/cvs-serv3373
Modified Files: sql-controller.lisp Log Message: Changes to make sqlite3 work
--- /project/elephant/cvsroot/elephant/src/db-clsql/sql-controller.lisp 2007/02/08 22:33:35 1.18 +++ /project/elephant/cvsroot/elephant/src/db-clsql/sql-controller.lisp 2007/02/14 22:39:10 1.19 @@ -41,6 +41,13 @@ creation, counters, locks, the root (for garbage collection,) et cetera. This is the Postgresql-specific subclass of store-controller."))
+(defmethod supports-sequence ((sc sql-store-controller)) + (not (equal + (car (cadr (controller-spec sc))) + :sqlite3) + ) +) + ;; This should be much more elegant --- but as of Feb. 6, SBCL 1.0.2 has a weird, ;; unpleasant bug when ASDF tries to load this stuff. ;; (defvar *thread-table-lock* nil) @@ -52,13 +59,13 @@ (if (null *thread-table-lock*) ;; nil ;; (setq *thread-table-lock* (sb-thread::make-mutex :name "thread-table-lock")) - (setq *thread-table-lock* (elephant::ele-make-lock)) + (setq *thread-table-lock* (elephant-utils::ele-make-lock)) ) )
(defun thread-hash () - (elephant::ele-thread-hash-key) + (elephant-utils::ele-thread-hash-key) )
@@ -284,14 +291,26 @@ (clsql:table-exists-p [version] :database con :owner :all) )
-(defun create-version-table (con) - ;; ALL OF THIS needs to be inside a transaction. - (clsql::create-table [version] +(defun create-version-table (sc) + (let ((con (controller-db sc))) + (clsql::create-table [version] '( ([dbversion] text :not-null) ) :database con ) - ) + (if (and (clsql:table-exists-p [keyvlaue] :database con :owner :all) + (= 0 (caar (clsql:query "select count(*) from keyvalue")))) + (clsql::insert-records :into [version] + :attributes '(dbversion) + :values (list (format nil "~A" *elephant-code-version*)) + :database con) + (clsql::insert-records :into [version] + :attributes '(dbversion) + :values (list (format nil "~A" '(0 6 0))) + :database con) + ) + ) + )
;; These functions are probably not cross-database portable... (defun keyvalue-table-exists (con) @@ -320,7 +339,7 @@ ;; storing blobs now in the Berkeley-db and we meed to make sure ;; we are properly testing that. However, blobs are awkward to ;; handle, so I am going to do this first... -(defun create-keyvalue-table (con) +(defun create-keyvalue-table (sc) ;; the "serial" specifiation here does not seem to work, ( ;; apparently not supported by clsql, so I have to execute these ;; commands specifically. This may be a database-dependent way of doing @@ -334,25 +353,29 @@ ;; CREATE-SEQUENCE and SEQUENCE-NEXT. That would solve our problem!
;; ALL OF THIS needs to be inside a transaction. - + (let* ((con (controller-db sc))) ;; At one time this was conditional, but all NEW repositories should have this. - (clsql::create-sequence [serial] :database con) - (clsql::query - (format nil "create table keyvalue ( + (if (supports-sequence sc) + (progn + (clsql::create-sequence [serial] :database con) + (clsql::query + (format nil "create table keyvalue ( pk integer PRIMARY KEY DEFAULT nextval('serial'), clctn_id integer NOT NULL, key varchar NOT NULL, value varchar )") - :database con) -;; (clsql::create-table [keyvalue] -;; ;; This is most likely to work with any database system.. -;; '( -;; ([clctn_id] integer :not-null) -;; ([key] text :not-null) -;; ([value] text) -;; ) -;; :database con) + :database con) + ) + (clsql::create-table [keyvalue] + ;; This is most likely to work with any database system.. + '( + ([clctn_id] integer :not-null) + ([key] text :not-null) + ([value] text) + ) + :database con) + )
;; :constraints '("PRIMARY KEY (clctn_id key)" ;; "UNIQUE (clctn_id,key)") @@ -380,7 +403,7 @@ :attributes '([clctn_id] [key]) :database con) ;;) - ) + ))
(defmethod database-version ((sc sql-store-controller)) "A version determination for a given store @@ -397,13 +420,6 @@ (read-from-string (caar tuples)) nil))))
-(defun set-database-version (sc) - (let ((con (controller-db sc))) - (clsql::insert-records :into [version] - :attributes '(dbversion) - :values (list (format nil "~A" *elephant-code-version*)) - :database con))) -
(defmethod open-controller ((sc sql-store-controller) ;; At present these three have no meaning @@ -427,13 +443,11 @@ ;; it does not, we need to create it.. (unless (keyvalue-table-exists con) (with-transaction (:store-controller sc) - (create-keyvalue-table con))) + (create-keyvalue-table sc))) (setf (uses-pk-of sc) (query-uses-pk con)) (unless (version-table-exists con) (with-transaction (:store-controller sc) - (create-version-table con))) - ;; Set elephant version if new - (when new-p (set-database-version sc)) + (create-version-table sc))) (initialize-serializer sc) ;; These should get oid 0 and 1 respectively (setf (slot-value sc 'root) (make-instance 'sql-btree :sc sc :from-oid 0))