X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=sql%2Foodml.lisp;h=329444363b6ed723dab505ae92e3ae5eaebd9441;hp=3a005ad0990ac8b19d82c95fbcca018e7b55f590;hb=a050eddab954ab3045d8427cf0c5563142266833;hpb=b9307c6d87a2d84d2a2b47891b753c4fc1a13b13 diff --git a/sql/oodml.lisp b/sql/oodml.lisp index 3a005ad..3294443 100644 --- a/sql/oodml.lisp +++ b/sql/oodml.lisp @@ -1,7 +1,7 @@ ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*- ;;;; ************************************************************************* ;;;; -;;;; $Id: $ +;;;; $Id$ ;;;; ;;;; The CLSQL Object Oriented Data Manipulation Language (OODML). ;;;; @@ -87,14 +87,11 @@ ;; Called by 'get-slot-values-from-view' ;; -(defvar *update-context* nil) - (defmethod update-slot-from-db ((instance standard-db-object) slotdef value) (declare (optimize (speed 3) #+cmu (extensions:inhibit-warnings 3))) (let* ((slot-reader (view-class-slot-db-reader slotdef)) (slot-name (slot-definition-name slotdef)) - (slot-type (specified-type slotdef)) - (*update-context* (cons (type-of instance) slot-name))) + (slot-type (specified-type slotdef))) (cond ((and value (null slot-reader)) (setf (slot-value instance slot-name) (read-sql-value value (delistify slot-type) @@ -309,9 +306,12 @@ (error "No view-table for class ~A" classname)) (sql-expression :table (view-table class)))) + +(defparameter *default-varchar-length* 255) + (defmethod database-get-type-specifier (type args database db-type) (declare (ignore type args database db-type)) - "VARCHAR(255)") + (format nil "VARCHAR(~D)" *default-varchar-length*)) (defmethod database-get-type-specifier ((type (eql 'integer)) args database db-type) (declare (ignore database db-type)) @@ -326,26 +326,23 @@ (defmethod database-get-type-specifier ((type (eql 'bigint)) args database db-type) (declare (ignore args database db-type)) "BIGINT") - -(defmethod database-get-type-specifier ((type (eql 'simple-base-string)) args - database db-type) - (declare (ignore database db-type)) - (if args - (format nil "VARCHAR(~A)" (car args)) - "VARCHAR(255)")) -(defmethod database-get-type-specifier ((type (eql 'simple-string)) args +(deftype varchar () + "A variable length string for the SQL varchar type." + 'string) + +(defmethod database-get-type-specifier ((type (eql 'varchar)) args database db-type) (declare (ignore database db-type)) (if args (format nil "VARCHAR(~A)" (car args)) - "VARCHAR(255)")) + (format nil "VARCHAR(~D)" *default-varchar-length*))) (defmethod database-get-type-specifier ((type (eql 'string)) args database db-type) (declare (ignore database db-type)) (if args - (format nil "VARCHAR(~A)" (car args)) - "VARCHAR(255)")) + (format nil "CHAR(~A)" (car args)) + (format nil "VARCHAR(~D)" *default-varchar-length*))) (deftype universal-time () "A positive integer as returned by GET-UNIVERSAL-TIME." @@ -367,16 +364,11 @@ (declare (ignore database args db-type)) "INT8") -(deftype raw-string (&optional len) - "A string which is not trimmed when retrieved from the database" +#+ignore +(deftype char (&optional len) + "A lisp type for the SQL CHAR type." `(string ,len)) -(defmethod database-get-type-specifier ((type (eql 'raw-string)) args database db-type) - (declare (ignore database db-type)) - (if args - (format nil "VARCHAR(~A)" (car args)) - "VARCHAR")) - (defmethod database-get-type-specifier ((type (eql 'float)) args database db-type) (declare (ignore database db-type)) (if args @@ -389,10 +381,35 @@ (format nil "FLOAT(~A)" (car args)) "FLOAT")) +(deftype generalized-boolean () + "A type which outputs a SQL boolean value, though any lisp type can be stored in the slot." + t) + (defmethod database-get-type-specifier ((type (eql 'boolean)) args database db-type) (declare (ignore args database db-type)) "BOOL") +(defmethod database-get-type-specifier ((type (eql 'generalized-boolean)) args database db-type) + (declare (ignore args database db-type)) + "BOOL") + +(defmethod database-get-type-specifier ((type (eql 'number)) args database db-type) + (declare (ignore database db-type)) + (cond + ((and (consp args) (= (length args) 2)) + (format nil "NUMBER(~D,~D)" (first args) (second args))) + ((and (consp args) (= (length args) 1)) + (format nil "NUMBER(~D)" (first args))) + (t + "NUMBER"))) + +(defmethod database-get-type-specifier ((type (eql 'char)) args database db-type) + (declare (ignore database db-type)) + (if args + (format nil "CHAR(~D)" (first args)) + "CHAR(1)")) + + (defmethod database-output-sql-as-type (type val database db-type) (declare (ignore type database db-type)) val) @@ -406,14 +423,12 @@ (defmethod database-output-sql-as-type ((type (eql 'symbol)) val database db-type) (declare (ignore database db-type)) - (if (keywordp val) - (symbol-name val) - (if val - (concatenate 'string - (package-name (symbol-package val)) - "::" - (symbol-name val)) - ""))) + (if val + (concatenate 'string + (package-name (symbol-package val)) + "::" + (symbol-name val)) + "")) (defmethod database-output-sql-as-type ((type (eql 'keyword)) val database db-type) (declare (ignore database db-type)) @@ -435,19 +450,20 @@ (declare (ignore database db-type)) (if val "t" "f")) -(defmethod database-output-sql-as-type ((type (eql 'string)) val database db-type) +(defmethod database-output-sql-as-type ((type (eql 'generalized-boolean)) val database db-type) (declare (ignore database db-type)) - val) + (if val "t" "f")) -(defmethod database-output-sql-as-type ((type (eql 'simple-string)) - val database db-type) +(defmethod database-output-sql-as-type ((type (eql 'string)) val database db-type) (declare (ignore database db-type)) val) -(defmethod database-output-sql-as-type ((type (eql 'simple-base-string)) +(defmethod database-output-sql-as-type ((type (eql 'char)) val database db-type) (declare (ignore database db-type)) - val) + (etypecase val + (character (write-to-string val)) + (string val))) (defmethod read-sql-value (val type database db-type) (declare (ignore type database db-type)) @@ -457,18 +473,14 @@ (declare (ignore database db-type)) val) -(defmethod read-sql-value (val (type (eql 'simple-string)) database db-type) - (declare (ignore database db-type)) - val) - -(defmethod read-sql-value (val (type (eql 'simple-base-string)) database db-type) +(defmethod read-sql-value (val (type (eql 'varchar)) database db-type) (declare (ignore database db-type)) val) -(defmethod read-sql-value (val (type (eql 'raw-string)) database db-type) +(defmethod read-sql-value (val (type (eql 'char)) database db-type) (declare (ignore database db-type)) - val) - + (schar val 0)) + (defmethod read-sql-value (val (type (eql 'keyword)) database db-type) (declare (ignore database db-type)) (when (< 0 (length val)) @@ -479,8 +491,7 @@ (declare (ignore database db-type)) (when (< 0 (length val)) (unless (string= val (symbol-name-default-case "NIL")) - (intern (symbol-name-default-case val) - (symbol-package *update-context*))))) + (read-from-string val)))) (defmethod read-sql-value (val (type (eql 'integer)) database db-type) (declare (ignore database db-type)) @@ -511,7 +522,19 @@ (declare (ignore database db-type)) (equal "t" val)) -(defmethod read-sql-value (val (type (eql 'univeral-time)) database db-type) +(defmethod read-sql-value (val (type (eql 'generalized-boolean)) database db-type) + (declare (ignore database db-type)) + (equal "t" val)) + +(defmethod read-sql-value (val (type (eql 'number)) database db-type) + (declare (ignore database db-type)) + (etypecase val + (string + (unless (string-equal "NIL" val) + (read-from-string val))) + (number val))) + +(defmethod read-sql-value (val (type (eql 'universal-time)) database db-type) (declare (ignore database db-type)) (unless (eq 'NULL val) (etypecase val @@ -1057,11 +1080,4 @@ as elements of a list." (record-caches database)) results) results) -(defun update-cached-results (targets qualifiers database) - ;; FIXME: this routine will need to update slots in cached objects, perhaps adding or removing objects from cached - ;; for now, dump cache entry and perform fresh search - (let ((res (apply #'find-all targets qualifiers))) - (setf (gethash (compute-records-cache-key targets qualifiers) - (record-caches database)) res) - res))