Changeset 60


Ignore:
Timestamp:
May 25, 2009, 2:27:07 PM (11 years ago)
Author:
marchulsman
Message:

Generator / default expression support for postgres db

File:
1 edited

Legend:

Unmodified
Added
Removed
  • container/postgres.py

    r59 r60  
    1212import types
    1313import cStringIO
     14from collections import deque
    1415
    1516class LogCursor(psycopg2.extensions.cursor):
     
    152153            return self.typeidx[idx]
    153154
     155def seqGenerator(seq_expr,conn):
     156    cursor = conn.getSingletonCursor()
     157    buffer = deque()
     158    range = 10
     159
     160    while(True):
     161        if(not buffer):
     162            if(range < 2048):
     163               range *= 2
     164       
     165            #faster? or slower?
     166            cursor.execute("SELECT ARRAY(SELECT " + seq_expr + " FROM generate_series(1,%s))",(range,))
     167            res = cursor.fetchone()
     168            buffer.extend(res[0])
     169 
     170         #int: temp solution
     171        yield buffer.popleft()
     172
    154173class PGDBSrcCon(srccon.DBSrcCon):
    155174    def __init__(self,conn,name):
     
    158177        fields = conn._getFields(name)
    159178
     179        print name
     180        print fields
    160181        fname = [field['name'] for field in fields]
    161         ftype = []
     182        ftypes = []
     183        fdefvals = []
    162184        for field in fields:
    163185            if(not field['not_null']):
    164                 ftype.append(itypes_py.createType(object))
     186                ftype = itypes_py.createType(object)
    165187            else:
    166                 ftype.append(conn._pgtype_to_itype(field['type_index']))
     188                ftype = conn._pgtype_to_itype(field['type_index'])
     189            ftypes.append(ftype)
     190            if(field['default_expression'] is None):
     191                dv = itypes_py.to_defval(ftype)
     192            else:
     193                dv = field['default_expression']
     194                if(dv.startswith('nextval')):
     195                    dv = seqGenerator(dv,conn)
     196                else:
     197                    cursor = conn.getSingletonCursor()
     198                    cursor.execute("SELECT " + dv);
     199                    dv = cursor.fetchone()
     200            fdefvals.append(dv)
     201 
    167202
    168203#        for field in fields:
     
    175210#            f.append(name=field['name'],type=ftype)
    176211#        f.fixate()
    177         f = itypes_py.createFields(fname,ftype)
     212        f = itypes_py.createFields(fname,ftypes,fdefvals)
    178213        srccon.DBSrcCon.__init__(self,name,f,conn)
    179214        self._add_buffer = []
     
    181216   
    182217    def append(self, *seq, **fields):
     218        res = None #return value, set to primary key if generated
    183219        if(not seq):
    184220            seq = []
     
    189225                    d = field.defval
    190226                    if(isinstance(d,types.GeneratorType)):
    191                         seq.append(d.next())
     227                        res = d.next() #return value
     228                        seq.append(res)
    192229                    elif(d is itypes_py.NotNull):
    193230                        raise RuntimeError, "Field %s should be given" % field.name
     
    197234            assert(len(seq) == len(self._actidx)),"Not right number of fields"
    198235        self._add_buffer.append(seq)
     236        return res
    199237
    200238    def extend(self, seq):
     
    204242        if(self._add_buffer):
    205243            data = "\n".join(("\t".join(map(str,record)) for record in self._add_buffer))
    206             print data
    207244            data = cStringIO.StringIO(data)
    208245            cursor = self._conn.getSingletonCursor()
Note: See TracChangeset for help on using the changeset viewer.