resolve concurrency problem

darcs-hash:20070708202230-86b55-b468cbaac24636efc20aea6e39eaa573db17e24e.gz
This commit is contained in:
David Rousselie
2007-07-08 22:22:30 +02:00
parent 7507f3b6ab
commit a566440b97
4 changed files with 79 additions and 13 deletions

View File

@@ -64,3 +64,12 @@ def get_accounts_root_filter(self, stanza, lang_class, node=None):
return account.get_accounts(stanza.get_from().bare()) return account.get_accounts(stanza.get_from().bare())
else: else:
return None return None
def replace_handlers(handlers, old_handler_type, new_handler):
"""
Replace handlers of type `old_handler_type` in `handlers` by `new_handler`
"""
for handler_group in handlers:
for i in xrange(len(handler_group)):
if isinstance(handler_group[i], old_handler_type):
handler_group[i] = new_handler

View File

@@ -17,16 +17,16 @@ def db_connect():
Create a new connection to the DataBase (SQLObject use connection Create a new connection to the DataBase (SQLObject use connection
pool) associated to the current thread. pool) associated to the current thread.
""" """
if not jcl.model.db_connected: #if not jcl.model.db_connected:
jcl.model.hub.threadConnection = \ jcl.model.hub.threadConnection = \
connectionForURI(db_connection_str) connectionForURI(db_connection_str)
# account.hub.threadConnection.debug = True # account.hub.threadConnection.debug = True
jcl.model.db_connected = True #jcl.model.db_connected = True
def db_disconnect(): def db_disconnect():
""" """
Delete connection associated to the current thread. Delete connection associated to the current thread.
""" """
if jcl.model.db_connected: #if jcl.model.db_connected:
del jcl.model.hub.threadConnection #del jcl.model.hub.threadConnection
jcl.model.db_connected = False #jcl.model.db_connected = False

View File

@@ -2,11 +2,68 @@
__revision__ = "" __revision__ = ""
import unittest import unittest
import threading
import os
import sys
from jcl.model.tests import account from sqlobject import SQLObject
from sqlobject.col import StringCol
from sqlobject.dbconnection import TheURIOpener
import jcl.model as model
if sys.platform == "win32":
DB_PATH = "/c|/temp/jcl_test.db"
else:
DB_PATH = "/tmp/jcl_test.db"
DB_URL = DB_PATH# + "?debug=1&debugThreading=1"
class MockSQLObject(SQLObject):
_connection = model.hub
string_attr = StringCol()
class ModelModule_TestCase(unittest.TestCase):
def setUp(self):
if os.path.exists(DB_PATH):
os.unlink(DB_PATH)
model.db_connection_str = 'sqlite://' + DB_URL
model.db_connect()
MockSQLObject.createTable(ifNotExists=True)
model.db_disconnect()
def tearDown(self):
model.db_connect()
MockSQLObject.dropTable(ifExists=True)
del TheURIOpener.cachedURIs['sqlite://' + DB_URL]
model.hub.threadConnection.close()
model.db_disconnect()
if os.path.exists(DB_PATH):
os.unlink(DB_PATH)
def test_multiple_db_connection(self):
def create_account_thread():
model.db_connect()
obj21 = MockSQLObject(string_attr="obj21")
obj22 = MockSQLObject(string_attr="obj22")
model.db_disconnect()
model.db_connect()
timer_thread = threading.Thread(target=create_account_thread,
name="CreateAccountThread")
timer_thread.start()
obj11 = MockSQLObject(string_attr="obj11")
obj12 = MockSQLObject(string_attr="obj12")
timer_thread.join(2)
threads = threading.enumerate()
self.assertEquals(len(threads), 1)
objs = MockSQLObject.select()
self.assertEquals(objs.count(), 4)
model.db_disconnect()
def suite(): def suite():
suite = unittest.TestSuite() suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(ModelModule_TestCase, 'test'))
from jcl.model.tests import account
suite.addTest(account.suite()) suite.addTest(account.suite())
return suite return suite

View File

@@ -277,10 +277,10 @@ class PresenceAccount_TestCase(InheritableAccount_TestCase):
self.account_class.possibles_actions) self.account_class.possibles_actions)
def test_possibles_actions(self): def test_possibles_actions(self):
for (field_name, \ for (field_name,
field_type, \ field_type,
possibles_actions, \ possibles_actions,
post_func, \ post_func,
default_func) in self.account_class.get_register_fields()[1:]: default_func) in self.account_class.get_register_fields()[1:]:
if possibles_actions is not None: if possibles_actions is not None:
for possible_action in possibles_actions: for possible_action in possibles_actions: