[pg-cvs] CVS update: pg/parsers.lisp

Peter Van Eynde pvaneynde at common-lisp.net
Mon Mar 8 14:37:37 UTC 2004


Update of /project/pg/cvsroot/pg
In directory common-lisp.net:/tmp/cvs-serv12704

Modified Files:
	parsers.lisp 
Log Message:
added type-to-oid table and lookup-type function to aid in bpe operations
Date: Mon Mar  8 09:37:37 2004
Author: pvaneynde

Index: pg/parsers.lisp
diff -u pg/parsers.lisp:1.1 pg/parsers.lisp:1.2
--- pg/parsers.lisp:1.1	Fri Mar  5 13:08:08 2004
+++ pg/parsers.lisp	Mon Mar  8 09:37:36 2004
@@ -59,7 +59,10 @@
 (defvar *parsers* '())
 
 
-
+(defvar *type-to-oid*
+  (make-hash-table :test #'eq)
+  "Is a hashtable for turning a typename into a OID.
+Needed to define the type of objects in pg-prepare")
 
 (defvar *type-parsers*
   `(("bool"      . ,'bool-parser)
@@ -96,6 +99,8 @@
 
 ;; FIXME switch to a specialized float parser
 (defun float-parser (str)
+  (declare (type simple-string str))
+
   (let ((*read-eval* nil))
     (read-from-string str)))
 
@@ -103,12 +108,14 @@
 (defun text-parser (str) str)
 
 (defun bool-parser (str)
+  (declare (type simple-string str))
   (cond ((string= "t" str) t)
         ((string= "f" str) nil)
         (t (error 'protocol-error
                   :reason "Badly formed boolean from backend: ~s" str))))
 
 (defun parse-timestamp (str)
+  (declare (type simple-string str))
   (let* ((year (parse-integer (subseq str 0 4)))
          (month (parse-integer (subseq str 5 7)))
          (day (parse-integer (subseq str 8 10)))
@@ -172,8 +179,8 @@
 ;; which we convert to a CL universal time
 (defun date-parser (str)
   (let ((year    (parse-integer (subseq str 0 4)))
-	(month   (parse-integer (subseq str 5 7)))
-	(day     (parse-integer (subseq str 8 10))))
+        (month   (parse-integer (subseq str 5 7)))
+        (day     (parse-integer (subseq str 8 10))))
     (encode-universal-time 0 0 0 day month year)))
 
 (defun initialize-parsers (connection)
@@ -185,14 +192,33 @@
        (let* ((typname (first tuple))
               (oid (parse-integer (second tuple)))
               (type (assoc typname *type-parsers* :test #'string=)))
-         (if (consp type)
-             (push (cons oid (cdr type)) *parsers*))))
+         (cond
+           ((consp type)
+            (setf (gethash (intern typname :keyword) *type-to-oid*)
+                  oid)
+            (push (cons oid (cdr type)) *parsers*))
+           (t
+            #+debug
+            (warn "Unknown postgresSQL type found: '~A' oid: '~A'"
+                   typname
+                   oid)))))
      tuples)))
 
 (defun parse (str oid)
+  (declare (type simple-string str))
   (let ((parser (assoc oid *parsers* :test #'eql)))
     (if (consp parser)
         (funcall (cdr parser) str)
         str)))
+
+(defun lookup-type (type)
+  "Given the name of a type, returns the oid of the type or NIL if
+not found"
+  (let ((type (etypecase type
+                (symbol
+                 type)
+                (string
+                 (intern type :keyword)))))
+    (gethash type *type-to-oid*)))
 
 ;; EOF





More information about the Pg-cvs mailing list