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.
- checksums.yaml +4 -4
- data/CMakeLists.txt +1 -1
- data/README-JA.md +52 -529
- data/README.md +52 -523
- data/bin/common/tdclc_32_3_0.dll +0 -0
- data/bin/common/tdclc_64_3_0.dll +0 -0
- data/build/common/system.cmake +2 -1
- data/build/common/transactd_cl_common.cmake +3 -6
- data/build/swig/ruby/ruby.swg +85 -28
- data/build/swig/ruby/tdclrb_wrap.cpp +3195 -1578
- data/build/swig/tdcl.i +161 -5
- data/build/tdclc/CMakeLists.txt +1 -0
- data/build/tdclc/tdclc.cbproj +7 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +2 -5
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/blobStructs.h +1 -1
- data/source/bzs/db/engine/mysql/database.cpp +199 -74
- data/source/bzs/db/engine/mysql/database.h +47 -18
- data/source/bzs/db/engine/mysql/dbManager.cpp +1 -0
- data/source/bzs/db/engine/mysql/mysqlInternal.h +32 -8
- data/source/bzs/db/protocol/tdap/btrDate.cpp +110 -75
- data/source/bzs/db/protocol/tdap/btrDate.h +46 -21
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +18 -18
- data/source/bzs/db/protocol/tdap/client/activeTable.h +25 -25
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
- data/source/bzs/db/protocol/tdap/client/client.cpp +6 -5
- data/source/bzs/db/protocol/tdap/client/client.h +82 -15
- data/source/bzs/db/protocol/tdap/client/database.cpp +531 -142
- data/source/bzs/db/protocol/tdap/client/database.h +19 -6
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +461 -408
- data/source/bzs/db/protocol/tdap/client/dbDef.h +11 -17
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +61 -13
- data/source/bzs/db/protocol/tdap/client/field.cpp +1592 -1398
- data/source/bzs/db/protocol/tdap/client/field.h +110 -121
- data/source/bzs/db/protocol/tdap/client/fields.h +40 -10
- data/source/bzs/db/protocol/tdap/client/filter.h +69 -55
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +296 -164
- data/source/bzs/db/protocol/tdap/client/groupQuery.h +77 -25
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +31 -13
- data/source/bzs/db/protocol/tdap/client/memRecord.h +31 -21
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +69 -24
- data/source/bzs/db/protocol/tdap/client/nsTable.h +3 -1
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +1 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +46 -27
- data/source/bzs/db/protocol/tdap/client/request.h +2 -1
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +44 -9
- data/source/bzs/db/protocol/tdap/client/serializer.h +1 -1
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +182 -76
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +23 -12
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +8 -10
- data/source/bzs/db/protocol/tdap/client/table.cpp +172 -93
- data/source/bzs/db/protocol/tdap/client/table.h +112 -37
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +17 -0
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +0 -1
- data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +0 -2
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +1 -1
- data/source/bzs/db/protocol/tdap/fieldComp.h +698 -14
- data/source/bzs/db/protocol/tdap/myDateTime.cpp +723 -307
- data/source/bzs/db/protocol/tdap/myDateTime.h +294 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +164 -54
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +6 -3
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +133 -550
- data/source/bzs/db/protocol/tdap/mysql/request.h +6 -5
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +217 -82
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +1 -1
- data/source/bzs/db/protocol/tdap/tdapRequest.h +4 -9
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +808 -17
- data/source/bzs/db/protocol/tdap/tdapSchema.h +656 -164
- data/source/bzs/db/protocol/tdap/tdapcapi.h +130 -28
- data/source/bzs/db/protocol/tdap/uri.h +40 -32
- data/source/bzs/db/transactd/connManager.cpp +1 -1
- data/source/bzs/db/transactd/transactd.cpp +7 -0
- data/source/bzs/env/compiler.h +107 -94
- data/source/bzs/env/crosscompile.cpp +24 -12
- data/source/bzs/env/crosscompile.h +75 -6
- data/source/bzs/env/mbcswchrLinux.cpp +2 -2
- data/source/bzs/env/tcharMinGW.h +4 -0
- data/source/bzs/example/changeSchema.cpp +22 -17
- data/source/bzs/example/queryData.cpp +4 -0
- data/source/bzs/netsvc/client/iconnection.h +3 -1
- data/source/bzs/netsvc/client/tcpClient.h +10 -3
- data/source/bzs/rtl/stringBuffers.cpp +7 -0
- data/source/bzs/test/tdclatl/bench_query_atl.js +6 -0
- data/source/bzs/test/tdclatl/bench_tdclatl.js +8 -1
- data/source/bzs/test/tdclatl/test_query_atl.js +22 -2
- data/source/bzs/test/tdclatl/test_v3.js +1017 -0
- data/source/bzs/test/tdclphp/transactd_Test.php +55 -21
- data/source/bzs/test/tdclphp/transactd_datetime_Test.php +0 -5
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +2 -0
- data/source/bzs/test/tdclphp/transactd_v3_Test.php +743 -0
- data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -5
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +2 -0
- data/source/bzs/test/tdclrb/transactd_spec.rb +39 -16
- data/source/bzs/test/tdclrb/transactd_v3_spec.rb +748 -0
- data/source/bzs/test/transactdBench/transactdBench.cpp +55 -58
- data/source/bzs/test/transactdBench/transactdBench2.cpp +1 -3
- data/source/bzs/test/trdclengn/testField.h +3305 -0
- data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +1050 -0
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +112 -190
- data/source/bzs/test/trdclengn/testbase.h +137 -0
- data/source/global/ormsrcgen/srcgen.cpp +23 -12
- data/source/global/ormsrcgen/template/ormDataClass_template.h +2 -0
- data/source/global/querystmts/querystmts.cpp +2 -3
- data/source/global/tdclatl/Bitset.cpp +38 -0
- data/source/global/tdclatl/Bitset.h +63 -0
- data/source/global/tdclatl/Database.cpp +59 -18
- data/source/global/tdclatl/Database.h +7 -4
- data/source/global/tdclatl/DbDef.cpp +6 -6
- data/source/global/tdclatl/DbDef.h +2 -1
- data/source/global/tdclatl/Field.cpp +112 -0
- data/source/global/tdclatl/Field.h +19 -5
- data/source/global/tdclatl/FieldDef.cpp +137 -16
- data/source/global/tdclatl/FieldDef.h +18 -2
- data/source/global/tdclatl/FieldDefs.cpp +54 -1
- data/source/global/tdclatl/FieldDefs.h +3 -0
- data/source/global/tdclatl/GroupQuery.cpp +8 -8
- data/source/global/tdclatl/QueryBase.cpp +65 -0
- data/source/global/tdclatl/QueryBase.h +10 -0
- data/source/global/tdclatl/Record.cpp +33 -2
- data/source/global/tdclatl/Record.h +3 -1
- data/source/global/tdclatl/RecordsetQuery.cpp +42 -0
- data/source/global/tdclatl/RecordsetQuery.h +8 -0
- data/source/global/tdclatl/Table.cpp +127 -3
- data/source/global/tdclatl/Table.h +10 -1
- data/source/global/tdclatl/TableDef.cpp +41 -8
- data/source/global/tdclatl/TableDef.h +7 -2
- data/source/global/tdclatl/activeTable.cpp +40 -71
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/tdclatl.idl +222 -28
- data/source/linux/tchar.h +100 -96
- data/transactd.gemspec +2 -2
- metadata +13 -11
- data/BUILD_UNIX-JA.md +0 -161
- data/BUILD_WIN-JA.md +0 -326
- data/README_ORMSRCGEN-JA.md +0 -115
- data/README_ORMSRCGEN.md +0 -118
- data/RELEASE_NOTE-JA.md +0 -356
- data/RELEASE_NOTE.md +0 -360
- data/bin/common/tdclc_32_2_4.dll +0 -0
- data/bin/common/tdclc_64_2_4.dll +0 -0
- 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
|
+
// ------------------------------------------------------------------------
|