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 49 final class DITypeInfo { 50 51 static final int columnNoNulls = 0; 53 static final int columnNullable = 1; 54 static final int typePredNone = 0; 55 static final int typePredChar = 1; 56 static final int typePredBasic = 2; 57 static final int typeSearchable = 3; 58 59 60 private int hnd_create_params = -1; 61 62 63 private int hnd_local_names = -1; 64 65 66 private int hnd_remarks = -1; 67 68 69 private int type = Types.NULL; 70 71 72 private int typeSub = Types.TYPE_SUB_DEFAULT; 73 boolean locale_set; 74 75 76 DITypeInfo() { 77 78 } 81 82 89 Integer getCharOctLen() { 90 return null; 91 } 92 93 100 Long getCharOctLenAct() { 101 102 switch (type) { 103 104 case Types.CHAR : 105 case Types.LONGVARCHAR : 106 case Types.VARCHAR : 107 return ValuePool.getLong(2L * Integer.MAX_VALUE); 108 109 case Types.CLOB : 110 return ValuePool.getLong(Long.MAX_VALUE); 111 112 default : 113 return null; 114 } 115 } 116 117 130 String getColStClsName() { 131 return Types.getColStClsName(type); 132 } 133 134 142 String getCreateParams() { 143 144 if (!locale_set) { 145 setLocale(Locale.getDefault()); 146 } 147 148 String names; 149 150 switch (type) { 151 152 case Types.CHAR : 153 case Types.VARCHAR : 154 names = "LENGTH"; 155 break; 156 157 case Types.DECIMAL : 158 case Types.NUMERIC : 159 names = "PRECISION,SCALE"; 160 break; 161 162 case Types.FLOAT : 163 case Types.TIMESTAMP : 164 names = "PRECISION"; 165 break; 166 167 default : 168 names = null; 169 break; 170 } 171 172 return names; 173 } 174 175 199 String getCstMapClsName() { 200 201 switch (type) { 202 203 case Types.ARRAY : 204 return "org.hsqldb.jdbc.jdbcArray"; 205 206 case Types.BLOB : 207 return "org.hsqldb.jdbc.jdbcBlob"; 208 209 case Types.CLOB : 210 return "org.hsqldb.jdbc.jdbcClob"; 211 212 case Types.DISTINCT : 213 return "org.hsqldb.jdbc.jdbcDistinct"; 214 215 case Types.REF : 216 return "org.hsqldb.jdbc.jdbcRef"; 217 218 case Types.STRUCT : 219 return "org.hsqldb.jdbc.jdbcStruct"; 220 221 default : 222 return null; 223 } 224 } 225 226 243 285 int getMaxDisplaySize() { 286 return Types.getMaxDisplaySize(type); 287 } 288 289 294 Integer getDataType() { 295 return ValuePool.getInt(type); 296 } 297 298 303 Integer getDataTypeSub() { 304 return ValuePool.getInt(typeSub); 305 } 306 307 316 Integer getDefaultScale() { 317 318 switch (type) { 319 320 case Types.BIGINT : 321 case Types.INTEGER : 322 case Types.SMALLINT : 323 case Types.TINYINT : 324 return ValuePool.getInt(0); 325 326 default : 327 return null; 328 } 329 } 330 331 336 Integer getIntervalPrecision() { 337 return null; 338 } 339 340 345 String getLiteralPrefix() { 346 347 switch (type) { 348 349 case Types.BINARY : 350 case Types.BLOB : 351 case Types.CHAR : 352 case Types.CLOB : 353 case Types.LONGVARBINARY : 354 case Types.LONGVARCHAR : 355 case Types.VARBINARY : 356 case Types.VARCHAR : 357 return "'"; 358 359 case Types.DATALINK : 360 return "'"; 362 case Types.DATE : 363 return "'"; 365 case Types.OTHER : 366 return "'"; 368 case Types.TIME : 369 return "'"; 371 case Types.TIMESTAMP : 372 return "'"; 374 case Types.XML : 375 return "'"; 377 default : 378 return null; 379 } 380 } 381 382 387 String getLiteralSuffix() { 388 389 switch (type) { 390 391 case Types.BINARY : 392 case Types.BLOB : 393 case Types.CHAR : 394 case Types.CLOB : 395 case Types.LONGVARBINARY : 396 case Types.LONGVARCHAR : 397 case Types.VARBINARY : 398 case Types.VARCHAR : 399 return "'"; 400 401 case Types.DATALINK : 402 case Types.DATE : 403 case Types.OTHER : 404 case Types.TIME : 405 case Types.TIMESTAMP : 406 case Types.XML : 407 return "'"; 409 default : 410 return null; 411 } 412 } 413 414 420 String getLocalName() { 421 422 if (!locale_set) { 423 setLocale(Locale.getDefault()); 424 } 425 426 String key = this.getTypeName(); 427 428 return BundleHandler.getString(hnd_local_names, key); 429 } 430 431 438 Integer getMaxScale() { 439 440 switch (type) { 441 442 case Types.BIGINT : 443 case Types.DATE : 444 case Types.TIME : 445 case Types.INTEGER : 446 case Types.SMALLINT : 447 case Types.TINYINT : 448 return ValuePool.getInt(0); 449 450 case Types.TIMESTAMP : 451 return ValuePool.getInt(6); 452 453 case Types.DECIMAL : 454 case Types.NUMERIC : 455 return ValuePool.getInt(Short.MAX_VALUE); 456 457 case Types.FLOAT : 458 case Types.REAL : 459 case Types.DOUBLE : 460 return ValuePool.getInt(306); 461 462 default : 463 return null; 464 } 465 } 466 467 474 Integer getMaxScaleAct() { 475 476 switch (type) { 477 478 case Types.DECIMAL : 479 case Types.NUMERIC : 480 return ValuePool.getInt(Integer.MAX_VALUE); 481 482 default : 483 return getMaxScale(); 484 } 485 } 486 487 494 Integer getMinScale() { 495 496 switch (type) { 497 498 case Types.BIGINT : 499 case Types.DATE : 500 case Types.INTEGER : 501 case Types.SMALLINT : 502 case Types.TIME : 503 case Types.TIMESTAMP : 504 case Types.TINYINT : 505 case Types.DECIMAL : 506 case Types.NUMERIC : 507 return ValuePool.getInt(0); 508 509 case Types.FLOAT : 510 case Types.REAL : 511 case Types.DOUBLE : 512 return ValuePool.getInt(-324); 513 514 default : 515 return null; 516 } 517 } 518 519 526 Integer getMinScaleAct() { 527 return getMinScale(); 528 } 529 530 536 Integer getNullability() { 537 return ValuePool.getInt(columnNullable); 538 } 539 540 547 Integer getNumPrecRadix() { 548 549 switch (type) { 550 551 case Types.BIGINT : 552 case Types.DECIMAL : 553 case Types.DOUBLE : 554 case Types.INTEGER : 555 case Types.NUMERIC : 556 case Types.REAL : 557 case Types.SMALLINT : 558 case Types.TINYINT : 559 return ValuePool.getInt(10); 560 561 case Types.FLOAT : 562 return ValuePool.getInt(2); 563 564 default : 565 return null; 566 } 567 } 568 569 576 Integer getPrecision() { 577 578 int p = Types.getPrecision(type); 579 580 return p == 0 ? null 581 : ValuePool.getInt(p); 582 } 583 584 591 Long getPrecisionAct() { 592 593 Integer temp = getPrecision(); 594 595 if (temp == null) { 596 return ValuePool.getLong(Long.MAX_VALUE); 597 } else { 598 return ValuePool.getLong(temp.longValue()); 599 } 600 } 601 602 607 String getRemarks() { 608 609 if (!locale_set) { 610 setLocale(Locale.getDefault()); 611 } 612 613 String key = this.getTypeName(); 614 615 return BundleHandler.getString(hnd_remarks, key); 616 } 617 618 623 Integer getSearchability() { 624 return Types.isSearchable(type) ? ValuePool.getInt(typeSearchable) 625 : ValuePool.getInt(typePredNone); 626 } 627 628 633 Integer getSqlDataType() { 634 635 switch (type) { 639 640 case Types.ARRAY : 641 return ValuePool.getInt(Types.SQL_ARRAY); 643 case Types.BIGINT : 644 return ValuePool.getInt(Types.SQL_BIGINT); 646 case Types.BINARY : 647 return ValuePool.getInt(Types.SQL_BLOB); 649 case Types.BOOLEAN : 650 return ValuePool.getInt(Types.SQL_BOOLEAN); 652 case Types.BLOB : 653 return ValuePool.getInt(Types.SQL_BLOB); 655 case Types.CHAR : 656 return ValuePool.getInt(Types.SQL_CHAR); 658 case Types.CLOB : 659 return ValuePool.getInt(Types.SQL_CLOB); 661 case Types.DATALINK : 662 return ValuePool.getInt(Types.SQL_DATALINK); 664 case Types.DATE : 665 666 return ValuePool.getInt(Types.SQL_DATETIME); 676 677 case Types.DECIMAL : 678 return ValuePool.getInt(Types.SQL_DECIMAL); 680 case Types.DISTINCT : 681 return ValuePool.getInt(Types.SQL_UDT); 683 case Types.DOUBLE : 684 return ValuePool.getInt(Types.SQL_DOUBLE); 686 case Types.FLOAT : 687 return ValuePool.getInt(Types.SQL_FLOAT); 689 case Types.INTEGER : 690 return ValuePool.getInt(Types.SQL_INTEGER); 692 case Types.JAVA_OBJECT : 693 return ValuePool.getInt(Types.JAVA_OBJECT); 695 case Types.LONGVARBINARY : 696 return ValuePool.getInt(Types.SQL_BLOB); 698 case Types.LONGVARCHAR : 699 return ValuePool.getInt(Types.SQL_CLOB); 701 case Types.NULL : 702 return ValuePool.getInt(Types.SQL_ALL_TYPES); 704 case Types.NUMERIC : 705 return ValuePool.getInt(Types.SQL_NUMERIC); 707 case Types.OTHER : 708 return ValuePool.getInt(Types.OTHER); 710 case Types.REAL : 711 return ValuePool.getInt(Types.SQL_REAL); 713 case Types.REF : 714 return ValuePool.getInt(Types.SQL_REF); 716 case Types.SMALLINT : 717 return ValuePool.getInt(Types.SQL_SMALLINT); 719 case Types.STRUCT : 720 return ValuePool.getInt(Types.SQL_UDT); 722 case Types.TIME : 723 724 return ValuePool.getInt(Types.SQL_DATETIME); 734 735 case Types.TIMESTAMP : 736 737 return ValuePool.getInt(Types.SQL_DATETIME); 747 748 case Types.TINYINT : 749 return ValuePool.getInt(Types.TINYINT); 751 case Types.VARBINARY : 752 return ValuePool.getInt(Types.SQL_BLOB); 754 case Types.VARCHAR : 755 return ValuePool.getInt(Types.SQL_VARCHAR); 757 case Types.XML : 758 return ValuePool.getInt(Types.SQL_XML); 760 default : 761 return null; 762 } 763 } 764 765 770 Integer getSqlDateTimeSub() { 771 772 switch (type) { 773 774 case Types.DATE : 775 return ValuePool.getInt(1); 776 777 case Types.TIME : 778 return ValuePool.getInt(2); 779 780 case Types.TIMESTAMP : 781 return ValuePool.getInt(3); 782 783 default : 784 return null; 785 } 786 } 787 788 796 String getStdMapClsName() { 797 798 switch (type) { 799 800 case Types.ARRAY : 801 return "java.sql.Array"; 802 803 case Types.BIGINT : 804 return "long"; 805 806 case Types.BINARY : 807 case Types.LONGVARBINARY : 808 case Types.VARBINARY : 809 return "[B"; 810 811 case Types.BOOLEAN : 812 return "boolean"; 813 814 case Types.BLOB : 815 return "java.sql.Blob"; 816 817 case Types.CHAR : 818 case Types.LONGVARCHAR : 819 case Types.VARCHAR : 820 return "java.lang.String"; 821 822 case Types.CLOB : 823 return "java.sql.Clob"; 824 825 case Types.DATALINK : 826 return "java.net.URL"; 827 828 case Types.DATE : 829 return "java.sql.Date"; 830 831 case Types.DECIMAL : 832 case Types.NUMERIC : 833 return "java.math.BigDecimal"; 834 835 case Types.DISTINCT : 836 case Types.JAVA_OBJECT : 837 case Types.OTHER : 838 case Types.XML : return "java.lang.Object"; 840 841 case Types.REAL : 842 return "float"; 843 844 case Types.FLOAT : 845 case Types.DOUBLE : 846 return "double"; 847 848 case Types.INTEGER : 849 return "int"; 850 851 case Types.NULL : 852 return "null"; 853 854 case Types.REF : 855 return "java.sql.Ref"; 856 857 case Types.SMALLINT : 858 return "short"; 859 860 case Types.STRUCT : 861 return "java.sql.Struct"; 862 863 case Types.TIME : 864 return "java.sql.Time"; 865 866 case Types.TIMESTAMP : 867 return "java.sql.Timestamp"; 868 869 case Types.TINYINT : 870 return "byte"; 871 872 default : 873 return null; 874 } 875 } 876 877 882 int getTypeCode() { 883 return type; 884 } 885 886 895 String getTypeName() { 896 897 return typeSub == Types.TYPE_SUB_IGNORECASE 898 ? Types.getTypeName(Types.VARCHAR_IGNORECASE) 899 : Types.getTypeName(type); 900 } 901 902 907 int getTypeSub() { 908 return this.typeSub; 909 } 910 911 916 Boolean isAutoIncrement() { 917 918 switch (type) { 919 920 case Types.DECIMAL : 921 case Types.DOUBLE : 922 case Types.FLOAT : 923 case Types.NUMERIC : 924 case Types.REAL : 925 case Types.SMALLINT : 926 case Types.TINYINT : 927 return Boolean.FALSE; 928 929 case Types.BIGINT : 930 case Types.INTEGER : 931 return Boolean.TRUE; 932 933 default : 934 return null; 935 } 936 } 937 938 945 Boolean isCaseSensitive() { 946 947 return typeSub == Types.TYPE_SUB_IGNORECASE ? Boolean.FALSE 948 : Types.isCaseSensitive( 949 type); 950 } 951 952 962 Boolean isColStClsSupported() { 963 964 return ValuePool.getBoolean(type == Types.NULL ? true 965 : getColStClsName() 966 != null); 967 } 968 969 976 Boolean isFixedPrecisionScale() { 977 978 switch (type) { 979 980 case Types.BIGINT : 981 case Types.DECIMAL : 982 case Types.DOUBLE : 983 case Types.FLOAT : 984 case Types.INTEGER : 985 case Types.NUMERIC : 986 case Types.REAL : 987 case Types.SMALLINT : 988 case Types.TINYINT : 989 return Boolean.FALSE; 990 991 default : 992 return null; 993 } 994 } 995 996 1005 Boolean isStdMapClsSupported() { 1006 1007 boolean isSup = false; 1010 1011 switch (type) { 1012 1013 case Types.ARRAY : { 1014 try { 1015 Class.forName("java.sql.Array"); 1016 1017 isSup = true; 1018 } catch (Exception e) { 1019 isSup = false; 1020 } 1021 1022 break; 1023 } 1024 case Types.BLOB : { 1025 try { 1026 Class.forName("java.sql.Blob"); 1027 1028 isSup = true; 1029 } catch (Exception e) { 1030 isSup = false; 1031 } 1032 1033 break; 1034 } 1035 case Types.CLOB : { 1036 try { 1037 Class.forName("java.sql.Clob"); 1038 1039 isSup = true; 1040 } catch (Exception e) { 1041 isSup = false; 1042 } 1043 1044 break; 1045 } 1046 case Types.DISTINCT : { 1047 isSup = false; 1048 1049 break; 1050 } 1051 case Types.REF : { 1052 try { 1053 Class.forName("java.sql.Ref"); 1054 1055 isSup = true; 1056 } catch (Exception e) { 1057 isSup = false; 1058 } 1059 1060 break; 1061 } 1062 case Types.STRUCT : { 1063 try { 1064 Class.forName("java.sql.Struct"); 1065 1066 isSup = true; 1067 } catch (Exception e) { 1068 isSup = false; 1069 } 1070 1071 break; 1072 } 1073 default : { 1074 isSup = (getStdMapClsName() != null); 1075 1076 break; 1077 } 1078 } 1079 1080 return ValuePool.getBoolean(isSup); 1081 } 1082 1083 1092 Boolean isSupportedAsPCol() { 1093 1094 switch (type) { 1095 1096 case Types.NULL : case Types.JAVA_OBJECT : 1099 case Types.ARRAY : return Boolean.TRUE; 1102 1103 default : 1104 return isSupportedAsTCol(); 1105 } 1106 } 1107 1108 1117 Boolean isSupportedAsTCol() { 1118 1119 String columnTypeName; 1120 1121 if (type == Types.NULL) { 1122 return Boolean.FALSE; 1123 } 1124 1125 columnTypeName = Types.getTypeString(type); 1126 1127 return ValuePool.getBoolean(columnTypeName != null); 1128 } 1129 1130 1135 Boolean isUnsignedAttribute() { 1136 return Types.isUnsignedAttribute(type); 1137 } 1138 1139 1146 void setLocale(Locale l) { 1147 1148 if (l == null) { 1149 hnd_create_params = hnd_local_names = hnd_remarks = -1; 1150 locale_set = false; 1151 1152 return; 1153 } 1154 1155 Locale oldLocale; 1156 1157 synchronized (BundleHandler.class) { 1158 oldLocale = BundleHandler.getLocale(); 1159 1160 BundleHandler.setLocale(l); 1161 1162 hnd_create_params = 1163 BundleHandler.getBundleHandle("data-type-create-parameters", 1164 null); 1165 hnd_local_names = BundleHandler.getBundleHandle("data-type-names", 1166 null); 1167 hnd_remarks = BundleHandler.getBundleHandle("data-type-remarks", 1168 null); 1169 1170 BundleHandler.setLocale(oldLocale); 1171 1172 locale_set = true; 1173 } 1174 } 1175 1176 1181 void setTypeCode(int type) { 1182 this.type = type; 1183 } 1184 1185 1192 void setTypeSub(int typeSub) { 1193 this.typeSub = typeSub; 1194 } 1195} 1196 | Popular Tags |