Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit a4bc5ee

Browse files
committed
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.
1 parent f393ee0 commit a4bc5ee

File tree

1 file changed

+35
-14
lines changed
  • src/interfaces/python

1 file changed

+35
-14
lines changed

src/interfaces/python/pg.py

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -63,17 +63,6 @@ def __init__(self, *args, **kw):
6363
# that takes a single string arg. For example
6464
# in a CGI set to "%s<BR>"
6565

66-
# Get all the primary keys at once
67-
for rel, att in self.db.query("""SELECT
68-
pg_class.relname, pg_attribute.attname
69-
FROM pg_class, pg_attribute, pg_index
70-
WHERE pg_class.oid = pg_attribute.attrelid AND
71-
pg_class.oid = pg_index.indrelid AND
72-
pg_index.indkey[0] = pg_attribute.attnum AND
73-
pg_index.indisprimary = 't' AND
74-
pg_attribute.attisdropped = 'f'""").getresult():
75-
self.__pkeys__[rel] = att
76-
7766
def _do_debug(self, s):
7867
if not self.debug: return
7968
if type(self.debug) == StringType: print self.debug % s
@@ -85,10 +74,30 @@ def query(self, qstr):
8574
self._do_debug(qstr)
8675
return self.db.query(qstr)
8776

88-
# If third arg supplied set primary key to it
8977
def pkey(self, cl, newpkey = None):
78+
"""This method returns the primary key of a class. If newpkey
79+
is set and is set and is not a dictionary then set that
80+
value as the primary key of the class. If it is a dictionary
81+
then replace the __pkeys__ dictionary with it."""
82+
# Get all the primary keys at once
83+
if type(newpkey) == DictType:
84+
self.__pkeys__ = newpkey
85+
return
86+
9087
if newpkey:
9188
self.__pkeys__[cl] = newpkey
89+
return newpkey
90+
91+
if self.__pkeys__ == {}:
92+
for rel, att in self.db.query("""SELECT
93+
pg_class.relname, pg_attribute.attname
94+
FROM pg_class, pg_attribute, pg_index
95+
WHERE pg_class.oid = pg_attribute.attrelid AND
96+
pg_class.oid = pg_index.indrelid AND
97+
pg_index.indkey[0] = pg_attribute.attnum AND
98+
pg_index.indisprimary = 't' AND
99+
pg_attribute.attisdropped = 'f'""").getresult():
100+
self.__pkeys__[rel] = att
92101

93102
# will raise an exception if primary key doesn't exist
94103
return self.__pkeys__[cl]
@@ -108,7 +117,17 @@ def get_tables(self):
108117
l.append(n[0])
109118
return l
110119

111-
def get_attnames(self, cl):
120+
def get_attnames(self, cl, newattnames = None):
121+
"""This method gets a list of attribute names for a class. If
122+
the optional newattnames exists it must be a dictionary and
123+
will become the new attribute names dictionary."""
124+
125+
if type(newattnames) == DictType:
126+
self.__attnames__ = newattnames
127+
return
128+
elif newattnames:
129+
raise error, "If supplied, newattnames must be a dictionary"
130+
112131
# May as well cache them
113132
if self.__attnames__.has_key(cl):
114133
return self.__attnames__[cl]
@@ -160,7 +179,7 @@ def get(self, cl, arg, keyname = None, view = 0):
160179
xcl = cl
161180

162181
if keyname == None: # use the primary key by default
163-
keyname = self.__pkeys__[xcl]
182+
keyname = self.pkey(xcl)
164183

165184
fnames = self.get_attnames(xcl)
166185

@@ -225,6 +244,8 @@ def insert(self, cl, a):
225244
# Update always works on the oid which get returns if available
226245
# otherwise use the primary key. Fail if neither.
227246
def update(self, cl, a):
247+
self.pkey(cl) # make sure we have a self.__pkeys__ dictionary
248+
228249
foid = 'oid_%s' % cl
229250
if a.has_key(foid):
230251
where = "oid = %s" % a[foid]

0 commit comments

Comments
 (0)