transactd 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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());