--- ZSQLExtend/ZSQLExtend.py 2011/02/14 22:00:50 1.138 +++ ZSQLExtend/ZSQLExtend.py 2011/02/23 20:05:51 1.142 @@ -5,11 +5,14 @@ import urllib import re import string #from pyPgSQL import libpq +import psycopg2 from AccessControl import getSecurityManager,Unauthorized from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate from Products.PageTemplates.PageTemplateFile import PageTemplateFile from Products.ZSQLMethods.SQL import SQLConnectionIDs +from Shared.DC.ZRDB.Results import Results + from xml.sax.saxutils import escape from types import * import Shared.DC.ZRDB.DA @@ -586,12 +589,13 @@ class ZSQLExtendFolder(Folder,Persistent return pt() - def changeZSQLExtend(self,label,description,weight=0,connection_id=None,REQUEST=None,): + def changeZSQLExtend(self,label,description,weight=0,connection_id=None,autocommit=None,REQUEST=None,): """change the Konfiguration""" self.connection_id=connection_id self.weight=weight self.label=label self.description=description + self.autocommit = (autocommit == "on") if REQUEST is not None: return self.manage_main(self, REQUEST) @@ -990,12 +994,51 @@ class ZSQLExtendFolder(Folder,Persistent def ZSQLSimpleSearch(self,query=None,max_rows=1000000): """new simple search""" - logging.debug("new ZSQLSimpleSearch X %s"%query) + logging.debug("new ZSQLSimpleSearch %s"%query) # get Connection instance con = self.getConnectionObj() # call to get db object dbc = con() - res = dbc.query(query, max_rows=max_rows) + if getattr(self, 'autocommit', False): + # force transaction isolation level (for psycopg2 0=autocommit) + logging.debug(" old tilevel=%s"%dbc.tilevel) + dbc.tilevel = 0 + # modified code from ZPsycopgDA.db without _register: + c = dbc.getcursor() + desc = () + r = [] + try: + try: + c.execute(query) + + except psycopg2.OperationalError: + #logging.exception("Operational error on connection, closing it.") + try: + # Only close our connection + dbc.putconn(True) + except: + #logging.debug("Something went wrong when we tried to close the pool", exc_info=True) + pass + + if c.description is not None: + if max_rows: + r = c.fetchmany(max_rows) + else: + r = c.fetchall() + desc = c.description + + dbc.failures = 0 + + except StandardError, err: + raise err + + res = (dbc.convert_description(desc), r) + + else: + logging.debug(" no autocommit") + # just use DA's query method + res = dbc.query(query, max_rows=max_rows) + # return result set as Result object with Brains return Results(res)