Change the pkey method so that the caller can optionally set the dictionary

used for the primary key lookup.  This will prevent a database lookup
for each connection object that gets created.  This could be a significant
optimization on a busy system.

Similarly, the get_attnames method allows for the attributes dictionary
to be installed directly.
This commit is contained in:
D'Arcy J.M. Cain 2002-11-25 02:15:13 +00:00
parent f393ee0680
commit a4bc5eeef2

View File

@ -63,17 +63,6 @@ class DB:
# that takes a single string arg. For example
# in a CGI set to "%s<BR>"
# Get all the primary keys at once
for rel, att in self.db.query("""SELECT
pg_class.relname, pg_attribute.attname
FROM pg_class, pg_attribute, pg_index
WHERE pg_class.oid = pg_attribute.attrelid AND
pg_class.oid = pg_index.indrelid AND
pg_index.indkey[0] = pg_attribute.attnum AND
pg_index.indisprimary = 't' AND
pg_attribute.attisdropped = 'f'""").getresult():
self.__pkeys__[rel] = att
def _do_debug(self, s):
if not self.debug: return
if type(self.debug) == StringType: print self.debug % s
@ -85,10 +74,30 @@ class DB:
self._do_debug(qstr)
return self.db.query(qstr)
# If third arg supplied set primary key to it
def pkey(self, cl, newpkey = None):
"""This method returns the primary key of a class. If newpkey
is set and is set and is not a dictionary then set that
value as the primary key of the class. If it is a dictionary
then replace the __pkeys__ dictionary with it."""
# Get all the primary keys at once
if type(newpkey) == DictType:
self.__pkeys__ = newpkey
return
if newpkey:
self.__pkeys__[cl] = newpkey
return newpkey
if self.__pkeys__ == {}:
for rel, att in self.db.query("""SELECT
pg_class.relname, pg_attribute.attname
FROM pg_class, pg_attribute, pg_index
WHERE pg_class.oid = pg_attribute.attrelid AND
pg_class.oid = pg_index.indrelid AND
pg_index.indkey[0] = pg_attribute.attnum AND
pg_index.indisprimary = 't' AND
pg_attribute.attisdropped = 'f'""").getresult():
self.__pkeys__[rel] = att
# will raise an exception if primary key doesn't exist
return self.__pkeys__[cl]
@ -108,7 +117,17 @@ class DB:
l.append(n[0])
return l
def get_attnames(self, cl):
def get_attnames(self, cl, newattnames = None):
"""This method gets a list of attribute names for a class. If
the optional newattnames exists it must be a dictionary and
will become the new attribute names dictionary."""
if type(newattnames) == DictType:
self.__attnames__ = newattnames
return
elif newattnames:
raise error, "If supplied, newattnames must be a dictionary"
# May as well cache them
if self.__attnames__.has_key(cl):
return self.__attnames__[cl]
@ -160,7 +179,7 @@ class DB:
xcl = cl
if keyname == None: # use the primary key by default
keyname = self.__pkeys__[xcl]
keyname = self.pkey(xcl)
fnames = self.get_attnames(xcl)
@ -225,6 +244,8 @@ class DB:
# Update always works on the oid which get returns if available
# otherwise use the primary key. Fail if neither.
def update(self, cl, a):
self.pkey(cl) # make sure we have a self.__pkeys__ dictionary
foid = 'oid_%s' % cl
if a.has_key(foid):
where = "oid = %s" % a[foid]