X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=sql%2Foodml.lisp;h=d76712c2d6e7726c65b91675fb5ab65fc29a71c9;hp=c98342ed55ddf3ce220ec7c5d9ddf86ad3c8ff4d;hb=cc1360674fe8976074b6af9e5a9aab63cb078fc7;hpb=24a4186aa531c3e56953413119e2308bb7c50b6b diff --git a/sql/oodml.lisp b/sql/oodml.lisp index c98342e..d76712c 100644 --- a/sql/oodml.lisp +++ b/sql/oodml.lisp @@ -248,6 +248,7 @@ (if vd (let ((qualifier (key-qualifier-for-instance instance :database vd))) (delete-records :from vt :where qualifier :database vd) + (setf (record-caches vd) nil) (setf (slot-value instance 'view-database) nil) (values)) (signal-no-database-error vd)))) @@ -327,13 +328,21 @@ "INT") (deftype smallint () - "An integer smaller than a 32-bit integer, this width may vary by SQL implementation." + "An integer smaller than a 32-bit integer. this width may vary by SQL implementation." 'integer) (defmethod database-get-type-specifier ((type (eql 'smallint)) args database db-type) (declare (ignore args database db-type)) "INT") +(deftype mediumint () + "An integer smaller than a 32-bit integer, but may be larger than a smallint. This width may vary by SQL implementation." + 'integer) + +(defmethod database-get-type-specifier ((type (eql 'mediumint)) args database db-type) + (declare (ignore args database db-type)) + "INT") + (deftype bigint () "An integer larger than a 32-bit integer, this width may vary by SQL implementation." 'integer) @@ -634,7 +643,8 @@ :attribute (gethash :home-key tdbi) :table jc-view-table)) :where jq - :result-types :auto))) + :result-types :auto + :database (view-database object)))) (mapcar #'(lambda (i) (let* ((instance (car i)) (jcc (make-instance jc :view-database (view-database instance)))) @@ -659,7 +669,8 @@ (list instance jcc))) (select (sql-expression :attribute (gethash :foreign-key tdbi) :table jc-view-table) :from (sql-expression :table jc-view-table) - :where jq))))))) + :where jq + :database (view-database object)))))))) ;;; Remote Joins @@ -729,21 +740,29 @@ maximum of MAX-LEN instances updated in each query." keys)) :result-types :auto :flatp t))) + (dolist (object objects) (when (or force-p (not (slot-boundp object slotdef-name))) - (let ((res (find (slot-value object home-key) results - :key #'(lambda (res) (slot-value res foreign-key)) - :test #'equal))) + (let ((res (remove-if-not #'(lambda (obj) + (equal obj (slot-value + object + home-key))) + results + :key #'(lambda (res) + (slot-value res + foreign-key))))) (when res - (setf (slot-value object slotdef-name) res))))))))))) + (setf (slot-value object slotdef-name) + (if (gethash :set dbi) res (car res))))))))))))) (values)) - + (defun fault-join-slot-raw (class object slot-def) (let* ((dbi (view-class-slot-db-info slot-def)) (jc (gethash :join-class dbi))) (let ((jq (join-qualifier class object slot-def))) (when jq - (select jc :where jq :flatp t :result-types nil))))) + (select jc :where jq :flatp t :result-types nil + :database (view-database object)))))) (defun fault-join-slot (class object slot-def) (let* ((dbi (view-class-slot-db-info slot-def)) @@ -984,6 +1003,10 @@ maximum of MAX-LEN instances updated in each query." (defmethod instance-refreshed ((instance standard-db-object))) +(defvar *default-caching* t + "Controls whether SELECT caches objects by default. The CommonSQL +specification states caching is on by default.") + (defun select (&rest select-all-args) "Executes a query on DATABASE, which has a default value of *DEFAULT-DATABASE*, specified by the SQL expressions supplied @@ -1042,7 +1065,7 @@ as elements of a list." (cond ((select-objects target-args) - (let ((caching (getf qualifier-args :caching t)) + (let ((caching (getf qualifier-args :caching *default-caching*)) (result-types (getf qualifier-args :result-types :auto)) (refresh (getf qualifier-args :refresh nil)) (database (or (getf qualifier-args :database) *default-database*)) @@ -1136,7 +1159,8 @@ as elements of a list." (unless (record-caches database) (setf (record-caches database) (make-hash-table :test 'equal - #+allegro :values #+allegro :weak + #+allegro :values #+allegro :weak + #+clisp :weak #+clisp :value #+lispworks :weak-kind #+lispworks :value))) (setf (gethash (compute-records-cache-key targets qualifiers) (record-caches database)) results)