File: ZMySQLDA.patch

package info (click to toggle)
python-mysqldb 0.1.1-1
  • links: PTS
  • area: main
  • in suites: potato
  • size: 264 kB
  • ctags: 244
  • sloc: ansic: 1,320; python: 1,079; makefile: 47; sh: 14
file content (140 lines) | stat: -rw-r--r-- 5,168 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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