transactd 2.4.5 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/CMakeLists.txt +1 -1
  3. data/README-JA.md +52 -529
  4. data/README.md +52 -523
  5. data/bin/common/tdclc_32_3_0.dll +0 -0
  6. data/bin/common/tdclc_64_3_0.dll +0 -0
  7. data/build/common/system.cmake +2 -1
  8. data/build/common/transactd_cl_common.cmake +3 -6
  9. data/build/swig/ruby/ruby.swg +85 -28
  10. data/build/swig/ruby/tdclrb_wrap.cpp +3195 -1578
  11. data/build/swig/tdcl.i +161 -5
  12. data/build/tdclc/CMakeLists.txt +1 -0
  13. data/build/tdclc/tdclc.cbproj +7 -1
  14. data/build/tdclc/tdclc.rc +4 -4
  15. data/build/tdclcpp/tdclcpp.rc +4 -4
  16. data/build/tdclcpp/tdclcpp_bc.cbproj +2 -5
  17. data/build/tdclrb/tdclrb.rc +4 -4
  18. data/source/bzs/db/blobStructs.h +1 -1
  19. data/source/bzs/db/engine/mysql/database.cpp +199 -74
  20. data/source/bzs/db/engine/mysql/database.h +47 -18
  21. data/source/bzs/db/engine/mysql/dbManager.cpp +1 -0
  22. data/source/bzs/db/engine/mysql/mysqlInternal.h +32 -8
  23. data/source/bzs/db/protocol/tdap/btrDate.cpp +110 -75
  24. data/source/bzs/db/protocol/tdap/btrDate.h +46 -21
  25. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +18 -18
  26. data/source/bzs/db/protocol/tdap/client/activeTable.h +25 -25
  27. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
  28. data/source/bzs/db/protocol/tdap/client/client.cpp +6 -5
  29. data/source/bzs/db/protocol/tdap/client/client.h +82 -15
  30. data/source/bzs/db/protocol/tdap/client/database.cpp +531 -142
  31. data/source/bzs/db/protocol/tdap/client/database.h +19 -6
  32. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +461 -408
  33. data/source/bzs/db/protocol/tdap/client/dbDef.h +11 -17
  34. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +61 -13
  35. data/source/bzs/db/protocol/tdap/client/field.cpp +1592 -1398
  36. data/source/bzs/db/protocol/tdap/client/field.h +110 -121
  37. data/source/bzs/db/protocol/tdap/client/fields.h +40 -10
  38. data/source/bzs/db/protocol/tdap/client/filter.h +69 -55
  39. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +296 -164
  40. data/source/bzs/db/protocol/tdap/client/groupQuery.h +77 -25
  41. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +31 -13
  42. data/source/bzs/db/protocol/tdap/client/memRecord.h +31 -21
  43. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +1 -1
  44. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
  45. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +69 -24
  46. data/source/bzs/db/protocol/tdap/client/nsTable.h +3 -1
  47. data/source/bzs/db/protocol/tdap/client/recordset.cpp +1 -0
  48. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +46 -27
  49. data/source/bzs/db/protocol/tdap/client/request.h +2 -1
  50. data/source/bzs/db/protocol/tdap/client/serializer.cpp +44 -9
  51. data/source/bzs/db/protocol/tdap/client/serializer.h +1 -1
  52. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +182 -76
  53. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +23 -12
  54. data/source/bzs/db/protocol/tdap/client/stringConverter.h +8 -10
  55. data/source/bzs/db/protocol/tdap/client/table.cpp +172 -93
  56. data/source/bzs/db/protocol/tdap/client/table.h +112 -37
  57. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +17 -0
  58. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +0 -1
  59. data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +0 -2
  60. data/source/bzs/db/protocol/tdap/client/trdormapi.h +1 -1
  61. data/source/bzs/db/protocol/tdap/fieldComp.h +698 -14
  62. data/source/bzs/db/protocol/tdap/myDateTime.cpp +723 -307
  63. data/source/bzs/db/protocol/tdap/myDateTime.h +294 -0
  64. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +164 -54
  65. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +6 -3
  66. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +133 -550
  67. data/source/bzs/db/protocol/tdap/mysql/request.h +6 -5
  68. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +217 -82
  69. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +1 -1
  70. data/source/bzs/db/protocol/tdap/tdapRequest.h +4 -9
  71. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +808 -17
  72. data/source/bzs/db/protocol/tdap/tdapSchema.h +656 -164
  73. data/source/bzs/db/protocol/tdap/tdapcapi.h +130 -28
  74. data/source/bzs/db/protocol/tdap/uri.h +40 -32
  75. data/source/bzs/db/transactd/connManager.cpp +1 -1
  76. data/source/bzs/db/transactd/transactd.cpp +7 -0
  77. data/source/bzs/env/compiler.h +107 -94
  78. data/source/bzs/env/crosscompile.cpp +24 -12
  79. data/source/bzs/env/crosscompile.h +75 -6
  80. data/source/bzs/env/mbcswchrLinux.cpp +2 -2
  81. data/source/bzs/env/tcharMinGW.h +4 -0
  82. data/source/bzs/example/changeSchema.cpp +22 -17
  83. data/source/bzs/example/queryData.cpp +4 -0
  84. data/source/bzs/netsvc/client/iconnection.h +3 -1
  85. data/source/bzs/netsvc/client/tcpClient.h +10 -3
  86. data/source/bzs/rtl/stringBuffers.cpp +7 -0
  87. data/source/bzs/test/tdclatl/bench_query_atl.js +6 -0
  88. data/source/bzs/test/tdclatl/bench_tdclatl.js +8 -1
  89. data/source/bzs/test/tdclatl/test_query_atl.js +22 -2
  90. data/source/bzs/test/tdclatl/test_v3.js +1017 -0
  91. data/source/bzs/test/tdclphp/transactd_Test.php +55 -21
  92. data/source/bzs/test/tdclphp/transactd_datetime_Test.php +0 -5
  93. data/source/bzs/test/tdclphp/transactd_pool_Test.php +2 -0
  94. data/source/bzs/test/tdclphp/transactd_v3_Test.php +743 -0
  95. data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -5
  96. data/source/bzs/test/tdclrb/transactd_pool_spec.rb +2 -0
  97. data/source/bzs/test/tdclrb/transactd_spec.rb +39 -16
  98. data/source/bzs/test/tdclrb/transactd_v3_spec.rb +748 -0
  99. data/source/bzs/test/transactdBench/transactdBench.cpp +55 -58
  100. data/source/bzs/test/transactdBench/transactdBench2.cpp +1 -3
  101. data/source/bzs/test/trdclengn/testField.h +3305 -0
  102. data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +1050 -0
  103. data/source/bzs/test/trdclengn/test_trdclengn.cpp +112 -190
  104. data/source/bzs/test/trdclengn/testbase.h +137 -0
  105. data/source/global/ormsrcgen/srcgen.cpp +23 -12
  106. data/source/global/ormsrcgen/template/ormDataClass_template.h +2 -0
  107. data/source/global/querystmts/querystmts.cpp +2 -3
  108. data/source/global/tdclatl/Bitset.cpp +38 -0
  109. data/source/global/tdclatl/Bitset.h +63 -0
  110. data/source/global/tdclatl/Database.cpp +59 -18
  111. data/source/global/tdclatl/Database.h +7 -4
  112. data/source/global/tdclatl/DbDef.cpp +6 -6
  113. data/source/global/tdclatl/DbDef.h +2 -1
  114. data/source/global/tdclatl/Field.cpp +112 -0
  115. data/source/global/tdclatl/Field.h +19 -5
  116. data/source/global/tdclatl/FieldDef.cpp +137 -16
  117. data/source/global/tdclatl/FieldDef.h +18 -2
  118. data/source/global/tdclatl/FieldDefs.cpp +54 -1
  119. data/source/global/tdclatl/FieldDefs.h +3 -0
  120. data/source/global/tdclatl/GroupQuery.cpp +8 -8
  121. data/source/global/tdclatl/QueryBase.cpp +65 -0
  122. data/source/global/tdclatl/QueryBase.h +10 -0
  123. data/source/global/tdclatl/Record.cpp +33 -2
  124. data/source/global/tdclatl/Record.h +3 -1
  125. data/source/global/tdclatl/RecordsetQuery.cpp +42 -0
  126. data/source/global/tdclatl/RecordsetQuery.h +8 -0
  127. data/source/global/tdclatl/Table.cpp +127 -3
  128. data/source/global/tdclatl/Table.h +10 -1
  129. data/source/global/tdclatl/TableDef.cpp +41 -8
  130. data/source/global/tdclatl/TableDef.h +7 -2
  131. data/source/global/tdclatl/activeTable.cpp +40 -71
  132. data/source/global/tdclatl/resource.h +0 -0
  133. data/source/global/tdclatl/tdclatl.idl +222 -28
  134. data/source/linux/tchar.h +100 -96
  135. data/transactd.gemspec +2 -2
  136. metadata +13 -11
  137. data/BUILD_UNIX-JA.md +0 -161
  138. data/BUILD_WIN-JA.md +0 -326
  139. data/README_ORMSRCGEN-JA.md +0 -115
  140. data/README_ORMSRCGEN.md +0 -118
  141. data/RELEASE_NOTE-JA.md +0 -356
  142. data/RELEASE_NOTE.md +0 -360
  143. data/bin/common/tdclc_32_2_4.dll +0 -0
  144. data/bin/common/tdclc_64_2_4.dll +0 -0
  145. data/source/bzs/test/trdclengn/test_blob.cpp +0 -375
@@ -0,0 +1,1050 @@
1
+ /* =================================================================
2
+ Copyright (C) 2015 BizStation Corp All rights reserved.
3
+
4
+ This program is free software; you can redistribute it and/or
5
+ modify it under the terms of the GNU General Public License
6
+ as published by the Free Software Foundation; either version 2
7
+ of the License, or (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program; if not, write to the Free Software
16
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17
+ 02111-1307, USA.
18
+ ================================================================= */
19
+ #define SP_SCOPE_FIELD_TEST
20
+ #include "testField.h"
21
+ #include <bzs/db/protocol/tdap/fieldComp.h>
22
+
23
+ class fixture
24
+ {
25
+ mutable database* m_db;
26
+
27
+ public:
28
+ fixture() : m_db(NULL)
29
+ {
30
+ nsdatabase::setCheckTablePtr(true);
31
+ m_db = database::create();
32
+ if (!m_db)
33
+ printf("Error database::create()\n");
34
+ }
35
+
36
+ ~fixture()
37
+ {
38
+ if (m_db)
39
+ database::destroy(m_db);
40
+ }
41
+
42
+ ::database* db() const { return m_db; }
43
+ };
44
+
45
+ static bool g_db_created = false;
46
+
47
+
48
+ bool canDatatimeTimeStamp(table* tb, short fieldNum)
49
+ {
50
+ const fielddef& fd = tb->tableDef()->fieldDefs[fieldNum];
51
+ return !tb->tableDef()->isLegacyTimeFormat(fd);
52
+ }
53
+
54
+ short createTestDataBase(database* db)
55
+ {
56
+ if (g_db_created == false)
57
+ {
58
+ db->create(makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME));
59
+ if (db->stat() == STATUS_TABLE_EXISTS_ERROR)
60
+ {
61
+ db->open(makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME));
62
+ if (db->stat()) return db->stat();
63
+ db->drop();
64
+ db->create(makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME));
65
+ }
66
+ if (db->stat()) return db->stat();
67
+
68
+ g_db_created = true;
69
+ }
70
+ return 0;
71
+ }
72
+
73
+ /* Desc of nulltest table timestampNull = true
74
+
75
+ | Field | Type | Null | Key | Default | Extra
76
+ +-------+---------------+------+-----+----------------------+-------------------
77
+ | id | int(11) | NO | PRI | NULL |
78
+ | fd1 | int(11) | YES | UNI | NULL |
79
+ | fd2 | int(11) | YES | | NULL |
80
+ | fd3 | int(11) | YES | | NULL |
81
+ | fd4 | int(11) | YES | | NULL |
82
+ | fd5 | int(11) | YES | | -1 |
83
+ | fd6 | varchar(16) | YES | | NULL |
84
+ | fd7 | varbinary(50) | YES | | NULL |
85
+ | fd8 | timestamp(6) | YES | | NULL |
86
+ | fd9 | datetime(6) | YES | | NULL |
87
+ | fd10 | timestamp(6) | YES | | CURRENT_TIMESTAMP(6) | on update CURRENT_TIMESTAMP(6)
88
+ | fd11 | datetime(6) | YES | | NULL |
89
+ +-------+---------------+------+-----+----------------------+-------------------
90
+
91
+ CREATE TABLE `nulltest` (`id` INT NOT NULL ,`fd1` INT NULL DEFAULT NULL,`fd2` INT NULL DEFAULT NULL,`fd3` INT NULL DEFAULT NULL,`fd4` INT NULL DEFAULT NULL,`fd5` INT NULL DEFAULT '-1',`fd6` VARCHAR(16) binary NULL DEFAULT '-123456',`fd7` VARBINARY(50) NULL DEFAULT NULL,`fd8` TIMESTAMP(6) NULL DEFAULT NULL,`fd9` DATETIME(2) NULL DEFAULT NULL,`fd10` TIMESTAMP(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),`fd11` DATETIME(6) NULL DEFAULT NULL, UNIQUE key0(`id`), UNIQUE key1(`fd1`)) ENGINE=InnoDB default charset=utf8
92
+ */
93
+ short createTestTable(database* db, bool timestampNull = true, bool supportDateTimeTimeStamp = true)
94
+ {
95
+ try
96
+ {
97
+ openDatabase(db, makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME), TYPE_SCHEMA_BDF,TD_OPEN_NORMAL);
98
+ dbdef* def = db->dbDef();
99
+ short tableid = 1;
100
+ db->dropTable(_T("nulltest"));
101
+ def->deleteTable(tableid);
102
+
103
+ short fieldnum = 0;
104
+ insertTable(def, tableid, _T("nulltest"), g_td_charsetIndex);
105
+
106
+ insertField(def, tableid, fieldnum, _T("id"), ft_integer, 4);
107
+ fielddef* fd = insertField(def, tableid, ++fieldnum, _T("fd1"), ft_integer, 4);
108
+ fd->setNullable(true);
109
+ //fd->nullbit = 100;
110
+ //fd->nullbytes = 30;
111
+
112
+ fd = insertField(def, tableid, ++fieldnum, _T("fd2"), ft_integer, 4);
113
+ fd->setNullable(true);
114
+ fd = insertField(def, tableid, ++fieldnum, _T("fd3"), ft_integer, 4);
115
+ fd->setNullable(true);
116
+ fd = insertField(def, tableid, ++fieldnum, _T("fd4"), ft_integer, 4);
117
+ fd->setNullable(true);
118
+ fd = insertField(def, tableid, ++fieldnum, _T("fd5"), ft_integer, 4);
119
+ fd->setNullable(timestampNull, false);
120
+ fd->setDefaultValue(-1LL);
121
+ fd = insertField(def, tableid, ++fieldnum, _T("fd6"), ft_myvarchar, 49);
122
+ fd->setNullable(true, false);
123
+ fd->setDefaultValue(_T("-123456"));
124
+ //fd->setDefaultValue(_T("漢字"));
125
+ fd = insertField(def, tableid, ++fieldnum, _T("fd7"), ft_myvarbinary, 51);
126
+ fd->setNullable(true);
127
+ fd = insertField(def, tableid, ++fieldnum, _T("fd8"), ft_mytimestamp, 7);
128
+ fd->setNullable(timestampNull);
129
+ fd->decimals = 6;
130
+
131
+ fd = insertField(def, tableid, ++fieldnum, _T("fd9"), ft_mydatetime, 6);
132
+ fd->setNullable(true);
133
+ fd->decimals = 2;
134
+
135
+ fd = insertField(def, tableid, ++fieldnum, _T("fd10"), ft_mytimestamp, 7);
136
+ fd->setNullable(true);
137
+ fd->decimals = 6;
138
+ if (timestampNull == false && supportDateTimeTimeStamp)
139
+ {
140
+ fd->setDefaultValue(DFV_TIMESTAMP_DEFAULT);
141
+ fd->setTimeStampOnUpdate(true);
142
+ }
143
+
144
+ fd = insertField(def, tableid, ++fieldnum, _T("fd11"), ft_mydatetime, 8);
145
+ fd->setNullable(timestampNull);
146
+ fd->decimals = 6;
147
+ if (timestampNull == false && supportDateTimeTimeStamp)
148
+ fd->setTimeStampOnUpdate(true);
149
+
150
+ fd = insertField(def, tableid, ++fieldnum, _T("fd12"), ft_myyear, 1);
151
+ fd->setNullable(true);
152
+
153
+ keydef* kd = insertKey(def, tableid, 0);
154
+ kd->segments[0].fieldNum = 0;
155
+ kd->segments[0].flags.bit8 = 1; // extended key type
156
+ kd->segments[0].flags.bit1 = 1; // changeable
157
+ kd->segmentCount = 1;
158
+
159
+ kd = insertKey(def, tableid, 1);
160
+ kd->segments[0].fieldNum = 1;
161
+ kd->segments[0].flags.bit8 = 1; // extended key type
162
+ kd->segments[0].flags.bit1 = 1; // changeable
163
+ kd->segmentCount = 1;
164
+ tabledef* td = def->tableDefs(tableid);
165
+ td->primaryKeyNum = 0;
166
+ updateTableDef(def, tableid);
167
+ return 0;
168
+
169
+ }
170
+ catch (bzs::rtl::exception& e)
171
+ {
172
+ _tprintf(_T("Error! %s\n"), (*getMsg(e)).c_str());
173
+ }
174
+ return 1;
175
+ }
176
+
177
+ void testNoSchema(database* db)
178
+ {
179
+ db->open(makeUri(PROTOCOL, HOSTNAME, DBNAMEV3));
180
+ if (db->stat()==0)
181
+ db->drop();
182
+
183
+ db->create(makeUri(PROTOCOL, HOSTNAME, DBNAMEV3));
184
+ BOOST_CHECK_MESSAGE(db->stat() == 0, "create stat = " << db->stat());
185
+
186
+ db->open(makeUri(PROTOCOL, HOSTNAME, DBNAMEV3));
187
+ BOOST_CHECK_MESSAGE(db->stat() == 0, "open stat = " << db->stat());
188
+ if (db->stat()==0)
189
+ {
190
+ db->drop();
191
+ BOOST_CHECK_MESSAGE(db->stat() == 0, "drop stat = " << db->stat());
192
+ }
193
+ }
194
+
195
+ void testFielddefs(database* db)
196
+ {
197
+ short ret = createTestDataBase(db);
198
+ BOOST_CHECK_MESSAGE(0 == ret, "createTestDataBase stat = " << ret);
199
+ if (ret) return;
200
+ ret = createTestTable(db);
201
+ BOOST_CHECK_MESSAGE(0 == ret, "createTestTable stat = " << ret);
202
+ if (ret) return;
203
+ try
204
+ {
205
+ short tableid = 1;
206
+ table_ptr tb = openTable(db, tableid, TD_OPEN_NORMAL);
207
+
208
+ //Check nullbit
209
+ const tabledef* td = tb->tableDef();
210
+ const fielddef* fd = &td->fieldDefs[1];
211
+ BOOST_CHECK_MESSAGE(fd->nullbit() == 0, "Invalid nullbit = " << (int)fd->nullbit());
212
+ BOOST_CHECK_MESSAGE(fd->nullbytes() == 2, "Invalid nullbytes = " << (int)fd->nullbytes());
213
+
214
+ fd = &td->fieldDefs[8]; //fd8
215
+ BOOST_CHECK_MESSAGE(fd->nullbit() == 7, "Invalid nullbit = " << (int)fd->nullbit());
216
+ BOOST_CHECK_MESSAGE(fd->nullbytes() == 2, "Invalid nullbytes = " << (int)fd->nullbytes());
217
+ //fielddefs copy test
218
+ fielddefs& fds = *fielddefs::create();
219
+ fds.addAllFileds(tb->tableDef());
220
+ fd = &fds[1];
221
+ BOOST_CHECK_MESSAGE(fd->nullbit() == 0, "Invalid nullbit = " << (int)fd->nullbit());
222
+ BOOST_CHECK_MESSAGE(fd->nullbytes() == 2, "Invalid nullbytes = " << (int)fd->nullbytes());
223
+
224
+ // Append join field, nullbytes and nullbit specify only append fields.
225
+ query q;
226
+ q.select(_T("fd8"));
227
+ tb->setQuery(&q);
228
+ fds.addSelectedFields(tb.get());
229
+ fd = &fds[(int)fds.size() -1];
230
+ BOOST_CHECK_MESSAGE(fd->nullbit() == 0, "Invalid nullbit = " << (int)fd->nullbit());
231
+ BOOST_CHECK_MESSAGE(fd->nullbytes() == 1, "Invalid nullbytes = " << (int)fd->nullbytes());
232
+
233
+ //One more join
234
+ q.reset().select(_T("fd2"), _T("fd3"), _T("fd4"), _T("fd5"), _T("fd6"));
235
+ tb->setQuery(&q);
236
+ fds.addSelectedFields(tb.get());
237
+ fd = &fds[(int)fds.size() -1];
238
+ BOOST_CHECK_MESSAGE(fd->nullbit() == 4, "Invalid nullbit = " << (int)fd->nullbit());
239
+ BOOST_CHECK_MESSAGE(fd->nullbytes() == 1, "Invalid nullbytes = " << (int)fd->nullbytes());
240
+
241
+ //One more join
242
+ q.reset().select(_T("fd1"), _T("fd2"), _T("fd3"), _T("fd4"), _T("fd5"), _T("fd6"), _T("fd7"), _T("fd8"));
243
+ tb->setQuery(&q);
244
+ fds.addSelectedFields(tb.get());
245
+ fd = &fds[(int)fds.size() -1];
246
+ BOOST_CHECK_MESSAGE(fd->nullbit() == 7, "Invalid nullbit = " << (int)fd->nullbit());
247
+ BOOST_CHECK_MESSAGE(fd->nullbytes() == 1, "Invalid nullbytes = " << (int)fd->nullbytes());
248
+ fds.release();
249
+ }
250
+ catch (bzs::rtl::exception& e)
251
+ {
252
+ _tprintf(_T("Error ! %s\n"), (*getMsg(e)).c_str());
253
+ }
254
+ }
255
+
256
+ void testFieldValue(database* db)
257
+ {
258
+ try
259
+ {
260
+ short tableid = 1;
261
+ table_ptr tb = openTable(db, tableid, TD_OPEN_NORMAL);
262
+ tb->clearBuffer();
263
+ for (int i = 1; i < tb->tableDef()->fieldCount; ++i)
264
+ {
265
+ tb->setFVNull(i, true);
266
+ BOOST_CHECK_MESSAGE(tb->getFVNull(i) == true, "Invalid getFVNull i = " << i);
267
+ tb->setFVNull(i, false);
268
+ BOOST_CHECK_MESSAGE(tb->getFVNull(i) == false, "Invalid getFVNull i = " << i);
269
+ }
270
+
271
+ // field 0 is not nullable
272
+ short index = 0;
273
+ tb->setFVNull(index, true);
274
+ BOOST_CHECK_MESSAGE(tb->getFVNull(index) == false, "Invalid getFVNull(0) ");
275
+ tb->setFVNull(index, false);
276
+ BOOST_CHECK_MESSAGE(tb->getFVNull(index) == false, "Invalid getFVNull(0) ");
277
+
278
+ }
279
+ catch (bzs::rtl::exception& e)
280
+ {
281
+ _tprintf(_T("Error ! %s\n"), (*getMsg(e)).c_str());
282
+ }
283
+ }
284
+
285
+ void testWriatbleRecordFieldValue(database* db)
286
+ {
287
+ try
288
+ {
289
+ activeTable tb(db, _T("nulltest"));
290
+ writableRecord& wr = tb.getWritableRecord();
291
+ wr.clear();
292
+ for (int i = 1; i < (int)wr.fieldDefs()->size(); ++i)
293
+ {
294
+ wr[i].setNull(true);
295
+ BOOST_CHECK_MESSAGE(wr[i].isNull() == true, "Invalid isNull i = " << i);
296
+ wr[i].setNull(false);
297
+ BOOST_CHECK_MESSAGE(wr[i].isNull() == false, "Invalid isNull i = " << i);
298
+ }
299
+
300
+ // field 0 is not nullable
301
+ short index = 0;
302
+ wr[index].setNull(true);
303
+ BOOST_CHECK_MESSAGE(wr[index].isNull() == false, "Invalid isNull ");
304
+ wr[index].setNull(false);
305
+ BOOST_CHECK_MESSAGE(wr[index].isNull() == false, "Invalid isNull ");
306
+
307
+ }
308
+ catch (bzs::rtl::exception& e)
309
+ {
310
+ _tprintf(_T("Error ! %s\n"), (*getMsg(e)).c_str());
311
+ }
312
+ }
313
+
314
+ // ------------------------------------------------------------------------
315
+ class fixtureStore
316
+ {
317
+ mutable database* m_db;
318
+ public:
319
+ fixtureStore() : m_db(NULL)
320
+ {
321
+ nsdatabase::setCheckTablePtr(true);
322
+ bool db_created = g_db_created;
323
+
324
+ m_db = database::create();
325
+ if (!m_db)
326
+ printf("Error database::create()\n");
327
+ short ret = createTestDataBase(m_db);
328
+ if (ret)
329
+ {
330
+ printf("Error createDataBase\n");
331
+ return;
332
+ }
333
+ if (!db_created)
334
+ ret = createTestTable(m_db);
335
+ else
336
+ {
337
+ m_db->open(makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME), TYPE_SCHEMA_BDF,TD_OPEN_NORMAL);
338
+ ret = m_db->stat();
339
+ }
340
+ if (ret)
341
+ printf("Error createTable\n");
342
+ }
343
+
344
+ ~fixtureStore()
345
+ {
346
+ if (m_db)
347
+ m_db->release();
348
+ }
349
+ ::database* db() const { return m_db; }
350
+ };
351
+
352
+ void testDefaultValue(database* db, bool timestampNull)
353
+ {
354
+ try
355
+ {
356
+ short tableid = 1;
357
+ table_ptr tb = openTable(db, tableid, TD_OPEN_NORMAL+TD_OPEN_MASK_MYSQL_NULL);
358
+ tb->setKeyNum(0);
359
+ tb->clearBuffer(table::defaultNull);
360
+ fields& fds = tb->fields();
361
+ if (timestampNull)
362
+ {
363
+ for (short i = 0 ;i < (short)fds.size(); ++i)
364
+ {
365
+ bool v = true;
366
+ int dv = 0;
367
+ if (i == 0 || i == 5 || i == 6) v = false;
368
+ BOOST_CHECK_MESSAGE(fds[i].isNull() == v, "testDefaultValue isNull field num = " << i);
369
+ if (i == 5) dv = -1;
370
+
371
+ if (i == 6) dv = -123456;
372
+ BOOST_CHECK_MESSAGE(fds[i].i() == dv, "testDefaultValue defaultValue field num = "
373
+ << i << " " << fds[i].i());
374
+ }
375
+ }else
376
+ {
377
+ int dfs[13] = {0, 0, 0, 0, 0, -1, -123456, 0, 3, 0, 0, 1, 0};
378
+ for (short i = 1 ;i < (short)fds.size(); ++i)
379
+ {
380
+ BOOST_CHECK_MESSAGE(fds[i].isNull() == (dfs[i] == 0), "testDefaultValue isNull field num = " << i);
381
+ if ((dfs[i] < 0) || i == 12)
382
+ BOOST_CHECK_MESSAGE(fds[i].i() == dfs[i], "testDefaultValue i() field num = " << i);
383
+ else if ((dfs[i] < 3))
384
+ BOOST_CHECK_MESSAGE(fds[i].i64() == 0, "testDefaultValue i64() field num = " << i);
385
+ }
386
+ }
387
+ }
388
+ catch (bzs::rtl::exception& e)
389
+ {
390
+ _tprintf(_T("Error ! %s\n"), (*getMsg(e)).c_str());
391
+ }
392
+ }
393
+
394
+
395
+ void testWRDefaultValue(database* db, bool timestampNull)
396
+ {
397
+ try
398
+ {
399
+ activeTable tb(db, _T("nulltest"));
400
+ writableRecord& wr = tb.getWritableRecord();
401
+ wr.clear();
402
+ if (timestampNull)
403
+ {
404
+ for (short i = 0 ;i < (short)wr.size(); ++i)
405
+ {
406
+ bool v = true;
407
+ int dv = 0;
408
+ if (i == 0 || i == 5 || i == 6) v = false;
409
+ BOOST_CHECK_MESSAGE(wr[i].isNull() == v, "testWRDefaultValue isNull field num = " << i);
410
+ if (i == 5) dv = -1;
411
+
412
+ if (i == 6) dv = -123456;
413
+ BOOST_CHECK_MESSAGE(wr[i].i() == dv, "testWRDefaultValue defaultValue field num = "
414
+ << i << " " << wr[i].i());
415
+ }
416
+ }else
417
+ {
418
+ int dfs[13] = {0, 0, 0, 0, 0, -1, -123456, 0, 3, 0, 0, 1, 0};
419
+ for (short i = 1 ;i < (short)wr.size(); ++i)
420
+ {
421
+ BOOST_CHECK_MESSAGE(wr[i].isNull() == (dfs[i] == 0), "testWRDefaultValue isNull field num = " << i);
422
+ if ((dfs[i] < 0))
423
+ BOOST_CHECK_MESSAGE(wr[i].i() == dfs[i], "testWRDefaultValue isNull field num = " << i);
424
+ else if ((dfs[i] < 3))
425
+ BOOST_CHECK_MESSAGE(wr[i].i64() == 0, "testWRDefaultValue isNull field num = " << i);
426
+ }
427
+ }
428
+ }
429
+ catch (bzs::rtl::exception& e)
430
+ {
431
+ _tprintf(_T("Error ! %s\n"), (*getMsg(e)).c_str());
432
+ }
433
+ }
434
+
435
+ void testTableStore(database* db)
436
+ {
437
+ try
438
+ {
439
+ // All null test
440
+ short tableid = 1;
441
+ table_ptr tb = openTable(db, tableid, TD_OPEN_NORMAL);
442
+ tb->setKeyNum(0);
443
+ tb->clearBuffer();
444
+ fields& fds = tb->fields();
445
+
446
+ fds[(short)0] = 1;
447
+ for (short i = 1 ;i < (short)fds.size(); ++i)
448
+ {
449
+ fds[i] = _T("123");
450
+ fds[i].setNull(true);
451
+ }
452
+ tb->insert();
453
+ BOOST_CHECK_MESSAGE(tb->stat() == 0, "testStore insert stat = " << tb->stat());
454
+
455
+ tb->clearBuffer();
456
+ fds[(short)0] = 1;
457
+ tb->seek();
458
+ BOOST_CHECK_MESSAGE(tb->stat() == 0, "testStore seek stat = " << tb->stat());
459
+ for (short i = 1 ;i < (short)fds.size(); ++i)
460
+ BOOST_CHECK_MESSAGE(fds[i].isNull() == true, "testStore isNull field num = " << i);
461
+
462
+ // All not null test
463
+ tb->clearBuffer(table::defaultNull);
464
+ fds[(short)0] = 2;
465
+ for (short i = 1 ;i < (short)fds.size(); ++i)
466
+ fds[i].setNull(false);
467
+ tb->insert();
468
+ BOOST_CHECK_MESSAGE(tb->stat() == 0, "testStore insert stat = " << tb->stat());
469
+
470
+ tb->clearBuffer(table::defaultNull);
471
+
472
+ fds[(short)0] = 2;
473
+ tb->seek();
474
+ BOOST_CHECK_MESSAGE(tb->stat() == 0, "testStore seek stat = " << tb->stat());
475
+ for (short i = 1 ;i < (short)fds.size(); ++i)
476
+ {
477
+ BOOST_CHECK_MESSAGE(fds[i].isNull() == false, "testStore isNull field num = " << i);
478
+ //Test Default value
479
+ __int64 dv = 0;
480
+ if (i == 5) dv = -1;
481
+ if (i == 6) dv = -123456;
482
+ if (i != 10) //ignore timestamp
483
+ BOOST_CHECK_MESSAGE(fds[i].i64() == dv, "testStore defaultValue field num = "
484
+ << i << " " << fds[i].i64());
485
+ }
486
+ }
487
+ catch (bzs::rtl::exception& e)
488
+ {
489
+ _tprintf(_T("Error ! %s\n"), (*getMsg(e)).c_str());
490
+ }
491
+ }
492
+
493
+ void testWRStore(database* db)
494
+ {
495
+ try
496
+ {
497
+ // All null test
498
+ activeTable tb(db, _T("nulltest"));
499
+ writableRecord& wr = tb.getWritableRecord();
500
+ wr.clear();
501
+
502
+ wr[(short)0] = 3;
503
+ for (short i = 1 ;i < (short)wr.size(); ++i)
504
+ {
505
+ wr[i] = _T("123");
506
+ wr[i].setNull(true);
507
+ }
508
+ wr.save();
509
+
510
+ wr.clear();
511
+ wr[(short)0] = 3;
512
+ bool ret = wr.read();
513
+ BOOST_CHECK_MESSAGE(ret == true, "testWRStore read ");
514
+ for (short i = 1 ;i < (short)wr.size(); ++i)
515
+ BOOST_CHECK_MESSAGE(wr[i].isNull() == true, "testWRStore isNull field num = " << i);
516
+
517
+ // All not null test
518
+ wr.clear();
519
+ wr[(short)0] = 4;
520
+ wr[1] = 2;
521
+ for (short i = 1 ;i < (short)wr.size(); ++i)
522
+ wr[i].setNull(false);
523
+ wr.save();
524
+
525
+ wr.clear();
526
+ wr[(short)0] = 4;
527
+ ret = wr.read();
528
+ BOOST_CHECK_MESSAGE(ret == true, "testWRStore read");
529
+ for (short i = 1 ;i < (short)wr.size(); ++i)
530
+ {
531
+ BOOST_CHECK_MESSAGE(wr[i].isNull() == false, "testWRStore isNull field num = " << i);
532
+ //Test Default value
533
+ __int64 dv = 0;
534
+ if (i == 1) dv = 2;
535
+ if (i == 5) dv = -1;
536
+ if (i == 6) dv = -123456;
537
+ if (i != 10) //ignore timestamp
538
+ BOOST_CHECK_MESSAGE(wr[i].i64() == dv, "testWRStore defaultValue field num = "
539
+ << i << " " << wr[i].i64());
540
+ }
541
+ }
542
+ catch (bzs::rtl::exception& e)
543
+ {
544
+ _tprintf(_T("Error ! %s\n"), (*getMsg(e)).c_str());
545
+ }
546
+ }
547
+
548
+ void testAutoNotNull(database* db)
549
+ {
550
+ activeTable tb(db, _T("nulltest"));
551
+ writableRecord& wr = tb.getWritableRecord();
552
+ wr.clear();
553
+
554
+ wr[(short)0] = 3;
555
+ for (short i = 1 ;i < (short)wr.size(); ++i)
556
+ {
557
+ wr[i].setNull(true);
558
+ wr[i] = 1;// setNotNull automaticaly
559
+ BOOST_CHECK_MESSAGE(wr[i].isNull() == false, "testAutoNotNull isNull field num = " << i);
560
+ }
561
+ }
562
+
563
+ void testSchemaSync(database* db)
564
+ {
565
+ try
566
+ {
567
+ dbdef* def = db->dbDef();
568
+ short tableid = 1;
569
+ def->pushBackup(tableid);
570
+ def->deleteField(tableid, 10);
571
+ updateTableDef(def, tableid);
572
+ synchronizeSeverSchema(def, tableid);
573
+ if (def->compAsBackup(tableid))
574
+ BOOST_CHECK_MESSAGE(false, "testSchemaSync");
575
+ }
576
+ catch (bzs::rtl::exception& e)
577
+ {
578
+ _tprintf(_T("testSchemaSync Error ! %s\n"), (*getMsg(e)).c_str());
579
+ }
580
+ }
581
+
582
+ void testUnuseSchema(database* db)
583
+ {
584
+ try
585
+ {
586
+ db->close();
587
+ bool ret = db->open(makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, _T("")), TYPE_SCHEMA_BDF,TD_OPEN_NORMAL);
588
+ BOOST_CHECK_MESSAGE(ret == true, "db open stat = " << db->stat());
589
+ table_ptr tb = openTable(db, _T("nulltest"), TD_OPEN_NORMAL);
590
+ tb->setKeyNum(0);
591
+ tb->clearBuffer();
592
+ fields& fds = tb->fields();
593
+ fds[(short)0] = 1;
594
+ tb->seek();
595
+ BOOST_CHECK_MESSAGE(tb->stat() == 0, "UnuseSchema seek stat = " << tb->stat());
596
+ for (short i = 1 ;i < (short)fds.size(); ++i)
597
+ BOOST_CHECK_MESSAGE(fds[i].isNull() == true, "UnuseSchema isNull field num = " << i);
598
+
599
+ //open second table
600
+ table_ptr tb2 = openTable(db, _T("nulltest"), TD_OPEN_NORMAL);
601
+ BOOST_CHECK_MESSAGE(db->stat() == 0, "UnuseSchema openTable stat = " << db->stat());
602
+
603
+ //shared tabledef
604
+ BOOST_CHECK_MESSAGE(db->dbDef()->tableCount() == 1, "tableCount = " << db->dbDef()->tableCount());
605
+
606
+ tb2->setKeyNum(0);
607
+ tb2->clearBuffer(table::defaultNull);
608
+
609
+ //default values
610
+ fields& fds2 = tb2->fields();
611
+ for (short i = 1 ;i < (short)fds.size(); ++i)
612
+ {
613
+ bool v = true;
614
+ int dv = 0;
615
+ if (i == 0 || i == 5 || i == 6) v = false;
616
+ BOOST_CHECK_MESSAGE(fds2[i].isNull() == v, "defaultValue isNull field num = " << i);
617
+ if (i == 5) dv = -1;
618
+
619
+ if (i == 6) dv = -123456;
620
+ BOOST_CHECK_MESSAGE(fds2[i].i() == dv, "defaultValue defaultValue field num = "
621
+ << i << " " << fds2[i].i());
622
+ }
623
+
624
+ fds2[(short)0] = 1;
625
+ tb2->seek();
626
+ BOOST_CHECK_MESSAGE(tb2->stat() == 0, "UnuseSchema seek stat = " << tb2->stat());
627
+ for (short i = 1 ;i < (short)fds2.size(); ++i)
628
+ BOOST_CHECK_MESSAGE(fds2[i].isNull() == true, "UnuseSchema isNull field num = " << i);
629
+
630
+ db->openTable(_T("abc"));
631
+ BOOST_CHECK_MESSAGE(db->stat() == STATUS_TABLE_NOTOPEN, "openTable stat = " << db->stat());
632
+ }
633
+ catch (bzs::rtl::exception& e)
634
+ {
635
+ _tprintf(_T("testUnuseSchema Error ! %s\n"), (*getMsg(e)).c_str());
636
+ }
637
+ }
638
+ // ------------------------------------------------------------------------
639
+ class fixtureTimestamp
640
+ {
641
+ mutable database* m_db;
642
+ bool supportDateTimeTimeStamp;
643
+ public:
644
+ fixtureTimestamp() : m_db(NULL)
645
+ {
646
+ nsdatabase::setCheckTablePtr(true);
647
+ m_db = database::create();
648
+ if (!m_db)
649
+ printf("Error database::create()\n");
650
+ short ret = createTestDataBase(m_db);
651
+ if (ret)
652
+ {
653
+ printf("Error createDataBase\n");
654
+ return;
655
+ }
656
+ m_db->connect(makeUri(PROTOCOL, HOSTNAME, _T("")));
657
+ if (m_db->stat())
658
+ {
659
+ printf("Error db connect\n");
660
+ return;
661
+ }
662
+ btrVersions vs;
663
+ m_db->getBtrVersion(&vs);
664
+ if (m_db->stat())
665
+ {
666
+ printf("Error getBtrVersion\n");
667
+ return;
668
+ }
669
+ btrVersion& v = vs.versions[1];
670
+ supportDateTimeTimeStamp = v.isSupportDateTimeTimeStamp();
671
+
672
+ ret = createTestTable(m_db, false, supportDateTimeTimeStamp);
673
+ if (ret)
674
+ printf("Error createTable\n");
675
+ }
676
+
677
+ ~fixtureTimestamp()
678
+ {
679
+ if (m_db)
680
+ m_db->release();
681
+ }
682
+ ::database* db() const { return m_db; }
683
+ };
684
+
685
+ /* Desc of nulltest table timestampNull = false
686
+
687
+ | Field | Type | Null | Key | Default | Extra
688
+ +-------+---------------+------+-----+----------------------+-------------------
689
+ | id | int(11) | NO | PRI | NULL |
690
+ | fd1 | int(11) | YES | UNI | NULL |
691
+ | fd2 | int(11) | YES | | NULL |
692
+ | fd3 | int(11) | YES | | NULL |
693
+ | fd4 | int(11) | YES | | NULL |
694
+ | fd5 | int(11) | NO | | -1 |
695
+ | fd6 | varchar(16) | YES | | NULL |
696
+ | fd7 | varbinary(50) | YES | | NULL |
697
+ | fd8 | timestamp(6) | NO | | CURRENT_TIMESTAMP(6) | on update CURRENT_TIMESTAMP(6) |
698
+ | fd9 | datetime(6) | YES | | NULL |
699
+ | fd10 | timestamp(6) | YES | | CURRENT_TIMESTAMP(6) | on update CURRENT_TIMESTAMP(6) |
700
+ | fd11 | datetime(6) | NO | | NULL | on update CURRENT_TIMESTAMP(6) |
701
+ +-------+---------------+------+-----+----------------------+-------------------
702
+ */
703
+ void testTimestamp(database* db)
704
+ {
705
+ try
706
+ {
707
+ short tableid = 1;
708
+ {
709
+ table_ptr tb = openTable(db, tableid, TD_OPEN_NORMAL+TD_OPEN_MASK_MYSQL_NULL);
710
+ tb->setKeyNum(0);
711
+ tb->clearBuffer();
712
+ fields& fds = tb->fields();
713
+ fds[(short)0] = 1;
714
+ for (short i = 1 ;i < (short)fds.size(); ++i)
715
+ fds[i].setNull(true);
716
+ tb->insert();
717
+ BOOST_CHECK_MESSAGE(tb->stat() == 0, "testTimestamp insert stat = " << tb->stat());
718
+
719
+ tb->clearBuffer();
720
+ fds[(short)0] = 1;
721
+ tb->seek();
722
+ BOOST_CHECK_MESSAGE(tb->stat() == 0, "testTimestamp seek stat = " << tb->stat());
723
+
724
+ __int64 v = fds[_T("fd8")].i64();
725
+ BOOST_CHECK_MESSAGE(v != 0, "Timestamp is 0 ");
726
+
727
+ BOOST_CHECK_MESSAGE(fds[_T("fd10")].isNull() == true, "Timestamp2 not null" );
728
+
729
+ Sleep(1);
730
+ tb->update();
731
+ BOOST_CHECK_MESSAGE(tb->stat() == 0, "testTimestamp update stat = " << tb->stat());
732
+ tb->seek();
733
+
734
+ if (canDatatimeTimeStamp(tb.get(), 8))
735
+ BOOST_CHECK_MESSAGE(fds[_T("fd8")].i64() != v, "Timestamp not udapte ");
736
+ BOOST_CHECK_MESSAGE(fds[_T("fd8")].i64() != 0, "Timestamp is zero ");
737
+
738
+ }
739
+
740
+ }
741
+ catch (bzs::rtl::exception& e)
742
+ {
743
+ _tprintf(_T("Error ! %s\n"), (*getMsg(e)).c_str());
744
+ }
745
+ }
746
+ // ------------------------------------------------------------------------
747
+
748
+
749
+
750
+ void testMyDateTimeStore()
751
+ {
752
+ __int64 tmp;
753
+
754
+ fielddefs* fds = fielddefs::create();
755
+ fielddef f;
756
+ memset(&f, 0, sizeof(fielddef));
757
+ f.len = 8;
758
+ f.pos = 0;
759
+
760
+ //timestamp
761
+ f.type = ft_mytimestamp;
762
+ f.decimals = 6;
763
+ field fd((unsigned char* )&tmp, f, fds);
764
+ myTimeStamp dt(f.decimals, true);
765
+ dt = "2010-10-10 00:00:00.123456";
766
+ fd = dt.i64;
767
+ BOOST_CHECK_MESSAGE(fd.i64() == dt.i64, "ft_mytimestamp7 value = " << fd.i64());
768
+
769
+ //Legacy format
770
+ myTimeStamp dtl(f.decimals, false);
771
+ dtl = "2010-10-10 00:00:00";
772
+ fd = dtl.i64;
773
+ BOOST_CHECK_MESSAGE(fd.i64() == dtl.i64, "ft_mytimestamp legacy value = " << fd.i64());
774
+
775
+
776
+ f.decimals = 4; f.len = 7;
777
+ myTimeStamp dt2(f.decimals, true);
778
+ dt2 = "2010-10-10 00:00:12.9988";
779
+ fd = dt2.i64;
780
+ BOOST_CHECK_MESSAGE(fd.i64() == dt2.i64, "ft_mytimestamp6 value = " << fd.i64());
781
+
782
+ f.decimals = 2; f.len = 6;
783
+ myTimeStamp dt3(f.decimals, true);
784
+ dt3 = "2010-10-10 00:00:12.23";
785
+ fd = dt3.i64;
786
+ BOOST_CHECK_MESSAGE(fd.i64() == dt3.i64, "ft_mytimestamp5 value = " << fd.i64());
787
+
788
+ f.decimals = 0; f.len = 5;
789
+ myTimeStamp dt4(f.decimals, true);
790
+ dt4 = "2010-10-10 00:00:12";
791
+ fd = dt4.i64;
792
+ BOOST_CHECK_MESSAGE(fd.i64() == dt4.i64, "ft_mytimestamp4 value = " << fd.i64());
793
+
794
+ //datetime
795
+ f.decimals = 6; f.len = 8;
796
+ f.type = ft_mydatetime;
797
+ myDateTime dt5(f.decimals, true);
798
+ dt5 = "2015-10-10 00:00:12.445566";
799
+ fd = dt5.i64;
800
+ BOOST_CHECK_MESSAGE(fd.i64() == dt5.i64, "ft_mydatetime8 value = " << fd.i64());
801
+
802
+ //Legacy format
803
+ myDateTime dt5l(f.decimals, true);
804
+ dt5l = "2015-10-10 00:00:12";
805
+ fd = dt5l.i64;
806
+ BOOST_CHECK_MESSAGE(fd.i64() == dt5l.i64, "ft_mydatetime Legacy value = " << fd.i64());
807
+
808
+ f.decimals = 4; f.len = 7;
809
+ myDateTime dt6(f.decimals, true);
810
+ dt6 = "2015-10-10 00:00:12.7788";
811
+ fd = dt6.i64;
812
+ BOOST_CHECK_MESSAGE(fd.i64() == dt6.i64, "ft_mydatetime7 value = " << fd.i64());
813
+
814
+ f.decimals = 2; f.len = 6;
815
+ myDateTime dt7(f.decimals, true);
816
+ dt7 = "2015-10-10 00:00:12.00";
817
+ fd = dt7.i64;
818
+ BOOST_CHECK_MESSAGE(fd.i64() == dt7.i64, "ft_mydatetime6 value = " << fd.i64());
819
+
820
+ f.decimals = 0; f.len = 5;
821
+ myDateTime dt71(f.decimals, true);
822
+ dt71 = "2015-10-10 00:00:12";
823
+ fd = dt71.i64;
824
+ BOOST_CHECK_MESSAGE(fd.i64() == dt71.i64, "ft_mydatetime5 value = " << fd.i64());
825
+
826
+ //mariadb datetime
827
+ f.setOptions(FIELD_OPTION_MARIADB);
828
+ f.decimals = 6; f.len = 8;
829
+ f.type = ft_mydatetime;
830
+ maDateTime dta(f.decimals, true);
831
+ dta = "2015-10-10 00:00:12.445566";
832
+ fd = dta.i64;
833
+ BOOST_CHECK_MESSAGE(fd.i64() == dta.i64, "ft_mydatetime8 maridb value = " << fd.i64());
834
+
835
+ f.decimals = 4; f.len = 7;
836
+ maDateTime dta1(f.decimals, true);
837
+ dta1 = "2015-10-10 00:00:12.7788";
838
+ fd = dta1.i64;
839
+ BOOST_CHECK_MESSAGE(fd.i64() == dta1.i64, "ft_mydatetime7 maridb value = " << fd.i64());
840
+
841
+ f.decimals = 2; f.len = 6;
842
+ maDateTime dta2(f.decimals, true);
843
+ dta2 = "2015-10-10 00:00:12.00";
844
+ fd = dta2.i64;
845
+ BOOST_CHECK_MESSAGE(fd.i64() == dta2.i64, "ft_mydatetime6 maridb value = " << fd.i64());
846
+
847
+ f.decimals = 0; f.len = 5;
848
+ maDateTime dta20(f.decimals, true);
849
+ dta20 = "2015-10-10 00:00:12";
850
+ fd = dta20.i64;
851
+ BOOST_CHECK_MESSAGE(fd.i64() == dta20.i64, "ft_mydatetime6 maridb value = " << fd.i64());
852
+
853
+ // mariadb time
854
+ f.decimals = 6; f.len = 6;
855
+ f.type = ft_mytime;
856
+ maTime dtma1(f.decimals, true);
857
+ dtma1 = "00:00:12.123456";
858
+ fd = dtma1.i64;
859
+ BOOST_CHECK_MESSAGE(fd.i64() == dtma1.i64, "ft_mytime6 maridb value = " << fd.i64());
860
+
861
+ f.decimals = 4; f.len = 5;
862
+ maTime dtma2(f.decimals, true);
863
+ dtma2 = "00:00:12.1234";
864
+ fd = dtma2.i64;
865
+ BOOST_CHECK_MESSAGE(fd.i64() == dtma2.i64, "ft_mytime5 maridb value = " << fd.i64());
866
+
867
+ f.decimals = 2; f.len = 4;
868
+ maTime dta3(f.decimals, true);
869
+ dta3 = "00:00:12.12";
870
+ fd = dta3.i64;
871
+ BOOST_CHECK_MESSAGE(fd.i64() == dta3.i64, "ft_mytime4 maridb value = " << fd.i64());
872
+
873
+ f.decimals = 0; f.len = 3;
874
+ maTime dta4(f.decimals, true);
875
+ dta4 = "00:00:12";
876
+ fd = dta4.i64;
877
+ BOOST_CHECK_MESSAGE(fd.i64() == dta4.i64, "ft_mytime3 maridb value = " << fd.i64());
878
+
879
+ maTime dta5(f.decimals, false);
880
+ dta5 = "00:00:12";
881
+ fd = dta5.i64;
882
+ BOOST_CHECK_MESSAGE(fd.i64() == dta5.i64, "ft_mytime Legacy maridb value = " << fd.i64());
883
+
884
+
885
+ // MySQl time
886
+ f.setOptions(0);
887
+ f.decimals = 6; f.len = 6;
888
+ f.type = ft_mytime;
889
+ myTime dt10(f.decimals, true);
890
+ dt10 = "00:00:12.123456";
891
+ fd = dt10.i64;
892
+ BOOST_CHECK_MESSAGE(fd.i64() == dt10.i64, "ft_mytime6 value = " << fd.i64());
893
+
894
+ f.decimals = 4; f.len = 5;
895
+ myTime dt11(f.decimals, true);
896
+ dt11 = "00:00:12.1234";
897
+ fd = dt11.i64;
898
+ BOOST_CHECK_MESSAGE(fd.i64() == dt11.i64, "ft_mytime5 value = " << fd.i64());
899
+
900
+ f.decimals = 2; f.len = 4;
901
+ myTime dt12(f.decimals, true);
902
+ dt12 = "00:00:12.12";
903
+ fd = dt12.i64;
904
+ BOOST_CHECK_MESSAGE(fd.i64() == dt12.i64, "ft_mytime4 value = " << fd.i64());
905
+
906
+ f.decimals = 0; f.len = 3;
907
+ myTime dt13(f.decimals, true);
908
+ dt13 = "00:00:12";
909
+ fd = dt13.i64;
910
+ BOOST_CHECK_MESSAGE(fd.i64() == dt13.i64, "ft_mytime3 value = " << fd.i64());
911
+
912
+ myTime dt13l(f.decimals, false);
913
+ dt13l = "00:00:12";
914
+ fd = dt13l.i64;
915
+ BOOST_CHECK_MESSAGE(fd.i64() == dt13l.i64, "ft_mytime Legacy value = " << fd.i64());
916
+
917
+ //print
918
+ f.type = ft_mydatetime;
919
+ f.decimals = 6; f.len = 8;
920
+ fd = _T("2015-10-01 20:50:36.002000");
921
+ BOOST_CHECK_MESSAGE(fd.c_str() == _tstring(_T("2015-10-01 20:50:36.002000"))
922
+ , "ft_mydatetime string8 = " << fd.c_str());
923
+
924
+ f.decimals = 4; f.len = 7;
925
+ fd = _T("2015-10-01 20:50:36.002000");
926
+ BOOST_CHECK_MESSAGE(fd.c_str() == _tstring(_T("2015-10-01 20:50:36.0020"))
927
+ , "ft_mydatetime string7 = " << fd.c_str());
928
+
929
+ f.decimals = 2; f.len = 6;
930
+ fd = _T("2015-10-01 20:50:36.052000");
931
+ BOOST_CHECK_MESSAGE(fd.c_str() == _tstring(_T("2015-10-01 20:50:36.05"))
932
+ , "ft_mydatetime string6 = " << fd.c_str());
933
+
934
+ f.decimals = 0; f.len = 5;
935
+ fd = _T("2015-10-01 20:50:36.002000");
936
+ BOOST_CHECK_MESSAGE(fd.c_str() == _tstring(_T("2015-10-01 20:50:36"))
937
+ , "ft_mydatetime string5 = " << fd.c_str());
938
+
939
+ f.type = ft_mytimestamp;
940
+ f.decimals = 6; f.len = 7;
941
+ fd = _T("2015-10-01 20:50:36.052001");
942
+ BOOST_CHECK_MESSAGE(fd.c_str() == _tstring(_T("2015-10-01 20:50:36.052001"))
943
+ , "ft_mytimestamp string7 = " << fd.c_str());
944
+
945
+ f.decimals = 4; f.len = 6;
946
+ fd = _T("2015-10-01 20:50:36.052001");
947
+ BOOST_CHECK_MESSAGE(fd.c_str() == _tstring(_T("2015-10-01 20:50:36.0520"))
948
+ , "ft_mytimestamp string6 = " << fd.c_str());
949
+
950
+ f.decimals = 2; f.len = 5;
951
+ fd = _T("2015-10-01 20:50:36.052000");
952
+ BOOST_CHECK_MESSAGE(fd.c_str() == _tstring(_T("2015-10-01 20:50:36.05"))
953
+ , "ft_mytimestamp string5 = " << fd.c_str());
954
+ f.decimals = 0; f.len = 4;
955
+ fd = _T("2015-10-01 20:50:36.952000");
956
+ BOOST_CHECK_MESSAGE(fd.c_str() == _tstring(_T("2015-10-01 20:50:36"))
957
+ , "ft_mytimestamp string4 = " << fd.c_str());
958
+
959
+ fds->release();
960
+ }
961
+
962
+
963
+ BOOST_AUTO_TEST_SUITE(test_v3)
964
+
965
+ BOOST_FIXTURE_TEST_CASE(noschema, fixture)
966
+ {
967
+ testNoSchema(db());
968
+ }
969
+
970
+ BOOST_FIXTURE_TEST_CASE(nullbit, fixture)
971
+ {
972
+ testFielddefs(db());
973
+ testFieldValue(db());
974
+ testWriatbleRecordFieldValue(db());
975
+ }
976
+
977
+ BOOST_FIXTURE_TEST_CASE(nullstore, fixtureStore)
978
+ {
979
+ testDefaultValue(db(), true);
980
+ testWRDefaultValue(db(), true);
981
+ testTableStore(db());
982
+ testWRStore(db());
983
+ testAutoNotNull(db());
984
+ testSchemaSync(db());
985
+ testUnuseSchema(db());
986
+ }
987
+
988
+ BOOST_FIXTURE_TEST_CASE(timestamp, fixtureTimestamp)
989
+ {
990
+ testDefaultValue(db(), false);
991
+ testWRDefaultValue(db(), false);
992
+ testTimestamp(db());
993
+ }
994
+
995
+ BOOST_AUTO_TEST_CASE(dateTimeStore)
996
+ {
997
+ testModeMacro();
998
+ testMyDateTimeStore();
999
+ }
1000
+
1001
+ BOOST_FIXTURE_TEST_CASE(fieldstore, fixtureFieldStore)
1002
+ {
1003
+ testStoreInt(db());
1004
+ if (isLegacyTimeFormat())
1005
+ testStoreLegacyTime(db());
1006
+ else
1007
+ testStoreTime(db(), isMysql56TimeFormat(), isSupportMultiTimeStamp());
1008
+ test_NOT_HA_OPTION_PACK_RECORD(db());
1009
+ testInMany(db());
1010
+ testNullValue(db());
1011
+ testSetEnumBit();
1012
+ }
1013
+
1014
+ BOOST_AUTO_TEST_CASE(null_comp)
1015
+ {
1016
+ BOOST_CHECK_EQUAL(nullComp(true, true, (char)eIsNull), 0);
1017
+ BOOST_CHECK_EQUAL(nullComp(true, true, (char)eIsNotNull), -1);
1018
+ BOOST_CHECK_EQUAL(nullComp(true, false, (char)0), -1);
1019
+ BOOST_CHECK_EQUAL(nullComp(false, true, (char)eIsNull), 1);
1020
+ BOOST_CHECK_EQUAL(nullComp(false, true, (char)eIsNotNull), 0);
1021
+ BOOST_CHECK_EQUAL(nullComp(false, false, (char)0), 2);
1022
+ }
1023
+
1024
+ BOOST_AUTO_TEST_CASE(field_comp)
1025
+ {
1026
+ testCompInt();
1027
+ testCompUint();
1028
+ testCompDouble();
1029
+ testCompBit();
1030
+ testCompSet();
1031
+ testCompEnum();
1032
+ testCompYear();
1033
+ testCompDate();
1034
+ testCompTime();
1035
+ testCompDateTime();
1036
+ testCompTimeStamp();
1037
+ testCompTimeMa();
1038
+ testCompDateTimeMa();
1039
+ testCompTimeStampMa();
1040
+ testCompString();
1041
+ #ifdef _WIN32
1042
+ testCompWString();
1043
+ #endif
1044
+ testCompBlob();
1045
+ testCompDecimal();
1046
+ }
1047
+
1048
+ BOOST_AUTO_TEST_SUITE_END()
1049
+
1050
+ // ------------------------------------------------------------------------