Changeset 440 for trunk/module/pg.py


Ignore:
Timestamp:
May 12, 2012, 5:57:17 PM (7 years ago)
Author:
cito
Message:

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/module/pg.py

    r439 r440  
    422422        return self.get_relations('r')
    423423
    424     def get_attnames(self, cl, newattnames=None):
     424    def get_attnames(self, cl, newattnames=None, regtypes=False):
    425425        """Given the name of a table, digs out the set of attribute names.
    426426
     
    429429        If the optional newattnames exists, it must be a dictionary and
    430430        will become the new attribute names dictionary.
     431        If the optional regtypes flag is set, then the regular type names
     432        will be returned instead of the simplified type names.
    431433
    432434        """
     
    443445        if qcl not in self.get_relations('rv'):
    444446            raise _prg_error('Class %s does not exist' % qcl)
    445         t = {}
    446         for att, typ, reg in self.db.query("SELECT pg_attribute.attname,"
    447             " pg_type.typname, pg_type.typname::regtype FROM pg_class"
     447
     448        q = "SELECT pg_attribute.attname, pg_type.typname"
     449        if regtypes:
     450            q += "::regtype"
     451        q += (" FROM pg_class"
    448452            " JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid"
    449453            " JOIN pg_attribute ON pg_attribute.attrelid = pg_class.oid"
     
    451455            " WHERE pg_namespace.nspname = '%s' AND pg_class.relname = '%s'"
    452456            " AND (pg_attribute.attnum > 0 OR pg_attribute.attname = 'oid')"
    453             " AND pg_attribute.attisdropped = 'f'"
    454                 % cl).getresult():
    455             if typ.startswith('_'):
    456                 typ = reg
    457             if typ.startswith('bool'):
    458                 typ = 'bool'
    459             elif typ.startswith('abstime'):
    460                 typ = 'date'
    461             elif typ.startswith('date'):
    462                 typ = 'date'
    463             elif typ.startswith('interval'):
    464                 typ = 'date'
    465             elif typ.startswith('timestamp'):
    466                 typ = 'date'
    467             elif typ.startswith('oid'):
    468                 typ = 'int'
    469             elif typ.startswith('int'):
    470                 typ = 'int'
    471             elif typ.startswith('float'):
    472                 typ = 'float'
    473             elif typ.startswith('numeric'):
    474                 typ = 'num'
    475             elif typ.startswith('money'):
    476                 typ = 'money'
    477             else:
    478                 typ = 'text'
    479             t[att] = typ
     457            " AND pg_attribute.attisdropped = 'f'") % cl
     458        q = self.db.query(q).getresult()
     459
     460        if regtypes:
     461            t = dict(q)
     462        else:
     463            t = {}
     464            for att, typ in q:
     465                if typ.startswith('bool'):
     466                    typ = 'bool'
     467                elif typ.startswith('abstime'):
     468                    typ = 'date'
     469                elif typ.startswith('date'):
     470                    typ = 'date'
     471                elif typ.startswith('interval'):
     472                    typ = 'date'
     473                elif typ.startswith('timestamp'):
     474                    typ = 'date'
     475                elif typ.startswith('oid'):
     476                    typ = 'int'
     477                elif typ.startswith('int'):
     478                    typ = 'int'
     479                elif typ.startswith('float'):
     480                    typ = 'float'
     481                elif typ.startswith('numeric'):
     482                    typ = 'num'
     483                elif typ.startswith('money'):
     484                    typ = 'money'
     485                else:
     486                    typ = 'text'
     487                t[att] = typ
    480488
    481489        self._attnames[qcl] = t  # cache it
Note: See TracChangeset for help on using the changeset viewer.