Index: 3rdParty_sources/tacitknowledge/autopatch/src/main/java/com/tacitknowledge/util/migration/jdbc/DatabaseType.java =================================================================== diff -u -r60fd31cb3d049512a0549ad11dbbe4ba81cae54e -r5dd176f28f864f168b3825c237c74c5bc45de145 --- 3rdParty_sources/tacitknowledge/autopatch/src/main/java/com/tacitknowledge/util/migration/jdbc/DatabaseType.java (.../DatabaseType.java) (revision 60fd31cb3d049512a0549ad11dbbe4ba81cae54e) +++ 3rdParty_sources/tacitknowledge/autopatch/src/main/java/com/tacitknowledge/util/migration/jdbc/DatabaseType.java (.../DatabaseType.java) (revision 5dd176f28f864f168b3825c237c74c5bc45de145) @@ -29,6 +29,7 @@ * required keys are: *
null
- * @param stmt the statement to close; may be null
- * @param rs the result set to close; may be null
- */
- public static void close(Connection conn, Statement stmt, ResultSet rs)
- {
- if (rs != null)
+
+ private static void closeResultSet(ResultSet rs) {
+ if (rs != null)
+ {
+ try
+ {
+ boolean rsIsOpen = true;
+ try
+ {
+ rsIsOpen = !rs.isClosed();
+ }
+ catch (AbstractMethodError e)
+ {
+ log.debug("AbstractMethodError closing ResultSet. ResultSet might be a DelegatingResultSet with a badly implemented (i.e. missing) delegation to isClosed().", e);
+ }
+ if (rsIsOpen)
+ {
+ log.debug("Closing ResultSet: " + rs.toString());
+ rs.close();
+ }
+ else
+ {
+ log.debug("ResultSet (" + rs.toString() + ") already closed.");
+ }
+ }
+ catch (SQLException e)
+ {
+ log.error("Error closing ResultSet", e);
+ }
+ }
+ }
+
+ private static void closeStatement(Statement stmt) {
+ if (stmt != null)
{
try
{
- boolean rsIsOpen = true;
- try
- {
- rsIsOpen = !rs.isClosed();
- }
- catch (AbstractMethodError e)
- {
- log.debug("AbstractMethodError closing ResultSet. ResultSet might be a DelegatingResultSet with a badly implemented (i.e. missing) delegation to isClosed().", e);
- }
- if (rsIsOpen)
- {
- log.debug("Closing ResultSet: " + rs.toString());
- rs.close();
- }
- else
- {
- log.debug("ResultSet (" + rs.toString() + ") already closed.");
- }
- }
- catch (SQLException e)
- {
- log.error("Error closing ResultSet", e);
- }
- }
-
- if (stmt != null)
- {
- try
- {
boolean stmtIsOpen = true;
try
{
@@ -113,8 +113,10 @@
log.error("Error closing Statement", e);
}
}
-
- if (conn != null)
+ }
+
+ private static void closeConnection(Connection conn) {
+ if (conn != null)
{
try
{
@@ -143,6 +145,20 @@
}
}
}
+
+ /**
+ * Ensures the given connection, statement, and result are properly closed.
+ *
+ * @param conn the connection to close; may be null
+ * @param stmt the statement to close; may be null
+ * @param rs the result set to close; may be null
+ */
+ public static void close(Connection conn, Statement stmt, ResultSet rs)
+ {
+ closeResultSet(rs);
+ closeStatement(stmt);
+ closeConnection(conn);
+ }
/**
* Established and returns a connection based on the specified parameters.
Index: 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/hsqldb.properties
===================================================================
diff -u -r60fd31cb3d049512a0549ad11dbbe4ba81cae54e -r5dd176f28f864f168b3825c237c74c5bc45de145
--- 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/hsqldb.properties (.../hsqldb.properties) (revision 60fd31cb3d049512a0549ad11dbbe4ba81cae54e)
+++ 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/hsqldb.properties (.../hsqldb.properties) (revision 5dd176f28f864f168b3825c237c74c5bc45de145)
@@ -7,6 +7,10 @@
, patch_in_progress CHAR(1) default 'F' NOT NULL \
, PRIMARY KEY (system_name, patch_level))
+# Alter patches table to use composite primary key.
+patches.upgrade=ALTER TABLE patches DROP PRIMARY KEY, ADD PRIMARY KEY(system_name, patch_level);
+patches.tablename=patches
+
# Validates that a record exists for a given system
level.create=INSERT INTO patches (system_name, patch_level) VALUES ( ?, 0)
level.table.exists=SELECT patch_level FROM patches WHERE system_name = ?
Index: 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/mysql.properties
===================================================================
diff -u -r6228ef532ab695b3a588dec9f7d52c2f15f581ba -r5dd176f28f864f168b3825c237c74c5bc45de145
--- 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/mysql.properties (.../mysql.properties) (revision 6228ef532ab695b3a588dec9f7d52c2f15f581ba)
+++ 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/mysql.properties (.../mysql.properties) (revision 5dd176f28f864f168b3825c237c74c5bc45de145)
@@ -7,6 +7,10 @@
, patch_in_progress CHAR(1) NOT NULL default 'F' \
, PRIMARY KEY(system_name, patch_level))
+# Alter patches table to use composite primary key.
+patches.upgrade=ALTER TABLE patches DROP PRIMARY KEY, ADD PRIMARY KEY(system_name, patch_level);
+patches.tablename=patches
+
# Validates that a record exists for a given system
level.create=INSERT INTO patches (system_name, patch_level) VALUES ( ?, 0 )
level.table.exists=SELECT patch_level FROM patches WHERE system_name = ?
Index: 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/oracle.properties
===================================================================
diff -u -r60fd31cb3d049512a0549ad11dbbe4ba81cae54e -r5dd176f28f864f168b3825c237c74c5bc45de145
--- 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/oracle.properties (.../oracle.properties) (revision 60fd31cb3d049512a0549ad11dbbe4ba81cae54e)
+++ 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/oracle.properties (.../oracle.properties) (revision 5dd176f28f864f168b3825c237c74c5bc45de145)
@@ -7,6 +7,10 @@
, patch_in_progress CHAR(1) DEFAULT 'F' NOT NULL\
, CONSTRAINT tk_patches_pk PRIMARY KEY (system_name, patch_level) )
+# Alter patches table to use composite primary key. This query is not validated to work in oracle DBMS
+patches.upgrade=ALTER TABLE tk_patches DROP PRIMARY KEY, ADD PRIMARY KEY(system_name, patch_level);
+patches.tablename=tk_patches
+
# Validates that a record exists for a given system
level.create=INSERT INTO tk_patches (system_name, patch_level) VALUES ( ?, 0 )
level.table.exists=SELECT patch_level FROM tk_patches WHERE system_name = ?
Index: 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/postgres.properties
===================================================================
diff -u -r60fd31cb3d049512a0549ad11dbbe4ba81cae54e -r5dd176f28f864f168b3825c237c74c5bc45de145
--- 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/postgres.properties (.../postgres.properties) (revision 60fd31cb3d049512a0549ad11dbbe4ba81cae54e)
+++ 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/postgres.properties (.../postgres.properties) (revision 5dd176f28f864f168b3825c237c74c5bc45de145)
@@ -7,6 +7,10 @@
, patch_in_progress CHAR(1) NOT NULL DEFAULT ('F') \
, PRIMARY KEY (system_name, patch_level))
+# Alter patches table to use composite primary key. This query is not validated to work in postgres DBMS
+patches.upgrade=ALTER TABLE patches DROP PRIMARY KEY, ADD PRIMARY KEY(system_name, patch_level);
+patches.tablename=patches
+
# Validates that a record exists for a given system
level.create=INSERT INTO patches (system_name, patch_level) VALUES ( ?, 0 )
level.table.exists=SELECT patch_level FROM patches WHERE system_name = ?
Index: 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/sqlserver.properties
===================================================================
diff -u -r60fd31cb3d049512a0549ad11dbbe4ba81cae54e -r5dd176f28f864f168b3825c237c74c5bc45de145
--- 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/sqlserver.properties (.../sqlserver.properties) (revision 60fd31cb3d049512a0549ad11dbbe4ba81cae54e)
+++ 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/sqlserver.properties (.../sqlserver.properties) (revision 5dd176f28f864f168b3825c237c74c5bc45de145)
@@ -7,6 +7,10 @@
, patch_in_progress CHAR(1) default 'F' NOT NULL \
, PRIMARY KEY(system_name, patch_level))
+# Alter patches table to use composite primary key. This query is not validated to work in sqlserver DBMS
+patches.upgrade=ALTER TABLE patches DROP PRIMARY KEY, ADD PRIMARY KEY(system_name, patch_level);
+patches.tablename=patches
+
# Validates that a record exists for a given system
level.create=INSERT INTO patches (system_name, patch_level) VALUES ( ?, 0)
level.table.exists=SELECT patch_level FROM patches WHERE system_name = ?
Index: 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/sybase.properties
===================================================================
diff -u -r60fd31cb3d049512a0549ad11dbbe4ba81cae54e -r5dd176f28f864f168b3825c237c74c5bc45de145
--- 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/sybase.properties (.../sybase.properties) (revision 60fd31cb3d049512a0549ad11dbbe4ba81cae54e)
+++ 3rdParty_sources/tacitknowledge/autopatch/src/main/resources/com/tacitknowledge/util/migration/jdbc/sybase.properties (.../sybase.properties) (revision 5dd176f28f864f168b3825c237c74c5bc45de145)
@@ -6,7 +6,11 @@
patch_date DATETIME DEFAULT getdate() NOT NULL,\
patch_in_progress CHAR(1) DEFAULT 'F' NOT NULL,\
primary key clustered (system_name, patch_level))
-
+
+# Alter patches table to use composite primary key. This query is not validated to work in sybase DBMS
+patches.upgrade=ALTER TABLE patches DROP PRIMARY KEY, ADD PRIMARY KEY(system_name, patch_level);
+patches.tablename=patches
+
# Validates that a record exists for a given system
level.create=INSERT INTO patches (system_name, patch_level) VALUES ( ?, 0 )
level.table.exists=SELECT patch_level FROM patches WHERE system_name = ?
Index: 3rdParty_sources/tacitknowledge/autopatch/src/test/java/com/tacitknowledge/util/migration/jdbc/PatchTableTest.java
===================================================================
diff -u -r60fd31cb3d049512a0549ad11dbbe4ba81cae54e -r5dd176f28f864f168b3825c237c74c5bc45de145
--- 3rdParty_sources/tacitknowledge/autopatch/src/test/java/com/tacitknowledge/util/migration/jdbc/PatchTableTest.java (.../PatchTableTest.java) (revision 60fd31cb3d049512a0549ad11dbbe4ba81cae54e)
+++ 3rdParty_sources/tacitknowledge/autopatch/src/test/java/com/tacitknowledge/util/migration/jdbc/PatchTableTest.java (.../PatchTableTest.java) (revision 5dd176f28f864f168b3825c237c74c5bc45de145)
@@ -24,6 +24,7 @@
import com.mockrunner.jdbc.JDBCTestCaseAdapter;
import com.mockrunner.jdbc.PreparedStatementResultSetHandler;
import com.mockrunner.mock.jdbc.MockConnection;
+import com.mockrunner.mock.jdbc.MockDatabaseMetaData;
import com.mockrunner.mock.jdbc.MockResultSet;
import com.tacitknowledge.util.migration.MigrationException;
import com.tacitknowledge.util.migration.jdbc.util.ConnectionWrapperDataSource;
@@ -160,6 +161,12 @@
// Test-specific setup
handler = conn.getPreparedStatementResultSetHandler();
MockResultSet rs = handler.createResultSet();
+
+ MockDatabaseMetaData mdmd = (MockDatabaseMetaData) conn.getMetaData();
+ MockResultSet mrs = handler.createResultSet();
+ mrs.addRow(new String[]{"", "", "", "system_name"});
+ mrs.addRow(new String[]{"", "", "", "patch_level"});
+ mdmd.setPrimaryKeys(mrs);
handler.prepareGlobalResultSet(rs);
rs.addRow(new Integer[] {new Integer(13)});
@@ -168,10 +175,38 @@
commonVerifications();
verifyNotCommitted();
verifyPreparedStatementParameter(0, 1, "milestone");
+ verifyPreparedStatementNotPresent(table.getSql("patches.upgrade"));
verifyPreparedStatementNotPresent(table.getSql("patches.create"));
}
/**
+ * Validates that the system recognizes an existing patches table.
+ *
+ * @throws Exception if an unexpected error occurs
+ */
+ public void testVerifyAndUpgradePatchesTable() throws Exception
+ {
+ // Test-specific setup
+ handler = conn.getPreparedStatementResultSetHandler();
+ MockResultSet rs = handler.createResultSet();
+
+ MockDatabaseMetaData mdmd = (MockDatabaseMetaData) conn.getMetaData();
+ MockResultSet mrs = handler.createResultSet();
+ mrs.addRow(new String[]{"", "", "", "system_name"});
+ mdmd.setPrimaryKeys(mrs);
+ handler.prepareGlobalResultSet(rs);
+ rs.addRow(new Integer[] {new Integer(13)});
+
+ table.createPatchStoreIfNeeded();
+
+ commonVerifications();
+ verifyCommitted();
+ verifyPreparedStatementParameter(0, 1, "milestone");
+ verifyPreparedStatementPresent(table.getSql("patches.upgrade"));
+ verifyPreparedStatementNotPresent(table.getSql("patches.create"));
+ }
+
+ /**
* Validates that getPatchLevel
works on an existing system.
*
* @throws Exception if an unexpected error occurs
@@ -180,6 +215,13 @@
{
// Test-specific setup
handler = conn.getPreparedStatementResultSetHandler();
+
+ MockDatabaseMetaData mdmd = (MockDatabaseMetaData) conn.getMetaData();
+ MockResultSet mrs = handler.createResultSet();
+ mrs.addRow(new String[]{"", "", "", "system_name"});
+ mrs.addRow(new String[]{"", "", "", "patch_level"});
+ mdmd.setPrimaryKeys(mrs);
+
MockResultSet rs = handler.createResultSet();
rs.addRow(new Integer[]{new Integer(13)});
handler.prepareGlobalResultSet(rs);
@@ -190,6 +232,7 @@
commonVerifications();
verifyNotCommitted();
verifyPreparedStatementParameter(1, 1, "milestone");
+ verifyPreparedStatementNotPresent(table.getSql("patches.upgrade"));
verifyPreparedStatementNotPresent(table.getSql("level.create"));
}
@@ -222,6 +265,13 @@
public void testUpdatePatchLevel() throws Exception
{
handler = conn.getPreparedStatementResultSetHandler();
+
+ MockDatabaseMetaData mdmd = (MockDatabaseMetaData) conn.getMetaData();
+ MockResultSet mrs = handler.createResultSet();
+ mrs.addRow(new String[]{"", "", "", "system_name"});
+ mrs.addRow(new String[]{"", "", "", "patch_level"});
+ mdmd.setPrimaryKeys(mrs);
+
MockResultSet rs = handler.createResultSet();
rs.addRow(new Integer[]{new Integer(12)});
handler.prepareResultSet(table.getSql("level.read"), rs, new String[]{"milestone"});
@@ -244,6 +294,13 @@
// Test-specific setup
// Return a non-empty set in response to the patch lock query
handler = conn.getPreparedStatementResultSetHandler();
+
+ MockDatabaseMetaData mdmd = (MockDatabaseMetaData) conn.getMetaData();
+ MockResultSet mrs = handler.createResultSet();
+ mrs.addRow(new String[]{"", "", "", "system_name"});
+ mrs.addRow(new String[]{"", "", "", "patch_level"});
+ mdmd.setPrimaryKeys(mrs);
+
MockResultSet rs = handler.createResultSet();
rs.addRow(new String[]{"F"});
handler.prepareResultSet(table.getSql("lock.read"), rs, new String[]{"milestone", "milestone"});
@@ -263,6 +320,13 @@
// Test-specific setup
// Return a non-empty set in response to the patch lock query
handler = conn.getPreparedStatementResultSetHandler();
+
+ MockDatabaseMetaData mdmd = (MockDatabaseMetaData) conn.getMetaData();
+ MockResultSet mrs = handler.createResultSet();
+ mrs.addRow(new String[]{"", "", "", "system_name"});
+ mrs.addRow(new String[]{"", "", "", "patch_level"});
+ mdmd.setPrimaryKeys(mrs);
+
MockResultSet rs = handler.createResultSet();
rs.addRow(new String[]{"T"});
handler.prepareResultSet(table.getSql("lock.read"), rs, new String[]{"milestone", "milestone"});
@@ -283,6 +347,13 @@
// Test-specific setup
// Return a non-empty set in response to the patch lock query
handler = conn.getPreparedStatementResultSetHandler();
+
+ MockDatabaseMetaData mdmd = (MockDatabaseMetaData) conn.getMetaData();
+ MockResultSet mrs = handler.createResultSet();
+ mrs.addRow(new String[]{"", "", "", "system_name"});
+ mrs.addRow(new String[]{"", "", "", "patch_level"});
+ mdmd.setPrimaryKeys(mrs);
+
handler.prepareUpdateCount(table.getSql("lock.obtain"), 0, new String[] {"milestone", "milestone"});
try
@@ -312,6 +383,13 @@
// Test-specific setup
// Return an empty set in response to the patch lock query
handler = conn.getPreparedStatementResultSetHandler();
+
+ MockDatabaseMetaData mdmd = (MockDatabaseMetaData) conn.getMetaData();
+ MockResultSet mrs = handler.createResultSet();
+ mrs.addRow(new String[]{"", "", "", "system_name"});
+ mrs.addRow(new String[]{"", "", "", "patch_level"});
+ mdmd.setPrimaryKeys(mrs);
+
MockResultSet rs = handler.createResultSet();
handler.prepareUpdateCount(table.getSql("lock.obtain"), 1, new String[] {"milestone", "milestone"});
@@ -384,7 +462,15 @@
}
public void testPatchRetrievesSetWithPatchesApplied () throws SQLException, MigrationException {
+
handler = conn.getPreparedStatementResultSetHandler();
+
+ MockDatabaseMetaData mdmd = (MockDatabaseMetaData) conn.getMetaData();
+ MockResultSet mrs = handler.createResultSet();
+ mrs.addRow(new String[]{"", "", "", "system_name"});
+ mrs.addRow(new String[]{"", "", "", "patch_level"});
+ mdmd.setPrimaryKeys(mrs);
+
MockResultSet rs = handler.createResultSet();
rs.addColumn("patch_level", new Object[]{1, 2});
handler.prepareGlobalResultSet(rs);