[PATCH] expressions, metaclasses, generic-postgresql

Vladimir Sekissov <[email protected]> Thu, 01 Dec 2005 03:22:17 +0500 (YEKT)
Newsgroups gmane.lisp.clsql.devel
Message-ID <[email protected]>
Good day,

Here are small patches for CLSQL.

Changes:

- sql/expressions.lisp - make column alias a symbol not a string,
  at least PostgreSQL and Oracle don't accept a string as valid alias;

- sql/generic-postgresql.lisp - corrected decoding of table attribute
  parameters;

- sql/metaclasses.lisp - check that metaclass is standard-db-class or
  it's subclass to prevent adding standard-db-object to supers if
  somebody in the path has it already when metaclass inherited from
  standard-db-class.


Best Regards,
Vladimir Sekissov

diff -Naur clsql-3.5.0.orig/sql/expressions.lisp clsql-3.5.0/sql/expressions.lisp
--- clsql-3.5.0.orig/sql/expressions.lisp	2005-11-16 13:49:00.000000000 +0500
+++ clsql-3.5.0/sql/expressions.lisp	2005-12-01 03:01:36.000000000 +0500
@@ -201,7 +201,10 @@
   (with-slots (name alias) expr
      (let ((namestr (if (symbolp name)
                         (symbol-name name)
-                      name)))
+                      name))
+           (aliastr (if (symbolp alias)
+                        (symbol-name alias)
+                      alias)))
        (if (null alias)
            (write-string
             (sql-escape (convert-to-db-default-case namestr database))
@@ -211,7 +214,9 @@
             (sql-escape (convert-to-db-default-case namestr database))
             *sql-stream*)
            (write-char #\Space *sql-stream*)
-           (format *sql-stream* "~s" alias)))))
+           (write-string
+            (sql-escape (convert-to-db-default-case aliastr database))
+            *sql-stream*)))))
   t)
 
 (defmethod output-sql-hash-key ((expr sql-ident-table) database)
diff -Naur clsql-3.5.0.orig/sql/generic-postgresql.lisp clsql-3.5.0/sql/generic-postgresql.lisp
--- clsql-3.5.0.orig/sql/generic-postgresql.lisp	2005-10-13 11:09:01.000000000 +0600
+++ clsql-3.5.0/sql/generic-postgresql.lisp	2005-12-01 03:01:36.000000000 +0500
@@ -150,15 +150,29 @@
 			   (owner-clause owner))
 		   database nil nil))))
     (when row
-      (values
-       (ensure-keyword (first row))
-       (if (string= "-1" (second row))
-	   (- (parse-integer (third row) :junk-allowed t) 4)
-	 (parse-integer (second row)))
-       nil
-       (if (string-equal "f" (fourth row))
-	   1
-	 0)))))
+      (destructuring-bind (typname attlen atttypmod attnull) row
+
+        (setf attlen (parse-integer attlen :junk-allowed t)
+              atttypmod (parse-integer atttypmod :junk-allowed t))
+              
+        (let ((coltype (ensure-keyword typname))
+              (colnull (if (string-equal "f" attnull) 1 0))
+              collen
+              colprec)
+           (setf (values collen colprec)
+                 (case coltype
+                   ((:numeric :decimal)
+                    (if (= -1 atttypmod)
+                        (values nil nil)
+                        (values (ash (- atttypmod 4) -16)
+                                (boole boole-and (- atttypmod 4) #xffff))))
+                   (otherwise
+                    (values
+                     (cond ((and (= -1 attlen) (= -1 atttypmod)) nil)
+                           ((= -1 attlen) (- atttypmod 4))
+                           (t attlen))
+                     nil))))
+           (values coltype collen colprec colnull))))))
 
 (defmethod database-create-sequence (sequence-name
 				     (database generic-postgresql-database))
diff -Naur clsql-3.5.0.orig/sql/metaclasses.lisp clsql-3.5.0/sql/metaclasses.lisp
--- clsql-3.5.0.orig/sql/metaclasses.lisp	2005-11-16 13:07:54.000000000 +0500
+++ clsql-3.5.0/sql/metaclasses.lisp	2005-12-01 03:01:36.000000000 +0500
@@ -107,12 +107,12 @@
                                         qualifier
 					&allow-other-keys)
   (let ((root-class (find-class 'standard-db-object nil))
-	(vmc (find-class 'standard-db-class)))
+	(vmc 'standard-db-class))
     (setf (view-class-qualifier class)
           (car qualifier))
     (if root-class
-	(if (member-if #'(lambda (super)
-			   (eq (class-of super) vmc)) direct-superclasses)
+	(if (some #'(lambda (super) (typep super vmc))
+                  direct-superclasses)
 	    (call-next-method)
             (apply #'call-next-method
                    class
@@ -135,7 +135,7 @@
                                           direct-superclasses qualifier
                                           &allow-other-keys)
   (let ((root-class (find-class 'standard-db-object nil))
-	(vmc (find-class 'standard-db-class)))
+	(vmc 'standard-db-class))
     (setf (view-table class)
           (table-name-from-arg (sql-escape (or (and base-table
                                                     (if (listp base-table)
@@ -145,8 +145,8 @@
     (setf (view-class-qualifier class)
           (car qualifier))
     (if (and root-class (not (equal class root-class)))
-	(if (member-if #'(lambda (super)
-			   (eq (class-of super) vmc)) direct-superclasses)
+	(if (some #'(lambda (super) (typep super vmc))
+                  direct-superclasses)
 	    (call-next-method)
             (apply #'call-next-method
                    class