transactd 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/bin/common/tdclc_32_2_2.dll +0 -0
  3. data/bin/common/tdclc_64_2_2.dll +0 -0
  4. data/build/swig/ruby/generate.cmd +45 -0
  5. data/build/swig/ruby/generate.sh +40 -0
  6. data/build/swig/ruby/tdclrb_wrap.cpp +406 -969
  7. data/build/swig/tdcl.i +88 -0
  8. data/build/tdclc/CMakeLists.txt +5 -1
  9. data/build/tdclc/tdclc.cbproj +1 -1
  10. data/build/tdclc/tdclc.rc +4 -4
  11. data/build/tdclcpp/tdclcpp.rc +4 -4
  12. data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
  13. data/build/tdclrb/tdclrb.rc +4 -4
  14. data/source/bzs/db/engine/mysql/database.cpp +165 -74
  15. data/source/bzs/db/engine/mysql/database.h +19 -5
  16. data/source/bzs/db/engine/mysql/dbManager.cpp +33 -11
  17. data/source/bzs/db/engine/mysql/dbManager.h +6 -1
  18. data/source/bzs/db/engine/mysql/mydebuglog.h +12 -0
  19. data/source/bzs/db/engine/mysql/mysqlInternal.h +10 -3
  20. data/source/bzs/db/engine/mysql/mysqlThd.cpp +20 -8
  21. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +12 -7
  22. data/source/bzs/db/protocol/hs/hsCommandExecuter.h +1 -1
  23. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +1 -0
  24. data/source/bzs/db/protocol/tdap/client/client.cpp +17 -15
  25. data/source/bzs/db/protocol/tdap/client/client.h +102 -30
  26. data/source/bzs/db/protocol/tdap/client/connectionPool.cpp +1 -1
  27. data/source/bzs/db/protocol/tdap/client/database.cpp +32 -10
  28. data/source/bzs/db/protocol/tdap/client/database.h +1 -0
  29. data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +0 -2
  30. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +2 -0
  31. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +47 -42
  32. data/source/bzs/db/protocol/tdap/client/fields.h +3 -1
  33. data/source/bzs/db/protocol/tdap/client/filter.h +3 -3
  34. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +18 -2
  35. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +3 -2
  36. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +14 -6
  37. data/source/bzs/db/protocol/tdap/client/nsTable.h +12 -12
  38. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +6 -3
  39. data/source/bzs/db/protocol/tdap/client/request.h +1 -0
  40. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +101 -64
  41. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +3 -0
  42. data/source/bzs/db/protocol/tdap/client/stringConverter.h +9 -13
  43. data/source/bzs/db/protocol/tdap/client/table.cpp +73 -56
  44. data/source/bzs/db/protocol/tdap/client/table.h +8 -8
  45. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +52 -100
  46. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +8 -1
  47. data/source/bzs/db/protocol/tdap/mysql/request.h +6 -0
  48. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +349 -189
  49. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +28 -12
  50. data/source/bzs/db/protocol/tdap/tdapRequest.h +5 -4
  51. data/source/bzs/db/protocol/tdap/tdapSchema.h +6 -1
  52. data/source/bzs/db/protocol/tdap/tdapcapi.h +29 -4
  53. data/source/bzs/db/protocol/tdap/uri.h +297 -0
  54. data/source/bzs/db/transactd/appModule.cpp +41 -16
  55. data/source/bzs/db/transactd/appModule.h +1 -2
  56. data/source/bzs/db/transactd/transactd.cpp +37 -14
  57. data/source/bzs/env/crosscompile.h +1 -3
  58. data/source/bzs/example/queryData.cpp +2 -2
  59. data/source/bzs/netsvc/client/iconnection.h +3 -1
  60. data/source/bzs/netsvc/client/tcpClient.cpp +75 -28
  61. data/source/bzs/netsvc/client/tcpClient.h +94 -62
  62. data/source/bzs/netsvc/server/IAppModule.h +2 -2
  63. data/source/bzs/netsvc/server/serverCpt.cpp +17 -10
  64. data/source/bzs/netsvc/server/serverPipe.cpp +26 -19
  65. data/source/bzs/netsvc/server/serverTpool.cpp +8 -2
  66. data/source/bzs/rtl/debuglog.cpp +21 -5
  67. data/source/bzs/rtl/debuglog.h +1 -1
  68. data/source/bzs/test/tdclphp/transactd_Test.php +183 -37
  69. data/source/bzs/test/tdclphp/transactd_pool_Test.php +1 -2
  70. data/source/bzs/test/tdclrb/transactd_spec.rb +183 -39
  71. data/source/bzs/test/transactdBench/scaling_bench.cpp +3 -3
  72. data/source/bzs/test/trdclengn/test_trdclengn.cpp +172 -57
  73. data/source/global/boost/sha1.hpp +223 -0
  74. data/source/global/tdclatl/ConnectParams.cpp +2 -2
  75. data/source/global/tdclatl/ConnectParams.h +1 -1
  76. data/source/global/tdclatl/Database.cpp +18 -0
  77. data/source/global/tdclatl/Database.h +5 -0
  78. data/source/global/tdclatl/tdclatl.idl +23 -1
  79. data/source/linux/linuxTypes.h +2 -0
  80. metadata +8 -6
  81. data/bin/common/tdclc_32_2_1.dll +0 -0
  82. data/bin/common/tdclc_64_2_1.dll +0 -0
  83. data/source/bzs/db/protocol/tdap/client/memRecordset.cpp +0 -448
  84. data/source/bzs/db/protocol/tdap/client/memRecordset.h +0 -159
@@ -45,12 +45,17 @@ using namespace std;
45
45
  #endif
46
46
  static _TCHAR HOSTNAME[MAX_PATH] = { _T("127.0.0.1") };
47
47
  #define DBNAME _T("test")
48
- #define BDFNAME _T("test.bdf")
48
+ #define BDFNAME _T("test")
49
49
  // #define ISOLATION_REPEATABLE_READ
50
50
  #define ISOLATION_READ_COMMITTED
51
51
 
52
+ static _TCHAR g_uri[MAX_PATH];
53
+ static _TCHAR g_userName[MYSQL_USERNAME_MAX + 1]={0x00};
54
+ static _TCHAR g_password[MAX_PATH]={0x00};
55
+
52
56
  static const short fdi_id = 0;
53
57
  static const short fdi_name = 1;
58
+
54
59
  boost::unit_test::test_suite* init_unit_test_suite(int argc, char* argv[]);
55
60
 
56
61
  boost::unit_test::test_suite* init_unit_test_suite(int argc, char* argv[])
@@ -67,6 +72,26 @@ boost::unit_test::test_suite* init_unit_test_suite(int argc, char* argv[])
67
72
  strcpy_s(HOSTNAME, MAX_PATH, argv[i] + 7);
68
73
  #endif
69
74
  }
75
+ if (strstr(argv[i], "--user=") == argv[i])
76
+ {
77
+ #ifdef _UNICODE
78
+ MultiByteToWideChar(CP_ACP,
79
+ (CP_ACP == CP_UTF8) ? 0 : MB_PRECOMPOSED,
80
+ argv[i] + 7, -1, g_userName, MYSQL_USERNAME_MAX+1);
81
+ #else
82
+ strcpy_s(g_userName, MYSQL_USERNAME_MAX+1, argv[i] + 7);
83
+ #endif
84
+ }
85
+ if (strstr(argv[i], "--pwd=") == argv[i])
86
+ {
87
+ #ifdef _UNICODE
88
+ MultiByteToWideChar(CP_ACP,
89
+ (CP_ACP == CP_UTF8) ? 0 : MB_PRECOMPOSED,
90
+ argv[i] + 6, -1, g_password, MAX_PATH);
91
+ #else
92
+ strcpy_s(g_password, MAX_PATH, argv[i] + 6);
93
+ #endif
94
+ }
70
95
  }
71
96
  printf("Transactd test ... \nMay look like progress is stopped, \n"
72
97
  "but it is such as record lock test, please wait.\n");
@@ -74,16 +99,18 @@ boost::unit_test::test_suite* init_unit_test_suite(int argc, char* argv[])
74
99
  return 0;
75
100
  }
76
101
 
77
- static _TCHAR g_uri[MAX_PATH];
102
+
78
103
 
79
104
  const _TCHAR* makeUri(const _TCHAR* protocol, const _TCHAR* host,
80
- const _TCHAR* dbname, const _TCHAR* dbfile = NULL)
105
+ const _TCHAR* dbname, const _TCHAR* dbfile=_T(""))
81
106
  {
82
- if (dbfile)
107
+ connectParams cp(protocol, host, dbname, dbfile, g_userName, g_password);
108
+ _tcscpy(g_uri, cp.uri());
109
+ /*if (dbfile)
83
110
  _stprintf_s(g_uri, MAX_PATH, _T("%s://%s/%s?dbfile=%s"), protocol, host,
84
111
  dbname, dbfile);
85
112
  else
86
- _stprintf_s(g_uri, MAX_PATH, _T("%s://%s/%s"), protocol, host, dbname);
113
+ _stprintf_s(g_uri, MAX_PATH, _T("%s://%s/%s"), protocol, host, dbname);*/
87
114
  return g_uri;
88
115
  }
89
116
 
@@ -125,7 +152,7 @@ public:
125
152
  if (!m_db)
126
153
  printf("Error database::create()\n");
127
154
  connectParams param(PROTOCOL, HOSTNAME, _T("querytest"),
128
- _T("test.bdf"));
155
+ _T("test"), g_userName, g_password);
129
156
  param.setMode(TD_OPEN_NORMAL);
130
157
 
131
158
  prebuiltData(m_db, param);
@@ -142,19 +169,18 @@ table* openTable(database* db, short dbmode = TD_OPEN_NORMAL,
142
169
 
143
170
  db->open(makeUri(PROTOCOL, HOSTNAME, DBNAME, BDFNAME), TYPE_SCHEMA_BDF,
144
171
  dbmode);
145
- BOOST_CHECK_MESSAGE(0 == db->stat(), "open 1" << db->stat());
172
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "open stat = " << db->stat());
146
173
  table* tb = db->openTable(_T("user"), tbmode);
147
- BOOST_CHECK_MESSAGE(0 == db->stat(), "openTable" << db->stat());
174
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "openTable stat = " << db->stat());
148
175
  return tb;
149
176
  }
150
177
 
151
178
  void testDropDatabase(database* db)
152
179
  {
153
180
  db->open(makeUri(PROTOCOL, HOSTNAME, DBNAME, BDFNAME));
154
- BOOST_CHECK_MESSAGE(0 == db->stat(), "DropDatabase 1");
155
-
181
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "open stat = " << db->stat());
156
182
  db->drop();
157
- BOOST_CHECK_MESSAGE(0 == db->stat(), "drop 2");
183
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "drop stat = " << db->stat());
158
184
  }
159
185
 
160
186
  void testClone(database* db)
@@ -297,9 +323,6 @@ void testCreateNewDataBase(database* db)
297
323
  def->updateTableDef(2);
298
324
  BOOST_CHECK_MESSAGE(0 == def->stat(),
299
325
  "updateTableDef 3 stat = " << def->stat());
300
-
301
-
302
-
303
326
  }
304
327
  }
305
328
 
@@ -1010,8 +1033,11 @@ void testSnapshot(database* db)
1010
1033
  BOOST_CHECK_MESSAGE(STATUS_NOT_FOUND_TI == tb->stat(), "phantom read");
1011
1034
 
1012
1035
  // clean up
1036
+ tb2->setFV(fdi_id, 29999);
1037
+ tb2->seek();
1038
+ BOOST_CHECK_MESSAGE(0 == tb2->stat(), "seek stat = " << tb2->stat());
1013
1039
  tb2->del();
1014
- BOOST_CHECK_MESSAGE(0 == tb2->stat(), "del");
1040
+ BOOST_CHECK_MESSAGE(0 == tb2->stat(), "del stat = " << tb2->stat());
1015
1041
 
1016
1042
  db->endSnapshot();
1017
1043
  BOOST_CHECK_MESSAGE(0 == db->stat(), "endSnapShot");
@@ -1036,7 +1062,8 @@ void testSnapshot(database* db)
1036
1062
 
1037
1063
  tb2->setFV(fdi_id, 29999);
1038
1064
  tb2->insert();
1039
- BOOST_CHECK_MESSAGE(STATUS_LOCK_ERROR == tb2->stat(), "GAP insert");
1065
+ BOOST_CHECK_MESSAGE(STATUS_LOCK_ERROR == tb2->stat(),
1066
+ "GAP insert stat = " << tb2->stat());
1040
1067
 
1041
1068
  db->endSnapshot();
1042
1069
 
@@ -1488,13 +1515,14 @@ void testTransactionLockReadCommited(database* db)
1488
1515
  //insert test row
1489
1516
  tb2->setFV(fdi_id, 29999);
1490
1517
  tb2->insert();
1491
- BOOST_CHECK_MESSAGE(0 == tb2->stat(), "tb2->insert");
1518
+ BOOST_CHECK_MESSAGE(0 == tb2->stat(), "tb2->insert stat = " << tb2->stat());
1492
1519
 
1493
1520
  tb->seekLast();
1494
1521
  BOOST_CHECK_MESSAGE(0 == tb->stat(), "tb->seekLast");
1495
1522
  tb->seekPrev();
1496
1523
  BOOST_CHECK_MESSAGE(0 == tb->stat(), "tb->seekPrev");
1497
- BOOST_CHECK_MESSAGE(last2 != tb->getFVint(fdi_id), "phantom read");
1524
+ BOOST_CHECK_MESSAGE(last2 != tb->getFVint(fdi_id), "phantom read id = "
1525
+ << tb->getFVint(fdi_id));
1498
1526
  db->endTrn();
1499
1527
 
1500
1528
  //cleanup
@@ -1610,8 +1638,13 @@ void testRecordLock(database* db)
1610
1638
  BOOST_CHECK_MESSAGE(0 == tb2->stat(), "tb2->seekFirst");
1611
1639
 
1612
1640
 
1613
- tb->seekNext(); // nobody lock second.
1614
- BOOST_CHECK_MESSAGE(0 == tb->stat(), "tb->seekFirst");
1641
+ tb->seekNext(); // nobody lock second. but REPEATABLE_READ tb2 lock all(no unlock)
1642
+ if (db->trxIsolationServer() == SRV_ISO_REPEATABLE_READ)
1643
+ BOOST_CHECK_MESSAGE(STATUS_LOCK_ERROR == tb->stat(), "tb->seekFirst stat = "
1644
+ << tb->stat() );
1645
+ else
1646
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "tb->seekFirst stat = " <<
1647
+ tb->stat() );
1615
1648
  tb->seekNext(ROW_LOCK_X); // Try lock(X) third
1616
1649
  BOOST_CHECK_MESSAGE(STATUS_LOCK_ERROR == tb->stat(), "tb->seekFirst");
1617
1650
 
@@ -1637,8 +1670,11 @@ void testRecordLock(database* db)
1637
1670
  tb->setFV(fdi_id, 21000);
1638
1671
  tb->insert();
1639
1672
  BOOST_CHECK_MESSAGE(0 == tb->stat(), "tb->insert");
1673
+ tb->setFV(fdi_id, 21000);
1674
+ tb->seek();
1675
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "tb->seek stat = " << tb->stat() );
1640
1676
  tb->del();
1641
- BOOST_CHECK_MESSAGE(0 == tb->stat(), "tb->del");
1677
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "tb->del stat = " << tb->stat() );
1642
1678
 
1643
1679
  /* --------- Unlock test ----------------------------*/
1644
1680
  // 1 unlock()
@@ -1826,6 +1862,7 @@ void testExclusive()
1826
1862
  /* Nnomal and Exclusive opend tables mix transaction */
1827
1863
  /* ---------------------------------------------------*/
1828
1864
  tb2 = db->openTable(_T("group"), TD_OPEN_EXCLUSIVE);
1865
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "open group stat = " << db->stat()) ;
1829
1866
  //Check tb2 Exclusive
1830
1867
  tb3 = db2->openTable(_T("group"), TD_OPEN_NORMAL);
1831
1868
  BOOST_CHECK_MESSAGE(STATUS_CANNOT_LOCK_TABLE == db2->stat()
@@ -1906,9 +1943,6 @@ public:
1906
1943
  /* Getting missing value by lock wait */
1907
1944
  void testMissingUpdate(database* db)
1908
1945
  {
1909
-
1910
-
1911
-
1912
1946
  table* tb = openTable(db);
1913
1947
  database* db2 = database::create();
1914
1948
  db2->connect(makeUri(PROTOCOL, HOSTNAME, DBNAME), true);
@@ -1926,17 +1960,42 @@ void testMissingUpdate(database* db)
1926
1960
  BOOST_CHECK_MESSAGE(0 == tb->stat(), "tb->seekLessThan");
1927
1961
  if (tb->stat() == 0)
1928
1962
  {
1929
- // Get lock(X) same record in parallel.
1963
+ tb2->seekLessThan(false, ROW_LOCK_X);
1964
+ BOOST_CHECK_MESSAGE(STATUS_LOCK_ERROR == tb2->stat(), "tb2->seekLessThan");
1965
+ // Get lock(X) same record in parallel. The InnoDB is good!
1930
1966
  boost::scoped_ptr<boost::thread> t(new boost::thread(boost::bind(&worker::run, w.get())));
1931
- int v = tb->getFVint(fdi_id);
1932
- tb->setFV(fdi_id, ++v);
1967
+ Sleep(5);
1968
+ int v = tb->getFVint(fdi_id);//v = 30000
1969
+ tb->setFV(fdi_id, ++v); //v = 30001
1933
1970
  tb->insert();
1934
1971
  t->join();
1935
- BOOST_CHECK_MESSAGE(0 == tb->stat(), "tb->insert");
1936
- BOOST_CHECK_MESSAGE(0 == tb2->stat(), "tb2->seekLessThan");
1937
- int v2 = tb2->getFVint(fdi_id);
1938
- BOOST_CHECK_MESSAGE(v == v2 , "value v = " << v
1939
- << " bad = " << v2);
1972
+
1973
+ if (db->trxIsolationServer() == SRV_ISO_REPEATABLE_READ)
1974
+ { /* When SRV_ISO_REPEATABLE_READ tb2 get gap lock first,
1975
+ tb can not insert, it is dedlock!
1976
+ */
1977
+ BOOST_CHECK_MESSAGE(STATUS_LOCK_ERROR == tb->stat(), "tb->insert stat= "
1978
+ << tb->stat());
1979
+ }
1980
+ else
1981
+ { /* When SRV_ISO_READ_COMMITED, tb2 get lock after insert.
1982
+ But no retry loop then lock id = 30000 !!!!!!!. Oh no!
1983
+ This is not READ_COMMITED !.
1984
+ */
1985
+ BOOST_CHECK_MESSAGE(0 == tb2->stat(), "tb2->seekLessThan stat= "
1986
+ << tb2->stat());
1987
+ int v2 = tb2->getFVint(fdi_id);
1988
+ BOOST_CHECK_MESSAGE(v2 == v-1 , "value v-1 = " << v-1 << " bad = "
1989
+ << v2);
1990
+
1991
+ //cleanup
1992
+ tb->setFV(fdi_id, v);
1993
+ tb->seek();
1994
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "tb->seek");
1995
+ tb->del();
1996
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "tb->del");
1997
+ }
1998
+
1940
1999
  tb2->unlock();
1941
2000
  }
1942
2001
 
@@ -1949,6 +2008,7 @@ void testMissingUpdate(database* db)
1949
2008
  {
1950
2009
  // Get lock(X) same record in parallel.
1951
2010
  boost::scoped_ptr<boost::thread> t(new boost::thread(boost::bind(&worker::run, w.get())));
2011
+ Sleep(5);
1952
2012
  int v = tb->getFVint(fdi_id);
1953
2013
  tb->del();
1954
2014
  t->join();
@@ -2046,17 +2106,47 @@ void testSetOwner(database* db)
2046
2106
  {
2047
2107
  table* tb = openTable(db);
2048
2108
  tb->setOwnerName(_T("ABCDEFG"));
2049
- BOOST_CHECK_MESSAGE(0 == tb->stat(), "SetOwner");
2109
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "SetOwner stat = " << tb->stat());
2050
2110
  tb->clearOwnerName();
2051
- BOOST_CHECK_MESSAGE(0 == tb->stat(), "SetOwner");
2111
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "SetOwner stat = " << tb->stat());
2052
2112
  tb->release();
2053
2113
  }
2054
2114
 
2115
+ void testCreateIndex(database* db)
2116
+ {
2117
+ table* tb = openTable(db);
2118
+ dbdef* def = db->dbDef();
2119
+ if (def)
2120
+ {
2121
+ const tabledef* td = tb->tableDef();
2122
+ keydef* kd = def->insertKey(td->id, td->keyCount);
2123
+ kd->segments[0].fieldNum = fdi_name; //name
2124
+ kd->segments[0].flags.bit8 = 1; // extended key type
2125
+ kd->segments[0].flags.bit1 = 1; // changeable
2126
+ kd->segments[0].flags.bit0 = 1; // duplicatable
2127
+ kd->segmentCount = 1;
2128
+ // assign keynumber
2129
+ kd->keyNumber = 5;
2130
+ def->updateTableDef(1);
2131
+ BOOST_CHECK_MESSAGE(0 == def->stat(),
2132
+ "CreateIndex updateTableDef stat = " << def->stat());
2133
+ }
2134
+ tb->setKeyNum(tb->tableDef()->keyCount-1);
2135
+ tb->createIndex(true);
2136
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "CreateIndex");
2137
+ tb->release();
2138
+
2139
+ //test not mysql grant
2140
+ db->aclReload();
2141
+ BOOST_CHECK_MESSAGE(STATUS_DB_YET_OPEN == db->stat(),
2142
+ "bad grantReload db->stat() = " << db->stat());
2143
+ }
2144
+
2055
2145
  void testDropIndex(database* db)
2056
2146
  {
2057
2147
  table* tb = openTable(db);
2058
2148
  tb->dropIndex(false);
2059
- BOOST_CHECK_MESSAGE(0 == tb->stat(), "DropIndex");
2149
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "DropIndex stat = " << tb->stat());
2060
2150
  tb->release();
2061
2151
  }
2062
2152
 
@@ -2077,7 +2167,7 @@ void testLogin(database* db)
2077
2167
  "new connection connect db->stat() = " << db->stat());
2078
2168
  database::destroy(db2);
2079
2169
 
2080
- db->disconnect(makeUri(PROTOCOL, HOSTNAME, _T("")));
2170
+ db->disconnect();
2081
2171
  BOOST_CHECK_MESSAGE(0 == db->stat(),
2082
2172
  "disconnect db->stat() = " << db->stat());
2083
2173
  }
@@ -2102,10 +2192,10 @@ void testLogin(database* db)
2102
2192
  (db->stat() == ERROR_TD_HOSTNAME_NOT_FOUND);
2103
2193
  BOOST_CHECK_MESSAGE(f, "bad host stat =" << db->stat());
2104
2194
 
2105
- testCreateNewDataBase(db);
2106
- db->disconnect(makeUri(PROTOCOL, HOSTNAME, DBNAME));
2195
+ testCreateNewDataBase(db); //with open
2196
+ db->close(); // disconnected
2107
2197
  BOOST_CHECK_MESSAGE(0 == db->stat(),
2108
- "databese disconnect db->stat() = " << db->stat());
2198
+ "databese close db->stat() = " << db->stat());
2109
2199
 
2110
2200
  // true database name
2111
2201
  db->connect(makeUri(PROTOCOL, HOSTNAME, DBNAME));
@@ -2113,25 +2203,36 @@ void testLogin(database* db)
2113
2203
  "databese connect db->stat() = " << db->stat());
2114
2204
  if (db->stat() == 0)
2115
2205
  {
2116
- db->disconnect(makeUri(PROTOCOL, HOSTNAME, DBNAME));
2206
+ db->disconnect();
2117
2207
  BOOST_CHECK_MESSAGE(0 == db->stat(),
2118
2208
  "databese disconnect db->stat() = " << db->stat());
2119
2209
  }
2120
2210
  // invalid database name
2121
2211
  testDropDatabase(db);
2122
- db->disconnect(makeUri(PROTOCOL, HOSTNAME, DBNAME));
2212
+ db->disconnect();
2123
2213
  BOOST_CHECK_MESSAGE(0 == db->stat(),
2124
2214
  "databese disconnect db->stat() = " << db->stat());
2125
2215
 
2126
2216
  db->connect(makeUri(PROTOCOL, HOSTNAME, DBNAME));
2127
- BOOST_CHECK_MESSAGE(25000 + 1049 == db->stat(),
2217
+ BOOST_CHECK_MESSAGE(ERROR_NO_DATABASE == db->stat(),
2128
2218
  "databese connect db->stat() = " << db->stat());
2129
2219
 
2130
- db->disconnect(makeUri(PROTOCOL, HOSTNAME, DBNAME));
2131
- BOOST_CHECK_MESSAGE(0 == db->stat(),
2220
+ //connect is failed, no need disconnet.
2221
+ db->disconnect();
2222
+ BOOST_CHECK_MESSAGE(1 == db->stat(),
2132
2223
  "databese disconnect db->stat() = " << db->stat());
2133
2224
  }
2134
2225
 
2226
+ void testGrantReload(database* db)
2227
+ {
2228
+ db->open(makeUri(PROTOCOL, HOSTNAME, _T("mysql"), TRANSACTD_SCHEMANAME),
2229
+ TYPE_SCHEMA_BDF, TD_OPEN_NORMAL);
2230
+ BOOST_CHECK_MESSAGE(0 == db->stat(),
2231
+ "open mysql db->stat() = " << db->stat());
2232
+ db->aclReload();
2233
+ BOOST_CHECK_MESSAGE(0 == db->stat(),
2234
+ "grantReload db->stat() = " << db->stat());
2235
+ }
2135
2236
  // ------------------------------------------------------------------------
2136
2237
 
2137
2238
  // ------------------------------------------------------------------------
@@ -2219,7 +2320,7 @@ void doCreateVarTable(database* db, int id, const _TCHAR* name, char fieldType,
2219
2320
 
2220
2321
  BOOST_CHECK_MESSAGE(0 == def->stat(), "updateTableDef 4");
2221
2322
  table* tb = db->openTable(id);
2222
- BOOST_CHECK_MESSAGE(0 == db->stat(), "openTable");
2323
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "openTable stat = " << db->stat());
2223
2324
  if (tb)
2224
2325
  tb->release();
2225
2326
  }
@@ -2245,15 +2346,17 @@ void testCreateDataBaseVar(database* db)
2245
2346
  return;
2246
2347
 
2247
2348
  if (db->open(makeUri(PROTOCOL, HOSTNAME, _T("testvar"), BDFNAME)))
2349
+ {
2248
2350
  db->drop();
2249
-
2351
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "drop testvar db stat = " << db->stat());
2352
+ }
2250
2353
  db->create(makeUri(PROTOCOL, HOSTNAME, _T("testvar"), BDFNAME));
2251
2354
  BOOST_CHECK_MESSAGE(0 == db->stat(),
2252
- "createNewDataBase stat = " << db->stat());
2355
+ "create testvar db stat = " << db->stat());
2253
2356
  if (0 == db->stat())
2254
2357
  {
2255
2358
  db->open(makeUri(PROTOCOL, HOSTNAME, _T("testvar"), BDFNAME), 0, 0);
2256
- BOOST_CHECK_MESSAGE(0 == db->stat(), "createNewDataBase 1");
2359
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "open testvar db stat = " << db->stat());
2257
2360
 
2258
2361
  if (0 == db->stat())
2259
2362
  {
@@ -2555,6 +2658,7 @@ void doVarInsert(database* db, const _TCHAR* name, unsigned int codePage,
2555
2658
  v = i + 10;
2556
2659
  tb->setFV((short)2, v);
2557
2660
  tb->insert();
2661
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "insert");
2558
2662
  }
2559
2663
  if (bulk)
2560
2664
  tb->commitBulkInsert();
@@ -2572,7 +2676,7 @@ void testVarInsert(database* db)
2572
2676
  const _TCHAR* str2 = _T("123");
2573
2677
 
2574
2678
  db->open(makeUri(PROTOCOL, HOSTNAME, _T("testvar"), BDFNAME));
2575
- BOOST_CHECK_MESSAGE(0 == db->stat(), "open 1");
2679
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "open 1 stat = " << db->stat());
2576
2680
  if (0 == db->stat())
2577
2681
  {
2578
2682
  bool utf16leSupport = isUtf16leSupport(db);
@@ -2609,7 +2713,7 @@ void doVarRead(database* db, const _TCHAR* name, unsigned int codePage,
2609
2713
  {
2610
2714
 
2611
2715
  table* tb = db->openTable(name);
2612
- BOOST_CHECK_MESSAGE(0 == db->stat(), "openTable");
2716
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "openTable stat = " << db->stat());
2613
2717
  tb->clearBuffer();
2614
2718
  tb->setKeyNum(key);
2615
2719
 
@@ -2646,7 +2750,7 @@ void testVarRead(database* db)
2646
2750
  const _TCHAR* str4 = _T("1232");
2647
2751
 
2648
2752
  db->open(makeUri(PROTOCOL, HOSTNAME, _T("testvar"), BDFNAME));
2649
- BOOST_CHECK_MESSAGE(0 == db->stat(), "open 1");
2753
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "open stat = " << db->stat());
2650
2754
  if (0 == db->stat())
2651
2755
  {
2652
2756
  bool utf16leSupport = isUtf16leSupport(db);
@@ -2683,7 +2787,7 @@ void doVarFilter(database* db, const _TCHAR* name, unsigned int codePage,
2683
2787
  const _TCHAR* str, int num, char_td key)
2684
2788
  {
2685
2789
  table* tb = db->openTable(name);
2686
- BOOST_CHECK_MESSAGE(0 == db->stat(), "openTable");
2790
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "openTable stat = " << db->stat());
2687
2791
  tb->clearBuffer();
2688
2792
  tb->setKeyNum(key);
2689
2793
 
@@ -2745,7 +2849,7 @@ void testFilterVar(database* db)
2745
2849
  return;
2746
2850
 
2747
2851
  db->open(makeUri(PROTOCOL, HOSTNAME, _T("testvar"), BDFNAME));
2748
- BOOST_CHECK_MESSAGE(0 == db->stat(), "open 1");
2852
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "open stat = " << db->stat());
2749
2853
  if (0 == db->stat())
2750
2854
  {
2751
2855
  const _TCHAR* str = _T("漢字文");
@@ -3112,7 +3216,7 @@ void doTestStringFileter(database* db, int id, const _TCHAR* name,
3112
3216
  void testDropDataBaseStr(database* db)
3113
3217
  {
3114
3218
  db->open(makeUri(PROTOCOL, HOSTNAME, _T("testString"), BDFNAME), 0, 0);
3115
- BOOST_CHECK_MESSAGE(0 == db->stat(), "createNewDataBase 1");
3219
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "open stat = " << db->stat());
3116
3220
  db->drop();
3117
3221
  BOOST_CHECK_MESSAGE(0 == db->stat(),
3118
3222
  "DropDataBaseTestString stat=" << db->stat());
@@ -4280,7 +4384,7 @@ void testDbPool()
4280
4384
  pooledDbManager poolMgr;
4281
4385
  pooledDbManager::setMaxConnections(4);
4282
4386
 
4283
- connectParams pm(PROTOCOL, HOSTNAME, _T("querytest"), DBNAME);
4387
+ connectParams pm(PROTOCOL, HOSTNAME, _T("querytest"), DBNAME, g_userName, g_password);
4284
4388
  poolMgr.use(&pm);
4285
4389
  BOOST_CHECK_MESSAGE(1 == poolMgr.usingCount(), "usingCount 1");
4286
4390
  poolMgr.use(&pm);
@@ -4321,8 +4425,8 @@ BOOST_AUTO_TEST_SUITE(btrv_nativ)
4321
4425
 
4322
4426
  BOOST_FIXTURE_TEST_CASE(createNewDataBase, fixture)
4323
4427
  {
4324
- const _TCHAR* uri = makeUri(PROTOCOL, HOSTNAME, DBNAME, BDFNAME);
4325
- _tprintf(_T("URI = %s\n"), uri);
4428
+ connectParams cp(PROTOCOL, HOSTNAME, DBNAME, BDFNAME, g_userName);
4429
+ _tprintf(_T("URI = %s\n"), cp.uri());
4326
4430
  if (db()->open(makeUri(PROTOCOL, HOSTNAME, DBNAME, BDFNAME)))
4327
4431
  db()->drop();
4328
4432
  testCreateNewDataBase(db());
@@ -4465,6 +4569,11 @@ BOOST_FIXTURE_TEST_CASE(setOwner, fixture)
4465
4569
  testSetOwner(db());
4466
4570
  }
4467
4571
 
4572
+ BOOST_FIXTURE_TEST_CASE(createIndex, fixture)
4573
+ {
4574
+ testCreateIndex(db());
4575
+ }
4576
+
4468
4577
  BOOST_FIXTURE_TEST_CASE(dropIndex, fixture)
4469
4578
  {
4470
4579
  testDropIndex(db());
@@ -4475,6 +4584,12 @@ BOOST_FIXTURE_TEST_CASE(dropDatabase, fixture)
4475
4584
  testDropDatabase(db());
4476
4585
  }
4477
4586
 
4587
+ BOOST_FIXTURE_TEST_CASE(grantReload, fixture)
4588
+ {
4589
+ testGrantReload(db());
4590
+ }
4591
+
4592
+
4478
4593
  BOOST_FIXTURE_TEST_CASE(connect, fixture)
4479
4594
  {
4480
4595
  testLogin(db());