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 <ZMySQLDA.patch # adulterate it

Then, follow the README instructions for building MySQLdb and install
it where Python can find it. Finally, you will need to restart Zope.

Andy Dustman <adustman@comstar.net>
1999-10-11

diff -ur ZMySQLDA.orig/lib/python/Products/ZMySQLDA/DA.py ZMySQLDA/lib/python/Products/ZMySQLDA/DA.py
--- ZMySQLDA.orig/lib/python/Products/ZMySQLDA/DA.py	Mon Jan 25 10:42:45 1999
+++ ZMySQLDA/lib/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 ZMySQLDA.orig/lib/python/Products/ZMySQLDA/db.py ZMySQLDA/lib/python/Products/ZMySQLDA/db.py
--- ZMySQLDA.orig/lib/python/Products/ZMySQLDA/db.py	Mon Jan 25 10:42:45 1999
+++ ZMySQLDA/lib/python/Products/ZMySQLDA/db.py	Mon Oct 11 21:29:07 1999
@@ -103,7 +103,8 @@
 """Db connection implementation"""
 __version__='$Revision: 1.9 $'[11:-2]
 
-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
