Hi Guys, I wanted to use ZSQL Methods in Z Classes to share code between different parts of a large project. The different parts need to use similar, but separate, database namespaces, but I still wanted to use the same methods. Now, ZSQL Methods treat their Database connection ID, for some reason, on a par with their source -- it is not a parameter. You are not supposed to run one ZSQL Method on two connections. (One can try to acquire, restricting yourself to the same ID name in different folders; I think this will not work, and the ZSQL methods will get to their original DB connection first). I tried to bypass this limitation, by defining a forwarding database adapter. The idea was that this adapter's connection string would point to a resource (property or method) which will specify the actual connection. The idea was that in a ZClass, I could have this be a pythonscript which will look into an instance property sheet, thereby allowing different instances to use different connections. This seemed to work very nicely at first: After the ZClass with the forwarding adapter and pythonscript was installed into a folder, all its methods worked like magic. I was very happy. Then we restarted Zope, and ever since, it seems like the Adapter is being called by the ZSQL Methods without any acquisiotion context. Could you help show me what went wrong? BTW: I intended to make the forwarding DA a product, and to ship with it a base ZClass for ZSQL methods-using ZClasses, which I wanted to call "ZSQL Class". But even before the current problems, I was halted by the fact that if you define a database connection in a ZClass, ZSQL Methods in derived classes cannot use it. In fact, even ZSQL Methods in the same class as the adapter act funny -- you can set it as their connection, but in the source they say "connection not found", and you can't test them in the class context (even when they don't rely on instance resources). Hope this is informative enough, and that others have thought of these problems, Shai.
Hi Guys, Last week, I wrote:
Hi Guys,
I wanted to use ZSQL Methods in Z Classes to share code between different parts of a large project. The different parts need to use similar, but separate, database namespaces, but I still wanted to use the same methods.
[...]
I tried to bypass this limitation, by defining a forwarding database adapter. The idea was that this adapter's connection string would point to a resource (property or method) which will specify the actual connection. The idea was that in a ZClass, I could have this be a pythonscript which will look into an instance property sheet, thereby allowing different instances to use different connections.
This seemed to work very nicely at first: After the ZClass with the forwarding adapter and pythonscript was installed into a folder, all its methods worked like magic. I was very happy.
Then we restarted Zope, and ever since, it seems like the Adapter is being called by the ZSQL Methods without any acquisiotion context.
Then we shut down Zope, and started it again from the command line, and everything seems to work OK. Except... that still,
ZSQL Methods in the same class as the adapter act funny -- you can set it as their connection, but in the source they say "connection not found", and you can't test them in the class context (even when they don't rely on instance resources).
And besides, my excellent adapter seems to have a problem: The idea behind it is very simple. Most of the adapter code is taken from ZGadfly, but the database implementation -- i.e. the connection between adapter and Python binding -- is replaced with the function, def DB(self, connection_finder): try: db_finder=getattr(self, connection_finder) except AttributeError: raise AttributeError, ( "The database connection finder <em>%s</em> cannot be found." % ( connection_finder)) # db_finder may be a string or a method which returns a string if hasattr(db_finder,'__call__'): db_name = db_finder() else: db_name = db_finder # Now find the actual db try: db = getattr(self, db_name) except AttributeError: raise AttributeError, ( "The database connection <em>%s</em> " "(indicated by <em>%s</em>) cannot be found." % ( db_name, connection_finder)) return db() The function DB is called whenever there is need to fetch a new database connection. It finds the name of the connection (db_name) and calls it, which is a lot like the way ZSQL Methods themselves find their connections. The problem is that when I try this with the proxied connection being a Z Oracle Connection, ZSQL methods in the ZClass get a different connection (at the Oracle level) from those outside it; in my case, this leads to very unpleasant database locks. It looks to me like some bad case of acquisition illness, but I can't quite get a grip on it. About ZSQL Methods in ZClasses: Searching through the archives, I found that Lindell Alderman tried to do, essentially, the same thing (use same set of ZSQL Methods on different connections thru ZClasses), and asked about it in zope-dev, exactly a year ago; there was no answer. (http://zope.nipltd.com/public/lists/dev-archive.nsf/0a8715d5f3c7b6a3802568c1... 098f2c0745ca099c802568e6007f2f31?OpenDocument&Highlight=2,ZClass) Is there a non-ZClass way to do this? Thanks again, and sorry for my impatience -- I really didn't want to share Lindell's fate of being unanswered, so I figured at least I could reply... Have fun, Shai.
participants (1)
-
Shai Berger