[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