Author: phd
Date: 2006-12-29 08:34:08 -0700 (Fri, 29 Dec 2006)
New Revision: 2171
Added:
home/phd/SQLObject/paramstyles/sqlobject/versioning/
home/phd/SQLObject/paramstyles/sqlobject/versioning/__init__.py
home/phd/SQLObject/paramstyles/sqlobject/versioning/test/
home/phd/SQLObject/paramstyles/sqlobject/versioning/test/__init__.py
home/phd/SQLObject/paramstyles/sqlobject/versioning/test/test_version.py
Removed:
home/phd/SQLObject/paramstyles/sqlobject/versioning/__init__.py
home/phd/SQLObject/paramstyles/sqlobject/versioning/test/
home/phd/SQLObject/paramstyles/sqlobject/versioning/test/__init__.py
home/phd/SQLObject/paramstyles/sqlobject/versioning/test/test_version.py
Modified:
home/phd/SQLObject/paramstyles/setup.py
home/phd/SQLObject/paramstyles/sqlobject/inheritance/__init__.py
home/phd/SQLObject/paramstyles/sqlobject/mysql/mysqlconnection.py
Log:
Merged patches from the revisions 2162:2170 from the trunk
Modified: home/phd/SQLObject/paramstyles/setup.py
===================================================================
--- home/phd/SQLObject/paramstyles/setup.py 2006-12-29 15:32:16 UTC (rev 2170)
+++ home/phd/SQLObject/paramstyles/setup.py 2006-12-29 15:34:08 UTC (rev 2171)
@@ -11,7 +11,7 @@
subpackages = ['firebird', 'include', 'include.pydispatch', 'inheritance',
'manager', 'maxdb', 'mssql', 'mysql', 'postgres', 'sqlite',
- 'sybase', 'util']
+ 'sybase', 'util', 'versioning']
import sys
# patch distutils if it can't cope with the "classifiers" keyword
Modified: home/phd/SQLObject/paramstyles/sqlobject/inheritance/__init__.py
===================================================================
--- home/phd/SQLObject/paramstyles/sqlobject/inheritance/__init__.py 2006-12-29 15:32:16 UTC (rev 2170)
+++ home/phd/SQLObject/paramstyles/sqlobject/inheritance/__init__.py 2006-12-29 15:34:08 UTC (rev 2171)
@@ -164,7 +164,22 @@
delJoin = classmethod(delJoin)
+ def getAllColumns(sqlmeta):
+ columns = sqlmeta.columns.copy()
+ sm = sqlmeta
+ while sm.parentClass:
+ columns.update(sm.parentClass.sqlmeta.columns)
+ sm = sm.parentClass.sqlmeta
+ return columns
+ def asDict(sqlmeta):
+ result = {}
+ for key in sqlmeta.getAllColumns():
+ result[key] = getattr(sqlmeta.instance, key)
+ result['id'] = sqlmeta.instance.id
+ return result
+
+
class InheritableSQLObject(SQLObject):
sqlmeta = InheritableSQLMeta
Modified: home/phd/SQLObject/paramstyles/sqlobject/mysql/mysqlconnection.py
===================================================================
--- home/phd/SQLObject/paramstyles/sqlobject/mysql/mysqlconnection.py 2006-12-29 15:32:16 UTC (rev 2170)
+++ home/phd/SQLObject/paramstyles/sqlobject/mysql/mysqlconnection.py 2006-12-29 15:34:08 UTC (rev 2171)
@@ -78,7 +78,19 @@
conn.autocommit(auto)
def _executeRetry(self, conn, cursor, query):
- while 1:
+ # When a server connection is lost and a query is attempted, most of
+ # the time the query will raise a SERVER_LOST exception, then at the
+ # second attempt to execute it, the mysql lib will reconnect and
+ # succeed. However is a few cases, the first attempt raises the
+ # SERVER_GONE exception, the second attempt the SERVER_LOST exception
+ # and only the third succeeds. Thus the 3 in the loop count.
+ # If it doesn't reconnect even after 3 attempts, while the database is
+ # up and running, it is because a 5.0.x (or newer) server is used
+ # which no longer permits autoreconnects by default. In their case a
+ # reconnect flag must be set when making the connection to indicate
+ # that autoreconnecting is desired and the python-mysqldb module
+ # doesn't set this flag.
+ for c in range(0, 3):
try:
if self.need_unicode:
# For MysqlDB 1.2.1 and later, we go
@@ -88,7 +100,9 @@
else:
return DBAPI._executeRetry(self, conn, cursor, query)
except MySQLdb.OperationalError, e:
- if e.args[0] == 2013: # SERVER_LOST error
+ if e.args[0] in (2006, 2013): # SERVER_GONE or SERVER_LOST error
+ if c == 2:
+ raise OperationalError(ErrorMessage(e))
if self.debug:
self.printDebug(conn, str(e), 'ERROR')
else:
Copied: home/phd/SQLObject/paramstyles/sqlobject/versioning (from rev 2168, SQLObject/trunk/sqlobject/versioning)
Deleted: home/phd/SQLObject/paramstyles/sqlobject/versioning/__init__.py
===================================================================
--- SQLObject/trunk/sqlobject/versioning/__init__.py 2006-12-29 15:19:00 UTC (rev 2168)
+++ home/phd/SQLObject/paramstyles/sqlobject/versioning/__init__.py 2006-12-29 15:34:08 UTC (rev 2171)
@@ -1,65 +0,0 @@
-from sqlobject import *
-from datetime import datetime
-
-class Version(SQLObject):
- def restore(self):
- values = self.sqlmeta.asDict()
- del values['id']
- del values['masterID']
- del values['dateArchived']
- self.masterClass.get(self.masterID).set(**values)
-
-def getColumns(columns, cls):
- for column, defi in cls.sqlmeta.columnDefinitions.items():
- columns[column] = defi.__class__()
-
- #ascend heirarchy
- if cls.sqlmeta.parentClass:
- getColumns(columns, cls.sqlmeta.parentClass)
-
-
-class Versioning(object):
- def __init__(self):
- pass
- def __addtoclass__(self, soClass, name):
- self.name = name
- self.soClass = soClass
- self.versionClass = None
- events.listen(self.createTable,
- soClass, events.CreateTableSignal)
- events.listen(self.rowUpdate, soClass,
- events.RowUpdateSignal)
-
- def createVersionTable(self, cls, conn):
- columns = {'dateArchived': DateTimeCol(default=datetime.now),
- 'masterID': IntCol(),
- 'masterClass' : self.soClass,
- }
-
- getColumns (columns, self.soClass)
-
- self.versionClass = type(self.soClass.__name__+'Versions',
- (Version,),
- columns)
-
- self.versionClass.createTable(connection=conn)
-
- def createTable(self, soClass, connection, extra_sql, post_funcs):
- assert soClass is self.soClass
- post_funcs.append(self.createVersionTable)
-
- def rowUpdate(self, instance, kwargs):
- if instance.childName and instance.childName != self.soClass.__name__:
- return #if you want your child class versioned, version it.
-
- values = instance.sqlmeta.asDict()
- del values['id']
- values['masterID'] = instance.id
- self.versionClass(connection=instance._connection, **values)
-
- def __get__(self, obj, type=None):
- if obj is None:
- return self
- return self.versionClass.select(
- self.versionClass.q.masterID==obj.id, connection=obj._connection)
-
Copied: home/phd/SQLObject/paramstyles/sqlobject/versioning/__init__.py (from rev 2168, SQLObject/trunk/sqlobject/versioning/__init__.py)
===================================================================
--- home/phd/SQLObject/paramstyles/sqlobject/versioning/__init__.py (rev 0)
+++ home/phd/SQLObject/paramstyles/sqlobject/versioning/__init__.py 2006-12-29 15:34:08 UTC (rev 2171)
@@ -0,0 +1,65 @@
+from sqlobject import *
+from datetime import datetime
+
+class Version(SQLObject):
+ def restore(self):
+ values = self.sqlmeta.asDict()
+ del values['id']
+ del values['masterID']
+ del values['dateArchived']
+ self.masterClass.get(self.masterID).set(**values)
+
+def getColumns(columns, cls):
+ for column, defi in cls.sqlmeta.columnDefinitions.items():
+ columns[column] = defi.__class__()
+
+ #ascend heirarchy
+ if cls.sqlmeta.parentClass:
+ getColumns(columns, cls.sqlmeta.parentClass)
+
+
+class Versioning(object):
+ def __init__(self):
+ pass
+ def __addtoclass__(self, soClass, name):
+ self.name = name
+ self.soClass = soClass
+ self.versionClass = None
+ events.listen(self.createTable,
+ soClass, events.CreateTableSignal)
+ events.listen(self.rowUpdate, soClass,
+ events.RowUpdateSignal)
+
+ def createVersionTable(self, cls, conn):
+ columns = {'dateArchived': DateTimeCol(default=datetime.now),
+ 'masterID': IntCol(),
+ 'masterClass' : self.soClass,
+ }
+
+ getColumns (columns, self.soClass)
+
+ self.versionClass = type(self.soClass.__name__+'Versions',
+ (Version,),
+ columns)
+
+ self.versionClass.createTable(connection=conn)
+
+ def createTable(self, soClass, connection, extra_sql, post_funcs):
+ assert soClass is self.soClass
+ post_funcs.append(self.createVersionTable)
+
+ def rowUpdate(self, instance, kwargs):
+ if instance.childName and instance.childName != self.soClass.__name__:
+ return #if you want your child class versioned, version it.
+
+ values = instance.sqlmeta.asDict()
+ del values['id']
+ values['masterID'] = instance.id
+ self.versionClass(connection=instance._connection, **values)
+
+ def __get__(self, obj, type=None):
+ if obj is None:
+ return self
+ return self.versionClass.select(
+ self.versionClass.q.masterID==obj.id, connection=obj._connection)
+
Copied: home/phd/SQLObject/paramstyles/sqlobject/versioning/test (from rev 2168, SQLObject/trunk/sqlobject/versioning/test)
Deleted: home/phd/SQLObject/paramstyles/sqlobject/versioning/test/__init__.py
===================================================================
Copied: home/phd/SQLObject/paramstyles/sqlobject/versioning/test/__init__.py (from rev 2168, SQLObject/trunk/sqlobject/versioning/test/__init__.py)
===================================================================
Deleted: home/phd/SQLObject/paramstyles/sqlobject/versioning/test/test_version.py
===================================================================
--- SQLObject/trunk/sqlobject/versioning/test/test_version.py 2006-12-29 15:19:00 UTC (rev 2168)
+++ home/phd/SQLObject/paramstyles/sqlobject/versioning/test/test_version.py 2006-12-29 15:34:08 UTC (rev 2171)
@@ -1,97 +0,0 @@
-from py.test import raises
-from sqlobject import *
-from sqlobject.tests.dbtest import *
-from sqlobject.inheritance import InheritableSQLObject
-from sqlobject.versioning import Versioning
-
-from datetime import datetime
-
-
-def setup():
- setupClass(MyClass)
- setupClass(Base)
- setupClass(Child)
- setupClass(Government)
- setupClass(Monarchy)
- setupClass(VChild)
-
-class MyClass(SQLObject):
- name = StringCol()
- versions = Versioning()
-
-class Base(InheritableSQLObject):
- name = StringCol()
- versions = Versioning()
-
-class Child(Base):
- toy = StringCol()
-
-
-class Government(InheritableSQLObject):
- name = StringCol()
-
-class Monarchy(Government):
- monarch = StringCol()
- versions = Versioning()
-
-class VChild(Base):
- weapon = StringCol()
- versions = Versioning()
-
-def test_versioning():
-
- #the simple case
- setup()
- mc = MyClass(name='fleem')
- mc.set(name='morx')
- assert len(list(mc.versions)) == 1
- assert mc.versions[0].name == "fleem"
-
- assert len(list(MyClass.select())) == 1
-
-def test_inheritable_versioning():
- setup()
-
- #base versioned, child unversioned
- base = Base(name='fleem')
- base.set(name='morx')
- assert len(list(base.versions)) == 1
- assert base.versions[0].name == "fleem"
- assert len(list(Base.select())) == 1
-
- child = Child(name='child', toy='nintendo')
- child.set(name='teenager', toy='guitar')
- assert len(list(child.versions)) == 0
-
-
- #child versioned, base unversioned
- government = Government(name='canada')
- assert not hasattr(government, 'versions')
-
- monarchy = Monarchy(name='UK', monarch='king george iv')
- monarchy.set(name='queen elisabeth ii')
- assert len(list(monarchy.versions)) == 1
- assert monarchy.versions[0].name == "UK"
- assert len(list(Monarchy.select())) == 1
-
- #both parent and child versioned
- num_base_versions = len(list(base.versions))
- vchild = VChild(name='kid', weapon='slingshot')
- vchild.set(name='toon', weapon='dynamite')
- assert len(list(base.versions)) == num_base_versions
- assert len(list(vchild.versions)) == 1
-
-def test_restore():
- setup()
- base = Base(name='fleem')
- base.set(name='morx')
- assert base.name == "morx"
- base.versions[0].restore()
- assert base.name == "fleem"
-
- monarchy = Monarchy(name='USA', monarch='Emperor Norton I')
- monarchy.set(name='morx')
- assert monarchy.name == "morx"
- monarchy.versions[0].restore()
- assert monarchy.name == "USA"
- assert monarchy.monarch == "Emperor Norton I"
Copied: home/phd/SQLObject/paramstyles/sqlobject/versioning/test/test_version.py (from rev 2168, SQLObject/trunk/sqlobject/versioning/test/test_version.py)
===================================================================
--- home/phd/SQLObject/paramstyles/sqlobject/versioning/test/test_version.py (rev 0)
+++ home/phd/SQLObject/paramstyles/sqlobject/versioning/test/test_version.py 2006-12-29 15:34:08 UTC (rev 2171)
@@ -0,0 +1,97 @@
+from py.test import raises
+from sqlobject import *
+from sqlobject.tests.dbtest import *
+from sqlobject.inheritance import InheritableSQLObject
+from sqlobject.versioning import Versioning
+
+from datetime import datetime
+
+
+def setup():
+ setupClass(MyClass)
+ setupClass(Base)
+ setupClass(Child)
+ setupClass(Government)
+ setupClass(Monarchy)
+ setupClass(VChild)
+
+class MyClass(SQLObject):
+ name = StringCol()
+ versions = Versioning()
+
+class Base(InheritableSQLObject):
+ name = StringCol()
+ versions = Versioning()
+
+class Child(Base):
+ toy = StringCol()
+
+
+class Government(InheritableSQLObject):
+ name = StringCol()
+
+class Monarchy(Government):
+ monarch = StringCol()
+ versions = Versioning()
+
+class VChild(Base):
+ weapon = StringCol()
+ versions = Versioning()
+
+def test_versioning():
+
+ #the simple case
+ setup()
+ mc = MyClass(name='fleem')
+ mc.set(name='morx')
+ assert len(list(mc.versions)) == 1
+ assert mc.versions[0].name == "fleem"
+
+ assert len(list(MyClass.select())) == 1
+
+def test_inheritable_versioning():
+ setup()
+
+ #base versioned, child unversioned
+ base = Base(name='fleem')
+ base.set(name='morx')
+ assert len(list(base.versions)) == 1
+ assert base.versions[0].name == "fleem"
+ assert len(list(Base.select())) == 1
+
+ child = Child(name='child', toy='nintendo')
+ child.set(name='teenager', toy='guitar')
+ assert len(list(child.versions)) == 0
+
+
+ #child versioned, base unversioned
+ government = Government(name='canada')
+ assert not hasattr(government, 'versions')
+
+ monarchy = Monarchy(name='UK', monarch='king george iv')
+ monarchy.set(name='queen elisabeth ii')
+ assert len(list(monarchy.versions)) == 1
+ assert monarchy.versions[0].name == "UK"
+ assert len(list(Monarchy.select())) == 1
+
+ #both parent and child versioned
+ num_base_versions = len(list(base.versions))
+ vchild = VChild(name='kid', weapon='slingshot')
+ vchild.set(name='toon', weapon='dynamite')
+ assert len(list(base.versions)) == num_base_versions
+ assert len(list(vchild.versions)) == 1
+
+def test_restore():
+ setup()
+ base = Base(name='fleem')
+ base.set(name='morx')
+ assert base.name == "morx"
+ base.versions[0].restore()
+ assert base.name == "fleem"
+
+ monarchy = Monarchy(name='USA', monarch='Emperor Norton I')
+ monarchy.set(name='morx')
+ assert monarchy.name == "morx"
+ monarchy.versions[0].restore()
+ assert monarchy.name == "USA"
+ assert monarchy.monarch == "Emperor Norton I"
|