$NetBSD: patch-aa,v 1.5 2000/03/16 12:14:07 wiz Exp $ Patch from MySQLdb distribution to let the ZMySQL DA work with it instead of with MySQLmodule, with patch paths modified for pkg use. --- This patch should convert ZMySQLDA from using MySQLmodule-1.4 to _mysql. Why _mysql and not MySQLdb? Well, look at the patch. :) It's basically puny. ZMySQLDA ends up abstracting away the Python DB API interface anyway, so why wrap another wrapper? Plus, by default MySQLdb attempts to do type conversions, which Zope doesn't want at this point. I made some changes, partially to help Zopistas, to both _mysql and MySQLdb. The main one is removing type_conv as part of _mysql. It now needs to be passed to _mysql.connect() as the conv keyword argument; if it is not present, it uses an empty dictionary (return everything as strings). MySQLdb now owns type_conv, and passes a copy if you don't supply your own converter. Thanks to Thilo Mezger for pointing out that Zope DOES expect numbers to be returned as numbers, so now a minimal type converter dictionary is passed. To apply the patch, you probably want to do something like this: cd ZOPEHOME # whatever that is tar xvfz ZMySQLDA.tar.gz # the original, unadulterated version patch -p1 1999-10-11 diff -ur python/Products/ZMySQLDA/DA.py python/Products/ZMySQLDA/DA.py --- python/Products/ZMySQLDA/DA.py Mon Jan 25 10:42:45 1999 +++ python/Products/ZMySQLDA/DA.py Wed Sep 15 20:16:32 1999 @@ -133,18 +133,6 @@ def factory(self): return DB - def sql_quote__(self, v, escapes={ - '\\': '\\\\', - '\"': '\\\"', - '\'': '\\\'', - '\0': '\\0', - '\n': '\\n', - '\t': '\\t', - '\r': '\\r', - '\b': '\\n', - }): - find=string.find - for c in "\\\"\'\0\n\t\r\b": - if find(v,c) > -1: - v=string.join(string.split(v,c),escapes[c]) - return "'%s'" % v + def sql_quote__(self, v, escapes={}): + from _mysql import escape_string + return "'%s'" % escape_string(v) diff -ur python/Products/ZMySQLDA/db.py python/Products/ZMySQLDA/db.py --- python/Products/ZMySQLDA/db.py Mon Jan 25 10:42:45 1999 +++ python/Products/ZMySQLDA/db.py Mon Oct 11 21:29:07 1999 @@ -105,5 +105,6 @@ -import MySQL, regex, sys +import _mysql, regex, sys +from _mysql import FIELD_TYPE from string import strip, split, find, join from time import gmtime, strftime @@ -118,13 +119,26 @@ class DB: defs={ - "short": "i", "long": "i", "char": "s", "double": "n", "decimal": "n", - "float": "n", "tiny blob": "t", "medium blob": "t", "long blob": "t", - "blob": "t", "date": "d", "time": "s", "datetime": "d", - "timestamp": "d", "varchar": "t", "string": "t", + FIELD_TYPE.CHAR: "i", FIELD_TYPE.DATE: "d", + FIELD_TYPE.DATETIME: "d", FIELD_TYPE.DECIMAL: "n", + FIELD_TYPE.DOUBLE: "n", FIELD_TYPE.FLOAT: "n", FIELD_TYPE.INT24: "i", + FIELD_TYPE.LONG: "i", FIELD_TYPE.LONGLONG: "l", + FIELD_TYPE.SHORT: "i", FIELD_TYPE.TIMESTAMP: "d", + FIELD_TYPE.TINY: "i", FIELD_TYPE.YEAR: "i", } - Database_Error=MySQL.error + conv={ + FIELD_TYPE.TINY: int, + FIELD_TYPE.SHORT: int, + FIELD_TYPE.LONG: int, + FIELD_TYPE.FLOAT: float, + FIELD_TYPE.DOUBLE: float, + FIELD_TYPE.LONGLONG: long, + FIELD_TYPE.INT24: int, + FIELD_TYPE.YEAR: int + } + + Database_Error=_mysql.Error def __init__(self,connection): self.connection=connection @@ -138,8 +152,7 @@ if len(dbhost) == 1: db, host = dbhost[0], 'localhost' else: [db, host] = dbhost - c=MySQL.connect(host,user,pw) - c.selectdb(db) + c=_mysql.connect(host=host,user=user,passwd=pw,db=db,conv=self.conv) self.db=c return @@ -168,10 +181,11 @@ result=() desc=None for qs in queries: - c=db.query(qs) + db.query(qs) + c=db.store_result() try: - desc=c.fields() - r=c.fetchrows() + desc=c.describe() + r=c.fetch_all_rows() except: r=None if not r: continue if result: @@ -182,15 +196,15 @@ except self.Database_Error, mess: raise sys.exc_type, sys.exc_value, sys.exc_traceback - if desc is None: return (), () + if not desc: return (), () items=[] func=items.append defs=self.defs for d in desc: item={'name': d[0], - 'type': defs[d[2]], - 'width': d[3], + 'type': defs.get(d[1],"t"), + 'width': d[2], } func(item) return items, result