transactd 2.4.5 → 3.0.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 (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
+ // ------------------------------------------------------------------------