1 21 22 package org.apache.derbyTesting.functionTests.util; 23 24 25 import org.apache.derby.iapi.error.StandardException; 26 27 import org.apache.derby.iapi.sql.dictionary.DataDictionaryContext; 28 import org.apache.derby.iapi.sql.dictionary.DataDictionary; 29 import org.apache.derby.iapi.sql.dictionary.SchemaDescriptor; 30 import org.apache.derby.iapi.sql.dictionary.TableDescriptor; 31 import org.apache.derby.iapi.sql.dictionary.ColumnDescriptor; 32 import org.apache.derby.iapi.sql.dictionary.ColumnDescriptorList; 33 import org.apache.derby.iapi.sql.dictionary.ConglomerateDescriptor; 34 35 import org.apache.derby.iapi.sql.depend.DependencyManager; 36 37 import org.apache.derby.iapi.reference.SQLState; 38 39 import org.apache.derby.iapi.sql.execute.ExecRow; 40 import org.apache.derby.iapi.sql.execute.ExecutionContext; 41 42 import org.apache.derby.iapi.types.DataValueFactory; 43 import org.apache.derby.iapi.types.DataTypeDescriptor; 44 45 import org.apache.derby.iapi.sql.conn.LanguageConnectionContext; 46 47 import org.apache.derby.iapi.store.access.TransactionController; 48 import org.apache.derby.iapi.types.RowLocation; 49 import org.apache.derby.iapi.store.access.ScanController; 50 import org.apache.derby.iapi.store.access.ConglomerateController; 51 52 import org.apache.derby.iapi.services.context.ContextService; 53 54 import org.apache.derby.iapi.services.io.FormatableBitSet; 55 56 66 public class T_ConsistencyChecker 67 { 68 private DataDictionary dd; 69 private TransactionController tc; 70 private LanguageConnectionContext lcc; 71 private DataValueFactory dvf; 72 private ExecutionContext ec; 73 private String indexName; 74 private String schemaName; 75 private String tableName; 76 private ConglomerateDescriptor id; 77 private SchemaDescriptor sd; 78 private TableDescriptor td; 79 80 T_ConsistencyChecker(String schemaName, String tableName, String indexName) 81 throws StandardException 82 { 83 this.schemaName = schemaName; 84 this.tableName = tableName; 85 this.indexName = indexName; 86 } 87 88 99 public static void deleteFirstHeapRow(String schemaName, String tableName) 100 throws StandardException 101 { 102 T_ConsistencyChecker t_cc = new T_ConsistencyChecker(schemaName, tableName, null); 103 t_cc.getContexts(); 104 t_cc.getDescriptors(); 105 106 107 ScanController heapScan = t_cc.openUnqualifiedHeapScan(); 108 109 heapScan.next(); 111 112 heapScan.delete(); 114 115 heapScan.close(); 116 } 117 118 130 public static void reinsertFirstHeapRow(String schemaName, String tableName) 131 throws StandardException 132 { 133 T_ConsistencyChecker t_cc = new T_ConsistencyChecker(schemaName, tableName, null); 134 t_cc.getContexts(); 135 t_cc.getDescriptors(); 136 137 138 ScanController heapScan = t_cc.openUnqualifiedHeapScan(); 139 140 heapScan.next(); 142 143 ExecRow firstRow = t_cc.getHeapRowOfNulls(); 145 heapScan.fetch(firstRow.getRowArray()); 146 heapScan.close(); 147 148 ConglomerateController heapCC = t_cc.openHeapCC(); 150 heapCC.insert(firstRow.getRowArray()); 151 heapCC.close(); 152 } 153 154 166 public static void nullFirstHeapRow(String schemaName, String tableName) 167 throws StandardException 168 { 169 T_ConsistencyChecker t_cc = new T_ConsistencyChecker(schemaName, tableName, null); 170 t_cc.getContexts(); 171 t_cc.getDescriptors(); 172 173 174 ScanController heapScan = t_cc.openUnqualifiedHeapScan(); 175 176 heapScan.next(); 178 179 RowLocation baseRL = heapScan.newRowLocationTemplate(); 181 heapScan.fetchLocation(baseRL); 182 183 heapScan.replace( 185 t_cc.getHeapRowOfNulls().getRowArray(), 186 (FormatableBitSet) null); 187 188 heapScan.close(); 189 } 190 191 204 public static void insertBadRowLocation(String schemaName, String tableName, String indexName) 205 throws StandardException 206 { 207 T_ConsistencyChecker t_cc = new T_ConsistencyChecker(schemaName, tableName, indexName); 208 t_cc.getContexts(); 209 t_cc.getDescriptors(); 210 211 212 213 ScanController heapScan = t_cc.openUnqualifiedHeapScan(); 214 215 RowLocation baseRL = heapScan.newRowLocationTemplate(); 217 RowLocation badRL = heapScan.newRowLocationTemplate(); 218 heapScan.close(); 219 220 221 ExecRow indexRow = t_cc.getIndexTemplateRow(baseRL); 222 ScanController indexScan = t_cc.openUnqualifiedIndexScan(); 223 224 indexScan.next(); 226 227 indexScan.fetch(indexRow.getRowArray()); 229 indexScan.close(); 230 231 int keyLength = 233 t_cc.getIndexDescriptor().getIndexDescriptor().baseColumnPositions().length; 234 indexRow.setColumn(keyLength + 1, badRL); 235 236 ConglomerateController indexCC = t_cc.openIndexCC(); 237 indexCC.insert(indexRow.getRowArray()); 238 indexCC.close(); 239 } 240 241 255 public static void swapColumnsInFirstHeapRow(String schemaName, String tableName, 256 int firstColumn, int secondColumn) 257 throws StandardException 258 { 259 } 260 261 262 private void getContexts() 263 throws StandardException 264 { 265 lcc = (LanguageConnectionContext) 266 ContextService.getContext(LanguageConnectionContext.CONTEXT_ID); 267 tc = lcc.getTransactionExecute(); 268 269 dd = lcc.getDataDictionary(); 270 271 dvf = lcc.getDataValueFactory(); 272 273 ec = (ExecutionContext) 274 (ContextService.getContext(ExecutionContext.CONTEXT_ID)); 275 } 276 277 278 private void getDescriptors() 279 throws StandardException 280 { 281 sd = dd.getSchemaDescriptor(schemaName, tc, true); 282 td = dd.getTableDescriptor(tableName, sd); 283 284 if (td == null) 285 { 286 throw StandardException.newException(SQLState.LANG_TABLE_NOT_FOUND, schemaName + "." + tableName); 287 } 288 289 if (indexName != null) 290 { 291 id = dd.getConglomerateDescriptor(indexName, sd, true); 292 if (id == null) 293 { 294 throw StandardException.newException(SQLState.LANG_INDEX_NOT_FOUND, indexName); 295 } 296 } 297 } 298 299 300 private ExecRow getHeapRowOfNulls() 301 throws StandardException 302 { 303 ConglomerateController baseCC; 304 ExecRow baseRow; 305 306 307 baseCC = tc.openConglomerate( 308 td.getHeapConglomerateId(), false, 0, 309 TransactionController.MODE_TABLE, 310 TransactionController.ISOLATION_SERIALIZABLE); 311 312 313 baseRow = ec.getExecutionFactory().getValueRow(td.getNumberOfColumns()); 314 315 316 ColumnDescriptorList cdl = td.getColumnDescriptorList(); 317 int cdlSize = cdl.size(); 318 319 for (int index = 0; index < cdlSize; index++) 320 { 321 ColumnDescriptor cd = (ColumnDescriptor) cdl.elementAt(index); 322 DataTypeDescriptor dts = cd.getType(); 323 baseRow.setColumn(cd.getPosition(), 324 dts.getNull()); 325 } 326 327 baseCC.close(); 328 return baseRow; 329 } 330 331 332 private ScanController openUnqualifiedHeapScan() 333 throws StandardException 334 { 335 ScanController heapScan; 336 337 heapScan = tc.openScan(td.getHeapConglomerateId(), 338 false, TransactionController.OPENMODE_FORUPDATE, TransactionController.MODE_TABLE, 341 TransactionController.ISOLATION_SERIALIZABLE, 342 (FormatableBitSet) null, 343 null, 0, null, null, 0); 349 return heapScan; 350 } 351 352 353 private ConglomerateController openHeapCC() 354 throws StandardException 355 { 356 ConglomerateController heapCC; 357 358 heapCC = tc.openConglomerate( 359 td.getHeapConglomerateId(), 360 false, 361 TransactionController.OPENMODE_FORUPDATE, TransactionController.MODE_TABLE, 363 TransactionController.ISOLATION_SERIALIZABLE); 364 365 366 return heapCC; 367 } 368 369 370 private ExecRow getIndexTemplateRow(RowLocation baseRL) 371 throws StandardException 372 { 373 int[] baseColumnPositions; 374 int baseColumns = 0; 375 ExecRow indexScanTemplate; 376 377 baseColumnPositions = 378 id.getIndexDescriptor().baseColumnPositions(); 379 baseColumns = baseColumnPositions.length; 380 381 FormatableBitSet indexColsBitSet = new FormatableBitSet(); 382 for (int i = 0; i < baseColumns; i++) 383 { 384 indexColsBitSet.grow(baseColumnPositions[i]); 385 indexColsBitSet.set(baseColumnPositions[i] - 1); 386 } 387 388 389 indexScanTemplate = ec.getExecutionFactory().getValueRow(baseColumns + 1); 390 391 392 for (int column = 0; column < baseColumns; column++) 393 { 394 395 ColumnDescriptor cd = td.getColumnDescriptor(baseColumnPositions[column]); 396 DataTypeDescriptor dts = cd.getType(); 397 indexScanTemplate.setColumn(column + 1, 398 dts.getNull()); 399 } 400 401 402 indexScanTemplate.setColumn(baseColumns + 1, baseRL); 403 404 return indexScanTemplate; 405 } 406 407 408 private ScanController openUnqualifiedIndexScan() 409 throws StandardException 410 { 411 ScanController indexScan; 412 413 indexScan = tc.openScan(id.getConglomerateNumber(), 414 false, TransactionController.OPENMODE_FORUPDATE, TransactionController.MODE_TABLE, 417 TransactionController.ISOLATION_SERIALIZABLE, 418 (FormatableBitSet) null, 419 null, 0, null, null, 0); 425 return indexScan; 426 } 427 428 429 private ConglomerateController openIndexCC() 430 throws StandardException 431 { 432 ConglomerateController indexCC; 433 434 indexCC = tc.openConglomerate( 435 id.getConglomerateNumber(), 436 false, 437 TransactionController.OPENMODE_FORUPDATE, TransactionController.MODE_TABLE, 439 TransactionController.ISOLATION_SERIALIZABLE); 440 441 442 return indexCC; 443 } 444 445 446 private ConglomerateDescriptor getIndexDescriptor() 447 { 448 return id; 449 } 450 451 452 458 459 473 public static String runConsistencyChecker() throws StandardException, java.sql.SQLException 474 { 475 return countOpens() + countDependencies(); 476 } 477 478 488 public static String countOpens() throws StandardException 489 { 490 int numOpens = 0; 491 LanguageConnectionContext lcc; 492 String output = "No open scans, etc.\n"; 493 TransactionController tc; 494 495 lcc = (LanguageConnectionContext) 496 ContextService.getContext(LanguageConnectionContext.CONTEXT_ID); 497 tc = lcc.getTransactionExecute(); 498 499 numOpens = tc.countOpens(TransactionController.OPEN_TOTAL); 500 501 if (numOpens > 0) 502 { 503 output = numOpens + " conglomerates/scans/sorts found open\n"; 504 505 } 506 507 return output; 508 } 509 510 522 public static String countDependencies() throws StandardException, java.sql.SQLException 523 { 524 int numDependencies = 0; 525 DataDictionary dd; 526 DataDictionaryContext ddc; 527 DependencyManager dm; 528 StringBuffer debugBuf = new StringBuffer (); 529 530 ddc = (DataDictionaryContext) 531 (ContextService.getContext(DataDictionaryContext.CONTEXT_ID)); 532 533 dd = ddc.getDataDictionary(); 534 dm = dd.getDependencyManager(); 535 536 numDependencies = dm.countDependencies(); 537 538 if (numDependencies > 0) 539 { 540 debugBuf.append(numDependencies + " dependencies found"); 541 } 542 else 543 { 544 debugBuf.append("No outstanding dependencies.\n"); 545 } 546 547 return debugBuf.toString(); 548 } 549 } 550 | Popular Tags |