1 21 22 package org.opensubsystems.core.persist.db.driver.mssql; 23 24 import java.sql.CallableStatement ; 25 import java.sql.Connection ; 26 import java.sql.SQLException ; 27 import java.sql.Statement ; 28 import java.sql.Types ; 29 import java.util.logging.Level ; 30 import java.util.logging.Logger ; 31 32 import org.opensubsystems.core.error.OSSException; 33 import org.opensubsystems.core.persist.db.driver.DatabaseTestSchema; 34 import org.opensubsystems.core.util.DatabaseUtils; 35 import org.opensubsystems.core.util.Log; 36 37 47 public class MSSQLDatabaseTestSchema extends DatabaseTestSchema 48 { 49 209 210 212 215 private static Logger s_logger = Log.getInstance(MSSQLDatabaseTestSchema.class); 216 217 219 224 public MSSQLDatabaseTestSchema( 225 ) throws OSSException 226 { 227 super(); 228 } 229 230 232 235 public void create( 236 Connection cntDBConnection, 237 String strUserName 238 ) throws SQLException 239 { 240 244 Statement stmQuery = null; 246 try 247 { 248 stmQuery = cntDBConnection.createStatement(); 249 250 252 if (stmQuery.execute("CREATE TABLE GENERATEDKEY_TEST" + NL + 253 "(" + NL + 254 " TEST_KEY INTEGER IDENTITY(1,1) NOT NULL PRIMARY KEY," + NL + 255 " TEST_VALUE VARCHAR(50) NOT NULL" + NL + 256 ")")) 257 { 258 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 260 } 261 s_logger.log(Level.FINEST, "Table GENERATEDKEY_TEST created."); 262 272 273 275 if (stmQuery.execute("CREATE TABLE RESULTSET_TEST" + NL + 276 "(" + NL + 277 " RESULTSET_TEST VARCHAR(20) NOT NULL" + NL + 278 ")")) 279 { 280 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 282 } 283 s_logger.log(Level.FINEST, "Table RESULTSET_TEST created."); 284 294 295 297 if (stmQuery.execute("CREATE TABLE DATE_TEST" + NL + 298 "(" + NL + 299 " DATE_TEST SMALLDATETIME NOT NULL" + NL + 300 ")")) 301 { 302 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 304 } 305 s_logger.log(Level.FINEST, "Table DATE_TEST created."); 306 316 317 319 if (stmQuery.execute("CREATE TABLE TIME_TEST" + NL + 320 "(" + NL + 321 " TIME_TEST SMALLDATETIME NOT NULL" + NL + 322 ")")) 323 { 324 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 326 } 327 s_logger.log(Level.FINEST, "Table TIME_TEST created."); 328 338 339 341 if (stmQuery.execute("CREATE TABLE TIMESTAMP_TEST" + NL + 342 "(" + NL + 343 " TIMESTAMP_TEST DATETIME NOT NULL" + NL + 344 ")")) 345 { 346 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 348 } 349 s_logger.log(Level.FINEST, "Table TIMESTAMP_TEST created."); 350 360 361 363 if (stmQuery.execute("CREATE TABLE TRANSACTION_TEST" + NL + 364 "(" + NL + 365 " TEST_ID INTEGER NOT NULL," + NL + 366 " TEST_VALUE VARCHAR(50) NOT NULL," + NL + 367 " CONSTRAINT TEST_ID_PK PRIMARY KEY (TEST_ID)" + NL + 368 ")")) 369 { 370 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 372 } 373 s_logger.log(Level.FINEST, "Table TRANSACTION_TEST created."); 374 384 385 387 if (stmQuery.execute("CREATE TABLE TRANSACTION_RELATED_TEST" + NL + 388 "(" + NL + 389 " TEST_REL_ID INTEGER NOT NULL," + NL + 390 " TEST_ID INTEGER NOT NULL," + NL + 391 " TEST_VALUE VARCHAR(50)," + NL + 392 " CONSTRAINT TEST_ID_FK FOREIGN KEY (TEST_ID)" + NL + 393 " REFERENCES TRANSACTION_TEST (TEST_ID) ON DELETE CASCADE" + NL + 394 ")")) 395 { 396 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 398 } 399 s_logger.log(Level.FINEST, "Table TRANSACTION_RELATED_TEST created."); 400 410 411 413 if (stmQuery.execute("CREATE TABLE DELETE_TEST" + NL + 414 "(" + 415 " TEST_ID INTEGER NOT NULL," + NL + 416 " TEST_VALUE VARCHAR(50) NOT NULL," + NL + 417 " CONSTRAINT DTEST_ID_PK PRIMARY KEY (TEST_ID)" + NL + 418 ")")) 419 { 420 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 422 } 423 s_logger.log(Level.FINEST, "Table DELETE_TEST created."); 424 434 435 437 if (stmQuery.execute("CREATE TABLE DELETE_RELATED_TEST" + NL + 438 "(" + NL + 439 " TEST_REL_ID INTEGER NOT NULL," + NL + 440 " TEST_ID INTEGER NOT NULL," + NL + 441 " TEST_VALUE VARCHAR(50)," + NL + 442 " CONSTRAINT DTEST_ID_FK FOREIGN KEY (TEST_ID)" + NL + 443 " REFERENCES DELETE_TEST (TEST_ID) ON DELETE CASCADE" + NL + 444 ")")) 445 { 446 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 448 } 449 s_logger.log(Level.FINEST, "Table DELETE_RELATED_TEST created."); 450 460 461 463 if (stmQuery.execute("CREATE TABLE ROLLBACK_TEST" + NL + 464 "(" + NL + 465 " TEST_COLUMN VARCHAR(50) NOT NULL," + NL + 466 " CONSTRAINT TEST_COLUMN_UQ UNIQUE (TEST_COLUMN)" + NL + 467 ")")) 468 { 469 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 471 } 472 s_logger.log(Level.FINEST, "Table TRANSACTION_TEST created."); 473 483 484 486 if (stmQuery.execute("CREATE TABLE OWN_FK_TEST " + NL + 487 "( " + NL + 488 " TEST_ID INTEGER NOT NULL, " + NL + 489 " FK_ID INTEGER," + NL + 490 " CONSTRAINT OWN_FK_TEST_PK PRIMARY KEY (TEST_ID), " + NL + 491 " CONSTRAINT OWN_FK_TEST_FK FOREIGN KEY (FK_ID) " + NL + 492 " REFERENCES OWN_FK_TEST (TEST_ID) ON DELETE NO ACTION" + NL + 493 ")")) 494 { 495 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 497 } 498 s_logger.log(Level.FINEST, "Table OWN_FK_TEST created."); 499 509 510 512 if (stmQuery.execute("CREATE TABLE GROUP_BASE_TEST" + NL + 513 "(" + NL + 514 " TEST_BASE_ID INTEGER NOT NULL, " + NL + 515 " TEST_BASE_VALUE INTEGER," + NL + 516 " CONSTRAINT GROUP_BASE_TEST_PK PRIMARY KEY (TEST_BASE_ID)" + NL + 517 ")")) 518 { 519 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 521 } 522 s_logger.log(Level.FINEST, "Table GROUP_BASE_TEST created."); 523 533 534 536 if (stmQuery.execute( 537 "CREATE TABLE GROUP_CHILD_TEST" + NL + 538 "(" + NL + 539 " TEST_CHILD_ID INTEGER NOT NULL, " + NL + 540 " TEST_BASE_FK_ID INTEGER NOT NULL, " + NL + 541 " TEST_CHILD_VALUE INTEGER," + NL + 542 " CONSTRAINT GROUP_CHILD_TEST_PK PRIMARY KEY (TEST_CHILD_ID)," + NL + 543 " CONSTRAINT TEST_BASE_ID_FK FOREIGN KEY (TEST_BASE_FK_ID) " + NL + 544 " REFERENCES GROUP_BASE_TEST (TEST_BASE_ID) ON DELETE CASCADE" + NL + 545 ")")) 546 { 547 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 549 } 550 s_logger.log(Level.FINEST, "Table GROUP_CHILD_TEST created."); 551 561 562 564 if (stmQuery.execute("CREATE TABLE SAME_TEST1" + NL + 565 "(" + NL + 566 " ID INTEGER NOT NULL" + NL + 567 ")")) 568 { 569 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 571 } 572 s_logger.log(Level.FINEST, "Table SAME_TEST1 created."); 573 583 584 586 if (stmQuery.execute("CREATE TABLE SAME_TEST2 " + NL + 587 "(" + NL + 588 " ID INTEGER NOT NULL" + NL + 589 ")")) 590 { 591 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 593 } 594 s_logger.log(Level.FINEST, "Table SAME_TEST2 created."); 595 605 606 608 if (stmQuery.execute("CREATE TABLE POOL_TEST " + NL + 609 "(" + NL + 610 " TEST_VALUE INTEGER NOT NULL," + NL + 611 " CONSTRAINT TEST_VALUE1_PK PRIMARY KEY (TEST_VALUE)" + NL + 612 ")")) 613 { 614 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 616 } 617 s_logger.log(Level.FINEST, "Table POOL_TEST created."); 618 628 629 631 if (stmQuery.execute("CREATE TABLE POOL_TEST2 " + NL + 632 "(" + NL + 633 " TEST_VALUE INTEGER NOT NULL," + NL + 634 " CONSTRAINT TEST_VALUE2_PK PRIMARY KEY (TEST_VALUE)" + NL + 635 ")")) 636 { 637 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 639 } 640 s_logger.log(Level.FINEST, "Table POOL_TEST2 created."); 641 651 652 654 if (stmQuery.execute("CREATE TABLE QUERY_TEST " + NL + 655 "(" + NL + 656 " VALUE_1 INTEGER NOT NULL," + NL + 657 " VALUE_2 INTEGER NOT NULL" + NL + 658 ")")) 659 { 660 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 662 } 663 s_logger.log(Level.FINEST, "Table QUERY_TEST created."); 664 674 675 677 if (stmQuery.execute("CREATE TABLE QUERY_TEST_EXCEPT " + NL + 678 "(" + NL + 679 " VALUE_1 INTEGER NOT NULL" + NL + 680 ")")) 681 { 682 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 684 } 685 s_logger.log(Level.FINEST, "Table QUERY_TEST_EXCEPT created."); 686 696 697 699 if (stmQuery.execute("CREATE TABLE UNIQUE_COLUMN_TEST " + NL + 700 "(" + NL + 701 " TEST_ID INTEGER, " + NL + 702 " CONSTRAINT TEST_ID_UQ UNIQUE (TEST_ID) " + NL + 703 ")")) 704 { 705 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 707 } 708 s_logger.log(Level.FINEST, "Table UNIQUE_COLUMN_TEST created."); 709 719 720 722 if (stmQuery.execute("CREATE TABLE NULL_COLUMN_TEST " + NL + 723 "(" + NL + 724 " NAME VARCHAR(50)" + NL + 725 ")")) 726 { 727 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 729 } 730 s_logger.log(Level.FINEST, "Table NULL_COLUMN_TEST created."); 731 741 742 744 if (stmQuery.execute("CREATE PROCEDURE INSERT_GENERATEDKEY_TEST " + NL + 745 "@IN_VALUE VARCHAR(50), " + NL + 746 "@OUT_KEY INTEGER OUTPUT " + NL + 747 "AS " + NL + 748 " INSERT INTO GENERATEDKEY_TEST(TEST_VALUE) VALUES (@IN_VALUE) " + NL + 749 " SET @OUT_KEY = @@IDENTITY " + NL + 750 " RETURN @OUT_KEY")) 751 { 752 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 754 } 755 s_logger.log(Level.FINEST, "Procedure INSERT_GENERATEDKEY_TEST created."); 756 766 767 769 if (stmQuery.execute("CREATE PROCEDURE INSERT_ROW_COUNT_TEST " + NL + 770 "@IN_VALUE VARCHAR(50), " + NL + 771 "@OUT_ROWS INTEGER OUTPUT " + NL + 772 "AS " + NL + 773 " INSERT INTO GENERATEDKEY_TEST(TEST_VALUE) VALUES (@IN_VALUE) " + NL + 774 " SET @OUT_ROWS = @@ROWCOUNT " + NL + 775 " RETURN @OUT_ROWS")) 776 { 777 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 779 } 780 s_logger.log(Level.FINEST, "Procedure INSERT_ROW_COUNT_TEST created."); 781 791 792 794 if (stmQuery.execute("CREATE PROCEDURE UPDATE_TRANSACTION_TEST_VALUE " + NL + 795 "@IN_OLD_TEST_VALUE VARCHAR(50), " + NL + 796 "@IN_NEW_TEST_VALUE VARCHAR(50) " + NL + 797 "AS " + NL + 798 " UPDATE " + strUserName + ".TRANSACTION_TEST SET " + NL + 799 " TEST_VALUE = @IN_NEW_TEST_VALUE " + NL + 800 " WHERE TEST_VALUE = @IN_OLD_TEST_VALUE " + NL + 801 " RETURN @@IDENTITY")) 802 803 { 804 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 806 } 807 s_logger.log(Level.FINEST, "Procedure UPDATE_TRANSACTION_TEST_VALUE created."); 808 818 819 } 820 catch (SQLException sqleExc) 821 { 822 s_logger.log(Level.WARNING, "Failed to create database test schema.", 823 sqleExc); 824 throw sqleExc; 825 } 826 finally 827 { 828 DatabaseUtils.closeStatement(stmQuery); 829 } 830 } 831 832 835 public String getInsertGeneratedKey( 836 ) 837 { 838 return "INSERT INTO generatedkey_test(test_value) " + 839 "VALUES (?)"; 840 } 841 842 845 public int[] executeInsertGeneratedKey2( 846 Connection dbConnection, 847 String strValue 848 ) throws SQLException 849 { 850 CallableStatement insertStatement = null; 851 int iInsertCount = 0; 852 int iGeneratedKey = 0; 853 int[] returnValues = null; 854 855 try 856 { 857 insertStatement = dbConnection.prepareCall( 858 "EXEC INSERT_GENERATEDKEY_TEST ?, ?"); 859 insertStatement.setString(1, strValue); 860 insertStatement.registerOutParameter(2, Types.INTEGER); 861 862 iInsertCount = insertStatement.executeUpdate(); 863 iGeneratedKey = insertStatement.getInt(2); 864 865 returnValues = new int[2]; 866 returnValues[0] = iInsertCount; 867 returnValues[1] = iGeneratedKey; 868 } 869 finally 870 { 871 DatabaseUtils.closeStatement(insertStatement); 872 } 873 874 return returnValues; 875 } 876 877 880 public int executeUpdateTestValue( 881 Connection dbConnection, 882 String strOldValue, 883 String strNewValue 884 ) throws SQLException 885 { 886 CallableStatement updateStatement = null; 887 int iUpdateCount = 0; 888 889 try 890 { 891 updateStatement = dbConnection.prepareCall("EXEC UPDATE_TRANSACTION_TEST_VALUE ?, ?"); 892 updateStatement.setString(1, strOldValue); 893 updateStatement.setString(2, strNewValue); 894 895 iUpdateCount = updateStatement.executeUpdate(); 898 } 899 finally 900 { 901 DatabaseUtils.closeStatement(updateStatement); 902 } 903 904 return iUpdateCount; 905 } 906 907 910 public int[] executeInsertRow( 911 Connection dbConnection, 912 String strValue) 913 throws SQLException 914 { 915 CallableStatement insertStatement = null; 916 int iInsertCount = 0; 917 int iInsertCountReturnedFromSP = 0; 918 int[] returnValues = null; 919 920 try 921 { 922 insertStatement = dbConnection.prepareCall( 923 "EXEC INSERT_ROW_COUNT_TEST ?, ?"); 924 insertStatement.setString(1, strValue); 925 insertStatement.registerOutParameter(2, Types.INTEGER); 926 927 iInsertCount = insertStatement.executeUpdate(); 928 iInsertCountReturnedFromSP = insertStatement.getInt(2); 929 930 returnValues = new int[2]; 931 932 returnValues[0] = iInsertCount; 934 935 returnValues[1] = iInsertCountReturnedFromSP; 937 } 938 finally 939 { 940 DatabaseUtils.closeStatement(insertStatement); 941 } 942 943 return returnValues; 944 } 945 946 949 public void createTestUser( 950 Connection cntAdminDBConnection, 951 String strDatabaseURL, 952 String strUserName, 953 String strUserPassword 954 ) throws SQLException 955 { 956 Statement stmQuery = null; 957 try 958 { 959 String strDatabaseName = ""; 960 if (strDatabaseURL.indexOf(":jtds:") > 0) 965 { 966 strDatabaseName = strDatabaseURL.substring( 968 strDatabaseURL.lastIndexOf("/") + 1, strDatabaseURL.length()); 969 } 970 else if (strDatabaseURL.indexOf(":microsoft:") > 0) 971 { 972 strDatabaseName = strDatabaseURL.substring( 974 strDatabaseURL.lastIndexOf("DatabaseName=") + 975 "DatabaseName=".length(), strDatabaseURL.indexOf(";", 976 strDatabaseURL.lastIndexOf("DatabaseName="))); 977 } 978 else if (strDatabaseURL.indexOf(":bea:") > 0 979 || strDatabaseURL.indexOf(":datadirect:") > 0 980 || strDatabaseURL.indexOf(":JSQLConnect:") > 0) 981 { 982 strDatabaseName = strDatabaseURL.substring( 984 strDatabaseURL.lastIndexOf("atabaseName=") + 985 "atabaseName=".length(), strDatabaseURL.length()); 986 } 987 else if (strDatabaseURL.indexOf(":inetdae7:") > 0) 988 { 989 strDatabaseName = strDatabaseURL.substring( 991 strDatabaseURL.lastIndexOf("database=") + 992 "database=".length(), strDatabaseURL.length()); 993 } 994 else 995 { 996 throw new SQLException ("Unsupported URL: " + strDatabaseURL); 997 } 998 999 StringBuffer buffer = new StringBuffer (); 1000 buffer.append("USE "); 1001 buffer.append(strDatabaseName); 1002 buffer.append("; EXEC sp_addlogin '"); 1003 buffer.append(strUserName); 1004 buffer.append("', '"); 1005 buffer.append(strUserPassword); 1006 buffer.append("', '"); 1007 buffer.append(strDatabaseName); 1008 buffer.append("', 'us_english'"); 1009 buffer.append("; EXEC sp_adduser '"); 1010 buffer.append(strUserName); 1011 buffer.append("' ; GRANT ALL TO "); 1012 buffer.append(strUserName); 1013 1014 stmQuery = cntAdminDBConnection.createStatement(); 1015 1016 if (stmQuery.execute(buffer.toString())) 1017 { 1018 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 1020 } 1021 } 1022 finally 1023 { 1024 DatabaseUtils.closeStatement(stmQuery); 1025 } 1026 } 1027 1028 1031 public void dropTestUser( 1032 Connection cntAdminDBConnection, 1033 String strDatabaseURL, 1034 String strUserName 1035 ) throws SQLException 1036 { 1037 Statement stmQuery = null; 1038 try 1039 { 1040 String strDatabaseName = ""; 1041 if (strDatabaseURL.indexOf(":jtds:") > 0) 1045 { 1046 strDatabaseName = strDatabaseURL.substring( 1048 strDatabaseURL.lastIndexOf("/") + 1, strDatabaseURL.length()); 1049 } 1050 else if (strDatabaseURL.indexOf(":microsoft:") > 0) 1051 { 1052 strDatabaseName = strDatabaseURL.substring( 1054 strDatabaseURL.lastIndexOf("DatabaseName=") + 1055 "DatabaseName=".length(), strDatabaseURL.indexOf(";", 1056 strDatabaseURL.lastIndexOf("DatabaseName="))); 1057 } 1058 else 1059 { 1060 throw new SQLException ("Unsupported URL: " + strDatabaseURL); 1061 } 1062 1063 StringBuffer buffer = new StringBuffer (); 1064 buffer.append("USE "); 1065 buffer.append(strDatabaseName); 1066 buffer.append("; EXEC sp_revokedbaccess '"); 1067 buffer.append(strUserName); 1068 buffer.append("'; EXEC sp_droplogin '"); 1069 buffer.append(strUserName); 1070 buffer.append("'"); 1071 1072 stmQuery = cntAdminDBConnection.createStatement(); 1073 1074 if (stmQuery.execute(buffer.toString())) 1075 { 1076 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 1078 } 1079 } 1080 finally 1081 { 1082 DatabaseUtils.closeStatement(stmQuery); 1083 } 1084 } 1085} 1086 | Popular Tags |