more db.py

This commit is contained in:
Michael Davidsaver
2013-03-31 09:45:10 -04:00
parent 61057e7c81
commit 63aaf8afe7
3 changed files with 47 additions and 9 deletions

View File

@ -50,7 +50,7 @@ static int pyField_Init(pyField *self, PyObject *args, PyObject *kws)
} }
if(self->addr.field_type >= DBF_ENUM) { if(self->addr.field_type >= DBF_ENUM) {
PyErr_SetString(PyExc_ValueError, "Access to this field type is not supported"); PyErr_SetString(PyExc_TypeError, "Access to this field type is not supported");
return -1; return -1;
} }
return 0; return 0;

View File

@ -6,10 +6,10 @@ def verinfo():
""" """
return (0,0,0,0.'invalid') return (0,0,0,0.'invalid')
class Record(object): class _Record(object):
"""Handle for record operations """Handle for record operations
r = Record("rec:name") r = _Record("rec:name")
""" """
def __init__(self, rec): def __init__(self, rec):
@ -49,7 +49,7 @@ class Record(object):
def asyncFinish(self, reason=None): def asyncFinish(self, reason=None):
pass pass
def Field(object): def _Field(object):
"""Handle for field operations """Handle for field operations
f = Field("rec:name.HOPR") f = Field("rec:name.HOPR")

View File

@ -5,6 +5,7 @@ except ImportError:
from _dbapi import _Field, _Record from _dbapi import _Field, _Record
_rec_cache = {} _rec_cache = {}
_no_such_field = object()
__all__ = [ __all__ = [
'Record', 'Record',
@ -22,18 +23,43 @@ def getRecord(name):
class Record(_Record): class Record(_Record):
def __init__(self, *args, **kws): def __init__(self, *args, **kws):
super(Record, self).__init__(*args, **kws) super(Record, self).__init__(*args, **kws)
self._fld_cache = {} super(Record, self).__setattr__('_fld_cache', {})
def field(self, name): def field(self, name):
"""Lookup field in this record """Lookup field in this record
fld = rec.field('HOPR') fld = rec.field('HOPR')
""" """
try: try:
return self._fld_cache[name] F = self._fld_cache[name]
if F is _no_such_field:
raise ValueError()
return F
except KeyError: except KeyError:
fld = Field("%s.%s"%(self.name(), name)) try:
self._fld_cache[name] = fld fld = Field("%s.%s"%(self.name(), name))
return fld except ValueError:
self._fld_cache[name] = _no_such_field
else:
self._fld_cache[name] = fld
return fld
def __getattr__(self, name):
try:
F = self.field(name)
except ValueError:
raise AttributeError('No such field')
else:
return F.getval()
def __setattr__(self, name, val):
try:
F=self.field(name)
except ValueError:
super(Record, self).__setattr__(name, val)
else:
F.putval(val)
def __repr__(self): def __repr__(self):
return 'Record("%s")'%self.name() return 'Record("%s")'%self.name()
@ -50,6 +76,18 @@ class Field(_Field):
self._record = getRecord(rec) self._record = getRecord(rec)
return self._record return self._record
def __cmp__(self, B):
if isinstance(B, Field):
B=B.getval()
return cmp(self.getval(), B)
def __int__(self):
return int(self.getval())
def __long__(self):
return long(self.getval())
def __float__(self):
return float(self.getval())
def __repr__(self): def __repr__(self):
return 'Field("%s.%s")'%self.name() return 'Field("%s.%s")'%self.name()