1 21 22 package org.opensubsystems.core.persist.db.driver; 23 24 import java.sql.PreparedStatement ; 25 import java.sql.ResultSet ; 26 import java.sql.SQLException ; 27 import java.util.logging.Logger ; 28 29 import junit.extensions.TestSetup; 30 import junit.framework.Test; 31 import junit.framework.TestSuite; 32 33 import org.opensubsystems.core.error.OSSException; 34 import org.opensubsystems.core.persist.db.Database; 35 import org.opensubsystems.core.persist.db.DatabaseImpl; 36 import org.opensubsystems.core.persist.db.DatabaseTest; 37 import org.opensubsystems.core.persist.db.DatabaseTestSetup; 38 import org.opensubsystems.core.persist.db.DatabaseTestSuite; 39 import org.opensubsystems.core.util.DatabaseUtils; 40 import org.opensubsystems.core.util.Log; 41 42 51 public final class UpdatableResultSetTest 52 { 53 55 58 private UpdatableResultSetTest( 59 ) 60 { 61 } 63 64 66 72 public static Test suite( 73 ) 74 { 75 TestSuite suite = new DatabaseTestSuite("UpdatableResultSetTest"); 76 suite.addTestSuite(UpdatableResultSetTestInternal.class); 77 TestSetup wrapper = new DatabaseTestSetup(suite); 78 79 return wrapper; 80 } 81 82 87 public static class UpdatableResultSetTestInternal extends DatabaseTest 88 { 89 91 94 private static Logger s_logger = Log.getInstance(UpdatableResultSetTestInternal.class); 95 96 99 static 100 { 101 Database dbDatabase; 103 104 try 105 { 106 dbDatabase = DatabaseImpl.getInstance(); 107 dbDatabase.add(DatabaseTestSchema.class); 109 } 110 catch (OSSException bfeExc) 111 { 112 throw new RuntimeException ("Unexpected exception.", bfeExc); 113 } 114 } 115 116 121 public UpdatableResultSetTestInternal( 122 String strTestName 123 ) 124 { 125 super(strTestName); 126 } 127 128 136 public void testDeleteRow( 137 ) throws Throwable 138 { 139 final String INSERT_VALUE = "insert into RESULTSET_TEST(RESULTSET_TEST) values (?)"; 140 final String SELECT_VALUE 142 = "select RESULTSET_TEST.* from RESULTSET_TEST where RESULTSET_TEST = ?"; 143 final String DELETE_VALUE = "delete from RESULTSET_TEST where RESULTSET_TEST = ?"; 144 final String VALUE_TEST = "test value"; 145 146 PreparedStatement insertStatement; 147 int iUpdateCount; 148 149 m_transaction.begin(); 150 151 try 152 { 153 insertStatement = m_connection.prepareStatement(INSERT_VALUE); 154 insertStatement.setString(1, VALUE_TEST); 155 156 iUpdateCount = DatabaseUtils.executeUpdateAndClose(insertStatement); 157 158 m_transaction.commit(); 159 } 160 catch (Throwable throwable) 161 { 162 m_transaction.rollback(); 163 throw throwable; 164 } 165 166 assertEquals("Exactly one record have been inserted.", 167 iUpdateCount, 1); 168 169 PreparedStatement selectStatement = null; 171 PreparedStatement deleteStatement = null; 172 173 ResultSet results = null; 174 int iDeletedCount = 0; 175 boolean bUpdatableResultSet = true; 176 177 boolean bHasMoreThanOne; 178 String retrievedValue; 179 180 m_transaction.begin(); 181 182 try 183 { 184 SQLException sqleThrownExc = null; 185 186 try 187 { 188 selectStatement = m_connection.prepareStatement( 189 SELECT_VALUE, 190 ResultSet.TYPE_SCROLL_SENSITIVE, 191 ResultSet.CONCUR_UPDATABLE); 192 } 193 catch (SQLException sqleExc) 194 { 195 bUpdatableResultSet = false; 198 sqleThrownExc = sqleExc; 199 selectStatement = m_connection.prepareStatement(SELECT_VALUE); 200 } 203 selectStatement.setString(1, VALUE_TEST); 204 results = selectStatement.executeQuery(); 205 206 assertTrue("The inserted record is not in the database.", 207 results.next()); 208 retrievedValue = results.getString(1); 209 210 if (bUpdatableResultSet) 212 { 213 try 217 { 218 results.deleteRow(); 219 iDeletedCount = 1; 220 } 221 catch (SQLException sqleExc) 222 { 223 bUpdatableResultSet = false; 226 sqleThrownExc = sqleExc; 227 } 228 } 229 if (!bUpdatableResultSet) 230 { 231 s_logger.warning("Database driver " + getDataSourceName() 234 + " still doesn't support updatable resultset: " 235 + sqleThrownExc); 236 237 deleteStatement = m_connection.prepareStatement(DELETE_VALUE); 238 deleteStatement.setString(1, VALUE_TEST); 239 iDeletedCount = DatabaseUtils.executeUpdateAndClose(deleteStatement); 240 } 241 bHasMoreThanOne = results.next(); 244 m_transaction.commit(); 245 } 246 catch (Throwable throwable) 247 { 248 m_transaction.rollback(); 249 throw throwable; 250 } 251 finally 252 { 253 DatabaseUtils.closeResultSetAndStatement(results, selectStatement); 254 255 m_transaction.begin(); 256 try 257 { 258 deleteStatement = m_connection.prepareStatement( 259 "delete from RESULTSET_TEST"); 260 deleteStatement.execute(); 261 m_transaction.commit(); 262 } 263 catch (Exception eExc) 264 { 265 m_transaction.rollback(); 266 throw eExc; 267 } 268 finally 269 { 270 DatabaseUtils.closeStatement(deleteStatement); 271 } 272 } 273 274 assertFalse("There should be only one inserted record in the database.", 275 bHasMoreThanOne); 276 277 assertEquals("Exactly one record with date data shoud have been deleted.", 278 iDeletedCount, 1); 279 280 assertNotNull("The inserted value shouldn't be retrieved as null" + 282 " from the database", 283 retrievedValue); 284 assertEquals("The value retrieved from database " 285 + " is not the same as the inserted one ", 286 VALUE_TEST, retrievedValue); 287 288 289 } 290 } 291 } 292 | Popular Tags |