Author: cito
Date: Sat May 12 17:57:17 2012
New Revision: 440

Log:
Add option to let get_attnames() return regular type names.

Modified:
   trunk/module/pg.py

Modified: trunk/module/pg.py
==============================================================================
--- trunk/module/pg.py  Sat May 12 17:43:55 2012        (r439)
+++ trunk/module/pg.py  Sat May 12 17:57:17 2012        (r440)
@@ -421,13 +421,15 @@
         """Return list of tables in connected database."""
         return self.get_relations('r')
 
-    def get_attnames(self, cl, newattnames=None):
+    def get_attnames(self, cl, newattnames=None, regtypes=False):
         """Given the name of a table, digs out the set of attribute names.
 
         Returns a dictionary of attribute names (the names are the keys,
         the values are the names of the attributes' types).
         If the optional newattnames exists, it must be a dictionary and
         will become the new attribute names dictionary.
+        If the optional regtypes flag is set, then the regular type names
+        will be returned instead of the simplified type names.
 
         """
         if isinstance(newattnames, dict):
@@ -442,41 +444,47 @@
             return self._attnames[qcl]
         if qcl not in self.get_relations('rv'):
             raise _prg_error('Class %s does not exist' % qcl)
-        t = {}
-        for att, typ, reg in self.db.query("SELECT pg_attribute.attname,"
-            " pg_type.typname, pg_type.typname::regtype FROM pg_class"
+
+        q = "SELECT pg_attribute.attname, pg_type.typname"
+        if regtypes:
+            q += "::regtype"
+        q += (" FROM pg_class"
             " JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid"
             " JOIN pg_attribute ON pg_attribute.attrelid = pg_class.oid"
             " JOIN pg_type ON pg_type.oid = pg_attribute.atttypid"
             " WHERE pg_namespace.nspname = '%s' AND pg_class.relname = '%s'"
             " AND (pg_attribute.attnum > 0 OR pg_attribute.attname = 'oid')"
-            " AND pg_attribute.attisdropped = 'f'"
-                % cl).getresult():
-            if typ.startswith('_'):
-                typ = reg
-            if typ.startswith('bool'):
-                typ = 'bool'
-            elif typ.startswith('abstime'):
-                typ = 'date'
-            elif typ.startswith('date'):
-                typ = 'date'
-            elif typ.startswith('interval'):
-                typ = 'date'
-            elif typ.startswith('timestamp'):
-                typ = 'date'
-            elif typ.startswith('oid'):
-                typ = 'int'
-            elif typ.startswith('int'):
-                typ = 'int'
-            elif typ.startswith('float'):
-                typ = 'float'
-            elif typ.startswith('numeric'):
-                typ = 'num'
-            elif typ.startswith('money'):
-                typ = 'money'
-            else:
-                typ = 'text'
-            t[att] = typ
+            " AND pg_attribute.attisdropped = 'f'") % cl
+        q = self.db.query(q).getresult()
+
+        if regtypes:
+            t = dict(q)
+        else:
+            t = {}
+            for att, typ in q:
+                if typ.startswith('bool'):
+                    typ = 'bool'
+                elif typ.startswith('abstime'):
+                    typ = 'date'
+                elif typ.startswith('date'):
+                    typ = 'date'
+                elif typ.startswith('interval'):
+                    typ = 'date'
+                elif typ.startswith('timestamp'):
+                    typ = 'date'
+                elif typ.startswith('oid'):
+                    typ = 'int'
+                elif typ.startswith('int'):
+                    typ = 'int'
+                elif typ.startswith('float'):
+                    typ = 'float'
+                elif typ.startswith('numeric'):
+                    typ = 'num'
+                elif typ.startswith('money'):
+                    typ = 'money'
+                else:
+                    typ = 'text'
+                t[att] = typ
 
         self._attnames[qcl] = t  # cache it
         return self._attnames[qcl]
_______________________________________________
PyGreSQL mailing list
PyGreSQL@Vex.Net
https://mail.vex.net/mailman/listinfo.cgi/pygresql

Reply via email to