[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