Commit a4bc5eee authored by D'Arcy J.M. Cain's avatar D'Arcy J.M. Cain

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.
parent f393ee06
......@@ -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]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment