diff --git a/devsupApp/src/dbfield.c b/devsupApp/src/dbfield.c index 7fe0af5..30568a7 100644 --- a/devsupApp/src/dbfield.c +++ b/devsupApp/src/dbfield.c @@ -50,7 +50,7 @@ static int pyField_Init(pyField *self, PyObject *args, PyObject *kws) } 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 0; diff --git a/python/devsup/_nullapi.py b/python/devsup/_nullapi.py index 052d451..1b2c645 100644 --- a/python/devsup/_nullapi.py +++ b/python/devsup/_nullapi.py @@ -6,10 +6,10 @@ def verinfo(): """ return (0,0,0,0.'invalid') -class Record(object): +class _Record(object): """Handle for record operations - r = Record("rec:name") + r = _Record("rec:name") """ def __init__(self, rec): @@ -49,7 +49,7 @@ class Record(object): def asyncFinish(self, reason=None): pass -def Field(object): +def _Field(object): """Handle for field operations f = Field("rec:name.HOPR") diff --git a/python/devsup/db.py b/python/devsup/db.py index 5821421..d644021 100644 --- a/python/devsup/db.py +++ b/python/devsup/db.py @@ -5,6 +5,7 @@ except ImportError: from _dbapi import _Field, _Record _rec_cache = {} +_no_such_field = object() __all__ = [ 'Record', @@ -22,18 +23,43 @@ def getRecord(name): class Record(_Record): def __init__(self, *args, **kws): super(Record, self).__init__(*args, **kws) - self._fld_cache = {} + super(Record, self).__setattr__('_fld_cache', {}) + def field(self, name): """Lookup field in this record fld = rec.field('HOPR') """ try: - return self._fld_cache[name] + F = self._fld_cache[name] + if F is _no_such_field: + raise ValueError() + return F except KeyError: - fld = Field("%s.%s"%(self.name(), name)) - self._fld_cache[name] = fld - return fld + try: + fld = Field("%s.%s"%(self.name(), name)) + 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): return 'Record("%s")'%self.name() @@ -50,6 +76,18 @@ class Field(_Field): self._record = getRecord(rec) 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): return 'Field("%s.%s")'%self.name()