]> granicus.if.org Git - postgresql/commitdiff
Change the pkey method so that the caller can optionally set the dictionary
authorD'Arcy J.M. Cain <darcy@druid.net>
Mon, 25 Nov 2002 02:15:13 +0000 (02:15 +0000)
committerD'Arcy J.M. Cain <darcy@druid.net>
Mon, 25 Nov 2002 02:15:13 +0000 (02:15 +0000)
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.

src/interfaces/python/pg.py

index a5997341bcf6e923583d0de4fbfedae980c049f8..df502397fa6c9b4eaaaeff9d4f8edc03b54c373b 100644 (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]