> There is an ugly little problem with the DB wrapper class.
authorBruce Momjian
Thu, 12 Dec 2002 22:49:27 +0000 (22:49 +0000)
committerBruce Momjian
Thu, 12 Dec 2002 22:49:27 +0000 (22:49 +0000)
>
> In pg.py the attributes of DB are defined as being the same as
> the attributes of the corresponding pgobject "db", using the following

...

> The problem is that the attributes of db (which are read only)
> are not static (they are actually function calls to PostgreSQL),
> especially "status" and "error", but those attributes are copied
> and this is done only once when initializing the DB object.
>
> So, in effect, only the attribute "db.error" of a DB instance
> will be updated, but not the attribute "error". Same with "status".

> Don't copy the (read only) attributes of the pgobject to the
> DB object, but only the methods, and all of them, like this:
>
> --------------- change in pg.py ------------------
> # Create convience methods, in a way that is still overridable.
> for e in self.db.__methods__:
>  setattr(self, e, getattr(self.db, e))
> ----------------------------------------------------
>
> Furthermore, make an addition to the documentation of the
> DB wrapper class (i.e. in pygresql-pg-db.html):
> After the sentence "All pgobject methods are included in this class also."
> add the following sentence "The pgobject read-only attributes can be
> accessed py adding the prefix 'db.' to them."

Christoph Zwerschke

doc/src/sgml/pygresql.sgml
src/interfaces/python/pg.py

index 8a002036bbf0c9453ff2e0a400053595b5746925..3b854d467351ba30d8d2718dc6ea2ed082cd698d 100644 (file)
@@ -1,4 +1,4 @@
-
+
 
 
  <application>PyGreSQL</application> - <application>Python</application> Interface
@@ -2413,12 +2413,17 @@ loimport(filename)
   Database Wrapper Class: <classname>DB</classname>
 
   
-   pg module contains a class called
-   DB.  All pgobject
-   methods are included in this class also.  A number of additional
-   DB class methods are described below.  The
-   preferred way to use this module is as follows (See description of
-   the initialization method below.):
+   The pg module contains a class called
+   DB wrapping a pgobject.
+   This pgobject can be addressed as a
+   DB class member named db
+   to get access to the read-only attributes of the corresponding connection
+   (e.g. db.error).  All pgobject
+   methods (e.g. query()) are directly included as members
+   in the class DB also.  A number of additional
+   higher level DB class methods are described below.
+   The preferred way to use this module is as follows  (see description of the
+   initialization method below):
 
 
 import pg
index df502397fa6c9b4eaaaeff9d4f8edc03b54c373b..0e40a6e5a47db3f1f65cc387c4cac02dd48e82ba 100644 (file)
@@ -48,14 +48,10 @@ class DB:
    def __init__(self, *args, **kw):
        self.db = apply(connect, args, kw)
 
-       # Create convience methods, in a way that is still overridable.
-       for e in ( 'query', 'reset', 'close', 'getnotify', 'inserttable',
-                   'putline', 'getline', 'endcopy',
-                   'host', 'port', 'db', 'options', 
-                   'tty', 'error', 'status', 'user',
-                   'locreate', 'getlo', 'loimport' ):
-           if not hasattr(self,e) and hasattr(self.db,e):
-               exec 'self.%s = self.db.%s' % ( e, e )
+       # Create convience methods, in a way that is still overridable
+       # (members are not copied because they are actually functions)
+       for e in self.db.__methods__:
+           setattr(self, e, getattr(self.db, e))
 
        self.__attnames__ = {}
        self.__pkeys__ = {}