[Checkins] SVN: relstorage/trunk/relstorage/adapters/ Increased test coverage by reducing duplicated try/finally constructs.
Shane Hathaway
shane at hathawaymix.org
Mon Jan 26 19:14:01 EST 2009
Log message for revision 95058:
Increased test coverage by reducing duplicated try/finally constructs.
Changed:
U relstorage/trunk/relstorage/adapters/common.py
U relstorage/trunk/relstorage/adapters/mysql.py
U relstorage/trunk/relstorage/adapters/oracle.py
U relstorage/trunk/relstorage/adapters/postgresql.py
-=-
Modified: relstorage/trunk/relstorage/adapters/common.py
===================================================================
--- relstorage/trunk/relstorage/adapters/common.py 2009-01-26 23:30:28 UTC (rev 95057)
+++ relstorage/trunk/relstorage/adapters/common.py 2009-01-27 00:14:01 UTC (rev 95058)
@@ -176,7 +176,27 @@
stmt = '\n'.join(lines)
self._run_script_stmt(cursor, stmt, params)
+ def _open_and_call(self, callback):
+ """Call a function with an open connection and cursor.
+ If the function returns, commits the transaction and returns the
+ result returned by the function.
+ If the function raises an exception, aborts the transaction
+ then propagates the exception.
+ """
+ conn, cursor = self.open()
+ try:
+ try:
+ res = callback(conn, cursor)
+ except:
+ conn.rollback()
+ raise
+ else:
+ conn.commit()
+ return res
+ finally:
+ self.close(conn, cursor)
+
def _transaction_iterator(self, cursor):
"""Iterate over a list of transactions returned from the database.
Modified: relstorage/trunk/relstorage/adapters/mysql.py
===================================================================
--- relstorage/trunk/relstorage/adapters/mysql.py 2009-01-26 23:30:28 UTC (rev 95057)
+++ relstorage/trunk/relstorage/adapters/mysql.py 2009-01-27 00:14:01 UTC (rev 95058)
@@ -235,66 +235,39 @@
def prepare_schema(self):
"""Create the database schema if it does not already exist."""
- conn, cursor = self.open()
- try:
- try:
- cursor.execute("SHOW TABLES LIKE 'object_state'")
- if not cursor.rowcount:
- self.create_schema(cursor)
- except:
- conn.rollback()
- raise
- else:
- conn.commit()
- finally:
- self.close(conn, cursor)
+ def callback(conn, cursor):
+ cursor.execute("SHOW TABLES LIKE 'object_state'")
+ if not cursor.rowcount:
+ self.create_schema(cursor)
+ self._open_and_call(callback)
-
def zap_all(self):
"""Clear all data out of the database."""
- conn, cursor = self.open()
- try:
- try:
- stmt = """
- DELETE FROM object_refs_added;
- DELETE FROM object_ref;
- DELETE FROM current_object;
- DELETE FROM object_state;
- TRUNCATE new_oid;
- DELETE FROM transaction;
- -- Create a transaction to represent object creation.
- INSERT INTO transaction (tid, username, description) VALUES
- (0, 'system', 'special transaction for object creation');
- """
- self._run_script(cursor, stmt)
- except:
- conn.rollback()
- raise
- else:
- conn.commit()
- finally:
- self.close(conn, cursor)
+ def callback(conn, cursor):
+ stmt = """
+ DELETE FROM object_refs_added;
+ DELETE FROM object_ref;
+ DELETE FROM current_object;
+ DELETE FROM object_state;
+ TRUNCATE new_oid;
+ DELETE FROM transaction;
+ -- Create a transaction to represent object creation.
+ INSERT INTO transaction (tid, username, description) VALUES
+ (0, 'system', 'special transaction for object creation');
+ """
+ self._run_script(cursor, stmt)
+ self._open_and_call(callback)
-
def drop_all(self):
"""Drop all tables and sequences."""
- conn, cursor = self.open()
- try:
- try:
- for tablename in ('pack_state_tid', 'pack_state',
- 'pack_object', 'object_refs_added', 'object_ref',
- 'current_object', 'object_state', 'new_oid',
- 'transaction'):
- cursor.execute("DROP TABLE IF EXISTS %s" % tablename)
- except:
- conn.rollback()
- raise
- else:
- conn.commit()
- finally:
- self.close(conn, cursor)
+ def callback(conn, cursor):
+ for tablename in ('pack_state_tid', 'pack_state',
+ 'pack_object', 'object_refs_added', 'object_ref',
+ 'current_object', 'object_state', 'new_oid',
+ 'transaction'):
+ cursor.execute("DROP TABLE IF EXISTS %s" % tablename)
+ self._open_and_call(callback)
-
def open(self, transaction_mode="ISOLATION LEVEL READ COMMITTED"):
"""Open a database connection and return (conn, cursor)."""
try:
Modified: relstorage/trunk/relstorage/adapters/oracle.py
===================================================================
--- relstorage/trunk/relstorage/adapters/oracle.py 2009-01-26 23:30:28 UTC (rev 95057)
+++ relstorage/trunk/relstorage/adapters/oracle.py 2009-01-27 00:14:01 UTC (rev 95058)
@@ -267,73 +267,46 @@
def prepare_schema(self):
"""Create the database schema if it does not already exist."""
- conn, cursor = self.open()
- try:
- try:
- cursor.execute("""
- SELECT 1 FROM USER_TABLES WHERE TABLE_NAME = 'OBJECT_STATE'
- """)
- if not cursor.fetchall():
- self.create_schema(cursor)
- except:
- conn.rollback()
- raise
- else:
- conn.commit()
- finally:
- self.close(conn, cursor)
+ def callback(conn, cursor):
+ cursor.execute("""
+ SELECT 1 FROM USER_TABLES WHERE TABLE_NAME = 'OBJECT_STATE'
+ """)
+ if not cursor.fetchall():
+ self.create_schema(cursor)
+ self._open_and_call(callback)
-
def zap_all(self):
"""Clear all data out of the database."""
- conn, cursor = self.open()
- try:
- try:
- stmt = """
- DELETE FROM object_refs_added;
- DELETE FROM object_ref;
- DELETE FROM current_object;
- DELETE FROM object_state;
- DELETE FROM transaction;
- -- Create a transaction to represent object creation.
- INSERT INTO transaction (tid, username, description) VALUES
- (0, UTL_I18N.STRING_TO_RAW('system', 'US7ASCII'),
- UTL_I18N.STRING_TO_RAW(
- 'special transaction for object creation', 'US7ASCII'));
- DROP SEQUENCE zoid_seq;
- CREATE SEQUENCE zoid_seq;
- """
- self._run_script(cursor, stmt)
- except:
- conn.rollback()
- raise
- else:
- conn.commit()
- finally:
- self.close(conn, cursor)
+ def callback(conn, cursor):
+ stmt = """
+ DELETE FROM object_refs_added;
+ DELETE FROM object_ref;
+ DELETE FROM current_object;
+ DELETE FROM object_state;
+ DELETE FROM transaction;
+ -- Create a transaction to represent object creation.
+ INSERT INTO transaction (tid, username, description) VALUES
+ (0, UTL_I18N.STRING_TO_RAW('system', 'US7ASCII'),
+ UTL_I18N.STRING_TO_RAW(
+ 'special transaction for object creation', 'US7ASCII'));
+ DROP SEQUENCE zoid_seq;
+ CREATE SEQUENCE zoid_seq;
+ """
+ self._run_script(cursor, stmt)
+ self._open_and_call(callback)
-
def drop_all(self):
"""Drop all tables and sequences."""
- conn, cursor = self.open()
- try:
- try:
- for tablename in ('pack_state_tid', 'pack_state',
- 'pack_object', 'object_refs_added', 'object_ref',
- 'current_object', 'object_state', 'transaction',
- 'commit_lock', 'pack_lock',
- 'temp_store', 'temp_undo', 'temp_pack_visit'):
- cursor.execute("DROP TABLE %s" % tablename)
- cursor.execute("DROP SEQUENCE zoid_seq")
- except:
- conn.rollback()
- raise
- else:
- conn.commit()
- finally:
- self.close(conn, cursor)
+ def callback(conn, cursor):
+ for tablename in ('pack_state_tid', 'pack_state',
+ 'pack_object', 'object_refs_added', 'object_ref',
+ 'current_object', 'object_state', 'transaction',
+ 'commit_lock', 'pack_lock',
+ 'temp_store', 'temp_undo', 'temp_pack_visit'):
+ cursor.execute("DROP TABLE %s" % tablename)
+ cursor.execute("DROP SEQUENCE zoid_seq")
+ self._open_and_call(callback)
-
def open(self, transaction_mode="ISOLATION LEVEL READ COMMITTED",
twophase=False):
"""Open a database connection and return (conn, cursor)."""
Modified: relstorage/trunk/relstorage/adapters/postgresql.py
===================================================================
--- relstorage/trunk/relstorage/adapters/postgresql.py 2009-01-26 23:30:28 UTC (rev 95057)
+++ relstorage/trunk/relstorage/adapters/postgresql.py 2009-01-27 00:14:01 UTC (rev 95058)
@@ -142,73 +142,46 @@
def prepare_schema(self):
"""Create the database schema if it does not already exist."""
- conn, cursor = self.open()
- try:
- try:
- cursor.execute("""
- SELECT tablename
- FROM pg_tables
- WHERE tablename = 'object_state'
- """)
- if not cursor.rowcount:
- self.create_schema(cursor)
- except:
- conn.rollback()
- raise
- else:
- conn.commit()
- finally:
- self.close(conn, cursor)
+ def callback(conn, cursor):
+ cursor.execute("""
+ SELECT tablename
+ FROM pg_tables
+ WHERE tablename = 'object_state'
+ """)
+ if not cursor.rowcount:
+ self.create_schema(cursor)
+ self._open_and_call(callback)
-
def zap_all(self):
"""Clear all data out of the database."""
- conn, cursor = self.open()
- try:
- try:
- cursor.execute("""
- DELETE FROM object_refs_added;
- DELETE FROM object_ref;
- DELETE FROM current_object;
- DELETE FROM object_state;
- DELETE FROM transaction;
- -- Create a special transaction to represent object creation.
- INSERT INTO transaction (tid, username, description) VALUES
- (0, 'system', 'special transaction for object creation');
- ALTER SEQUENCE zoid_seq START WITH 1;
- """)
- except:
- conn.rollback()
- raise
- else:
- conn.commit()
- finally:
- self.close(conn, cursor)
+ def callback(conn, cursor):
+ cursor.execute("""
+ DELETE FROM object_refs_added;
+ DELETE FROM object_ref;
+ DELETE FROM current_object;
+ DELETE FROM object_state;
+ DELETE FROM transaction;
+ -- Create a special transaction to represent object creation.
+ INSERT INTO transaction (tid, username, description) VALUES
+ (0, 'system', 'special transaction for object creation');
+ ALTER SEQUENCE zoid_seq START WITH 1;
+ """)
+ self._open_and_call(callback)
-
def drop_all(self):
"""Drop all tables and sequences."""
- conn, cursor = self.open()
- try:
- try:
- cursor.execute("SELECT tablename FROM pg_tables")
- existent = set([name for (name,) in cursor])
- for tablename in ('pack_state_tid', 'pack_state',
- 'pack_object', 'object_refs_added', 'object_ref',
- 'current_object', 'object_state', 'transaction',
- 'commit_lock', 'pack_lock'):
- if tablename in existent:
- cursor.execute("DROP TABLE %s" % tablename)
- cursor.execute("DROP SEQUENCE zoid_seq")
- except:
- conn.rollback()
- raise
- else:
- conn.commit()
- finally:
- self.close(conn, cursor)
+ def callback(conn, cursor):
+ cursor.execute("SELECT tablename FROM pg_tables")
+ existent = set([name for (name,) in cursor])
+ for tablename in ('pack_state_tid', 'pack_state',
+ 'pack_object', 'object_refs_added', 'object_ref',
+ 'current_object', 'object_state', 'transaction',
+ 'commit_lock', 'pack_lock'):
+ if tablename in existent:
+ cursor.execute("DROP TABLE %s" % tablename)
+ cursor.execute("DROP SEQUENCE zoid_seq")
+ self._open_and_call(callback)
-
def open(self,
isolation=psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED):
"""Open a database connection and return (conn, cursor)."""
@@ -278,12 +251,10 @@
def get_db_size(self):
"""Returns the approximate size of the database in bytes"""
- conn, cursor = self.open()
- try:
+ def callback(conn, cursor):
cursor.execute("SELECT pg_database_size(current_database())")
return cursor.fetchone()[0]
- finally:
- self.close(conn, cursor)
+ return self._open_and_call(callback)
def get_current_tid(self, cursor, oid):
"""Returns the current integer tid for an object.
More information about the Checkins
mailing list