[Checkins] SVN: mysqldbda/trunk/ Made sure that __stringConverter
gets (re)set only when needed
Adam Groszer
agroszer at gmail.com
Tue May 6 10:19:26 EDT 2008
Log message for revision 86510:
Made sure that __stringConverter gets (re)set only when needed
(only on encoding change) otherwise it just bloats ZODB
Changed:
U mysqldbda/trunk/CHANGES.txt
U mysqldbda/trunk/src/mysqldbda/adapter.py
U mysqldbda/trunk/src/mysqldbda/tests/test_adapter.py
-=-
Modified: mysqldbda/trunk/CHANGES.txt
===================================================================
--- mysqldbda/trunk/CHANGES.txt 2008-05-06 14:18:58 UTC (rev 86509)
+++ mysqldbda/trunk/CHANGES.txt 2008-05-06 14:19:25 UTC (rev 86510)
@@ -2,6 +2,13 @@
CHANGES
=======
+1.0.2 (2008-05-06)
+------------------
+
+- Made sure that __stringConverter gets (re)set only when needed
+ (only on encoding change) otherwise it just bloats ZODB
+
+
1.0.1 (2008-02-20)
------------------
Modified: mysqldbda/trunk/src/mysqldbda/adapter.py
===================================================================
--- mysqldbda/trunk/src/mysqldbda/adapter.py 2008-05-06 14:18:58 UTC (rev 86509)
+++ mysqldbda/trunk/src/mysqldbda/adapter.py 2008-05-06 14:19:25 UTC (rev 86510)
@@ -51,8 +51,10 @@
__NUMBERtypes = (0, 5, 4, 9, 3, 8, 1, 13)
__TIMEtypes = (11)
- # Default string converter
- __stringConverter = MySQLStringConverter('UTF-8')
+ def __init__(self, *args, **kw):
+ super(MySQLdbAdapter, self).__init__(*args, **kw)
+ # Default string converter
+ self.__stringConverter = MySQLStringConverter(self.getEncoding())
def _connection_factory(self):
"""Create a MySQLdb DBI connection based on the DSN"""
@@ -64,7 +66,11 @@
user=conn_info['username'],
passwd=conn_info['password'],
port=int(conn_info['port'] or '3306'))
- self.__stringConverter = MySQLStringConverter(self.getEncoding())
+
+ if self.__stringConverter.encoding != self.getEncoding():
+ #avoid resetting this everytime, otherwise the adapter
+ #gets modified on each connection and that causes ZODB conflicts
+ self.__stringConverter = MySQLStringConverter(self.getEncoding())
return connection
def getConverter(self, type):
@@ -76,6 +82,10 @@
def identity(self, x):
return x
+ def setEncoding(self, encoding):
+ super(MySQLdbAdapter, self).setEncoding(encoding)
+ self.__stringConverter = MySQLStringConverter(self.getEncoding())
+
def __call__(self):
connection = ZopeDatabaseAdapter.__call__(self)
directlyProvides(connection, IMySQLZopeConnection)
Modified: mysqldbda/trunk/src/mysqldbda/tests/test_adapter.py
===================================================================
--- mysqldbda/trunk/src/mysqldbda/tests/test_adapter.py 2008-05-06 14:18:58 UTC (rev 86509)
+++ mysqldbda/trunk/src/mysqldbda/tests/test_adapter.py 2008-05-06 14:19:25 UTC (rev 86510)
@@ -18,6 +18,7 @@
from unittest import TestCase, TestSuite, main, makeSuite
import MySQLdb
+from mysqldbda.adapter import MySQLdbAdapter
class TestStringConversion(TestCase):
def test_testStringConversion(self):
@@ -29,6 +30,40 @@
b =converter(u'Hi mom!')
self.assertEquals(type(b),unicode)
+ def test_testStringConverterAssignment(self):
+ #checking here that __stringConverter gets assigned when necessary
+ #and only when necesary, not on every connection creation
+ ad = MySQLdbAdapter("dbi://test" )
+
+ #__STRINGtypes = (1, 247, 254, 253)
+ cvt1 = ad.getConverter(1)
+
+ #not testable without a live MYSQL server
+ #------------------
+ #conn = ad.connect()
+ #cvt2 = ad.getConverter(1)
+ #self.assertEqual(cvt1, cvt2)
+ #self.assertEqual(cvt1.encoding, ad.encoding)
+ #ad.disconnect()
+ #
+ ##encoding does NOT set the __stringConverter
+ ##we need to connect again
+ #ad.encoding = 'latin2'
+ #conn = ad.connect()
+ #cvt3 = ad.getConverter(1)
+ #self.assertNotEqual(cvt2, cvt3)
+ #self.assertEqual(cvt3.encoding, 'latin2')
+ #ad.disconnect()
+ #------------------
+
+ #setEncoding sets the __stringConverter also
+ ad.setEncoding('latin1')
+ cvt2 = ad.getConverter(1)
+ self.assertNotEqual(cvt1, cvt2)
+ self.assertEqual(cvt2.encoding, 'latin1')
+
+
+
def test_suite():
return TestSuite((
makeSuite(TestStringConversion),
More information about the Checkins
mailing list