1 30 31 32 package org.hsqldb; 33 34 import java.util.Locale ; 35 36 import org.hsqldb.resources.BundleHandler; 37 import org.hsqldb.store.ValuePool; 38 39 47 final class DITableInfo { 48 49 int bestRowTemporary = 0; 51 int bestRowTransaction = 1; 52 int bestRowSession = 2; 53 int bestRowUnknown = 0; 54 int bestRowNotPseudo = 1; 55 static final short tableIndexOther = 3; 56 57 58 private static final int HALF_MAX_INT = Integer.MAX_VALUE >>> 1; 59 60 61 private int hnd_column_remarks = -1; 62 63 64 private int hnd_table_remarks = -1; 65 66 67 private Table table; 68 69 70 private static final DITypeInfo ti = new DITypeInfo(); 71 72 80 DITableInfo() { 81 82 83 setLocale(Locale.getDefault()); 84 } 85 86 91 void setLocale(Locale l) { 92 93 Locale oldLocale; 94 95 synchronized (BundleHandler.class) { 96 oldLocale = BundleHandler.getLocale(); 97 98 BundleHandler.setLocale(l); 99 100 hnd_column_remarks = 101 BundleHandler.getBundleHandle("column-remarks", null); 102 hnd_table_remarks = BundleHandler.getBundleHandle("table-remarks", 103 null); 104 105 BundleHandler.setLocale(oldLocale); 106 } 107 } 108 109 120 Integer getBRIPseudo() { 121 return ValuePool.getInt(bestRowNotPseudo); 122 } 123 124 132 Integer getBRIScope() { 133 return (table.isWritable()) ? ValuePool.getInt(bestRowTemporary) 134 : ValuePool.getInt(bestRowSession); 135 } 136 137 145 Integer getColBufLen(int i) { 146 147 int size; 148 int type; 149 Column column; 150 151 column = table.getColumn(i); 152 type = column.getDIType(); 153 154 switch (type) { 155 156 case Types.CHAR : 157 case Types.CLOB : 158 case Types.LONGVARCHAR : 159 case Types.VARCHAR : { 160 size = column.getSize(); 161 162 if (size == 0) {} 163 else if (size > HALF_MAX_INT) { 164 size = 0; 165 } else { 166 size = 2 * size; 167 } 168 169 break; 170 } 171 case Types.BINARY : 172 case Types.BLOB : 173 case Types.LONGVARBINARY : 174 case Types.VARBINARY : { 175 size = column.getSize(); 176 177 break; 178 } 179 case Types.BIGINT : 180 case Types.DOUBLE : 181 case Types.FLOAT : 182 case Types.DATE : 183 case Types.REAL : 184 case Types.TIME : { 185 size = 8; 186 187 break; 188 } 189 case Types.TIMESTAMP : { 190 size = 12; 191 192 break; 193 } 194 case Types.INTEGER : 195 case Types.SMALLINT : 196 case Types.TINYINT : { 197 size = 4; 198 199 break; 200 } 201 case Types.BOOLEAN : { 202 size = 1; 203 204 break; 205 } 206 default : { 207 size = 0; 208 209 break; 210 } 211 } 212 213 return (size > 0) ? ValuePool.getInt(size) 214 : null; 215 } 216 217 227 Integer getColCharOctLen(int i) { 228 229 int size; 230 int type; 231 Column column; 232 233 column = table.getColumn(i); 234 type = column.getDIType(); 235 236 switch (type) { 237 238 case Types.CHAR : 239 case Types.CLOB : 240 case Types.LONGVARCHAR : 241 case Types.VARCHAR : { 242 size = column.getSize(); 243 244 if (size == 0) {} 245 else if (size > HALF_MAX_INT) { 246 size = 0; 247 } else { 248 size = 2 * size; 249 } 250 251 break; 252 } 253 default : { 254 size = 0; 255 256 break; 257 } 258 } 259 260 return (size == 0) ? null 261 : ValuePool.getInt(size); 262 } 263 264 270 Integer getColDataType(int i) { 271 return ValuePool.getInt(table.getColumn(i).getDIType()); 272 } 273 274 280 String getColDataTypeName(int i) { 281 282 Column column = table.getColumn(i); 283 284 ti.setTypeCode(column.getDIType()); 285 ti.setTypeSub(column.getDITypeSub()); 286 287 return ti.getTypeName(); 288 } 289 290 296 Integer getColDataTypeSub(int i) { 297 return ValuePool.getInt(table.getColumn(i).getDITypeSub()); 298 } 299 300 306 String getColDefault(int i) { 307 return table.getColumn(i).getDefaultDDL(); 308 } 309 310 318 Boolean getColIsIdentity(int i) { 319 return ValuePool.getBoolean(table.getColumn(i).isIdentity()); 320 } 321 322 330 String getColIsNullable(int i) { 331 332 Column column = table.getColumn(i); 333 334 return (column.isNullable() &&!column.isIdentity()) ? "YES" 335 : "NO"; 336 } 337 338 344 String getColName(int i) { 345 return table.getColumn(i).columnName.name; 346 } 347 348 354 Integer getColNullability(int i) { 355 356 Column column = table.getColumn(i); 357 358 return (column.isNullable() &&!column.isIdentity()) 359 ? ValuePool.getInt(DITypeInfo.columnNullable) 360 : ValuePool.getInt(DITypeInfo.columnNoNulls); 361 } 362 363 372 Integer getColPrecRadix(int i) { 373 374 ti.setTypeCode(table.getColumn(i).getDIType()); 375 376 return ti.getNumPrecRadix(); 377 } 378 379 386 String getColRemarks(int i) { 387 388 String key; 389 390 if (table.getTableType() != Table.SYSTEM_TABLE) { 391 return null; 392 } 393 394 key = getName() + "_" + getColName(i); 395 396 return BundleHandler.getString(hnd_column_remarks, key); 397 } 398 399 410 Integer getColScale(int i) { 411 412 Column column; 413 int type; 414 415 column = table.getColumn(i); 416 type = column.getDIType(); 417 418 return Types.acceptsScaleCreateParam(type) 419 ? ValuePool.getInt(column.getScale()) 420 : null; 421 } 422 423 429 String getColScopeCat(int i) { 430 return null; 431 } 432 433 439 String getColScopeSchem(int i) { 440 return null; 441 } 442 443 449 String getColScopeTable(int i) { 450 return null; 451 } 452 453 462 Integer getColSize(int i) { 463 464 Column column; 465 int type; 466 int size; 467 468 column = table.getColumn(i); 469 type = column.getDIType(); 470 471 if (!Types.acceptsPrecisionCreateParam(type)) { 472 return null; 473 } 474 475 size = column.getSize(); 476 477 if (size > 0) { 478 return ValuePool.getInt(size); 479 } else { 480 ti.setTypeCode(type); 481 482 return ti.getPrecision(); 483 } 484 } 485 486 492 Integer getColSqlDataType(int i) { 493 494 ti.setTypeCode(table.getColumn(i).getDIType()); 495 496 return ti.getSqlDataType(); 497 } 498 499 505 Integer getColSqlDateTimeSub(int i) { 506 507 ti.setTypeCode(table.getColumn(i).getDIType()); 508 509 return ti.getSqlDateTimeSub(); 510 } 511 512 517 String getDataSource() { 518 return table.getDataSource(); 519 } 520 521 526 String getHsqlType() { 527 528 switch (table.getTableType()) { 529 530 case Table.MEMORY_TABLE : 531 case Table.TEMP_TABLE : 532 case Table.SYSTEM_TABLE : 533 return "MEMORY"; 534 535 case Table.CACHED_TABLE : 536 return "CACHED"; 537 538 case Table.TEMP_TEXT_TABLE : 539 case Table.TEXT_TABLE : 540 return "TEXT"; 541 542 case Table.VIEW : 543 default : 544 return null; 545 } 546 } 547 548 554 Integer getIndexCardinality(int i) { 555 return null; 556 } 557 558 567 String getIndexColDirection(int i, int columnPosition) { 568 569 return "A"; 571 } 572 573 583 int[] getIndexColumns(int i) { 584 return table.getIndex(i).getColumns(); 585 } 586 587 593 String getIndexName(int i) { 594 return table.getIndex(i).getName().name; 595 } 596 597 603 Integer getIndexRowCardinality(int i) { 604 return null; 605 } 606 607 613 Integer getIndexType(int i) { 614 return ValuePool.getInt(tableIndexOther); 615 } 616 617 627 int getIndexVisibleColumns(int i) { 628 return table.getIndex(i).getVisibleColumns(); 629 } 630 631 636 String getName() { 637 return table.getName().name; 638 } 639 640 649 Long getNextIdentity() { 650 651 Index pi; 652 653 if (table.identityColumn < 0) { 654 return null; 655 } 656 657 return ValuePool.getLong(table.identitySequence.peek()); 658 } 659 660 665 String getRemark() { 666 667 return (table.getTableType() == Table.SYSTEM_TABLE) 668 ? BundleHandler.getString(hnd_table_remarks, getName()) 669 : null; 670 } 671 672 680 String getStandardType() { 681 682 switch (table.getTableType()) { 683 684 case Table.VIEW : 685 return "VIEW"; 686 687 case Table.TEMP_TABLE : 688 case Table.TEMP_TEXT_TABLE : 689 return "GLOBAL TEMPORARY"; 690 691 case Table.SYSTEM_TABLE : 692 return "SYSTEM TABLE"; 693 694 default : 695 return "TABLE"; 696 } 697 } 698 699 706 Table getTable() { 707 return this.table; 708 } 709 710 720 Boolean isDataSourceDescending() { 721 return ValuePool.getBoolean(table.isDescDataSource()); 722 } 723 724 730 Boolean isIndexNonUnique(int i) { 731 return ValuePool.getBoolean(!table.getIndex(i).isUnique()); 732 } 733 734 741 Boolean isReadOnly() { 742 return ValuePool.getBoolean(table.isDataReadOnly()); 743 } 744 745 750 void setTable(Table table) { 751 this.table = table; 752 } 753 } 754 | Popular Tags |