transactd 2.4.5 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/CMakeLists.txt +1 -1
  3. data/README-JA.md +52 -529
  4. data/README.md +52 -523
  5. data/bin/common/tdclc_32_3_0.dll +0 -0
  6. data/bin/common/tdclc_64_3_0.dll +0 -0
  7. data/build/common/system.cmake +2 -1
  8. data/build/common/transactd_cl_common.cmake +3 -6
  9. data/build/swig/ruby/ruby.swg +85 -28
  10. data/build/swig/ruby/tdclrb_wrap.cpp +3195 -1578
  11. data/build/swig/tdcl.i +161 -5
  12. data/build/tdclc/CMakeLists.txt +1 -0
  13. data/build/tdclc/tdclc.cbproj +7 -1
  14. data/build/tdclc/tdclc.rc +4 -4
  15. data/build/tdclcpp/tdclcpp.rc +4 -4
  16. data/build/tdclcpp/tdclcpp_bc.cbproj +2 -5
  17. data/build/tdclrb/tdclrb.rc +4 -4
  18. data/source/bzs/db/blobStructs.h +1 -1
  19. data/source/bzs/db/engine/mysql/database.cpp +199 -74
  20. data/source/bzs/db/engine/mysql/database.h +47 -18
  21. data/source/bzs/db/engine/mysql/dbManager.cpp +1 -0
  22. data/source/bzs/db/engine/mysql/mysqlInternal.h +32 -8
  23. data/source/bzs/db/protocol/tdap/btrDate.cpp +110 -75
  24. data/source/bzs/db/protocol/tdap/btrDate.h +46 -21
  25. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +18 -18
  26. data/source/bzs/db/protocol/tdap/client/activeTable.h +25 -25
  27. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
  28. data/source/bzs/db/protocol/tdap/client/client.cpp +6 -5
  29. data/source/bzs/db/protocol/tdap/client/client.h +82 -15
  30. data/source/bzs/db/protocol/tdap/client/database.cpp +531 -142
  31. data/source/bzs/db/protocol/tdap/client/database.h +19 -6
  32. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +461 -408
  33. data/source/bzs/db/protocol/tdap/client/dbDef.h +11 -17
  34. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +61 -13
  35. data/source/bzs/db/protocol/tdap/client/field.cpp +1592 -1398
  36. data/source/bzs/db/protocol/tdap/client/field.h +110 -121
  37. data/source/bzs/db/protocol/tdap/client/fields.h +40 -10
  38. data/source/bzs/db/protocol/tdap/client/filter.h +69 -55
  39. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +296 -164
  40. data/source/bzs/db/protocol/tdap/client/groupQuery.h +77 -25
  41. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +31 -13
  42. data/source/bzs/db/protocol/tdap/client/memRecord.h +31 -21
  43. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +1 -1
  44. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
  45. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +69 -24
  46. data/source/bzs/db/protocol/tdap/client/nsTable.h +3 -1
  47. data/source/bzs/db/protocol/tdap/client/recordset.cpp +1 -0
  48. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +46 -27
  49. data/source/bzs/db/protocol/tdap/client/request.h +2 -1
  50. data/source/bzs/db/protocol/tdap/client/serializer.cpp +44 -9
  51. data/source/bzs/db/protocol/tdap/client/serializer.h +1 -1
  52. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +182 -76
  53. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +23 -12
  54. data/source/bzs/db/protocol/tdap/client/stringConverter.h +8 -10
  55. data/source/bzs/db/protocol/tdap/client/table.cpp +172 -93
  56. data/source/bzs/db/protocol/tdap/client/table.h +112 -37
  57. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +17 -0
  58. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +0 -1
  59. data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +0 -2
  60. data/source/bzs/db/protocol/tdap/client/trdormapi.h +1 -1
  61. data/source/bzs/db/protocol/tdap/fieldComp.h +698 -14
  62. data/source/bzs/db/protocol/tdap/myDateTime.cpp +723 -307
  63. data/source/bzs/db/protocol/tdap/myDateTime.h +294 -0
  64. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +164 -54
  65. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +6 -3
  66. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +133 -550
  67. data/source/bzs/db/protocol/tdap/mysql/request.h +6 -5
  68. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +217 -82
  69. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +1 -1
  70. data/source/bzs/db/protocol/tdap/tdapRequest.h +4 -9
  71. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +808 -17
  72. data/source/bzs/db/protocol/tdap/tdapSchema.h +656 -164
  73. data/source/bzs/db/protocol/tdap/tdapcapi.h +130 -28
  74. data/source/bzs/db/protocol/tdap/uri.h +40 -32
  75. data/source/bzs/db/transactd/connManager.cpp +1 -1
  76. data/source/bzs/db/transactd/transactd.cpp +7 -0
  77. data/source/bzs/env/compiler.h +107 -94
  78. data/source/bzs/env/crosscompile.cpp +24 -12
  79. data/source/bzs/env/crosscompile.h +75 -6
  80. data/source/bzs/env/mbcswchrLinux.cpp +2 -2
  81. data/source/bzs/env/tcharMinGW.h +4 -0
  82. data/source/bzs/example/changeSchema.cpp +22 -17
  83. data/source/bzs/example/queryData.cpp +4 -0
  84. data/source/bzs/netsvc/client/iconnection.h +3 -1
  85. data/source/bzs/netsvc/client/tcpClient.h +10 -3
  86. data/source/bzs/rtl/stringBuffers.cpp +7 -0
  87. data/source/bzs/test/tdclatl/bench_query_atl.js +6 -0
  88. data/source/bzs/test/tdclatl/bench_tdclatl.js +8 -1
  89. data/source/bzs/test/tdclatl/test_query_atl.js +22 -2
  90. data/source/bzs/test/tdclatl/test_v3.js +1017 -0
  91. data/source/bzs/test/tdclphp/transactd_Test.php +55 -21
  92. data/source/bzs/test/tdclphp/transactd_datetime_Test.php +0 -5
  93. data/source/bzs/test/tdclphp/transactd_pool_Test.php +2 -0
  94. data/source/bzs/test/tdclphp/transactd_v3_Test.php +743 -0
  95. data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -5
  96. data/source/bzs/test/tdclrb/transactd_pool_spec.rb +2 -0
  97. data/source/bzs/test/tdclrb/transactd_spec.rb +39 -16
  98. data/source/bzs/test/tdclrb/transactd_v3_spec.rb +748 -0
  99. data/source/bzs/test/transactdBench/transactdBench.cpp +55 -58
  100. data/source/bzs/test/transactdBench/transactdBench2.cpp +1 -3
  101. data/source/bzs/test/trdclengn/testField.h +3305 -0
  102. data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +1050 -0
  103. data/source/bzs/test/trdclengn/test_trdclengn.cpp +112 -190
  104. data/source/bzs/test/trdclengn/testbase.h +137 -0
  105. data/source/global/ormsrcgen/srcgen.cpp +23 -12
  106. data/source/global/ormsrcgen/template/ormDataClass_template.h +2 -0
  107. data/source/global/querystmts/querystmts.cpp +2 -3
  108. data/source/global/tdclatl/Bitset.cpp +38 -0
  109. data/source/global/tdclatl/Bitset.h +63 -0
  110. data/source/global/tdclatl/Database.cpp +59 -18
  111. data/source/global/tdclatl/Database.h +7 -4
  112. data/source/global/tdclatl/DbDef.cpp +6 -6
  113. data/source/global/tdclatl/DbDef.h +2 -1
  114. data/source/global/tdclatl/Field.cpp +112 -0
  115. data/source/global/tdclatl/Field.h +19 -5
  116. data/source/global/tdclatl/FieldDef.cpp +137 -16
  117. data/source/global/tdclatl/FieldDef.h +18 -2
  118. data/source/global/tdclatl/FieldDefs.cpp +54 -1
  119. data/source/global/tdclatl/FieldDefs.h +3 -0
  120. data/source/global/tdclatl/GroupQuery.cpp +8 -8
  121. data/source/global/tdclatl/QueryBase.cpp +65 -0
  122. data/source/global/tdclatl/QueryBase.h +10 -0
  123. data/source/global/tdclatl/Record.cpp +33 -2
  124. data/source/global/tdclatl/Record.h +3 -1
  125. data/source/global/tdclatl/RecordsetQuery.cpp +42 -0
  126. data/source/global/tdclatl/RecordsetQuery.h +8 -0
  127. data/source/global/tdclatl/Table.cpp +127 -3
  128. data/source/global/tdclatl/Table.h +10 -1
  129. data/source/global/tdclatl/TableDef.cpp +41 -8
  130. data/source/global/tdclatl/TableDef.h +7 -2
  131. data/source/global/tdclatl/activeTable.cpp +40 -71
  132. data/source/global/tdclatl/resource.h +0 -0
  133. data/source/global/tdclatl/tdclatl.idl +222 -28
  134. data/source/linux/tchar.h +100 -96
  135. data/transactd.gemspec +2 -2
  136. metadata +13 -11
  137. data/BUILD_UNIX-JA.md +0 -161
  138. data/BUILD_WIN-JA.md +0 -326
  139. data/README_ORMSRCGEN-JA.md +0 -115
  140. data/README_ORMSRCGEN.md +0 -118
  141. data/RELEASE_NOTE-JA.md +0 -356
  142. data/RELEASE_NOTE.md +0 -360
  143. data/bin/common/tdclc_32_2_4.dll +0 -0
  144. data/bin/common/tdclc_64_2_4.dll +0 -0
  145. data/source/bzs/test/trdclengn/test_blob.cpp +0 -375
@@ -0,0 +1,3305 @@
1
+ #ifndef BZS_TEST_TRDCLENGN_TESTFIELD_H
2
+ #define BZS_TEST_TRDCLENGN_TESTFIELD_H
3
+ /* =================================================================
4
+ Copyright (C) 2015 BizStation Corp All rights reserved.
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License
8
+ as published by the Free Software Foundation; either version 2
9
+ of the License, or (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program; if not, write to the Free Software
18
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19
+ 02111-1307, USA.
20
+ ================================================================= */
21
+ #include "testbase.h"
22
+ #include <bzs/db/protocol/tdap/btrDate.h>
23
+ #include <limits.h>
24
+ #include <stdlib.h>
25
+
26
+ #define DBNAMEV3 _T("test_v3")
27
+
28
+ const char* sql = "CREATE TABLE `setenumbit` ("
29
+ "`id` int(11) NOT NULL AUTO_INCREMENT,"
30
+ "`set5` set('A','B','C','D','E') DEFAULT '',"
31
+ "`set64` set('a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'g0', 'g1', 'g2', 'g3') DEFAULT '',"
32
+ "`enum2` enum('Y','N') DEFAULT 'N', "
33
+ "`enum260` enum('a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'g0', 'g1', 'g2', 'g3', 'g4', 'g5', 'g6', 'g7', 'g8', 'g9', 'h0', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8', 'h9', 'i0', 'i1', 'i2', 'i3', 'i4', 'i5', 'i6', 'i7', 'i8', 'i9', 'j0', 'j1', 'j2', 'j3', 'j4', 'j5', 'j6', 'j7', 'j8', 'j9', 'k0', 'k1', 'k2', 'k3', 'k4', 'k5', 'k6', 'k7', 'k8', 'k9', 'l0', 'l1', 'l2', 'l3', 'l4', 'l5', 'l6', 'l7', 'l8', 'l9', 'm0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'm9', 'n0', 'n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7', 'n8', 'n9', 'o0', 'o1', 'o2', 'o3', 'o4', 'o5', 'o6', 'o7', 'o8', 'o9', 'p0', 'p1', 'p2', 'p3', 'p4', 'p5', 'p6', 'p7', 'p8', 'p9', 'q0', 'q1', 'q2', 'q3', 'q4', 'q5', 'q6', 'q7', 'q8', 'q9', 'r0', 'r1', 'r2', 'r3', 'r4', 'r5', 'r6', 'r7', 'r8', 'r9', 's0', 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 't0', 't1', 't2', 't3', 't4', 't5', 't6', 't7', 't8', 't9', 'u0', 'u1', 'u2', 'u3', 'u4', 'u5', 'u6', 'u7', 'u8', 'u9', 'v0', 'v1', 'v2', 'v3', 'v4', 'v5', 'v6', 'v7', 'v8', 'v9', 'w0', 'w1', 'w2', 'w3', 'w4', 'w5', 'w6', 'w7', 'w8', 'w9', 'x0', 'x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x9', 'y0', 'y1', 'y2', 'y3', 'y4', 'y5', 'y6', 'y7', 'y8', 'y9', 'z0', 'z1', 'z2', 'z3', 'z4', 'z5', 'z6', 'z7', 'z8', 'z9') DEFAULT 'a0',"
34
+ "`bit1` bit(1) DEFAULT b'0',"
35
+ "`bit8` bit(8) DEFAULT b'0',"
36
+ "`bit32` bit(32) DEFAULT b'0',"
37
+ "`bit64` bit(64) DEFAULT b'0',"
38
+ "PRIMARY KEY (`id`) "
39
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8;";
40
+
41
+
42
+ const char* test_records = "INSERT INTO `setenumbit` (`id`, `set5`, `set64`, `enum2`, `enum260`, `bit1`, `bit8`, `bit32`, `bit64`) VALUES"
43
+ "(1, 'A', 'a0', 'N', 'a0', b'1', b'1', b'1', b'1'),"
44
+ "(2, 'A,B,C,D,E', 'a0,g3', 'Y', 'z9', b'1', b'11111111', b'11111111111111111111111111111111', b'1111111111111111111111111111111111111111111111111111111111111111'),"
45
+ "(3, '', '', '0', '0', b'0', b'00000000', b'00000000', b'00000000'),"
46
+ "(4, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);";
47
+
48
+
49
+
50
+ short createFieldStoreDataBase(database* db)
51
+ {
52
+ db->create(makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME));
53
+ if (db->stat() == STATUS_TABLE_EXISTS_ERROR)
54
+ {
55
+ db->open(makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME));
56
+ if (db->stat()) return db->stat();
57
+ db->drop();
58
+ db->create(makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME));
59
+ }
60
+ if (db->stat()) return db->stat();
61
+ return 0;
62
+ }
63
+
64
+ short createTestTable1(database* db)
65
+ {
66
+ try
67
+ {
68
+ openDatabase(db, makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME), TYPE_SCHEMA_BDF,TD_OPEN_NORMAL);
69
+ dbdef* def = db->dbDef();
70
+ short tableid = 1;
71
+
72
+ insertTable(def, tableid, _T("fieldtest"), g_td_charsetIndex);
73
+ short fieldnum = 0;
74
+ fielddef* fd;
75
+ insertField(def, tableid, fieldnum, _T("id"), ft_integer, 4);
76
+
77
+ int lens[5] = {1, 2, 3, 4, 8};
78
+ _TCHAR buf[50];
79
+ //int
80
+ for (int i=1; i < 6 ; ++i)
81
+ {
82
+ _stprintf_s(buf, 50, _T("int_%d_byte"), lens[i-1]);
83
+ fd = insertField(def, tableid, ++fieldnum, buf, ft_integer, lens[i-1]);
84
+ if (i==4)
85
+ fd->setDefaultValue((__int64)INT_MIN);
86
+ if (i==5)
87
+ fd->setDefaultValue(LLONG_MIN);
88
+
89
+ }
90
+
91
+ //unsigned int
92
+ for (int i=1; i < 6 ; ++i)
93
+ {
94
+ _stprintf_s(buf, 50, _T("uint_%d_byte"), lens[i-1]);
95
+ fd = insertField(def, tableid, ++fieldnum, buf, ft_uinteger, lens[i-1]);
96
+ if (i==4)
97
+ fd->setDefaultValue((__int64)UINT_MAX);
98
+ if (i==5)
99
+ fd->setDefaultValue((__int64)ULLONG_MAX);
100
+ }
101
+
102
+ //myyear
103
+ insertField(def, tableid, ++fieldnum, _T("year"), ft_myyear, 1);
104
+
105
+ //logical
106
+ insertField(def, tableid, ++fieldnum, _T("logical1"), ft_logical, 1);
107
+ insertField(def, tableid, ++fieldnum, _T("logical2"), ft_logical, 2);
108
+
109
+ //mydate
110
+ insertField(def, tableid, ++fieldnum, _T("date"), ft_mydate, 3);
111
+
112
+ //double
113
+ insertField(def, tableid, ++fieldnum, _T("double4.0"), ft_float, 4);
114
+ fd = insertField(def, tableid, ++fieldnum, _T("double4.4"), ft_float, 4);
115
+ fd->decimals = 4;
116
+
117
+ insertField(def, tableid, ++fieldnum, _T("double8.0"), ft_float, 8);
118
+ fd = insertField(def, tableid, ++fieldnum, _T("double8.5"), ft_float, 8);
119
+ fd->decimals = 15;
120
+
121
+ //decimal
122
+ /*for (int i=1; i < 66 ; ++i)
123
+ {
124
+ _stprintf_s(buf, 50, _T("dec_%d_digits"), i);
125
+ fd = insertField(def, tableid, ++fieldnum, buf, ft_mydecimal, 0);
126
+ fd->setLenByDecimal(i, (i-1) % 30);
127
+ }*/
128
+ fd = insertField(def, tableid, ++fieldnum, _T("dec1"), ft_mydecimal, 1);
129
+ fd->setDecimalDigits(15, 5);
130
+
131
+ fd = insertField(def, tableid, ++fieldnum, _T("dec2"), ft_mydecimal, 1);
132
+ fd->setDecimalDigits(65, 30);
133
+
134
+ fd = insertField(def, tableid, ++fieldnum, _T("dec3"), ft_mydecimal, 1);
135
+ fd->setDecimalDigits(1, 0);
136
+
137
+ fd = insertField(def, tableid, ++fieldnum, _T("dec4"), ft_mydecimal, 1);
138
+ fd->setDecimalDigits(11, 11);
139
+
140
+ fd = insertField(def, tableid, ++fieldnum, _T("dec5"), ft_mydecimal, 1);
141
+ fd->setDecimalDigits(15, 5);
142
+
143
+ fd = insertField(def, tableid, ++fieldnum, _T("dec6"), ft_mydecimal, 1);
144
+ fd->setDecimalDigits(65, 30);
145
+
146
+ fd = insertField(def, tableid, ++fieldnum, _T("dec7"), ft_mydecimal, 1);
147
+ fd->setDecimalDigits(1, 0);
148
+
149
+ fd = insertField(def, tableid, ++fieldnum, _T("dec8"), ft_mydecimal, 1);
150
+ fd->setDecimalDigits(11, 11);
151
+
152
+ keydef* kd = insertKey(def, tableid, 0);
153
+ kd->segments[0].fieldNum = 0;
154
+ kd->segments[0].flags.kf_extend = 1; // extended key type
155
+ kd->segments[0].flags.kf_changeatable = 1; // changeable
156
+ kd->segmentCount = 1;
157
+
158
+ tabledef* td = def->tableDefs(tableid);
159
+ td->primaryKeyNum = 0;
160
+ updateTableDef(def, tableid);
161
+ return 0;
162
+
163
+ }
164
+ catch (bzs::rtl::exception& e)
165
+ {
166
+ _tprintf(_T("Error! %s\n"), (*getMsg(e)).c_str());
167
+ }
168
+ return 1;
169
+ }
170
+
171
+ short createTestTableLegacyTimeTable(database* db)
172
+ {
173
+ try
174
+ {
175
+ dbdef* def = db->dbDef();
176
+ short tableid = 2;
177
+
178
+ insertTable(def, tableid, _T("timetestLegacy"), g_td_charsetIndex);
179
+ short fieldnum = 0;
180
+ insertField(def, tableid, fieldnum, _T("id"), ft_integer, 4);
181
+
182
+ //time
183
+ insertField(def, tableid, ++fieldnum, _T("time"), ft_mytime, 3);
184
+
185
+ //datetime
186
+ insertField(def, tableid, ++fieldnum, _T("datetime"), ft_mydatetime, 8);
187
+
188
+ //timestamp
189
+ insertField(def, tableid, ++fieldnum, _T("timestamp"), ft_mytimestamp, 4);
190
+
191
+
192
+ keydef* kd = insertKey(def, tableid, 0);
193
+ kd->segments[0].fieldNum = 0;
194
+ kd->segments[0].flags.kf_extend = 1; // extended key type
195
+ kd->segments[0].flags.kf_changeatable = 1; // changeable
196
+ kd->segmentCount = 1;
197
+
198
+ tabledef* td = def->tableDefs(tableid);
199
+ td->primaryKeyNum = 0;
200
+ updateTableDef(def, tableid);
201
+ return 0;
202
+
203
+ }
204
+ catch (bzs::rtl::exception& e)
205
+ {
206
+ _tprintf(_T("Error! %s\n"), (*getMsg(e)).c_str());
207
+ }
208
+ return 1;
209
+ }
210
+
211
+ /* If MySQL internal table flag has HA_OPTION_PACK_RECORD
212
+ then null_bit is offset one.
213
+ */
214
+ short createTestTableHA_OPTION_PACK_RECORD(database* db)
215
+ {
216
+ try
217
+ {
218
+ dbdef* def = db->dbDef();
219
+ short tableid = 3;
220
+
221
+ insertTable(def, tableid, _T("packrecord_test"), g_td_charsetIndex);
222
+ short fieldnum = 0;
223
+ fielddef* fd = insertField(def, tableid, fieldnum, _T("id"), ft_integer, 4);
224
+
225
+ fd = insertField(def, tableid, ++fieldnum, _T("int"), ft_integer, 4);
226
+ fd->setNullable(true, false);
227
+
228
+ keydef* kd = insertKey(def, tableid, 0);
229
+ kd->segments[0].fieldNum = 0;
230
+ kd->segments[0].flags.kf_extend = 1; // extended key type
231
+ kd->segments[0].flags.kf_changeatable = 1; // changeable
232
+ kd->segmentCount = 1;
233
+
234
+ tabledef* td = def->tableDefs(tableid);
235
+ td->primaryKeyNum = 0;
236
+ updateTableDef(def, tableid);
237
+ return 0;
238
+
239
+ }
240
+ catch (bzs::rtl::exception& e)
241
+ {
242
+ _tprintf(_T("Error! %s\n"), (*getMsg(e)).c_str());
243
+ }
244
+ return 1;
245
+ }
246
+
247
+ short createTestTableTime(database* db, bool isMariadb, uchar_td minorVersion, bool isSupportMultiTimeStamp)
248
+ {
249
+ try
250
+ {
251
+ dbdef* def = db->dbDef();
252
+ short tableid = 2;
253
+
254
+ insertTable(def, tableid, _T("timetest"), g_td_charsetIndex);
255
+ tabledef* td = def->tableDefs(tableid);
256
+ td->primaryKeyNum = 0;
257
+ td->setValidationTarget(isMariadb, minorVersion);
258
+
259
+ short fieldnum = 0;
260
+ insertField(def, tableid, fieldnum, _T("id"), ft_integer, 4);
261
+
262
+ //time
263
+ fielddef* fd = insertField(def, tableid, ++fieldnum, _T("time5"), ft_mytime, 5);
264
+ fd->decimals = 3;
265
+ insertField(def, tableid, ++fieldnum, _T("time3"), ft_mytime, 3);
266
+ fd = insertField(def, tableid, ++fieldnum, _T("time4"), ft_mytime, 4);
267
+ fd->decimals = 2;
268
+ fd = insertField(def, tableid, ++fieldnum, _T("time6"), ft_mytime, 6);
269
+ fd->decimals = 6;
270
+
271
+ //datetime
272
+ fd = insertField(def, tableid, ++fieldnum, _T("datetime7"), ft_mydatetime, 7);
273
+ fd->decimals = 3;
274
+ insertField(def, tableid, ++fieldnum, _T("datetime5"), ft_mydatetime, 5);
275
+ fd = insertField(def, tableid, ++fieldnum, _T("datetime6"), ft_mydatetime, 6);
276
+ fd->decimals = 2;
277
+ fd = insertField(def, tableid, ++fieldnum, _T("datetime8"), ft_mydatetime, 8);
278
+ fd->decimals = 6;
279
+
280
+ //timestamp
281
+ fd = insertField(def, tableid, ++fieldnum, _T("timestamp6"), ft_mytimestamp, 6);
282
+ fd->decimals = 3;
283
+
284
+ if (isSupportMultiTimeStamp)
285
+ {
286
+ fd = insertField(def, tableid, ++fieldnum, _T("timestamp4"), ft_mytimestamp, 4);
287
+ fd->setNullable(true);
288
+ fd = insertField(def, tableid, ++fieldnum, _T("timestamp5"), ft_mytimestamp, 5);
289
+ fd->decimals = 2;
290
+ fd->setNullable(true);
291
+ fd = insertField(def, tableid, ++fieldnum, _T("timestamp7"), ft_mytimestamp, 7);
292
+ fd->decimals = 6;
293
+ fd->setNullable(true);
294
+ }
295
+ keydef* kd = insertKey(def, tableid, 0);
296
+ kd->segments[0].fieldNum = 0;
297
+ kd->segments[0].flags.kf_extend = 1; // extended key type
298
+ kd->segments[0].flags.kf_changeatable = 1; // changeable
299
+ kd->segmentCount = 1;
300
+
301
+
302
+ updateTableDef(def, tableid);
303
+ return 0;
304
+
305
+ }
306
+ catch (bzs::rtl::exception& e)
307
+ {
308
+ _tprintf(_T("Error! %s\n"), (*getMsg(e)).c_str());
309
+ }
310
+ return 1;
311
+ }
312
+
313
+ short createTestInMany(database* db)
314
+ {
315
+ try
316
+ {
317
+ dbdef* def = db->dbDef();
318
+ short tableid = 4;
319
+
320
+ insertTable(def, tableid, _T("nullkey"), g_td_charsetIndex);
321
+ tabledef* td = def->tableDefs(tableid);
322
+ td->primaryKeyNum = 0;
323
+
324
+ short fieldnum = 0;
325
+ insertField(def, tableid, fieldnum, _T("id"), ft_autoinc, 4);
326
+
327
+ //time
328
+ fielddef* fd = insertField(def, tableid, ++fieldnum, _T("id2"), ft_integer, 4);
329
+ fd->setNullable(true);
330
+ fd = insertField(def, tableid, ++fieldnum, _T("id3"), ft_integer, 4);
331
+ fd->setNullable(true);
332
+ fd = insertField(def, tableid, ++fieldnum, _T("name"), ft_myvarchar, 151);
333
+ fd->setLenByCharnum(50);
334
+ fd->setNullable(true);
335
+
336
+
337
+ keydef* kd = insertKey(def, tableid, 0);
338
+ kd->segments[0].fieldNum = 0;
339
+ kd->segments[0].flags.kf_extend = 1;
340
+ kd->segments[0].flags.kf_changeatable = 1;
341
+ kd->segmentCount = 1;
342
+
343
+ kd = insertKey(def, tableid, 1);
344
+ kd->segments[0].fieldNum = 1;
345
+ kd->segments[0].flags.kf_extend = 1;
346
+ kd->segments[0].flags.kf_changeatable = 1;
347
+ kd->segments[0].flags.kf_duplicatable = 1;
348
+ kd->segments[0].flags.kf_allseg_nullkey = 1;
349
+ kd->segmentCount = 1;
350
+
351
+ kd = insertKey(def, tableid, 2);
352
+ kd->segments[0].fieldNum = 1;
353
+ kd->segments[0].flags.kf_extend = 1;
354
+ kd->segments[0].flags.kf_changeatable = 1;
355
+ kd->segments[0].flags.kf_duplicatable = 1;
356
+ kd->segments[1].fieldNum = 2;
357
+ kd->segments[1].flags.kf_extend = 1;
358
+ kd->segments[1].flags.kf_changeatable = 1;
359
+ kd->segments[1].flags.kf_duplicatable = 1;
360
+ kd->segmentCount = 2;
361
+ updateTableDef(def, tableid);
362
+ return 0;
363
+
364
+ }
365
+ catch (bzs::rtl::exception& e)
366
+ {
367
+ _tprintf(_T("Error! %s\n"), (*getMsg(e)).c_str());
368
+ }
369
+ return 1;
370
+ }
371
+
372
+ short createTestNull(database* db)
373
+ {
374
+ try
375
+ {
376
+ dbdef* def = db->dbDef();
377
+ short tableid = 5;
378
+
379
+ insertTable(def, tableid, _T("nullvalue"), g_td_charsetIndex);
380
+ tabledef* td = def->tableDefs(tableid);
381
+ td->primaryKeyNum = 0;
382
+
383
+ short fieldnum = 0;
384
+ insertField(def, tableid, fieldnum, _T("id"), ft_autoinc, 4);
385
+ fielddef* fd = insertField(def, tableid, ++fieldnum, _T("id2"), ft_integer, 4);
386
+ fd->setNullable(true);
387
+ fd = insertField(def, tableid, ++fieldnum, _T("id3"), ft_integer, 4);
388
+ fd->setNullable(true);
389
+ fd = insertField(def, tableid, ++fieldnum, _T("name"), ft_myvarchar, 151);
390
+ fd->setLenByCharnum(50);
391
+ fd->setNullable(true);
392
+
393
+ keydef* kd = insertKey(def, tableid, 0);
394
+ kd->segments[0].fieldNum = 0;
395
+ kd->segments[0].flags.kf_extend = 1;
396
+ kd->segments[0].flags.kf_changeatable = 1;
397
+ kd->segmentCount = 1;
398
+
399
+ kd = insertKey(def, tableid, 1);
400
+ kd->segments[0].fieldNum = 1;
401
+ kd->segments[0].flags.kf_extend = 1;
402
+ kd->segments[0].flags.kf_changeatable = 1;
403
+ kd->segments[0].flags.kf_duplicatable = 1;
404
+ kd->segmentCount = 1;
405
+
406
+ kd = insertKey(def, tableid, 2);
407
+ kd->segments[0].fieldNum = 1;
408
+ kd->segments[0].flags.kf_extend = 1;
409
+ kd->segments[0].flags.kf_changeatable = 1;
410
+ kd->segments[0].flags.kf_duplicatable = 1;
411
+ kd->segments[1].fieldNum = 2;
412
+ kd->segments[1].flags.kf_extend = 1;
413
+ kd->segments[1].flags.kf_changeatable = 1;
414
+ kd->segments[1].flags.kf_duplicatable = 1;
415
+ kd->segmentCount = 2;
416
+ updateTableDef(def, tableid);
417
+ return 0;
418
+ }
419
+ catch (bzs::rtl::exception& e)
420
+ {
421
+ _tprintf(_T("Error! %s\n"), (*getMsg(e)).c_str());
422
+ }
423
+ return 1;
424
+ }
425
+
426
+ short createTestGroups(database* db)
427
+ {
428
+ try
429
+ {
430
+ dbdef* def = db->dbDef();
431
+ short tableid = 6;
432
+
433
+ insertTable(def, tableid, _T("groups"), g_td_charsetIndex);
434
+ tabledef* td = def->tableDefs(tableid);
435
+ td->primaryKeyNum = 0;
436
+
437
+ short fieldnum = 0;
438
+ insertField(def, tableid, fieldnum, _T("pri_id"), ft_autoinc, 4);
439
+ fielddef* fd = insertField(def, tableid, ++fieldnum, _T("id"), ft_integer, 4);
440
+ fd->setNullable(true);
441
+ fd = insertField(def, tableid, ++fieldnum, _T("name"), ft_myvarchar, 151);
442
+ fd->setLenByCharnum(50);
443
+
444
+ keydef* kd = insertKey(def, tableid, 0);
445
+ kd->segments[0].fieldNum = 0;
446
+ kd->segments[0].flags.kf_extend = 1;
447
+ kd->segments[0].flags.kf_changeatable = 1;
448
+ kd->segmentCount = 1;
449
+
450
+ kd = insertKey(def, tableid, 1);
451
+ kd->segments[0].fieldNum = 1;
452
+ kd->segments[0].flags.kf_extend = 1;
453
+ kd->segments[0].flags.kf_changeatable = 1;
454
+ kd->segments[0].flags.kf_duplicatable = 1;
455
+ kd->segmentCount = 1;
456
+
457
+ kd = insertKey(def, tableid, 2);
458
+ kd->segments[0].fieldNum = 0;
459
+ kd->segments[0].flags.kf_extend = 1;
460
+ kd->segments[0].flags.kf_changeatable = 1;
461
+
462
+ kd->segments[1].fieldNum = 1;
463
+ kd->segments[1].flags.kf_extend = 1;
464
+ kd->segments[1].flags.kf_changeatable = 1;
465
+ kd->segmentCount = 2;
466
+ updateTableDef(def, tableid);
467
+ return 0;
468
+ }
469
+ catch (bzs::rtl::exception& e)
470
+ {
471
+ _tprintf(_T("Error! %s\n"), (*getMsg(e)).c_str());
472
+ }
473
+ return 1;
474
+ }
475
+
476
+ short createTestUsers(database* db)
477
+ {
478
+ try
479
+ {
480
+ dbdef* def = db->dbDef();
481
+ short tableid = 7;
482
+
483
+ insertTable(def, tableid, _T("users"), g_td_charsetIndex);
484
+ tabledef* td = def->tableDefs(tableid);
485
+ td->primaryKeyNum = 0;
486
+
487
+ short fieldnum = 0;
488
+ insertField(def, tableid, fieldnum, _T("id"), ft_autoinc, 4);
489
+ fielddef* fd = insertField(def, tableid, ++fieldnum, _T("group"), ft_integer, 4);
490
+ fd->setNullable(true);
491
+ fd = insertField(def, tableid, ++fieldnum, _T("class"), ft_integer, 4);
492
+ fd->setNullable(true);
493
+ fd = insertField(def, tableid, ++fieldnum, _T("name"), ft_myvarchar, 151);
494
+ fd->setLenByCharnum(50);
495
+
496
+ keydef* kd = insertKey(def, tableid, 0);
497
+ kd->segments[0].fieldNum = 0;
498
+ kd->segments[0].flags.kf_extend = 1;
499
+ kd->segments[0].flags.kf_changeatable = 1;
500
+ kd->segmentCount = 1;
501
+
502
+ kd = insertKey(def, tableid, 1);
503
+ kd->segments[0].fieldNum = 1;
504
+ kd->segments[0].flags.kf_extend = 1;
505
+ kd->segments[0].flags.kf_changeatable = 1;
506
+ kd->segments[0].flags.kf_duplicatable = 1;
507
+ kd->segmentCount = 1;
508
+ updateTableDef(def, tableid);
509
+ return 0;
510
+ }
511
+ catch (bzs::rtl::exception& e)
512
+ {
513
+ _tprintf(_T("Error! %s\n"), (*getMsg(e)).c_str());
514
+ }
515
+ return 1;
516
+ }
517
+
518
+ short createTestScores(database* db)
519
+ {
520
+ try
521
+ {
522
+ dbdef* def = db->dbDef();
523
+ short tableid = 8;
524
+
525
+ insertTable(def, tableid, _T("scores"), g_td_charsetIndex);
526
+ tabledef* td = def->tableDefs(tableid);
527
+ td->primaryKeyNum = 0;
528
+
529
+ short fieldnum = 0;
530
+ fielddef* fd = insertField(def, tableid, fieldnum, _T("id"), ft_autoinc, 4);
531
+ fd = insertField(def, tableid, ++fieldnum, _T("subject"), ft_integer, 4);
532
+ fd = insertField(def, tableid, ++fieldnum, _T("score"), ft_integer, 4);
533
+ fd->setNullable(true);
534
+
535
+ keydef* kd = insertKey(def, tableid, 0);
536
+ kd->segments[0].fieldNum = 0;
537
+ kd->segments[0].flags.kf_extend = 1;
538
+ kd->segments[0].flags.kf_changeatable = 1;
539
+ kd->segmentCount = 1;
540
+ updateTableDef(def, tableid);
541
+ return 0;
542
+ }
543
+ catch (bzs::rtl::exception& e)
544
+ {
545
+ _tprintf(_T("Error! %s\n"), (*getMsg(e)).c_str());
546
+ }
547
+ return 1;
548
+ }
549
+
550
+ #define exec_sql createTable //exec sql for no result recordset. like a createTable.
551
+
552
+ class fixtureFieldStore
553
+ {
554
+ mutable database* m_db;
555
+ btrVersion ver;
556
+
557
+ public:
558
+ fixtureFieldStore() : m_db(NULL)
559
+ {
560
+ nsdatabase::setCheckTablePtr(true);
561
+ m_db = database::create();
562
+ if (!m_db)
563
+ printf("Error database::create()\n");
564
+ short ret = createFieldStoreDataBase(m_db);
565
+ if (ret)
566
+ {
567
+ printf("Error createDataBase\n");
568
+ return;
569
+ }else
570
+ {
571
+ ret = createTestTable1(m_db);
572
+ if (ret == 0)
573
+ {
574
+ btrVersions vs;
575
+ m_db->getBtrVersion(&vs);
576
+ if (m_db->stat())
577
+ {
578
+ printf("Error getBtrVersion\n");
579
+ return;
580
+ }
581
+ ver = vs.versions[1];
582
+
583
+ if (ret == 0)
584
+ { if (isLegacyTimeFormat())
585
+ ret = createTestTableLegacyTimeTable(m_db);
586
+ else
587
+ ret = createTestTableTime(m_db, ver.isMariaDB(), (uchar_td)ver.minorVersion,
588
+ isSupportMultiTimeStamp());
589
+ if (ret == 0)
590
+ ret = createTestTableHA_OPTION_PACK_RECORD(m_db);
591
+ if (ret == 0)
592
+ ret = createTestInMany(m_db);
593
+ if (ret == 0)
594
+ ret = createTestNull(m_db);
595
+ if (ret == 0)
596
+ ret = createTestGroups(m_db);
597
+ if (ret == 0)
598
+ ret = createTestUsers(m_db);
599
+ if (ret == 0)
600
+ ret = createTestScores(m_db);
601
+
602
+ if (ret == 0)
603
+ m_db->open(makeUri(PROTOCOL, HOSTNAME, DBNAMEV3, BDFNAME), TYPE_SCHEMA_BDF,TD_OPEN_NORMAL);
604
+ if (m_db->stat() == 0)
605
+ {
606
+ m_db->createTable(sql); // This table is not listed in test.bdf
607
+ if (m_db->stat() == 0)
608
+ m_db->exec_sql(test_records);
609
+ }
610
+ }
611
+ }
612
+ ret = m_db->stat();
613
+ }
614
+ if (ret)
615
+ printf("Error createTable\n");
616
+ }
617
+
618
+ ~fixtureFieldStore()
619
+ {
620
+ if (m_db)
621
+ m_db->release();
622
+ }
623
+ ::database* db() const { return m_db; }
624
+
625
+ bool isMysql56TimeFormat() const { return ver.isMysql56TimeFormat(); }
626
+ bool isLegacyTimeFormat() const{ return ver.isFullLegacyTimeFormat(); }
627
+ bool isSupportMultiTimeStamp() const { return ver.isSupportMultiTimeStamp(); }
628
+ };
629
+ #define TEST_DATE _T("2015-11-10")
630
+ #define TEST_DATEA "2015-11-10"
631
+
632
+ void testModeMacro()
633
+ {
634
+ short mode = TD_OPEN_READONLY_EXCLUSIVE + TD_OPEN_MASK_MYSQL_NULL + TD_OPEN_MASK_GETSHCHEMA;
635
+ BOOST_CHECK_MESSAGE(IS_MODE_READONLY(mode) == true, "IS_MODE_READONLY ");
636
+ BOOST_CHECK_MESSAGE(IS_MODE_EXCLUSIVE(mode) == true, "IS_MODE_EXCLUSIVE ");
637
+ BOOST_CHECK_MESSAGE(IS_MODE_MYSQL_NULL(mode) == true, "IS_MODE_MYSQL_NULL ");
638
+ BOOST_CHECK_MESSAGE(IS_MODE_GETSCHEMA(mode) == true, "IS_MODE_GETSCHEMA ");
639
+
640
+ mode = 0;
641
+ BOOST_CHECK_MESSAGE(IS_MODE_READONLY(mode) == false, "IS_MODE_READONLY false");
642
+ BOOST_CHECK_MESSAGE(IS_MODE_EXCLUSIVE(mode) == false, "IS_MODE_EXCLUSIVE false");
643
+ BOOST_CHECK_MESSAGE(IS_MODE_MYSQL_NULL(mode) == false, "IS_MODE_MYSQL_NULL false");
644
+ BOOST_CHECK_MESSAGE(IS_MODE_GETSCHEMA(mode) == false, "IS_MODE_GETSCHEMA false");
645
+ }
646
+ #pragma warning(disable : 4996)
647
+
648
+ #define MINT_MIN -8388608
649
+ #define UMINT_MAX 16777215
650
+ #define FLOAT_V1 -1234.0f
651
+ #define FLOAT_V2 1234.1234f
652
+
653
+ #define DOUBLE_V1 (double)-12345678.0
654
+ #define DOUBLE_V2 (double)0.1234567890123
655
+
656
+ #define DEC_V1 (double)1234567890.12345
657
+ #define DEC_V1LL 1234567890LL
658
+
659
+ #define DEC_V2 (double)5.0000010000500001
660
+ #define DEC_V2LL 5LL
661
+ #define DEC_V2SA "5.000001000050000100000000000000"
662
+ #define DEC_V2S _T(DEC_V2SA)
663
+
664
+ #define DEC_V3 (double)3.0
665
+ #define DEC_V3LL 3LL
666
+
667
+ #define DEC_V4 (double)0.23456789010
668
+ #define DEC_V4LL 0LL
669
+
670
+ #define DEC_V5 (double)-1234567890.12345
671
+ #define DEC_V5LL -1234567890LL
672
+
673
+ #define DEC_V6 (double)-5.0000010000500001
674
+ #define DEC_V6LL -5LL
675
+ #define DEC_V6SA "-5.000001000050000100000000000000"
676
+ #define DEC_V6S _T(DEC_V6SA)
677
+
678
+ #define DEC_V7 (double)-3.0
679
+ #define DEC_V7LL -3LL
680
+
681
+ #define DEC_V8 (double)-0.23456789010
682
+ #define DEC_V8LL -0LL
683
+
684
+ void checkIntValue(table_ptr tb)
685
+ {
686
+ short fieldnum = 0;
687
+ // read by int64
688
+ BOOST_CHECK(tb->getFVbyt(++fieldnum) == SCHAR_MAX);
689
+ BOOST_CHECK(tb->getFVsht(++fieldnum) == SHRT_MAX);
690
+ BOOST_CHECK(tb->getFVint(++fieldnum) == MINT_MIN);
691
+ BOOST_CHECK(tb->getFVint(++fieldnum) == INT_MAX);
692
+ BOOST_CHECK(tb->getFV64(++fieldnum) == LLONG_MAX);
693
+
694
+ BOOST_CHECK(tb->getFVsht(++fieldnum) == UCHAR_MAX - 1);
695
+ BOOST_CHECK(tb->getFVint(++fieldnum) == USHRT_MAX - 1);
696
+ BOOST_CHECK(tb->getFVint(++fieldnum) == UMINT_MAX - 1);
697
+ BOOST_CHECK(tb->getFV64(++fieldnum) == UINT_MAX - 1);
698
+ BOOST_CHECK((unsigned __int64)tb->getFV64(++fieldnum) == ULLONG_MAX - 1);
699
+
700
+ BOOST_CHECK(tb->getFVsht(++fieldnum) == 2000);
701
+ BOOST_CHECK(tb->getFVbyt(++fieldnum) == 254); //logi1
702
+ BOOST_CHECK(tb->getFVint(++fieldnum) == 65000); //logi2
703
+ myDate d;
704
+ d = TEST_DATE;
705
+ BOOST_CHECK(tb->getFVint(++fieldnum) == d.i); //date
706
+
707
+ BOOST_CHECK(tb->getFVint(++fieldnum) == FLOAT_V1); //double
708
+ ++fieldnum;//BOOST_CHECK(tb->getFVint(++fieldnum) == FLOAT_V2);
709
+ BOOST_CHECK(tb->getFV64(++fieldnum) == DOUBLE_V1);
710
+ ++fieldnum;
711
+ BOOST_CHECK(tb->getFV64(++fieldnum) == DEC_V1LL); //decimal
712
+ BOOST_CHECK(tb->getFV64(++fieldnum) == DEC_V2LL); //decimal
713
+ BOOST_CHECK(tb->getFV64(++fieldnum) == DEC_V3LL); //decimal
714
+ BOOST_CHECK(tb->getFV64(++fieldnum) == DEC_V4LL); //decimal
715
+ BOOST_CHECK(tb->getFV64(++fieldnum) == DEC_V5LL); //decimal
716
+ BOOST_CHECK(tb->getFV64(++fieldnum) == DEC_V6LL); //decimal
717
+ BOOST_CHECK(tb->getFV64(++fieldnum) == DEC_V7LL); //decimal
718
+ BOOST_CHECK(tb->getFV64(++fieldnum) == DEC_V8LL); //decimal
719
+
720
+
721
+ // read by double
722
+ BOOST_CHECK(tb->getFVdbl(1) == SCHAR_MAX);
723
+ BOOST_CHECK(tb->getFVdbl(3) == MINT_MIN);
724
+ double v = tb->getFVdbl(5);
725
+ BOOST_CHECK(v == ((double)LLONG_MAX));
726
+ BOOST_CHECK(tb->getFVdbl(6) == UCHAR_MAX - 1);
727
+ BOOST_CHECK(tb->getFVdbl(8) == UMINT_MAX - 1);
728
+ fieldnum = 9;
729
+ v = tb->getFVdbl(++fieldnum);
730
+ BOOST_CHECK(v == ((double)ULLONG_MAX - 1));
731
+ BOOST_CHECK(tb->getFVdbl(++fieldnum) == 2000);
732
+ BOOST_CHECK(tb->getFVdbl(++fieldnum) == 254); //logi1
733
+ BOOST_CHECK(tb->getFVdbl(++fieldnum) == 65000); //logi2
734
+ BOOST_CHECK(tb->getFVdbl(++fieldnum) == (double)d.i); //date
735
+
736
+ float f = tb->getFVflt(++fieldnum);
737
+ BOOST_CHECK(f == FLOAT_V1); //double
738
+ f = tb->getFVflt(++fieldnum);
739
+ BOOST_CHECK(f == FLOAT_V2);
740
+ v = tb->getFVdbl(++fieldnum);
741
+ BOOST_CHECK(v == DOUBLE_V1);
742
+ v = tb->getFVdbl(++fieldnum);
743
+ if (DOUBLE_V2 > v)
744
+ v = DOUBLE_V2 - v;
745
+ else
746
+ v = v - DOUBLE_V2;
747
+
748
+ BOOST_CHECK(v < 0.000000001f);
749
+
750
+ //decimal
751
+ BOOST_CHECK(tb->getFVdbl(++fieldnum) == DEC_V1);
752
+ BOOST_CHECK(tb->getFVdbl(++fieldnum) == DEC_V2);
753
+ BOOST_CHECK(tb->getFVdbl(++fieldnum) == DEC_V3);
754
+ BOOST_CHECK(tb->getFVdbl(++fieldnum) == DEC_V4);
755
+ BOOST_CHECK(tb->getFVdbl(++fieldnum) == DEC_V5);
756
+ BOOST_CHECK(tb->getFVdbl(++fieldnum) == DEC_V6);
757
+ BOOST_CHECK(tb->getFVdbl(++fieldnum) == DEC_V7);
758
+ BOOST_CHECK(tb->getFVdbl(++fieldnum) == DEC_V8);
759
+
760
+ //read by string
761
+ _TCHAR buf[50];
762
+ BOOST_CHECK(_tcscmp(tb->getFVstr(1), _ltot(SCHAR_MAX, buf, 10)) == 0);
763
+ BOOST_CHECK(_tcscmp(tb->getFVstr(3), _ltot(MINT_MIN, buf, 10)) == 0);
764
+ _i64tot_s(LLONG_MAX, buf, 50, 10);
765
+ BOOST_CHECK(_tcscmp(tb->getFVstr(5), buf) == 0);
766
+ BOOST_CHECK(_tcscmp(tb->getFVstr(6), _ultot(UCHAR_MAX - 1, buf, 10)) == 0);
767
+ BOOST_CHECK(_tcscmp(tb->getFVstr(8), _ultot(UMINT_MAX - 1, buf, 10)) == 0);
768
+ fieldnum = 9;
769
+ _ui64tot_s(ULLONG_MAX - 1, buf, 50, 10);
770
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), buf) == 0);
771
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), _ltot(2000, buf, 10)) == 0);
772
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), _ltot(254, buf, 10)) == 0); //logi1
773
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), _ltot(65000, buf, 10)) == 0); //logi2
774
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), TEST_DATE) == 0); //date
775
+
776
+ _TCHAR tmp[64];
777
+ _stprintf(tmp, _T("%0.0f"), FLOAT_V1);
778
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), tmp) == 0); //double
779
+ _stprintf(tmp, _T("%0.4f"), FLOAT_V2);
780
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), tmp) == 0); //double
781
+ _stprintf(tmp, _T("%0.0f"), DOUBLE_V1);
782
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), tmp) == 0); //double
783
+ _stprintf(tmp, _T("%0.15lf"), DOUBLE_V2);
784
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), tmp) == 0); //double
785
+
786
+ _stprintf(tmp, _T("%0.5lf"), DEC_V1);
787
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), tmp) == 0); //decimal
788
+ _stprintf(tmp, _T("%s"), DEC_V2S);
789
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), tmp) == 0); //decimal
790
+ _stprintf(tmp, _T("%0.0lf"), DEC_V3);
791
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), tmp) == 0); //decimal
792
+ _stprintf(tmp, _T("%0.11lf"), DEC_V4);
793
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), tmp) == 0); //decimal
794
+
795
+ _stprintf(tmp, _T("%0.5lf"), DEC_V5);
796
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), tmp) == 0); //decimal
797
+ _stprintf(tmp, _T("%s"), DEC_V6S);
798
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), tmp) == 0); //decimal
799
+ _stprintf(tmp, _T("%0.0lf"), DEC_V7);
800
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), tmp) == 0); //decimal
801
+ _stprintf(tmp, _T("%0.11lf"), DEC_V8);
802
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), tmp) == 0); //decimal
803
+
804
+ }
805
+
806
+ void testStoreInt(database* db)
807
+ {
808
+ short tableid = 1;
809
+ short fieldnum = 0;
810
+ table_ptr tb = openTable(db, tableid, TD_OPEN_NORMAL);
811
+
812
+ //int64 store
813
+ tb->clearBuffer();
814
+ tb->setFV(_T("id"), 1);
815
+
816
+ tb->setFV(++fieldnum, (short)SCHAR_MAX);
817
+ tb->setFV(++fieldnum, (short)SHRT_MAX);
818
+ tb->setFV(++fieldnum, (int)MINT_MIN);
819
+
820
+ BOOST_CHECK(tb->getFVint(++fieldnum) == INT_MIN);// check default value
821
+ tb->setFV(fieldnum, (int)INT_MAX);
822
+ BOOST_CHECK(tb->getFV64(++fieldnum) == LLONG_MIN);// check default value
823
+ tb->setFV(fieldnum, (__int64)LLONG_MAX);
824
+
825
+ tb->setFV(++fieldnum, (short)(UCHAR_MAX - 1));
826
+ tb->setFV(++fieldnum, (int)(USHRT_MAX - 1));
827
+ tb->setFV(++fieldnum, (int)(UMINT_MAX - 1));
828
+ BOOST_CHECK(tb->getFV64(++fieldnum) == UINT_MAX);// check default value
829
+ tb->setFV(fieldnum, (__int64)(UINT_MAX - 1));
830
+ BOOST_CHECK((unsigned __int64)tb->getFV64(++fieldnum) == ULLONG_MAX);// check default value
831
+ tb->setFV(fieldnum, (__int64)(ULLONG_MAX - 1));
832
+ tb->setFV(++fieldnum, 2000);
833
+ tb->setFV(++fieldnum, 254); //logi1
834
+ tb->setFV(++fieldnum, (int)65000); //logi2
835
+ myDate d; d = TEST_DATE;
836
+ tb->setFV(++fieldnum, d.i);
837
+ tb->setFV(++fieldnum, (int)FLOAT_V1);
838
+ tb->setFV(++fieldnum, FLOAT_V2);
839
+ tb->setFV(++fieldnum, (__int64)DOUBLE_V1);
840
+ tb->setFV(++fieldnum, DOUBLE_V2);
841
+ tb->setFV(++fieldnum, DEC_V1);
842
+ tb->setFV(++fieldnum, DEC_V2S);
843
+ tb->setFV(++fieldnum, DEC_V3);
844
+ tb->setFV(++fieldnum, DEC_V4);
845
+ tb->setFV(++fieldnum, DEC_V5);
846
+ tb->setFV(++fieldnum, DEC_V6S);
847
+ tb->setFV(++fieldnum, DEC_V7);
848
+ tb->setFV(++fieldnum, DEC_V8);
849
+ tb->insert();
850
+
851
+ tb->clearBuffer();
852
+ tb->setFV(_T("id"), 1);
853
+ tb->seek();
854
+ BOOST_CHECK(tb->stat() == 0);
855
+ checkIntValue(tb);
856
+
857
+ // char* or wchar* store
858
+ tb->clearBuffer();
859
+ tb->setFV(_T("id"), 2);
860
+ _TCHAR buf[50];
861
+ fieldnum = 0;
862
+ tb->setFV(++fieldnum, _ltot(SCHAR_MAX, buf, 10));
863
+ tb->setFV(++fieldnum, _ltot(SHRT_MAX, buf, 10));
864
+ tb->setFV(++fieldnum, _ltot(MINT_MIN, buf, 10));
865
+ tb->setFV(++fieldnum, _ltot(INT_MAX, buf, 10));
866
+ _i64tot_s(LLONG_MAX, buf, 50, 10);
867
+ tb->setFV(++fieldnum, buf);
868
+
869
+ tb->setFV(++fieldnum, _ltot(UCHAR_MAX - 1, buf, 10));
870
+ tb->setFV(++fieldnum, _ltot(USHRT_MAX - 1, buf, 10));
871
+ tb->setFV(++fieldnum, _ltot(UMINT_MAX - 1, buf, 10));
872
+ tb->setFV(++fieldnum, _ultot(UINT_MAX - 1, buf, 10));
873
+ _ui64tot_s(ULLONG_MAX - 1, buf, 50, 10);
874
+ tb->setFV(++fieldnum, buf);
875
+ tb->setFV(++fieldnum, _ltot(2000, buf, 10));
876
+ tb->setFV(++fieldnum, _ltot(254, buf, 10)); //logi1
877
+ tb->setFV(++fieldnum, _ltot(65000, buf, 10)); //logi2
878
+ tb->setFV(++fieldnum, TEST_DATE);
879
+
880
+ _stprintf(buf, _T("%.0f"), FLOAT_V1);
881
+ tb->setFV(++fieldnum, buf);
882
+ _stprintf(buf, _T("%.4f"), FLOAT_V2);
883
+ tb->setFV(++fieldnum, buf);
884
+ _stprintf(buf, _T("%.0lf"), DOUBLE_V1);
885
+ tb->setFV(++fieldnum, buf);
886
+ _stprintf(buf, _T("%.20lf"), DOUBLE_V2);
887
+ tb->setFV(++fieldnum, buf);
888
+ _stprintf(buf, _T("%.5lf"), DEC_V1);
889
+ tb->setFV(++fieldnum, buf);
890
+ #if (__BCPLUSPLUS__)
891
+ tb->setFV(++fieldnum, DEC_V2S);
892
+ #else
893
+ _stprintf(buf, _T("%.16lf"), DEC_V2);
894
+ tb->setFV(++fieldnum, buf);
895
+ #endif
896
+ _stprintf(buf, _T("%.1lf"), DEC_V3);
897
+ tb->setFV(++fieldnum, buf);
898
+ _stprintf(buf, _T("%.11lf"), DEC_V4);
899
+ tb->setFV(++fieldnum, buf);
900
+ _stprintf(buf, _T("%.5lf"), DEC_V5);
901
+ tb->setFV(++fieldnum, buf);
902
+ #if (__BCPLUSPLUS__)
903
+ tb->setFV(++fieldnum, DEC_V6S);
904
+ #else
905
+ _stprintf(buf, _T("%.16lf"), DEC_V6);
906
+ tb->setFV(++fieldnum, buf);
907
+ #endif
908
+ _stprintf(buf, _T("%.1lf"), DEC_V7);
909
+ tb->setFV(++fieldnum, buf);
910
+ _stprintf(buf, _T("%.11lf"), DEC_V8);
911
+ tb->setFV(++fieldnum, buf);
912
+
913
+ tb->insert();
914
+
915
+ tb->clearBuffer();
916
+ tb->setFV(_T("id"), 2);
917
+ tb->seek();
918
+ BOOST_CHECK(tb->stat() == 0);
919
+ checkIntValue(tb);
920
+
921
+ // double store
922
+ tb->clearBuffer();
923
+ tb->setFV(_T("id"), 3);
924
+ fieldnum = 0;
925
+ tb->setFV(++fieldnum, (double)SCHAR_MAX);
926
+ tb->setFV(++fieldnum, (double)SHRT_MAX);
927
+ tb->setFV(++fieldnum, (double)MINT_MIN);
928
+ tb->setFV(++fieldnum, (double)INT_MAX);
929
+ // LLONG_MAX double store not support, because happen truncation
930
+ //tb->setFV(++fieldnum, (double)LLONG_MAX);
931
+ tb->setFV(++fieldnum, (__int64)LLONG_MAX);
932
+ tb->setFV(++fieldnum, (double)(UCHAR_MAX - 1));
933
+ tb->setFV(++fieldnum, (double)(USHRT_MAX - 1));
934
+ tb->setFV(++fieldnum, (double)(UMINT_MAX - 1));
935
+ tb->setFV(++fieldnum, (double)(UINT_MAX - 1));
936
+ //tb->setFV(++fieldnum, (double)(ULLONG_MAX - 1));
937
+ tb->setFV(++fieldnum, (__int64)(ULLONG_MAX - 1));
938
+ tb->setFV(++fieldnum, (double)2000);
939
+ tb->setFV(++fieldnum, (double)254); //logi1
940
+ tb->setFV(++fieldnum, (double)65000); //logi2
941
+ tb->setFV(++fieldnum, (double)d.i);
942
+ tb->setFV(++fieldnum, FLOAT_V1);
943
+ tb->setFV(++fieldnum, FLOAT_V2);
944
+ tb->setFV(++fieldnum, DOUBLE_V1);
945
+ tb->setFV(++fieldnum, DOUBLE_V2);
946
+ tb->setFV(++fieldnum, DEC_V1);
947
+ tb->setFV(++fieldnum, DEC_V2S);
948
+ tb->setFV(++fieldnum, DEC_V3);
949
+ tb->setFV(++fieldnum, DEC_V4);
950
+ tb->setFV(++fieldnum, DEC_V5);
951
+ tb->setFV(++fieldnum, DEC_V6S);
952
+ tb->setFV(++fieldnum, DEC_V7);
953
+ tb->setFV(++fieldnum, DEC_V8);
954
+ tb->insert();
955
+
956
+ tb->clearBuffer();
957
+ tb->setFV(_T("id"), 3);
958
+ tb->seek();
959
+ BOOST_CHECK(tb->stat() == 0);
960
+ checkIntValue(tb);
961
+
962
+
963
+ // cleanup id 3
964
+ tb->clearBuffer();
965
+ tb->setFV(_T("id"), 3);
966
+ tb->update();
967
+ BOOST_CHECK(tb->stat() == 0);
968
+
969
+ char buf2[50];
970
+ std::string values;
971
+ values += "1\t";
972
+ values += _ltoa(SCHAR_MAX, buf2, 10);
973
+ values += "\t2\t";
974
+ values += _ltoa(SHRT_MAX, buf2, 10);
975
+ values += "\t3\t";
976
+ values += _ltoa(MINT_MIN, buf2, 10);
977
+ values += "\t4\t";
978
+ values += _ltoa(INT_MAX, buf2, 10);
979
+ values += "\t5\t";
980
+ _i64toa_s(LLONG_MAX, buf2, 50, 10);
981
+ values += buf2;
982
+ values += "\t6\t";
983
+ values += _ltoa(UCHAR_MAX - 1, buf2, 10);
984
+ values += "\t7\t";
985
+ values += _ltoa(USHRT_MAX - 1, buf2, 10);
986
+ values += "\t8\t";
987
+ values += _ltoa(UMINT_MAX - 1, buf2, 10);
988
+ values += "\t9\t";
989
+ _i64toa_s(UINT_MAX - 1, buf2, 50, 10);
990
+ values += buf2;
991
+ values += "\t10\t";
992
+ _ui64toa_s(ULLONG_MAX - 1, buf2, 50, 10);
993
+ values += buf2;
994
+ values += "\t11\t";
995
+ values += _ltoa(2000, buf2, 10);
996
+ values += "\t12\t";
997
+ values += _ltoa(254, buf2, 10);
998
+ values += "\t13\t";
999
+ values += _ltoa(65000, buf2, 10);
1000
+ values += "\t14\t";
1001
+ values += TEST_DATEA;
1002
+ values += "\t15\t";sprintf_s(buf2, 50, "%.0f", FLOAT_V1);
1003
+ values += buf2;
1004
+ values += "\t16\t";sprintf_s(buf2, 50, "%.4f", FLOAT_V2);
1005
+ values += buf2;
1006
+ values += "\t17\t";sprintf_s(buf2, 50, "%.0lf", DOUBLE_V1);
1007
+ values += buf2;
1008
+ values += "\t18\t";sprintf_s(buf2, 50, "%.20lf", DOUBLE_V2);
1009
+ values += buf2;
1010
+ values += "\t19\t";sprintf_s(buf2, 50, "%.5lf", DEC_V1);
1011
+ values += buf2;
1012
+ values += "\t20\t";
1013
+ values += DEC_V2SA;
1014
+ values += "\t21\t";sprintf_s(buf2, 50, "%.1lf", DEC_V3);
1015
+ values += buf2;
1016
+ values += "\t22\t";sprintf_s(buf2, 50, "%.11lf", DEC_V4);
1017
+ values += buf2;
1018
+ values += "\t23\t";sprintf_s(buf2, 50, "%.5lf", DEC_V5);
1019
+ values += buf2;
1020
+ values += "\t24\t";
1021
+ values += DEC_V6SA;
1022
+ values += "\t25\t";sprintf_s(buf2, 50, "%.1lf", DEC_V7);
1023
+ values += buf2;
1024
+ values += "\t26\t";sprintf_s(buf2, 50, "%.11lf", DEC_V8);
1025
+ values += buf2;
1026
+
1027
+
1028
+ tb->test_store(values.c_str());
1029
+ BOOST_CHECK(tb->stat() == 0);
1030
+ tb->clearBuffer();
1031
+ tb->setFV(_T("id"), 3);
1032
+ tb->seek();
1033
+ BOOST_CHECK(tb->stat() == 0);
1034
+ checkIntValue(tb);
1035
+ }
1036
+
1037
+ #define TEST_TIME0 _T("23:41:12")
1038
+ #define TEST_TIME0A "23:41:12"
1039
+
1040
+ #define TEST_DATETIME0 _T("2015-11-09 12:31:56")
1041
+ #define TEST_DATETIME0A "2015-11-09 12:31:56"
1042
+
1043
+ const _TCHAR* TEST_TIME[7] = {
1044
+ _T("23:41:12"),
1045
+ _T(""),
1046
+ _T("23:41:12.34"),
1047
+ _T("23:41:12.987"),
1048
+ _T(""),
1049
+ _T(""),
1050
+ _T("23:41:12.123456")
1051
+ };
1052
+
1053
+ const char* TEST_TIMEA[7] = {
1054
+ "23:41:12",
1055
+ "",
1056
+ "23:41:12.34",
1057
+ "23:41:12.987",
1058
+ "",
1059
+ "",
1060
+ "23:41:12.123456"
1061
+ };
1062
+
1063
+ const _TCHAR* TEST_DATETIME[7] = {
1064
+ _T("2015-11-09 12:31:56"),
1065
+ _T(""),
1066
+ _T("2015-11-09 12:31:56.98"),
1067
+ _T("2015-11-09 12:31:56.987"),
1068
+ _T(""),
1069
+ _T(""),
1070
+ _T("2015-11-09 12:31:56.123456")
1071
+ };
1072
+
1073
+ const char* TEST_DATETIMEA[7] = {
1074
+ "2015-11-09 12:31:56",
1075
+ "",
1076
+ "2015-11-09 12:31:56.98",
1077
+ "2015-11-09 12:31:56.987",
1078
+ "",
1079
+ "",
1080
+ "2015-11-09 12:31:56.123456"
1081
+ };
1082
+
1083
+
1084
+ void checkLegacyTimeValue(table_ptr tb)
1085
+ {
1086
+ short fieldnum = 0;
1087
+ // read by int64
1088
+ myTime t(0, false); t = TEST_TIME0;
1089
+ BOOST_CHECK(tb->getFV64(++fieldnum) == t.i64);
1090
+
1091
+ myDateTime dt(0, false); dt = TEST_DATETIME0;
1092
+ BOOST_CHECK(tb->getFV64(++fieldnum) == dt.i64);
1093
+
1094
+ myTimeStamp ts(0, false); ts = TEST_DATETIME0;
1095
+ BOOST_CHECK(tb->getFV64(++fieldnum) == ts.i64);
1096
+
1097
+ // read by double
1098
+ fieldnum = 0;
1099
+ BOOST_CHECK(tb->getFVdbl(++fieldnum) == (double)t.i64);
1100
+ BOOST_CHECK(tb->getFVdbl(++fieldnum) == (double)dt.i64);
1101
+ BOOST_CHECK(tb->getFVdbl(++fieldnum) == (double)ts.i64);
1102
+
1103
+ //read by string
1104
+ fieldnum = 0;
1105
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), TEST_TIME0) == 0);
1106
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), TEST_DATETIME0) == 0);
1107
+ BOOST_CHECK(_tcscmp(tb->getFVstr(++fieldnum), TEST_DATETIME0) == 0);
1108
+
1109
+ }
1110
+
1111
+ void checkAutoTimeStamp(__int64& oldValue, __int64 newValue)
1112
+ {
1113
+ BOOST_CHECK(oldValue != newValue);
1114
+ _TCHAR tmp[70];
1115
+ myTimeStamp ts_auto(0, false);
1116
+ ts_auto.i64 = newValue;
1117
+ BOOST_CHECK(_tcscmp(btrdtoa(getNowDate(),(_TCHAR*)NULL, true), ts_auto.dateStr(tmp, 70)) == 0);
1118
+
1119
+ oldValue = newValue;
1120
+ }
1121
+
1122
+ void testStoreLegacyTime(database* db)
1123
+ {
1124
+ short tableid = 2;
1125
+ short fieldnum = 0;
1126
+
1127
+ table_ptr tb = openTable(db, tableid, TD_OPEN_NORMAL);
1128
+ tb->setTimestampMode(TIMESTAMP_VALUE_CONTROL);
1129
+ BOOST_CHECK(tb->stat() == 0);
1130
+
1131
+ tb->clearBuffer();
1132
+ tb->setFV(_T("id"), 1);
1133
+
1134
+ myTime t(0, false); t = TEST_TIME0;
1135
+ tb->setFV(++fieldnum, t.i64);
1136
+
1137
+ myDateTime dt(0, false); dt = TEST_DATETIME0;
1138
+ tb->setFV(++fieldnum, dt.i64);
1139
+
1140
+ myTimeStamp ts(0, false); ts = TEST_DATETIME0;
1141
+ tb->setFV(++fieldnum, ts.i64);
1142
+ tb->insert();
1143
+
1144
+ tb->clearBuffer();
1145
+ tb->setFV(_T("id"), 1);
1146
+ tb->seek();
1147
+ BOOST_CHECK(tb->stat() == 0);
1148
+ checkLegacyTimeValue(tb);
1149
+
1150
+
1151
+ tb->clearBuffer();
1152
+ tb->setFV(_T("id"), 2);
1153
+ fieldnum = 0;
1154
+ tb->setFV(++fieldnum, TEST_TIME0);
1155
+ tb->setFV(++fieldnum, TEST_DATETIME0);
1156
+ tb->setFV(++fieldnum, TEST_DATETIME0);
1157
+ tb->insert();
1158
+
1159
+ tb->clearBuffer();
1160
+ tb->setFV(_T("id"), 2);
1161
+ tb->seek();
1162
+ BOOST_CHECK(tb->stat() == 0);
1163
+ checkLegacyTimeValue(tb);
1164
+ __int64 ts_auto_i = tb->getFV64(3);
1165
+
1166
+ tb->clearBuffer();
1167
+ tb->setFV(_T("id"), 2);
1168
+ tb->update();
1169
+ BOOST_CHECK(tb->stat() == 0);
1170
+ tb->seek();
1171
+ BOOST_CHECK(tb->stat() == 0);
1172
+ checkAutoTimeStamp(ts_auto_i, tb->getFV64(3));
1173
+
1174
+
1175
+ std::string values;
1176
+ values += "1\t";
1177
+ values += TEST_TIME0A;
1178
+ values += "\t2\t";
1179
+ values += TEST_DATETIME0A;
1180
+ values += "\t3\t";
1181
+ values += TEST_DATETIME0A;
1182
+
1183
+ tb->test_store(values.c_str());
1184
+ BOOST_CHECK(tb->stat() == 0);
1185
+ tb->clearBuffer();
1186
+ tb->setFV(_T("id"), 2);
1187
+ tb->seek();
1188
+ BOOST_CHECK(tb->stat() == 0);
1189
+ checkLegacyTimeValue(tb);
1190
+ }
1191
+
1192
+ void checkTimeValue(table_ptr tb, short fieldIndex, int decimals, bool mySql56timeFormat,
1193
+ bool isSupportMultiTimeStamp)
1194
+ {
1195
+ // read by int64
1196
+ myTime t(decimals, true);
1197
+ t = TEST_TIME[decimals];
1198
+ BOOST_CHECK_MESSAGE(tb->getFV64(fieldIndex) == t.i64, "myTime decimals = " << decimals);
1199
+ myDateTime dt(decimals, true);
1200
+ maDateTime dta(decimals, true);
1201
+ if (mySql56timeFormat)
1202
+ {
1203
+ dt = TEST_DATETIME[decimals];
1204
+ BOOST_CHECK_MESSAGE(tb->getFV64(fieldIndex + 4) == dt.i64, "myDateTime decimals = " << decimals);
1205
+ }
1206
+ else
1207
+ {
1208
+ dta = TEST_DATETIME[decimals];
1209
+ BOOST_CHECK_MESSAGE(tb->getFV64(fieldIndex + 4) == dta.i64, "maDateTime decimals = " << decimals);
1210
+ }
1211
+ if (isSupportMultiTimeStamp || decimals == 3)
1212
+ {
1213
+ myTimeStamp ts(decimals, true);
1214
+ ts = TEST_DATETIME[decimals];
1215
+ BOOST_CHECK_MESSAGE(tb->getFV64(fieldIndex + 8) == ts.i64, "myTimeStamp decimals = " << decimals);
1216
+ }
1217
+ //read by string
1218
+ BOOST_CHECK_MESSAGE(_tcscmp(tb->getFVstr(fieldIndex), TEST_TIME[decimals]) == 0, "myTime decimals = " << decimals);
1219
+ BOOST_CHECK_MESSAGE(_tcscmp(tb->getFVstr(fieldIndex + 4), TEST_DATETIME[decimals]) == 0, "dateTime decimals = " << decimals);
1220
+ if (isSupportMultiTimeStamp || decimals == 3)
1221
+ BOOST_CHECK_MESSAGE(_tcscmp(tb->getFVstr(fieldIndex + 8), TEST_DATETIME[decimals]) == 0, "myTimeStamp decimals = " << decimals);
1222
+ }
1223
+
1224
+ void checkTimeValues(table_ptr tb, bool mySql56timeFormat, bool isSupportMultiTimeStamp)
1225
+ {
1226
+ short fieldnum = 0;
1227
+ checkTimeValue(tb, ++fieldnum, 3, mySql56timeFormat, isSupportMultiTimeStamp); //3 decimals
1228
+ checkTimeValue(tb, ++fieldnum, 0, mySql56timeFormat, isSupportMultiTimeStamp); //0 decimal
1229
+ checkTimeValue(tb, ++fieldnum, 2, mySql56timeFormat, isSupportMultiTimeStamp); //2 decimals
1230
+ checkTimeValue(tb, ++fieldnum, 6, mySql56timeFormat, isSupportMultiTimeStamp); //6 decimals
1231
+ }
1232
+
1233
+ void setTimeValue64(table_ptr tb, short fieldIndex, int decimals, bool mySql56timeFormat,
1234
+ bool isSupportMultiTimeStamp)
1235
+ {
1236
+ myTime t(decimals, true);
1237
+ t = TEST_TIME[decimals]; tb->setFV(fieldIndex, t.i64);
1238
+ myDateTime dt(decimals, true);
1239
+ maDateTime dta(decimals, true);
1240
+ if (mySql56timeFormat)
1241
+ {
1242
+ dt = TEST_DATETIME[decimals]; tb->setFV(fieldIndex + 4, dt.i64);
1243
+ }
1244
+ else
1245
+ {
1246
+ dta = TEST_DATETIME[decimals]; tb->setFV(fieldIndex + 4, dta.i64);
1247
+ }
1248
+ if (!isSupportMultiTimeStamp && decimals != 3) return;
1249
+
1250
+ myTimeStamp ts(decimals, true);
1251
+ ts = TEST_DATETIME[decimals]; tb->setFV(fieldIndex + 8, ts.i64);
1252
+ }
1253
+
1254
+ void testStoreTime(database* db, bool mySql56timeFormat, bool isSupportMultiTimeStamp)
1255
+ {
1256
+ short tableid = 2;
1257
+ short fieldnum = 0;
1258
+
1259
+
1260
+ #if (defined(_DEBUG) && defined(_WIN32))
1261
+ char sqlTemp[10240];
1262
+ uint_td datalen = 10240;
1263
+ db->getSqlStringForCreateTable(_T("timetest"), sqlTemp, &datalen);
1264
+ OutputDebugStringA(sqlTemp);
1265
+ #endif
1266
+ table_ptr tb = openTable(db, tableid, TD_OPEN_NORMAL);
1267
+ tb->setTimestampMode(TIMESTAMP_VALUE_CONTROL);
1268
+ BOOST_CHECK(tb->stat() == 0);
1269
+
1270
+ tb->clearBuffer();
1271
+ tb->setFV(_T("id"), 1);
1272
+
1273
+ setTimeValue64(tb, ++fieldnum, 3, mySql56timeFormat, isSupportMultiTimeStamp);
1274
+ setTimeValue64(tb, ++fieldnum, 0, mySql56timeFormat, isSupportMultiTimeStamp);
1275
+ setTimeValue64(tb, ++fieldnum, 2, mySql56timeFormat, isSupportMultiTimeStamp);
1276
+ setTimeValue64(tb, ++fieldnum, 6, mySql56timeFormat, isSupportMultiTimeStamp);
1277
+ tb->insert();
1278
+
1279
+ tb->clearBuffer();
1280
+ tb->setFV(_T("id"), 1);
1281
+ tb->seek();
1282
+ BOOST_CHECK(tb->stat() == 0);
1283
+ checkTimeValues(tb, mySql56timeFormat, isSupportMultiTimeStamp);
1284
+
1285
+
1286
+ tb->clearBuffer();
1287
+ tb->setFV(_T("id"), 2);
1288
+ fieldnum = 0;
1289
+ setTimeValue64(tb, ++fieldnum, 3, mySql56timeFormat, isSupportMultiTimeStamp);
1290
+ setTimeValue64(tb, ++fieldnum, 0, mySql56timeFormat, isSupportMultiTimeStamp);
1291
+ setTimeValue64(tb, ++fieldnum, 2, mySql56timeFormat, isSupportMultiTimeStamp);
1292
+ setTimeValue64(tb, ++fieldnum, 6, mySql56timeFormat, isSupportMultiTimeStamp);
1293
+ tb->insert();
1294
+
1295
+ tb->clearBuffer();
1296
+ tb->setFV(_T("id"), 2);
1297
+ tb->seek();
1298
+ BOOST_CHECK(tb->stat() == 0);
1299
+ checkTimeValues(tb, mySql56timeFormat, isSupportMultiTimeStamp);
1300
+ __int64 ts_auto_i = tb->getFV64(9);
1301
+
1302
+ tb->clearBuffer();
1303
+ tb->setFV(_T("id"), 2);
1304
+ tb->update();
1305
+ BOOST_CHECK(tb->stat() == 0);
1306
+ tb->seek();
1307
+ BOOST_CHECK(tb->stat() == 0);
1308
+ checkAutoTimeStamp(ts_auto_i, tb->getFV64(9));
1309
+
1310
+
1311
+ std::string values;
1312
+ values += "1\t";
1313
+ values += TEST_TIMEA[3];
1314
+ values += "\t2\t";
1315
+ values += TEST_TIMEA[0];
1316
+ values += "\t3\t";
1317
+ values += TEST_TIMEA[2];
1318
+ values += "\t4\t";
1319
+ values += TEST_TIMEA[6];
1320
+
1321
+ values += "\t5\t";
1322
+ values += TEST_DATETIMEA[3];
1323
+ values += "\t6\t";
1324
+ values += TEST_DATETIMEA[0];
1325
+ values += "\t7\t";
1326
+ values += TEST_DATETIMEA[2];
1327
+ values += "\t8\t";
1328
+ values += TEST_DATETIMEA[6];
1329
+
1330
+ values += "\t9\t";
1331
+ values += TEST_DATETIMEA[3];
1332
+ if (isSupportMultiTimeStamp)
1333
+ {
1334
+ values += "\t10\t";
1335
+ values += TEST_DATETIMEA[0];
1336
+ values += "\t11\t";
1337
+ values += TEST_DATETIMEA[2];
1338
+ values += "\t12\t";
1339
+ values += TEST_DATETIMEA[6];
1340
+ }
1341
+
1342
+ tb->test_store(values.c_str());
1343
+ BOOST_CHECK(tb->stat() == 0);
1344
+ tb->clearBuffer();
1345
+ tb->setFV(_T("id"), 2);
1346
+ tb->seek();
1347
+ BOOST_CHECK(tb->stat() == 0);
1348
+ checkTimeValues(tb, mySql56timeFormat, isSupportMultiTimeStamp);
1349
+ }
1350
+
1351
+ void test_NOT_HA_OPTION_PACK_RECORD(database* db)
1352
+ {
1353
+ short tableid = 3;
1354
+ short fieldnum = 0;
1355
+ table_ptr tb = openTable(db, tableid, TD_OPEN_NORMAL);
1356
+ tb->clearBuffer();
1357
+ BOOST_CHECK(tb->getFVNull(1) == false);
1358
+
1359
+ tb->setFV(fieldnum++, 1);
1360
+ tb->setFV(fieldnum++, 10);
1361
+ tb->insert();
1362
+ BOOST_CHECK(tb->stat() == 0);
1363
+
1364
+ fieldnum = 0;
1365
+ tb->clearBuffer();
1366
+ tb->setFV(fieldnum++, 2);
1367
+ tb->setFVNull(fieldnum++, true);
1368
+ tb->insert();
1369
+ BOOST_CHECK(tb->stat() == 0);
1370
+
1371
+ fieldnum = 0;
1372
+ tb->clearBuffer();
1373
+ tb->setFV(fieldnum++, 2);
1374
+ tb->seek();
1375
+ BOOST_CHECK(tb->stat() == 0);
1376
+ BOOST_CHECK(tb->getFVNull(fieldnum) == true);
1377
+
1378
+ }
1379
+
1380
+ void insertInManyData(table_ptr tb)
1381
+ {
1382
+ short fieldNum = 0;
1383
+ tb->clearBuffer();
1384
+ tb->setFV(++fieldNum, 1);
1385
+ tb->setFV(++fieldNum, 1);
1386
+ tb->setFV(++fieldNum, _T("test"));
1387
+ tb->insert();
1388
+ BOOST_CHECK(tb->stat() == 0);
1389
+
1390
+ fieldNum = 0;
1391
+ tb->clearBuffer();
1392
+ tb->setFV(++fieldNum, (_TCHAR*)NULL);
1393
+ tb->setFV(++fieldNum, 2);
1394
+ tb->setFV(++fieldNum, _T("test2"));
1395
+ tb->insert();
1396
+ BOOST_CHECK(tb->stat() == 0);
1397
+
1398
+ fieldNum = 0;
1399
+ tb->clearBuffer();
1400
+ tb->setFV(++fieldNum, 3);
1401
+ tb->setFV(++fieldNum, (_TCHAR*)NULL);
1402
+ tb->setFV(++fieldNum, _T(""));
1403
+ tb->insert();
1404
+ BOOST_CHECK(tb->stat() == 0);
1405
+
1406
+ fieldNum = 0;
1407
+ tb->clearBuffer();
1408
+ tb->setFV(++fieldNum, 4);
1409
+ tb->setFV(++fieldNum, (_TCHAR*)NULL);
1410
+ tb->setFV(++fieldNum, _T("test4"));
1411
+ tb->insert();
1412
+ BOOST_CHECK(tb->stat() == 0);
1413
+
1414
+ fieldNum = 0;
1415
+ tb->clearBuffer();
1416
+ tb->setFV(++fieldNum, 4);
1417
+ tb->setFV(++fieldNum, 5);
1418
+ tb->setFV(++fieldNum, (_TCHAR*)NULL);
1419
+ tb->insert();
1420
+ BOOST_CHECK(tb->stat() == 0);
1421
+
1422
+ fieldNum = 0;
1423
+ tb->clearBuffer();
1424
+ tb->setFV(++fieldNum, (_TCHAR*)NULL);
1425
+ tb->setFV(++fieldNum, (_TCHAR*)NULL);
1426
+ tb->setFV(++fieldNum, (_TCHAR*)NULL);
1427
+ tb->insert();
1428
+ BOOST_CHECK(tb->stat() == 0);
1429
+ }
1430
+
1431
+ void insertGroupsData(table_ptr tb)
1432
+ {
1433
+ short fieldNum = 0;
1434
+ tb->clearBuffer();
1435
+ tb->setFV(++fieldNum, 1);
1436
+ tb->setFV(++fieldNum, _T("Administrators"));
1437
+ tb->insert();
1438
+ BOOST_CHECK(tb->stat() == 0);
1439
+
1440
+ fieldNum = 0;
1441
+ tb->clearBuffer();
1442
+ tb->setFV(++fieldNum, 2);
1443
+ tb->setFV(++fieldNum, _T("Users"));
1444
+ tb->insert();
1445
+ BOOST_CHECK(tb->stat() == 0);
1446
+
1447
+ fieldNum = 0;
1448
+ tb->clearBuffer();
1449
+ tb->setFV(++fieldNum, 3);
1450
+ tb->setFV(++fieldNum, _T("Guests"));
1451
+ tb->insert();
1452
+ BOOST_CHECK(tb->stat() == 0);
1453
+
1454
+ fieldNum = 0;
1455
+ tb->clearBuffer();
1456
+ tb->setFV(++fieldNum, (_TCHAR*)NULL);
1457
+ tb->setFV(++fieldNum, _T("Unknowns"));
1458
+ tb->insert();
1459
+ BOOST_CHECK(tb->stat() == 0);
1460
+ }
1461
+
1462
+ void insertUsersData(table_ptr tb)
1463
+ {
1464
+ short fieldNum = 0;
1465
+ tb->clearBuffer();
1466
+ tb->setFV(++fieldNum, 1);
1467
+ tb->setFV(++fieldNum, 3);
1468
+ tb->setFV(++fieldNum, _T("John"));
1469
+ tb->insert();
1470
+ BOOST_CHECK(tb->stat() == 0);
1471
+
1472
+ fieldNum = 0;
1473
+ tb->clearBuffer();
1474
+ tb->setFV(++fieldNum, 2);
1475
+ tb->setFV(++fieldNum, (_TCHAR*)NULL);
1476
+ tb->setFV(++fieldNum, _T("Alice"));
1477
+ tb->insert();
1478
+ BOOST_CHECK(tb->stat() == 0);
1479
+
1480
+ fieldNum = 0;
1481
+ tb->clearBuffer();
1482
+ tb->setFV(++fieldNum, (_TCHAR*)NULL);
1483
+ tb->setFV(++fieldNum, 3);
1484
+ tb->setFV(++fieldNum, _T("Pochi"));
1485
+ tb->insert();
1486
+ BOOST_CHECK(tb->stat() == 0);
1487
+
1488
+ fieldNum = 0;
1489
+ tb->clearBuffer();
1490
+ tb->setFV(++fieldNum, 2);
1491
+ tb->setFV(++fieldNum, 1);
1492
+ tb->setFV(++fieldNum, _T("Bob"));
1493
+ tb->insert();
1494
+ BOOST_CHECK(tb->stat() == 0);
1495
+
1496
+ fieldNum = 0;
1497
+ tb->clearBuffer();
1498
+ tb->setFV(++fieldNum, (_TCHAR*)NULL);
1499
+ tb->setFV(++fieldNum, 2);
1500
+ tb->setFV(++fieldNum, _T("Tama"));
1501
+ tb->insert();
1502
+ BOOST_CHECK(tb->stat() == 0);
1503
+
1504
+ fieldNum = 0;
1505
+ tb->clearBuffer();
1506
+ tb->setFV(++fieldNum, 4);
1507
+ tb->setFV(++fieldNum, 3);
1508
+ tb->setFV(++fieldNum, _T("Microsoft"));
1509
+ tb->insert();
1510
+ BOOST_CHECK(tb->stat() == 0);
1511
+
1512
+ fieldNum = 0;
1513
+ tb->clearBuffer();
1514
+ tb->setFV(++fieldNum, 2);
1515
+ tb->setFV(++fieldNum, (_TCHAR*)NULL);
1516
+ tb->setFV(++fieldNum, _T("Susie"));
1517
+ tb->insert();
1518
+ BOOST_CHECK(tb->stat() == 0);
1519
+
1520
+ fieldNum = 0;
1521
+ tb->clearBuffer();
1522
+ tb->setFV(++fieldNum, 3);
1523
+ tb->setFV(++fieldNum, 1);
1524
+ tb->setFV(++fieldNum, _T("Taro"));
1525
+ tb->insert();
1526
+ BOOST_CHECK(tb->stat() == 0);
1527
+
1528
+ fieldNum = 0;
1529
+ tb->clearBuffer();
1530
+ tb->setFV(++fieldNum, 4);
1531
+ tb->setFV(++fieldNum, 3);
1532
+ tb->setFV(++fieldNum, _T("Google"));
1533
+ tb->insert();
1534
+ BOOST_CHECK(tb->stat() == 0);
1535
+
1536
+ fieldNum = 0;
1537
+ tb->clearBuffer();
1538
+ tb->setFV(++fieldNum, 1);
1539
+ tb->setFV(++fieldNum, 1);
1540
+ tb->setFV(++fieldNum, _T("Lee"));
1541
+ tb->insert();
1542
+ BOOST_CHECK(tb->stat() == 0);
1543
+
1544
+ fieldNum = 0;
1545
+ tb->clearBuffer();
1546
+ tb->setFV(++fieldNum, 3);
1547
+ tb->setFV(++fieldNum, (_TCHAR*)NULL);
1548
+ tb->setFV(++fieldNum, _T("Hanako"));
1549
+ tb->insert();
1550
+ BOOST_CHECK(tb->stat() == 0);
1551
+ }
1552
+
1553
+ void insertScoresData(table_ptr tb)
1554
+ {
1555
+ short fieldNum = 0;
1556
+ tb->clearBuffer();
1557
+ tb->setFV(++fieldNum, 1);
1558
+ tb->setFV(++fieldNum, 80);
1559
+ tb->insert();
1560
+ BOOST_CHECK(tb->stat() == 0);
1561
+
1562
+ fieldNum = 0;
1563
+ tb->clearBuffer();
1564
+ tb->setFV(++fieldNum, 1);
1565
+ tb->setFV(++fieldNum, 70);
1566
+ tb->insert();
1567
+ BOOST_CHECK(tb->stat() == 0);
1568
+
1569
+ fieldNum = 0;
1570
+ tb->clearBuffer();
1571
+ tb->setFV(++fieldNum, 1);
1572
+ tb->setFV(++fieldNum, 50);
1573
+ tb->insert();
1574
+ BOOST_CHECK(tb->stat() == 0);
1575
+
1576
+ fieldNum = 0;
1577
+ tb->clearBuffer();
1578
+ tb->setFV(++fieldNum, 1);
1579
+ tb->setFV(++fieldNum, (_TCHAR*)NULL);
1580
+ tb->insert();
1581
+ BOOST_CHECK(tb->stat() == 0);
1582
+
1583
+ fieldNum = 0;
1584
+ tb->clearBuffer();
1585
+ tb->setFV(++fieldNum, 2);
1586
+ tb->setFV(++fieldNum, 90);
1587
+ tb->insert();
1588
+ BOOST_CHECK(tb->stat() == 0);
1589
+
1590
+ fieldNum = 0;
1591
+ tb->clearBuffer();
1592
+ tb->setFV(++fieldNum, 2);
1593
+ tb->setFV(++fieldNum, 85);
1594
+ tb->insert();
1595
+ BOOST_CHECK(tb->stat() == 0);
1596
+
1597
+ fieldNum = 0;
1598
+ tb->clearBuffer();
1599
+ tb->setFV(++fieldNum, 3);
1600
+ tb->setFV(++fieldNum, 80);
1601
+ tb->insert();
1602
+ BOOST_CHECK(tb->stat() == 0);
1603
+
1604
+ fieldNum = 0;
1605
+ tb->clearBuffer();
1606
+ tb->setFV(++fieldNum, 3);
1607
+ tb->setFV(++fieldNum, 70);
1608
+ tb->insert();
1609
+ BOOST_CHECK(tb->stat() == 0);
1610
+
1611
+ fieldNum = 0;
1612
+ tb->clearBuffer();
1613
+ tb->setFV(++fieldNum, 3);
1614
+ tb->setFV(++fieldNum, 50);
1615
+ tb->insert();
1616
+ BOOST_CHECK(tb->stat() == 0);
1617
+
1618
+ fieldNum = 0;
1619
+ tb->clearBuffer();
1620
+ tb->setFV(++fieldNum, 3);
1621
+ tb->setFV(++fieldNum, 0);
1622
+ tb->insert();
1623
+ BOOST_CHECK(tb->stat() == 0);
1624
+
1625
+ fieldNum = 0;
1626
+ tb->clearBuffer();
1627
+ tb->setFV(++fieldNum, 1);
1628
+ tb->setFV(++fieldNum, 60);
1629
+ tb->insert();
1630
+ BOOST_CHECK(tb->stat() == 0);
1631
+
1632
+ fieldNum = 0;
1633
+ tb->clearBuffer();
1634
+ tb->setFV(++fieldNum, 2);
1635
+ tb->setFV(++fieldNum, 87);
1636
+ tb->insert();
1637
+ BOOST_CHECK(tb->stat() == 0);
1638
+
1639
+ fieldNum = 0;
1640
+ tb->clearBuffer();
1641
+ tb->setFV(++fieldNum, 3);
1642
+ tb->setFV(++fieldNum, 90);
1643
+ tb->insert();
1644
+ BOOST_CHECK(tb->stat() == 0);
1645
+ }
1646
+
1647
+ void testInMany(database* db)
1648
+ {
1649
+ short tableid = 4;
1650
+ {
1651
+ table_ptr tb = openTable(db, tableid, TD_OPEN_NORMAL);
1652
+ insertInManyData(tb);
1653
+ }
1654
+ activeTable atv(db, _T("nullkey"));
1655
+ atv.index(1);
1656
+ query q;
1657
+ recordset rs;
1658
+ q.in(1, 2, 3);
1659
+ atv.read(rs, q);
1660
+ BOOST_CHECK(rs.size() == 3);
1661
+ BOOST_CHECK(rs[0][_T("id")] == 1);
1662
+ BOOST_CHECK(rs[1].isInvalidRecord() == true);
1663
+ BOOST_CHECK(rs[2][_T("id")] == 3);
1664
+
1665
+ // read by nullkey
1666
+ q.reset();
1667
+ atv.index(1).keyValue(0).read(rs, q);
1668
+ BOOST_CHECK(rs.size() == 4);
1669
+
1670
+ // read records all, that include null value
1671
+ atv.index(2).keyValue((const _TCHAR*)NULL).read(rs, q);
1672
+ BOOST_CHECK(rs.size() == 6);
1673
+ rs.orderBy(_T("id2"));
1674
+ BOOST_CHECK(rs[0][_T("id2")].isNull() == true);
1675
+ BOOST_CHECK(rs[1][_T("id2")].isNull() == true);
1676
+ BOOST_CHECK(rs[2][_T("id2")].isNull() == false);
1677
+
1678
+ sortFields sf;
1679
+ sf.add(_T("id2"), false);
1680
+ rs.orderBy(sf);
1681
+ BOOST_CHECK(rs[5][_T("id2")].isNull() == true);
1682
+ BOOST_CHECK(rs[4][_T("id2")].isNull() == true);
1683
+ BOOST_CHECK(rs[3][_T("id2")].isNull() == false);
1684
+
1685
+ recordset& rs2 = *rs.clone();
1686
+ recordsetQuery rq;
1687
+ rq.whenIsNotNull(_T("id2"));
1688
+ rs2.matchBy(rq);
1689
+ BOOST_CHECK(rs2.size() == 4);
1690
+ //rs2.release();
1691
+
1692
+ rs2 = *rs.clone();
1693
+ rq.whenIsNull(_T("id2"));
1694
+ rs2.matchBy(rq);
1695
+ BOOST_CHECK(rs2.size() == 2);
1696
+ //rs2.release();
1697
+
1698
+ rs2 = *rs.clone();
1699
+ rq.when(_T("id2"), _T("="), 4);
1700
+ rs2.matchBy(rq);
1701
+ BOOST_CHECK(rs2.size() == 2);
1702
+
1703
+ rs2 = *rs.clone();
1704
+ rq.when(_T("id2"), _T("<"), 3);
1705
+ rs2.matchBy(rq);
1706
+ BOOST_CHECK(rs2.size() == 1);
1707
+
1708
+ rs2.release();
1709
+
1710
+ // read records after null.
1711
+ atv.index(2).keyValue(0).read(rs, q);
1712
+ BOOST_CHECK(rs.size() == 4);
1713
+
1714
+ // read in has_many.
1715
+ q.reset().segmentsForInValue(1).in(4);
1716
+ atv.index(2).read(rs, q);
1717
+ BOOST_CHECK(rs.size() == 2);
1718
+ BOOST_CHECK(rs[0][_T("id")] == 4);
1719
+ BOOST_CHECK(rs[1][_T("id")] == 5);
1720
+ }
1721
+
1722
+ void testNullValue(database* db)
1723
+ {
1724
+ {
1725
+ short tableid = 5;
1726
+ table_ptr tb = openTable(db, tableid, TD_OPEN_NORMAL);
1727
+ insertInManyData(tb);
1728
+ tableid = 6;
1729
+ table_ptr tbg = openTable(db, tableid, TD_OPEN_NORMAL);
1730
+ insertGroupsData(tbg);
1731
+ tableid = 7;
1732
+ table_ptr tbu = openTable(db, tableid, TD_OPEN_NORMAL);
1733
+ insertUsersData(tbu);
1734
+ tableid = 8;
1735
+ table_ptr tbs = openTable(db, tableid, TD_OPEN_NORMAL);
1736
+ insertScoresData(tbs);
1737
+ }
1738
+ activeTable atv(db, _T("nullvalue"));
1739
+ atv.index(1);
1740
+ activeTable atg(db, _T("groups"));
1741
+ atg.alias(_T("id"), _T("group_id")).alias(_T("name"), _T("group_name"));
1742
+ atg.index(1);
1743
+ activeTable atu(db, _T("users"));
1744
+ atu.index(0);
1745
+ activeTable ats(db, _T("scores"));
1746
+ ats.index(0);
1747
+ query q;
1748
+ recordsetQuery rq;
1749
+ groupQuery gq;
1750
+ recordset rs;
1751
+ fieldNames fns;
1752
+ fns.keyField(_T("score"));
1753
+ bzs::db::protocol::tdap::client::count countFunc(_T("row_count"));
1754
+ bzs::db::protocol::tdap::client::count countField(fns, _T("valid_row"));
1755
+ bzs::db::protocol::tdap::client::sum sumField(fns, _T("sum"));
1756
+ bzs::db::protocol::tdap::client::avg avgField(fns, _T("avg"));
1757
+ bzs::db::protocol::tdap::client::min minField(fns, _T("min"));
1758
+ bzs::db::protocol::tdap::client::max maxField(fns, _T("max"));
1759
+
1760
+ // [1] WHERE id2 = 0
1761
+ // query
1762
+ rs.clear();
1763
+ q.reset().where(_T("id2"), _T("="), 0).reject(0);
1764
+ atv.keyValue((char *)NULL).read(rs, q);
1765
+ //rs.dump();
1766
+ BOOST_CHECK(rs.size() == 0);
1767
+ // query reverse
1768
+ rs.clear();
1769
+ q.reset().where(_T("id2"), _T("="), 0).reject(0).direction(table::findBackForword);
1770
+ atv.keyValue(100).read(rs, q);
1771
+ //rs.dump();
1772
+ BOOST_CHECK(rs.size() == 0);
1773
+ // recordsetQuery
1774
+ rs.clear();
1775
+ q.reset().all();
1776
+ atv.keyValue((char *)NULL).read(rs, q);
1777
+ rq.reset();
1778
+ rq.when(_T("id2"), _T("="), 0);
1779
+ rs.matchBy(rq);
1780
+ //rs.dump();
1781
+ BOOST_CHECK(rs.size() == 0);
1782
+
1783
+ // [2] WHERE id2 <> 0
1784
+ // query
1785
+ rs.clear();
1786
+ q.reset().where(_T("id2"), _T("<>"), 0).reject(0);
1787
+ atv.keyValue((char *)NULL).read(rs, q);
1788
+ //rs.dump();
1789
+ BOOST_CHECK(rs.size() == 4);
1790
+ BOOST_CHECK(rs[0][_T("id")] == 1);
1791
+ BOOST_CHECK(rs[1][_T("id")] == 3);
1792
+ BOOST_CHECK(rs[2][_T("id")] == 4);
1793
+ BOOST_CHECK(rs[3][_T("id")] == 5);
1794
+ // query reverse
1795
+ rs.clear();
1796
+ q.reset().where(_T("id2"), _T("<>"), 0).reject(0).direction(table::findBackForword);
1797
+ atv.keyValue(100).read(rs, q);
1798
+ //rs.dump();
1799
+ BOOST_CHECK(rs.size() == 4);
1800
+ BOOST_CHECK(rs[0][_T("id")] == 5);
1801
+ BOOST_CHECK(rs[1][_T("id")] == 4);
1802
+ BOOST_CHECK(rs[2][_T("id")] == 3);
1803
+ BOOST_CHECK(rs[3][_T("id")] == 1);
1804
+ // recordsetQuery
1805
+ rs.clear();
1806
+ q.reset().all();
1807
+ atv.keyValue((char *)NULL).read(rs, q);
1808
+ rq.reset();
1809
+ rq.when(_T("id2"), _T("<>"), 0);
1810
+ rs.matchBy(rq);
1811
+ //rs.dump();
1812
+ BOOST_CHECK(rs.size() == 4);
1813
+ BOOST_CHECK(rs[0][_T("id")] == 1);
1814
+ BOOST_CHECK(rs[1][_T("id")] == 3);
1815
+ BOOST_CHECK(rs[2][_T("id")] == 4);
1816
+ BOOST_CHECK(rs[3][_T("id")] == 5);
1817
+
1818
+ // [3] WHERE id2 >= 0
1819
+ // query
1820
+ rs.clear();
1821
+ q.reset().where(_T("id2"), _T(">="), 0).reject(0);
1822
+ atv.keyValue((char *)NULL).read(rs, q);
1823
+ //rs.dump();
1824
+ BOOST_CHECK(rs.size() == 4);
1825
+ BOOST_CHECK(rs[0][_T("id")] == 1);
1826
+ BOOST_CHECK(rs[1][_T("id")] == 3);
1827
+ BOOST_CHECK(rs[2][_T("id")] == 4);
1828
+ BOOST_CHECK(rs[3][_T("id")] == 5);
1829
+ // query reverse
1830
+ rs.clear();
1831
+ q.reset().where(_T("id2"), _T(">="), 0).reject(0).direction(table::findBackForword);
1832
+ atv.keyValue(100).read(rs, q);
1833
+ //rs.dump();
1834
+ BOOST_CHECK(rs.size() == 4);
1835
+ BOOST_CHECK(rs[0][_T("id")] == 5);
1836
+ BOOST_CHECK(rs[1][_T("id")] == 4);
1837
+ BOOST_CHECK(rs[2][_T("id")] == 3);
1838
+ BOOST_CHECK(rs[3][_T("id")] == 1);
1839
+ // recordsetQuery
1840
+ rs.clear();
1841
+ q.reset().all();
1842
+ atv.keyValue((char *)NULL).read(rs, q);
1843
+ rq.reset();
1844
+ rq.when(_T("id2"), _T(">="), 0);
1845
+ rs.matchBy(rq);
1846
+ //rs.dump();
1847
+ BOOST_CHECK(rs.size() == 4);
1848
+ BOOST_CHECK(rs[0][_T("id")] == 1);
1849
+ BOOST_CHECK(rs[1][_T("id")] == 3);
1850
+ BOOST_CHECK(rs[2][_T("id")] == 4);
1851
+ BOOST_CHECK(rs[3][_T("id")] == 5);
1852
+
1853
+ // [4] WHERE id2 <= 5
1854
+ // query
1855
+ rs.clear();
1856
+ q.reset().where(_T("id2"), _T("<="), 5).reject(0);
1857
+ atv.keyValue(0).read(rs, q); // set keyValue as 0, CAN NOT USE NULL IN THIS OPERATION.
1858
+ //rs.dump();
1859
+ BOOST_CHECK(rs.size() == 4);
1860
+ BOOST_CHECK(rs[0][_T("id")] == 1);
1861
+ BOOST_CHECK(rs[1][_T("id")] == 3);
1862
+ BOOST_CHECK(rs[2][_T("id")] == 4);
1863
+ BOOST_CHECK(rs[3][_T("id")] == 5);
1864
+ // query reverse
1865
+ rs.clear();
1866
+ q.reset().where(_T("id2"), _T("<="), 5).reject(0).direction(table::findBackForword);
1867
+ atv.keyValue(100).read(rs, q);
1868
+ //rs.dump();
1869
+ BOOST_CHECK(rs.size() == 4);
1870
+ BOOST_CHECK(rs[0][_T("id")] == 5);
1871
+ BOOST_CHECK(rs[1][_T("id")] == 4);
1872
+ BOOST_CHECK(rs[2][_T("id")] == 3);
1873
+ BOOST_CHECK(rs[3][_T("id")] == 1);
1874
+ // recordsetQuery
1875
+ rs.clear();
1876
+ q.reset().all();
1877
+ atv.keyValue((char *)NULL).read(rs, q);
1878
+ rq.reset();
1879
+ rq.when(_T("id2"), _T("<="), 5);
1880
+ rs.matchBy(rq);
1881
+ //rs.dump();
1882
+ BOOST_CHECK(rs.size() == 4);
1883
+ BOOST_CHECK(rs[0][_T("id")] == 1);
1884
+ BOOST_CHECK(rs[1][_T("id")] == 3);
1885
+ BOOST_CHECK(rs[2][_T("id")] == 4);
1886
+ BOOST_CHECK(rs[3][_T("id")] == 5);
1887
+
1888
+ // [5] WHERE name like 'test%'
1889
+ // query
1890
+ rs.clear();
1891
+ q.reset().where(_T("name"), _T("="), _T("test*")).reject(0);
1892
+ atv.keyValue((char *)NULL).read(rs, q);
1893
+ //rs.dump();
1894
+ BOOST_CHECK(rs.size() == 3);
1895
+ BOOST_CHECK(rs[0][_T("id")] == 2);
1896
+ BOOST_CHECK(rs[1][_T("id")] == 1);
1897
+ BOOST_CHECK(rs[2][_T("id")] == 4);
1898
+ // query reverse
1899
+ rs.clear();
1900
+ q.reset().where(_T("name"), _T("="), _T("test*")).reject(0).direction(table::findBackForword);
1901
+ atv.keyValue(100).read(rs, q);
1902
+ //rs.dump();
1903
+ BOOST_CHECK(rs.size() == 3);
1904
+ BOOST_CHECK(rs[0][_T("id")] == 4);
1905
+ BOOST_CHECK(rs[1][_T("id")] == 1);
1906
+ BOOST_CHECK(rs[2][_T("id")] == 2);
1907
+ // recordsetQuery
1908
+ rs.clear();
1909
+ q.reset().all();
1910
+ atv.keyValue((char *)NULL).read(rs, q);
1911
+ rq.reset();
1912
+ rq.when(_T("name"), _T("="), _T("test*"));
1913
+ rs.matchBy(rq);
1914
+ //rs.dump();
1915
+ BOOST_CHECK(rs.size() == 3);
1916
+ BOOST_CHECK(rs[0][_T("id")] == 2);
1917
+ BOOST_CHECK(rs[1][_T("id")] == 1);
1918
+ BOOST_CHECK(rs[2][_T("id")] == 4);
1919
+
1920
+ // [6] WHERE name not like 'test%'
1921
+ // query
1922
+ rs.clear();
1923
+ q.reset().where(_T("name"), _T("<>"), _T("test*")).reject(0);
1924
+ atv.keyValue((char *)NULL).read(rs, q);
1925
+ //rs.dump();
1926
+ BOOST_CHECK(rs.size() == 1);
1927
+ BOOST_CHECK(rs[0][_T("id")] == 3);
1928
+ // query reverse
1929
+ rs.clear();
1930
+ q.reset().where(_T("name"), _T("<>"), _T("test*")).reject(0).direction(table::findBackForword);
1931
+ atv.keyValue(100).read(rs, q);
1932
+ //rs.dump();
1933
+ BOOST_CHECK(rs.size() == 1);
1934
+ BOOST_CHECK(rs[0][_T("id")] == 3);
1935
+ // recordsetQuery
1936
+ rs.clear();
1937
+ q.reset().all();
1938
+ atv.keyValue((char *)NULL).read(rs, q);
1939
+ rq.reset();
1940
+ rq.when(_T("name"), _T("<>"), _T("test*"));
1941
+ rs.matchBy(rq);
1942
+ //rs.dump();
1943
+ BOOST_CHECK(rs.size() == 1);
1944
+ BOOST_CHECK(rs[0][_T("id")] == 3);
1945
+
1946
+ // [7] WHERE id2 IS NULL
1947
+ // query
1948
+ rs.clear();
1949
+ q.reset().whereIsNull(_T("id2")).reject(0);
1950
+ atv.keyValue((char *)NULL).read(rs, q);
1951
+ //rs.dump();
1952
+ BOOST_CHECK(rs.size() == 2);
1953
+ BOOST_CHECK(rs[0][_T("id")] == 2);
1954
+ BOOST_CHECK(rs[1][_T("id")] == 6);
1955
+ // query reverse
1956
+ rs.clear();
1957
+ q.reset().whereIsNull(_T("id2")).reject(0).direction(table::findBackForword);
1958
+ atv.keyValue(100).read(rs, q);
1959
+ //rs.dump();
1960
+ BOOST_CHECK(rs.size() == 2);
1961
+ BOOST_CHECK(rs[0][_T("id")] == 6);
1962
+ BOOST_CHECK(rs[1][_T("id")] == 2);
1963
+ // recordsetQuery
1964
+ rs.clear();
1965
+ q.reset().all();
1966
+ atv.keyValue((char *)NULL).read(rs, q);
1967
+ rq.reset();
1968
+ rq.whenIsNull(_T("id2"));
1969
+ rs.matchBy(rq);
1970
+ //rs.dump();
1971
+ BOOST_CHECK(rs.size() == 2);
1972
+ BOOST_CHECK(rs[0][_T("id")] == 2);
1973
+ BOOST_CHECK(rs[1][_T("id")] == 6);
1974
+
1975
+ // [8] WHERE id2 IS NOT NULL
1976
+ // query
1977
+ rs.clear();
1978
+ q.reset().whereIsNotNull(_T("id2")).reject(0);
1979
+ atv.keyValue((char *)NULL).read(rs, q);
1980
+ //rs.dump();
1981
+ BOOST_CHECK(rs.size() == 4);
1982
+ BOOST_CHECK(rs[0][_T("id")] == 1);
1983
+ BOOST_CHECK(rs[1][_T("id")] == 3);
1984
+ BOOST_CHECK(rs[2][_T("id")] == 4);
1985
+ BOOST_CHECK(rs[3][_T("id")] == 5);
1986
+ // query reverse
1987
+ rs.clear();
1988
+ q.reset().whereIsNotNull(_T("id2")).reject(0).direction(table::findBackForword);
1989
+ atv.keyValue(100).read(rs, q);
1990
+ //rs.dump();
1991
+ BOOST_CHECK(rs.size() == 4);
1992
+ BOOST_CHECK(rs[0][_T("id")] == 5);
1993
+ BOOST_CHECK(rs[1][_T("id")] == 4);
1994
+ BOOST_CHECK(rs[2][_T("id")] == 3);
1995
+ BOOST_CHECK(rs[3][_T("id")] == 1);
1996
+ // recordsetQuery
1997
+ rs.clear();
1998
+ q.reset().all();
1999
+ atv.keyValue((char *)NULL).read(rs, q);
2000
+ rq.reset();
2001
+ rq.whenIsNotNull(_T("id2"));
2002
+ rs.matchBy(rq);
2003
+ //rs.dump();
2004
+ BOOST_CHECK(rs.size() == 4);
2005
+ BOOST_CHECK(rs[0][_T("id")] == 1);
2006
+ BOOST_CHECK(rs[1][_T("id")] == 3);
2007
+ BOOST_CHECK(rs[2][_T("id")] == 4);
2008
+ BOOST_CHECK(rs[3][_T("id")] == 5);
2009
+
2010
+ // [9] WHERE id2 IN (1, 2, 3
2011
+ // query
2012
+ rs.clear();
2013
+ q.reset().in(1, 2, 3).reject(0);
2014
+ atv.keyValue((char *)NULL).read(rs, q);
2015
+ //rs.dump();
2016
+ BOOST_CHECK(rs.size() == 3);
2017
+ BOOST_CHECK(rs[0][_T("id")] == 1);
2018
+ BOOST_CHECK(rs[1].isInvalidRecord() == true);
2019
+ BOOST_CHECK(rs[2][_T("id")] == 3);
2020
+ // query reverse
2021
+ rs.clear();
2022
+ q.reset().in(1, 2, 3).reject(0).direction(table::findBackForword);
2023
+ atv.keyValue(100).read(rs, q);
2024
+ //rs.dump();
2025
+ BOOST_CHECK(rs.size() == 3);
2026
+ BOOST_CHECK(rs[0][_T("id")] == 1);
2027
+ BOOST_CHECK(rs[1].isInvalidRecord() == true);
2028
+ BOOST_CHECK(rs[2][_T("id")] == 3);
2029
+
2030
+ // [10] select * from `values` join `groups` on `values`.id2 = `groups`.id;
2031
+ rs.clear();
2032
+ q.reset().all();
2033
+ atv.keyValue((char *)NULL).read(rs, q);
2034
+ atg.join(rs, q, _T("id2"));
2035
+ //rs.dump();
2036
+ BOOST_CHECK(rs.size() == 2);
2037
+ BOOST_CHECK(rs[0][_T("id2")] == 1);
2038
+ BOOST_CHECK(rs[0][_T("group_name")] == _T("Administrators"));
2039
+ BOOST_CHECK(rs[1][_T("id2")] == 3);
2040
+ BOOST_CHECK(rs[1][_T("group_name")] == _T("Guests"));
2041
+
2042
+ // [11] select * from `values` join `groups` on `values`.id2 = `groups`.pri_id and `values`.id3 = `groups`.id;
2043
+ atv.index(2);
2044
+ atg.index(2);
2045
+ rs.clear();
2046
+ q.reset().all();
2047
+ atv.keyValue((char *)NULL).read(rs, q);
2048
+ atg.join(rs, q, _T("id2"), _T("id3"));
2049
+ atv.index(1);
2050
+ atg.index(1);
2051
+ //rs.dump();
2052
+ BOOST_CHECK(rs.size() == 1);
2053
+ BOOST_CHECK(rs[0][_T("id2")] == 1);
2054
+ BOOST_CHECK(rs[0][_T("group_name")] == _T("Administrators"));
2055
+
2056
+ // [12] select * from `values` left outer join `groups` on `values`.id2 = `groups`.id;
2057
+ rs.clear();
2058
+ q.reset().all();
2059
+ atv.keyValue((char *)NULL).read(rs, q);
2060
+ atg.outerJoin(rs, q, _T("id2"));
2061
+ //rs.dump();
2062
+ BOOST_CHECK(rs.size() == 6);
2063
+ BOOST_CHECK(rs[0].isInvalidRecord() == true);
2064
+ BOOST_CHECK(rs[1].isInvalidRecord() == true);
2065
+ BOOST_CHECK(rs[2][_T("id2")] == 1);
2066
+ BOOST_CHECK(rs[2][_T("group_name")] == _T("Administrators"));
2067
+ BOOST_CHECK(rs[3][_T("id2")] == 3);
2068
+ BOOST_CHECK(rs[3][_T("group_name")] == _T("Guests"));
2069
+ BOOST_CHECK(rs[4].isInvalidRecord() == true);
2070
+ BOOST_CHECK(rs[5].isInvalidRecord() == true);
2071
+
2072
+ // [13] select * from `values` left outer join `groups` on `values`.id2 = `groups`.pri_id and `values`.id3 = `groups`.id;
2073
+ atv.index(2);
2074
+ atg.index(2);
2075
+ rs.clear();
2076
+ q.reset().all();
2077
+ atv.keyValue((char *)NULL, (char *)NULL).read(rs, q);
2078
+ atg.outerJoin(rs, q, _T("id2"), _T("id3"));
2079
+ atv.index(1);
2080
+ atg.index(1);
2081
+ //rs.dump();
2082
+ BOOST_CHECK(rs.size() == 6);
2083
+ BOOST_CHECK(rs[0].isInvalidRecord() == true);
2084
+ BOOST_CHECK(rs[1].isInvalidRecord() == true);
2085
+ BOOST_CHECK(rs[2][_T("id2")] == 1);
2086
+ BOOST_CHECK(rs[2][_T("group_name")] == _T("Administrators"));
2087
+ BOOST_CHECK(rs[3].isInvalidRecord() == true);
2088
+ BOOST_CHECK(rs[4].isInvalidRecord() == true);
2089
+ BOOST_CHECK(rs[5].isInvalidRecord() == true);
2090
+
2091
+ // [14] select id2 from `values` order by id2;
2092
+ rs.clear();
2093
+ q.reset().select(_T("id2"));
2094
+ atv.keyValue((char *)NULL).read(rs, q);
2095
+ rs.orderBy(_T("id2"));
2096
+ //rs.dump();
2097
+ BOOST_CHECK(rs.size() == 6);
2098
+ BOOST_CHECK(rs[0][_T("id2")].isNull() == true);
2099
+ BOOST_CHECK(rs[1][_T("id2")].isNull() == true);
2100
+ BOOST_CHECK(rs[2][_T("id2")] == 1);
2101
+ BOOST_CHECK(rs[3][_T("id2")] == 3);
2102
+ BOOST_CHECK(rs[4][_T("id2")] == 4);
2103
+ BOOST_CHECK(rs[5][_T("id2")] == 4);
2104
+
2105
+ // [15] select id2 from `values` order by id2 DESC;
2106
+ rs.clear();
2107
+ q.reset().select(_T("id2"));
2108
+ atv.keyValue((char *)NULL).read(rs, q);
2109
+ sortFields orders;
2110
+ orders.add(_T("id2"), false); // DESC
2111
+ rs.orderBy(orders);
2112
+ //rs.dump();
2113
+ BOOST_CHECK(rs.size() == 6);
2114
+ BOOST_CHECK(rs[0][_T("id2")] == 4);
2115
+ BOOST_CHECK(rs[1][_T("id2")] == 4);
2116
+ BOOST_CHECK(rs[2][_T("id2")] == 3);
2117
+ BOOST_CHECK(rs[3][_T("id2")] == 1);
2118
+ BOOST_CHECK(rs[4][_T("id2")].isNull() == true);
2119
+ BOOST_CHECK(rs[5][_T("id2")].isNull() == true);
2120
+
2121
+ // [16] select * from users2 group by `group`;
2122
+ rs.clear();
2123
+ q.reset().all();
2124
+ atu.keyValue((char *)NULL).read(rs, q);
2125
+ gq.reset();
2126
+ gq.keyField(_T("group"));
2127
+ rs.groupBy(gq);
2128
+ //rs.dump();
2129
+ BOOST_CHECK(rs.size() == 5);
2130
+ BOOST_CHECK(rs[0][_T("group")].isNull() == true);
2131
+ BOOST_CHECK(rs[1][_T("group")] == 1);
2132
+ BOOST_CHECK(rs[2][_T("group")] == 2);
2133
+ BOOST_CHECK(rs[3][_T("group")] == 3);
2134
+ BOOST_CHECK(rs[4][_T("group")] == 4);
2135
+
2136
+ // [17] select * from users2 group by `group`, `class`;
2137
+ rs.clear();
2138
+ q.reset().all();
2139
+ atu.keyValue((char *)NULL).read(rs, q);
2140
+ gq.reset();
2141
+ gq.keyField(_T("group"), _T("class"));
2142
+ rs.groupBy(gq);
2143
+ //rs.dump();
2144
+ BOOST_CHECK(rs.size() == 9);
2145
+ BOOST_CHECK(rs[0][_T("group")].isNull() == true);
2146
+ BOOST_CHECK(rs[0][_T("class")] == 2);
2147
+ BOOST_CHECK(rs[1][_T("group")].isNull() == true);
2148
+ BOOST_CHECK(rs[1][_T("class")] == 3);
2149
+ BOOST_CHECK(rs[2][_T("group")] == 1);
2150
+ BOOST_CHECK(rs[2][_T("class")] == 1);
2151
+ BOOST_CHECK(rs[3][_T("group")] == 1);
2152
+ BOOST_CHECK(rs[3][_T("class")] == 3);
2153
+ BOOST_CHECK(rs[4][_T("group")] == 2);
2154
+ BOOST_CHECK(rs[4][_T("class")].isNull() == true);
2155
+ BOOST_CHECK(rs[5][_T("group")] == 2);
2156
+ BOOST_CHECK(rs[5][_T("class")] == 1);
2157
+ BOOST_CHECK(rs[6][_T("group")] == 3);
2158
+ BOOST_CHECK(rs[6][_T("class")].isNull() == true);
2159
+ BOOST_CHECK(rs[7][_T("group")] == 3);
2160
+ BOOST_CHECK(rs[7][_T("class")] == 1);
2161
+ BOOST_CHECK(rs[8][_T("group")] == 4);
2162
+ BOOST_CHECK(rs[8][_T("class")] == 3);
2163
+
2164
+ // [18] select `group`, count(*) from users2 group by `group`;
2165
+ rs.clear();
2166
+ q.reset().all();
2167
+ atu.keyValue((char *)NULL).read(rs, q);
2168
+ gq.reset();
2169
+ gq.keyField(_T("group"));
2170
+ gq.addFunction(&countFunc);
2171
+ rs.groupBy(gq);
2172
+ //rs.dump();
2173
+ BOOST_CHECK(rs.size() == 5);
2174
+ BOOST_CHECK(rs[0][_T("group")].isNull() == true);
2175
+ BOOST_CHECK(rs[0][_T("row_count")] == 2);
2176
+ BOOST_CHECK(rs[1][_T("group")] == 1);
2177
+ BOOST_CHECK(rs[1][_T("row_count")] == 2);
2178
+ BOOST_CHECK(rs[2][_T("group")] == 2);
2179
+ BOOST_CHECK(rs[2][_T("row_count")] == 3);
2180
+ BOOST_CHECK(rs[3][_T("group")] == 3);
2181
+ BOOST_CHECK(rs[3][_T("row_count")] == 2);
2182
+ BOOST_CHECK(rs[4][_T("group")] == 4);
2183
+ BOOST_CHECK(rs[4][_T("row_count")] == 2);
2184
+
2185
+ // [19] select `group`, `class`, count(*) from users2 group by `group`, `class`;
2186
+ rs.clear();
2187
+ q.reset().all();
2188
+ atu.keyValue((char *)NULL).read(rs, q);
2189
+ gq.reset();
2190
+ gq.keyField(_T("group"), _T("class"));
2191
+ gq.addFunction(&countFunc);
2192
+ rs.groupBy(gq);
2193
+ //rs.dump();
2194
+ BOOST_CHECK(rs.size() == 9);
2195
+ BOOST_CHECK(rs[0][_T("group")].isNull() == true);
2196
+ BOOST_CHECK(rs[0][_T("class")] == 2);
2197
+ BOOST_CHECK(rs[0][_T("row_count")] == 1);
2198
+ BOOST_CHECK(rs[1][_T("group")].isNull() == true);
2199
+ BOOST_CHECK(rs[1][_T("class")] == 3);
2200
+ BOOST_CHECK(rs[1][_T("row_count")] == 1);
2201
+ BOOST_CHECK(rs[2][_T("group")] == 1);
2202
+ BOOST_CHECK(rs[2][_T("class")] == 1);
2203
+ BOOST_CHECK(rs[2][_T("row_count")] == 1);
2204
+ BOOST_CHECK(rs[3][_T("group")] == 1);
2205
+ BOOST_CHECK(rs[3][_T("class")] == 3);
2206
+ BOOST_CHECK(rs[3][_T("row_count")] == 1);
2207
+ BOOST_CHECK(rs[4][_T("group")] == 2);
2208
+ BOOST_CHECK(rs[4][_T("class")].isNull() == true);
2209
+ BOOST_CHECK(rs[4][_T("row_count")] == 2);
2210
+ BOOST_CHECK(rs[5][_T("group")] == 2);
2211
+ BOOST_CHECK(rs[5][_T("class")] == 1);
2212
+ BOOST_CHECK(rs[5][_T("row_count")] == 1);
2213
+ BOOST_CHECK(rs[6][_T("group")] == 3);
2214
+ BOOST_CHECK(rs[6][_T("class")].isNull() == true);
2215
+ BOOST_CHECK(rs[6][_T("row_count")] == 1);
2216
+ BOOST_CHECK(rs[7][_T("group")] == 3);
2217
+ BOOST_CHECK(rs[7][_T("class")] == 1);
2218
+ BOOST_CHECK(rs[7][_T("row_count")] == 1);
2219
+ BOOST_CHECK(rs[8][_T("group")] == 4);
2220
+ BOOST_CHECK(rs[8][_T("class")] == 3);
2221
+ BOOST_CHECK(rs[8][_T("row_count")] == 2);
2222
+
2223
+ // [20] select count(*) as cnt1, count(score) as cnt2, sum(score) as sum, avg(score) as avg, min(score) as min, max(score) as max from subjectscores;
2224
+ rs.clear();
2225
+ q.reset().all();
2226
+ ats.keyValue((char *)NULL).read(rs, q);
2227
+ gq.reset();
2228
+ gq.addFunction(&countFunc);
2229
+ gq.addFunction(&countField);
2230
+ gq.addFunction(&sumField);
2231
+ gq.addFunction(&avgField);
2232
+ gq.addFunction(&minField);
2233
+ gq.addFunction(&maxField);
2234
+ rs.groupBy(gq);
2235
+ //rs.dump();
2236
+ BOOST_CHECK(rs.size() == 1);
2237
+ BOOST_CHECK(rs[0][_T("row_count")] == 13);
2238
+ BOOST_CHECK(rs[0][_T("valid_row")] == 12);
2239
+ BOOST_CHECK(rs[0][_T("sum")] == 812);
2240
+ BOOST_CHECK(rs[0][_T("avg")] == (812/12));
2241
+ BOOST_CHECK(rs[0][_T("min")] == 0);
2242
+ BOOST_CHECK(rs[0][_T("max")] == 90);
2243
+
2244
+ // [21] select count(*) as cnt1, count(score) as cnt2, sum(score) as sum, avg(score) as avg, min(score) as min, max(score) as max from subjectscores group by subject;
2245
+ rs.clear();
2246
+ q.reset().all();
2247
+ ats.keyValue((char *)NULL).read(rs, q);
2248
+ gq.reset();
2249
+ gq.addFunction(&countFunc);
2250
+ gq.addFunction(&countField);
2251
+ gq.addFunction(&sumField);
2252
+ gq.addFunction(&avgField);
2253
+ gq.addFunction(&minField);
2254
+ gq.addFunction(&maxField);
2255
+ gq.keyField(_T("subject"));
2256
+ rs.groupBy(gq);
2257
+ //rs.dump();
2258
+ BOOST_CHECK(rs.size() == 3);
2259
+ BOOST_CHECK(rs[0][_T("subject")] == 1);
2260
+ BOOST_CHECK(rs[0][_T("row_count")] == 5);
2261
+ BOOST_CHECK(rs[0][_T("valid_row")] == 4);
2262
+ BOOST_CHECK(rs[0][_T("sum")] == 260);
2263
+ BOOST_CHECK(rs[0][_T("avg")] == (260/4));
2264
+ BOOST_CHECK(rs[0][_T("min")] == 50);
2265
+ BOOST_CHECK(rs[0][_T("max")] == 80);
2266
+ BOOST_CHECK(rs[1][_T("subject")] == 2);
2267
+ BOOST_CHECK(rs[1][_T("row_count")] == 3);
2268
+ BOOST_CHECK(rs[1][_T("valid_row")] == 3);
2269
+ BOOST_CHECK(rs[1][_T("sum")] == 262);
2270
+ BOOST_CHECK(rs[1][_T("avg")] == (262/3));
2271
+ BOOST_CHECK(rs[1][_T("min")] == 85);
2272
+ BOOST_CHECK(rs[1][_T("max")] == 90);
2273
+ BOOST_CHECK(rs[2][_T("subject")] == 3);
2274
+ BOOST_CHECK(rs[2][_T("row_count")] == 5);
2275
+ BOOST_CHECK(rs[2][_T("valid_row")] == 5);
2276
+ BOOST_CHECK(rs[2][_T("sum")] == 290);
2277
+ BOOST_CHECK(rs[2][_T("avg")] == (290/5));
2278
+ BOOST_CHECK(rs[2][_T("min")] == 0);
2279
+ BOOST_CHECK(rs[2][_T("max")] == 90);
2280
+ }
2281
+
2282
+ #define SEB_DB_TABLE_NAME _T("setenumbit")
2283
+
2284
+ void testSetEnumBit()
2285
+ {
2286
+ database* db = database::create();
2287
+ db->open(makeUri(PROTOCOL, HOSTNAME, DBNAMEV3));
2288
+
2289
+ activeTable ats(db, SEB_DB_TABLE_NAME);
2290
+ ats.index(0);
2291
+ recordset rs;
2292
+ query q;
2293
+ q.reset().all();
2294
+ ats.keyValue((char *)NULL).read(rs, q);
2295
+ #ifdef _DEBUG
2296
+ //rs.dump();
2297
+ #endif
2298
+
2299
+ BOOST_CHECK(rs.size() == 4);
2300
+
2301
+ BOOST_CHECK(rs[0][_T("id")] == 1);
2302
+ BOOST_CHECK(rs[0][_T("set5")].i64() == 1);
2303
+ BOOST_CHECK(rs[0][_T("set64")].i64() == 1);
2304
+ BOOST_CHECK(rs[0][_T("enum2")].i64() == 2);
2305
+ BOOST_CHECK(rs[0][_T("enum260")].i64() == 1);
2306
+ BOOST_CHECK(rs[0][_T("bit1")].i64() == 1);
2307
+ BOOST_CHECK(rs[0][_T("bit8")].i64() == 1);
2308
+ BOOST_CHECK(rs[0][_T("bit32")].i64() == 1);
2309
+ BOOST_CHECK(rs[0][_T("bit64")].i64() == 1);
2310
+
2311
+ BOOST_CHECK(rs[1][_T("id")] == 2);
2312
+ BOOST_CHECK(rs[1][_T("set5")].i64() == 31);
2313
+ BOOST_CHECK(rs[1][_T("set64")].i64() == 0x8000000000000001);
2314
+ BOOST_CHECK(rs[1][_T("enum2")].i64() == 1);
2315
+ BOOST_CHECK(rs[1][_T("enum260")].i64() == 260);
2316
+ BOOST_CHECK(rs[1][_T("bit1")].i64() == 1);
2317
+ BOOST_CHECK(rs[1][_T("bit8")].i64() == 0xFF);
2318
+ BOOST_CHECK(rs[1][_T("bit32")].i64() == 0xFFFFFFFF);
2319
+ BOOST_CHECK(rs[1][_T("bit64")].i64() == 0xFFFFFFFFFFFFFFFF);
2320
+
2321
+ BOOST_CHECK(rs[2][_T("id")] == 3);
2322
+ BOOST_CHECK(rs[2][_T("set5")].i64() == 0);
2323
+ BOOST_CHECK(rs[2][_T("set64")].i64() == 0);
2324
+ BOOST_CHECK(rs[2][_T("enum2")].i64() == 0);
2325
+ BOOST_CHECK(rs[2][_T("enum260")].i64() == 0);
2326
+ BOOST_CHECK(rs[2][_T("bit1")].i64() == 0);
2327
+ BOOST_CHECK(rs[2][_T("bit8")].i64() == 0);
2328
+ BOOST_CHECK(rs[2][_T("bit32")].i64() == 0);
2329
+ BOOST_CHECK(rs[2][_T("bit64")].i64() == 0);
2330
+
2331
+ BOOST_CHECK(rs[3][_T("id")] == 4);
2332
+ BOOST_CHECK(rs[3][_T("set5")].isNull() == true);
2333
+ BOOST_CHECK(rs[3][_T("set64")].isNull() == true);
2334
+ BOOST_CHECK(rs[3][_T("enum2")].isNull() == true);
2335
+ BOOST_CHECK(rs[3][_T("enum260")].isNull() == true);
2336
+ BOOST_CHECK(rs[3][_T("bit1")].isNull() == true);
2337
+ BOOST_CHECK(rs[3][_T("bit8")].isNull() == true);
2338
+ BOOST_CHECK(rs[3][_T("bit32")].isNull() == true);
2339
+ BOOST_CHECK(rs[3][_T("bit64")].isNull() == true);
2340
+ db->release();
2341
+ }
2342
+
2343
+ #include <bzs/db/protocol/tdap/fieldComp.h>
2344
+ void testCompInt()
2345
+ {
2346
+ for (ushort_td len = 1; len < 6; ++len)
2347
+ {
2348
+ if (len == 5) len = 8;
2349
+ comp1Func compFunc = getCompFunc(ft_integer, len, eEqual, 0);
2350
+ __int64 l; __int64 r;
2351
+ l = 0; r = 1; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2352
+ l = 0; r = 0; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2353
+ l = 1; r = 0; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2354
+ l = -1;r = 0; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2355
+ l = -1;r = -1; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2356
+ l = -1;r = -2; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2357
+ }
2358
+ }
2359
+
2360
+ void testCompUint()
2361
+ {
2362
+ for (ushort_td len = 1; len < 6; ++len)
2363
+ {
2364
+ if (len == 5) len = 8;
2365
+ comp1Func compFunc = getCompFunc(ft_uinteger, len, eEqual, 0);
2366
+ unsigned __int64 l; unsigned __int64 r;
2367
+ l = 0; r = ULLONG_MAX; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2368
+ l = 0; r = 0; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2369
+ l = 1; r = 0; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2370
+ l = ULLONG_MAX; r = 0; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2371
+ l = ULLONG_MAX; r = ULLONG_MAX; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2372
+ l = ULLONG_MAX-1;r = ULLONG_MAX; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2373
+ }
2374
+ }
2375
+ void testCompDouble()
2376
+ {
2377
+ ushort_td len = 4;
2378
+ comp1Func compFunc = getCompFunc(ft_float, len, eEqual, 0);
2379
+ {
2380
+ float l; float r;
2381
+ l = (float)-0.2; r = 0; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2382
+ l = (float)-0.2; r = (float)-0.2; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2383
+ l = (float)0.2; r = 0; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2384
+ }
2385
+ {
2386
+ double l; double r;
2387
+ len = 8;
2388
+ compFunc = getCompFunc(ft_float, len, eEqual, 0);
2389
+ l = -0.000000000000002; r = 0; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2390
+ l = -0.000000000000002; r = -0.000000000000002; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2391
+ l = 0.000000000000002; r = 0; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2392
+ }
2393
+ }
2394
+
2395
+ void testCompBit()
2396
+ {
2397
+ for (ushort_td len = 1; len < 8; ++len)
2398
+ {
2399
+ // equal comp
2400
+ comp1Func compFunc = getCompFunc(ft_bit, len, eEqual, 0);
2401
+ unsigned __int64 l; unsigned __int64 r;
2402
+
2403
+ l = 0; r = 0xF0; l = changeEndian(l, len);r = changeEndian(r, len);
2404
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2405
+
2406
+ l = 0; r = 0; l = changeEndian(l, len);r = changeEndian(r, len);
2407
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2408
+
2409
+ l = 1; r = 0; l = changeEndian(l, len);r = changeEndian(r, len);
2410
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2411
+
2412
+ l = 0xF0; r = 0; l = changeEndian(l, len);r = changeEndian(r, len);
2413
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2414
+
2415
+ l = 0xF0; r = 0xF0; l = changeEndian(l, len);r = changeEndian(r, len);
2416
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2417
+
2418
+ l = 0xF0-1;r = 0xF0; l = changeEndian(l, len);r = changeEndian(r, len);
2419
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2420
+
2421
+ // bit comp
2422
+ compFunc = getCompFunc(ft_bit, len, eBitAnd, 0);
2423
+ l = 0xFF; r = 0xF0; l = changeEndian(l, len);r = changeEndian(r, len);
2424
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2425
+ l = 0xF0; r = 0xF; l = changeEndian(l, len);r = changeEndian(r, len);
2426
+ int v = compFunc((const char*)&l, (const char*)&r, len);
2427
+ BOOST_CHECK(v > 0);
2428
+
2429
+ compFunc = getCompFunc(ft_bit, len, eNotBitAnd, 0);
2430
+ l = 0xFF; r = 0xF0; l = changeEndian(l, len);r = changeEndian(r, len);
2431
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2432
+ }
2433
+ }
2434
+
2435
+ void testCompSet()
2436
+ {
2437
+ for (ushort_td len = 1; len < 5; ++len)
2438
+ {
2439
+ if (len == 5) len = 8;
2440
+ // equal comp
2441
+ comp1Func compFunc = getCompFunc(ft_set, len, eEqual, 0);
2442
+ unsigned __int64 l; unsigned __int64 r;
2443
+ l = 0; r = 0xF0;
2444
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2445
+ l = 0; r = 0;
2446
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2447
+ l = 1; r = 0;
2448
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2449
+ l = 0xF0; r = 0;
2450
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2451
+ l = 0xF0; r = 0xF0;
2452
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2453
+ l = 0xF0-1;r = 0xF0;
2454
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2455
+
2456
+ // bit comp
2457
+ compFunc = getCompFunc(ft_set, len, eBitAnd, 0);
2458
+ l = 0xFF; r = 0xF0;
2459
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2460
+ l = 0xF0; r = 0xF;
2461
+ int v = compFunc((const char*)&l, (const char*)&r, len);
2462
+ BOOST_CHECK(v > 0);
2463
+ compFunc = getCompFunc(ft_set, len, eNotBitAnd, 0);
2464
+ l = 0xFF; r = 0xF0;
2465
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2466
+ }
2467
+ }
2468
+
2469
+ void testCompEnum()
2470
+ {
2471
+ for (ushort_td len = 1; len < 3; ++len)
2472
+ {
2473
+ comp1Func compFunc = getCompFunc(ft_enum, len, eEqual, 0);
2474
+ unsigned short l; unsigned short r;
2475
+ l = 0; r = USHRT_MAX; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2476
+ l = 0; r = 0; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2477
+ l = 1; r = 0; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2478
+ l = USHRT_MAX; r = 0; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2479
+ l = USHRT_MAX; r = USHRT_MAX; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2480
+ l = USHRT_MAX-1;r = USHRT_MAX; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2481
+ }
2482
+ }
2483
+
2484
+ void testCompYear()
2485
+ {
2486
+ ushort_td len = 1;
2487
+ comp1Func compFunc = getCompFunc(ft_myyear, len, eEqual, 0);
2488
+ unsigned char l; unsigned char r;
2489
+ l = 0; r = 0XFF; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2490
+ l = 0; r = 0; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2491
+ l = 0XFF; r = 0; BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2492
+ }
2493
+
2494
+ void testCompDate()
2495
+ {
2496
+ ushort_td len = 3;
2497
+ comp1Func compFunc = getCompFunc(ft_mydate, len, eEqual, 0);
2498
+ myDate ld, rd;
2499
+ int l, r;
2500
+
2501
+ ld = _T("1900-01-01"); rd = _T("1900-01-02"); l = ld.getValue(); r = rd.getValue();
2502
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2503
+ ld = _T("1900-01-01"); rd = _T("1900-01-01"); l = ld.getValue(); r = rd.getValue();
2504
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2505
+ ld = _T("1900-01-02"); rd = _T("1900-01-01"); l = ld.getValue(); r = rd.getValue();
2506
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2507
+
2508
+ }
2509
+
2510
+ void testCompTime()
2511
+ {
2512
+ __int64 l, r;
2513
+ {
2514
+ ushort_td len = 3;
2515
+ {
2516
+ comp1Func compFunc = getCompFunc(ft_mytime_num_cmp, len, eEqual, 0);
2517
+ myTime ld(0, false), rd(0, false);
2518
+ ld = _T("00:00:59"); rd = _T("16:59:00"); l = ld.getValue(); r = rd.getValue();
2519
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2520
+ ld = _T("00:00:01"); rd = _T("00:00:01"); l = ld.getValue(); r = rd.getValue();
2521
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2522
+ ld = _T("16:59:00"); rd = _T("00:00:59"); l = ld.getValue(); r = rd.getValue();
2523
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2524
+ }
2525
+ {
2526
+ comp1Func compFunc = getCompFunc(ft_mytime, len, eEqual, 0);
2527
+ myTime ld(0, true), rd(0, true);
2528
+ ld = _T("00:00:59"); rd = _T("16:59:00"); l = ld.getValue(); r = rd.getValue();
2529
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2530
+ ld = _T("00:00:01"); rd = _T("00:00:01"); l = ld.getValue(); r = rd.getValue();
2531
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2532
+ ld = _T("16:59:00"); rd = _T("00:00:59"); l = ld.getValue(); r = rd.getValue();
2533
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2534
+ }
2535
+
2536
+ len = 4;
2537
+ {
2538
+ comp1Func compFunc = getCompFunc(ft_mytime, len, eEqual, 0);
2539
+ myTime ld(1, true), rd(1, true);
2540
+ ld = _T("00:00:59.1"); rd = _T("00:00:59.2"); l = ld.getValue(); r = rd.getValue();
2541
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2542
+ ld = _T("00:00:59.1"); rd = _T("00:00:59.1"); l = ld.getValue(); r = rd.getValue();
2543
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2544
+ ld = _T("00:00:59.1"); rd = _T("00:00:59.0"); l = ld.getValue(); r = rd.getValue();
2545
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2546
+ }
2547
+
2548
+ {
2549
+ comp1Func compFunc = getCompFunc(ft_mytime, len, eEqual, 0);
2550
+ myTime ld(2, true), rd(2, true);
2551
+ ld = _T("00:00:59.01"); rd = _T("00:00:59.02"); l = ld.getValue(); r = rd.getValue();
2552
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2553
+ ld = _T("00:00:59.01"); rd = _T("00:00:59.01"); l = ld.getValue(); r = rd.getValue();
2554
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2555
+ ld = _T("00:00:59.01"); rd = _T("00:00:59.00"); l = ld.getValue(); r = rd.getValue();
2556
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2557
+ }
2558
+
2559
+ len = 5;
2560
+ {
2561
+ comp1Func compFunc = getCompFunc(ft_mytime, len, eEqual, 0);
2562
+ myTime ld(3, true), rd(3, true);
2563
+ ld = _T("00:00:59.001"); rd = _T("00:00:59.002"); l = ld.getValue(); r = rd.getValue();
2564
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2565
+ ld = _T("00:00:59.001"); rd = _T("00:00:59.001"); l = ld.getValue(); r = rd.getValue();
2566
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2567
+ ld = _T("00:00:59.001"); rd = _T("00:00:59.000"); l = ld.getValue(); r = rd.getValue();
2568
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2569
+ }
2570
+
2571
+ {
2572
+ comp1Func compFunc = getCompFunc(ft_mytime, len, eEqual, 0);
2573
+ myTime ld(4, true), rd(4, true);
2574
+ ld = _T("00:00:59.0000"); rd = _T("00:00:59.0001"); l = ld.getValue(); r = rd.getValue();
2575
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2576
+ ld = _T("00:00:59.0001"); rd = _T("00:00:59.0001"); l = ld.getValue(); r = rd.getValue();
2577
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2578
+ ld = _T("00:00:59.0001"); rd = _T("00:00:59.0000"); l = ld.getValue(); r = rd.getValue();
2579
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2580
+ }
2581
+
2582
+ len = 6;
2583
+ {
2584
+ comp1Func compFunc = getCompFunc(ft_mytime, len, eEqual, 0);
2585
+ myTime ld(5, true), rd(5, true);
2586
+ ld = _T("00:00:59.00001"); rd = _T("00:00:59.00002"); l = ld.getValue(); r = rd.getValue();
2587
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2588
+ ld = _T("00:00:59.00001"); rd = _T("00:00:59.00001"); l = ld.getValue(); r = rd.getValue();
2589
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2590
+ ld = _T("00:00:59.00001"); rd = _T("00:00:59.00000"); l = ld.getValue(); r = rd.getValue();
2591
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2592
+ }
2593
+
2594
+ {
2595
+ comp1Func compFunc = getCompFunc(ft_mytime, len, eEqual, 0);
2596
+ myTime ld(6, true), rd(6, true);
2597
+ ld = _T("01:00:59.999999"); rd = _T("10:00:59.100001"); l = ld.getValue(); r = rd.getValue();
2598
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2599
+ ld = _T("00:00:59.000001"); rd = _T("00:00:59.000001"); l = ld.getValue(); r = rd.getValue();
2600
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2601
+ ld = _T("10:00:59.000000"); rd = _T("10:00:58.999999"); l = ld.getValue(); r = rd.getValue();
2602
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2603
+ }
2604
+ }
2605
+ }
2606
+
2607
+ void testCompDateTime()
2608
+ {
2609
+ __int64 l, r;
2610
+ {
2611
+ ushort_td len = 5;
2612
+ {
2613
+ comp1Func compFunc = getCompFunc(ft_mydatetime, len, eEqual, 0);
2614
+ myDateTime ld(0, true), rd(0, true);
2615
+ ld = _T("1900-01-02 00:00:59"); rd = _T("1900-01-02 16:59:00"); l = ld.getValue(); r = rd.getValue();
2616
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2617
+ ld = _T("1900-01-02 00:00:01"); rd = _T("1900-01-02 00:00:01"); l = ld.getValue(); r = rd.getValue();
2618
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2619
+ ld = _T("1900-01-02 16:59:00"); rd = _T("1900-01-02 00:00:59"); l = ld.getValue(); r = rd.getValue();
2620
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2621
+ }
2622
+
2623
+ len = 6;
2624
+ {
2625
+ comp1Func compFunc = getCompFunc(ft_mydatetime, len, eEqual, 0);
2626
+ myDateTime ld(1, true), rd(1, true);
2627
+ ld = _T("1900-01-02 00:00:59.1"); rd = _T("1900-01-02 00:00:59.2"); l = ld.getValue(); r = rd.getValue();
2628
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2629
+ ld = _T("1900-01-02 00:00:59.1"); rd = _T("1900-01-02 00:00:59.1"); l = ld.getValue(); r = rd.getValue();
2630
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2631
+ ld = _T("1900-01-02 00:00:59.1"); rd = _T("1900-01-02 00:00:59.0"); l = ld.getValue(); r = rd.getValue();
2632
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2633
+ }
2634
+
2635
+ {
2636
+ comp1Func compFunc = getCompFunc(ft_mydatetime, len, eEqual, 0);
2637
+ myDateTime ld(2, true), rd(2, true);
2638
+ ld = _T("1900-01-02 00:00:59.01"); rd = _T("1900-01-02 00:00:59.02"); l = ld.getValue(); r = rd.getValue();
2639
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2640
+ ld = _T("1900-01-02 00:00:59.01"); rd = _T("1900-01-02 00:00:59.01"); l = ld.getValue(); r = rd.getValue();
2641
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2642
+ ld = _T("1900-01-02 00:00:59.01"); rd = _T("1900-01-02 00:00:59.00"); l = ld.getValue(); r = rd.getValue();
2643
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2644
+ }
2645
+
2646
+ len = 7;
2647
+ {
2648
+ comp1Func compFunc = getCompFunc(ft_mydatetime, len, eEqual, 0);
2649
+ myDateTime ld(3, true), rd(3, true);
2650
+ ld = _T("1900-01-02 00:00:59.001"); rd = _T("1900-01-02 00:00:59.002"); l = ld.getValue(); r = rd.getValue();
2651
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2652
+ ld = _T("1900-01-02 00:00:59.001"); rd = _T("1900-01-02 00:00:59.001"); l = ld.getValue(); r = rd.getValue();
2653
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2654
+ ld = _T("1900-01-02 00:00:59.001"); rd = _T("1900-01-02 00:00:59.000"); l = ld.getValue(); r = rd.getValue();
2655
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2656
+ }
2657
+
2658
+ {
2659
+ comp1Func compFunc = getCompFunc(ft_mydatetime, len, eEqual, 0);
2660
+ myDateTime ld(4, true), rd(4, true);
2661
+ ld = _T("1900-01-02 00:00:59.0000"); rd = _T("1900-01-02 00:00:59.0001"); l = ld.getValue(); r = rd.getValue();
2662
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2663
+ ld = _T("1900-01-02 00:00:59.0001"); rd = _T("1900-01-02 00:00:59.0001"); l = ld.getValue(); r = rd.getValue();
2664
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2665
+ ld = _T("1900-01-02 00:00:59.0001"); rd = _T("1900-01-02 00:00:59.0000"); l = ld.getValue(); r = rd.getValue();
2666
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2667
+ }
2668
+
2669
+ len = 8;
2670
+ {
2671
+ comp1Func compFunc = getCompFunc(ft_mydatetime, len, eEqual, 0);
2672
+ myDateTime ld(5, true), rd(5, true);
2673
+ ld = _T("1900-01-02 00:00:59.00001"); rd = _T("1900-01-02 00:00:59.00002"); l = ld.getValue(); r = rd.getValue();
2674
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2675
+ ld = _T("1900-01-02 00:00:59.00001"); rd = _T("1900-01-02 00:00:59.00001"); l = ld.getValue(); r = rd.getValue();
2676
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2677
+ ld = _T("1900-01-02 00:00:59.00001"); rd = _T("1900-01-02 00:00:59.00000"); l = ld.getValue(); r = rd.getValue();
2678
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2679
+ }
2680
+
2681
+ {
2682
+ comp1Func compFunc = getCompFunc(ft_mydatetime, len, eEqual, 0);
2683
+ myDateTime ld(6, true), rd(6, true);
2684
+ ld = _T("1900-01-02 01:00:59.999999"); rd = _T("1900-01-02 10:00:59.100001"); l = ld.getValue(); r = rd.getValue();
2685
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2686
+ ld = _T("1900-01-02 00:00:59.000001"); rd = _T("1900-01-02 00:00:59.000001"); l = ld.getValue(); r = rd.getValue();
2687
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2688
+ ld = _T("1900-01-02 10:00:59.000000"); rd = _T("1900-01-02 10:00:58.999999"); l = ld.getValue(); r = rd.getValue();
2689
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2690
+ }
2691
+
2692
+ {
2693
+ comp1Func compFunc = getCompFunc(ft_mydatetime_num_cmp, len, eEqual, 0);
2694
+ myDateTime ld(0, false), rd(0, false);
2695
+ ld = _T("1900-01-02 00:00:59"); rd = _T("1900-01-02 16:59:00"); l = ld.getValue(); r = rd.getValue();
2696
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2697
+ ld = _T("1900-01-02 00:00:01"); rd = _T("1900-01-02 00:00:01"); l = ld.getValue(); r = rd.getValue();
2698
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2699
+ ld = _T("1900-01-02 16:59:00"); rd = _T("1900-01-02 00:00:59"); l = ld.getValue(); r = rd.getValue();
2700
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2701
+ }
2702
+ }
2703
+ }
2704
+
2705
+ void testCompTimeStamp()
2706
+ {
2707
+ __int64 l, r;
2708
+ {
2709
+ ushort_td len = 4;
2710
+ {
2711
+ comp1Func compFunc = getCompFunc(ft_mytimestamp, len, eEqual, 0);
2712
+ myTimeStamp ld(0, true), rd(0, true);
2713
+ ld = _T("1970-01-02 00:00:59"); rd = _T("1970-01-02 16:59:00"); l = ld.getValue(); r = rd.getValue();
2714
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2715
+ ld = _T("1970-01-02 00:00:01"); rd = _T("1970-01-02 00:00:01"); l = ld.getValue(); r = rd.getValue();
2716
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2717
+ ld = _T("1970-01-02 16:59:00"); rd = _T("1970-01-02 00:00:59"); l = ld.getValue(); r = rd.getValue();
2718
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2719
+ }
2720
+
2721
+ {
2722
+ comp1Func compFunc = getCompFunc(ft_mytimestamp_num_cmp, len, eEqual, 0);
2723
+ myTimeStamp ld(0, false), rd(0, false);
2724
+ ld = _T("1970-01-02 00:00:59"); rd = _T("1970-01-02 16:59:00"); l = ld.getValue(); r = rd.getValue();
2725
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2726
+ ld = _T("1970-01-02 00:00:01"); rd = _T("1970-01-02 00:00:01"); l = ld.getValue(); r = rd.getValue();
2727
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2728
+ ld = _T("1970-01-02 16:59:00"); rd = _T("1970-01-02 00:00:59"); l = ld.getValue(); r = rd.getValue();
2729
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2730
+ }
2731
+
2732
+ len = 5;
2733
+ {
2734
+ comp1Func compFunc = getCompFunc(ft_mytimestamp, len, eEqual, 0);
2735
+ myTimeStamp ld(1, true), rd(1, true);
2736
+ ld = _T("1970-01-02 00:00:59.1"); rd = _T("1970-01-02 00:00:59.2"); l = ld.getValue(); r = rd.getValue();
2737
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2738
+ ld = _T("1970-01-02 00:00:59.1"); rd = _T("1970-01-02 00:00:59.1"); l = ld.getValue(); r = rd.getValue();
2739
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2740
+ ld = _T("1970-01-02 00:00:59.1"); rd = _T("1970-01-02 00:00:59.0"); l = ld.getValue(); r = rd.getValue();
2741
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2742
+ }
2743
+
2744
+ {
2745
+ comp1Func compFunc = getCompFunc(ft_mytimestamp, len, eEqual, 0);
2746
+ myTimeStamp ld(2, true), rd(2, true);
2747
+ ld = _T("1970-01-02 00:00:59.01"); rd = _T("1970-01-02 00:00:59.02"); l = ld.getValue(); r = rd.getValue();
2748
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2749
+ ld = _T("1970-01-02 00:00:59.01"); rd = _T("1970-01-02 00:00:59.01"); l = ld.getValue(); r = rd.getValue();
2750
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2751
+ ld = _T("1970-01-02 00:00:59.01"); rd = _T("1970-01-02 00:00:59.00"); l = ld.getValue(); r = rd.getValue();
2752
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2753
+ }
2754
+
2755
+ len = 6;
2756
+ {
2757
+ comp1Func compFunc = getCompFunc(ft_mytimestamp, len, eEqual, 0);
2758
+ myTimeStamp ld(3, true), rd(3, true);
2759
+ ld = _T("1970-01-02 00:00:59.001"); rd = _T("1970-01-02 00:00:59.002"); l = ld.getValue(); r = rd.getValue();
2760
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2761
+ ld = _T("1970-01-02 00:00:59.001"); rd = _T("1970-01-02 00:00:59.001"); l = ld.getValue(); r = rd.getValue();
2762
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2763
+ ld = _T("1970-01-02 00:00:59.001"); rd = _T("1970-01-02 00:00:59.000"); l = ld.getValue(); r = rd.getValue();
2764
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2765
+ }
2766
+
2767
+ {
2768
+ comp1Func compFunc = getCompFunc(ft_mytimestamp, len, eEqual, 0);
2769
+ myTimeStamp ld(4, true), rd(4, true);
2770
+ ld = _T("1970-01-02 00:00:59.0000"); rd = _T("1970-01-02 00:00:59.0001"); l = ld.getValue(); r = rd.getValue();
2771
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2772
+ ld = _T("1970-01-02 00:00:59.0001"); rd = _T("1970-01-02 00:00:59.0001"); l = ld.getValue(); r = rd.getValue();
2773
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2774
+ ld = _T("1970-01-02 00:00:59.0001"); rd = _T("1970-01-02 00:00:59.0000"); l = ld.getValue(); r = rd.getValue();
2775
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2776
+ }
2777
+
2778
+ len = 7;
2779
+ {
2780
+ comp1Func compFunc = getCompFunc(ft_mytimestamp, len, eEqual, 0);
2781
+ myTimeStamp ld(5, true), rd(5, true);
2782
+ ld = _T("1970-01-02 00:00:59.00001"); rd = _T("1970-01-02 00:00:59.00002"); l = ld.getValue(); r = rd.getValue();
2783
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2784
+ ld = _T("1970-01-02 00:00:59.00001"); rd = _T("1970-01-02 00:00:59.00001"); l = ld.getValue(); r = rd.getValue();
2785
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2786
+ ld = _T("1970-01-02 00:00:59.00001"); rd = _T("1970-01-02 00:00:59.00000"); l = ld.getValue(); r = rd.getValue();
2787
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2788
+ }
2789
+
2790
+ {
2791
+ comp1Func compFunc = getCompFunc(ft_mytimestamp, len, eEqual, 0);
2792
+ myTimeStamp ld(6, true), rd(6, true);
2793
+ ld = _T("1970-01-02 01:00:59.999999"); rd = _T("1970-01-02 10:00:59.100001"); l = ld.getValue(); r = rd.getValue();
2794
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2795
+ ld = _T("1970-01-02 00:00:59.000001"); rd = _T("1970-01-02 00:00:59.000001"); l = ld.getValue(); r = rd.getValue();
2796
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2797
+ ld = _T("1970-01-02 10:00:59.000000"); rd = _T("1970-01-02 10:00:58.999999"); l = ld.getValue(); r = rd.getValue();
2798
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2799
+ }
2800
+ }
2801
+ }
2802
+
2803
+ void testCompTimeMa()
2804
+ {
2805
+ __int64 l, r;
2806
+ {
2807
+ ushort_td len = 3;
2808
+ {
2809
+ comp1Func compFunc = getCompFunc(ft_mytime_num_cmp, len, eEqual, 0);
2810
+ maTime ld(0, false), rd(0, false);
2811
+ ld = _T("00:00:59"); rd = _T("16:59:00"); l = ld.getValue(); r = rd.getValue();
2812
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2813
+ ld = _T("00:00:01"); rd = _T("00:00:01"); l = ld.getValue(); r = rd.getValue();
2814
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2815
+ ld = _T("16:59:00"); rd = _T("00:00:59"); l = ld.getValue(); r = rd.getValue();
2816
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2817
+ }
2818
+ {
2819
+ comp1Func compFunc = getCompFunc(ft_mytime, len, eEqual, 0);
2820
+ maTime ld(0, true), rd(0, true);
2821
+ ld = _T("00:00:59"); rd = _T("16:59:00"); l = ld.getValue(); r = rd.getValue();
2822
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2823
+ ld = _T("00:00:01"); rd = _T("00:00:01"); l = ld.getValue(); r = rd.getValue();
2824
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2825
+ ld = _T("16:59:00"); rd = _T("00:00:59"); l = ld.getValue(); r = rd.getValue();
2826
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2827
+ }
2828
+
2829
+ len = 4;
2830
+ {
2831
+ comp1Func compFunc = getCompFunc(ft_mytime, len, eEqual, 0);
2832
+ maTime ld(1, true), rd(1, true);
2833
+ ld = _T("00:00:59.1"); rd = _T("00:00:59.2"); l = ld.getValue(); r = rd.getValue();
2834
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2835
+ ld = _T("00:00:59.1"); rd = _T("00:00:59.1"); l = ld.getValue(); r = rd.getValue();
2836
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2837
+ ld = _T("00:00:59.1"); rd = _T("00:00:59.0"); l = ld.getValue(); r = rd.getValue();
2838
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2839
+ }
2840
+
2841
+ {
2842
+ comp1Func compFunc = getCompFunc(ft_mytime, len, eEqual, 0);
2843
+ maTime ld(2, true), rd(2, true);
2844
+ ld = _T("00:00:59.01"); rd = _T("00:00:59.02"); l = ld.getValue(); r = rd.getValue();
2845
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2846
+ ld = _T("00:00:59.01"); rd = _T("00:00:59.01"); l = ld.getValue(); r = rd.getValue();
2847
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2848
+ ld = _T("00:00:59.01"); rd = _T("00:00:59.00"); l = ld.getValue(); r = rd.getValue();
2849
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2850
+ }
2851
+
2852
+ len = 5;
2853
+ {
2854
+ comp1Func compFunc = getCompFunc(ft_mytime, len, eEqual, 0);
2855
+ maTime ld(3, true), rd(3, true);
2856
+ ld = _T("00:00:59.001"); rd = _T("00:00:59.002"); l = ld.getValue(); r = rd.getValue();
2857
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2858
+ ld = _T("00:00:59.001"); rd = _T("00:00:59.001"); l = ld.getValue(); r = rd.getValue();
2859
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2860
+ ld = _T("00:00:59.001"); rd = _T("00:00:59.000"); l = ld.getValue(); r = rd.getValue();
2861
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2862
+ }
2863
+
2864
+ {
2865
+ comp1Func compFunc = getCompFunc(ft_mytime, len, eEqual, 0);
2866
+ maTime ld(4, true), rd(4, true);
2867
+ ld = _T("00:00:59.0000"); rd = _T("00:00:59.0001"); l = ld.getValue(); r = rd.getValue();
2868
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2869
+ ld = _T("00:00:59.0001"); rd = _T("00:00:59.0001"); l = ld.getValue(); r = rd.getValue();
2870
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2871
+ ld = _T("00:00:59.0001"); rd = _T("00:00:59.0000"); l = ld.getValue(); r = rd.getValue();
2872
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2873
+ }
2874
+
2875
+ len = 6;
2876
+ {
2877
+ comp1Func compFunc = getCompFunc(ft_mytime, len, eEqual, 0);
2878
+ maTime ld(5, true), rd(5, true);
2879
+ ld = _T("00:00:59.00001"); rd = _T("00:00:59.00002"); l = ld.getValue(); r = rd.getValue();
2880
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2881
+ ld = _T("00:00:59.00001"); rd = _T("00:00:59.00001"); l = ld.getValue(); r = rd.getValue();
2882
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2883
+ ld = _T("00:00:59.00001"); rd = _T("00:00:59.00000"); l = ld.getValue(); r = rd.getValue();
2884
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2885
+ }
2886
+
2887
+ {
2888
+ comp1Func compFunc = getCompFunc(ft_mytime, len, eEqual, 0);
2889
+ maTime ld(6, true), rd(6, true);
2890
+ ld = _T("01:00:59.999999"); rd = _T("10:00:59.100001"); l = ld.getValue(); r = rd.getValue();
2891
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2892
+ ld = _T("00:00:59.000001"); rd = _T("00:00:59.000001"); l = ld.getValue(); r = rd.getValue();
2893
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2894
+ ld = _T("10:00:59.000000"); rd = _T("10:00:58.999999"); l = ld.getValue(); r = rd.getValue();
2895
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2896
+ }
2897
+ }
2898
+ }
2899
+
2900
+ void testCompDateTimeMa()
2901
+ {
2902
+ __int64 l, r;
2903
+ {
2904
+ ushort_td len = 5;
2905
+ {
2906
+ comp1Func compFunc = getCompFunc(ft_mydatetime, len, eEqual, 0);
2907
+ maDateTime ld(0, true), rd(0, true);
2908
+ ld = _T("1900-01-02 00:00:59"); rd = _T("1900-01-02 16:59:00"); l = ld.getValue(); r = rd.getValue();
2909
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2910
+ ld = _T("1900-01-02 00:00:01"); rd = _T("1900-01-02 00:00:01"); l = ld.getValue(); r = rd.getValue();
2911
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2912
+ ld = _T("1900-01-02 16:59:00"); rd = _T("1900-01-02 00:00:59"); l = ld.getValue(); r = rd.getValue();
2913
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2914
+ }
2915
+
2916
+ len = 6;
2917
+ {
2918
+ comp1Func compFunc = getCompFunc(ft_mydatetime, len, eEqual, 0);
2919
+ maDateTime ld(1, true), rd(1, true);
2920
+ ld = _T("1900-01-02 00:00:59.1"); rd = _T("1900-01-02 00:00:59.2"); l = ld.getValue(); r = rd.getValue();
2921
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2922
+ ld = _T("1900-01-02 00:00:59.1"); rd = _T("1900-01-02 00:00:59.1"); l = ld.getValue(); r = rd.getValue();
2923
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2924
+ ld = _T("1900-01-02 00:00:59.1"); rd = _T("1900-01-02 00:00:59.0"); l = ld.getValue(); r = rd.getValue();
2925
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2926
+ }
2927
+
2928
+ {
2929
+ comp1Func compFunc = getCompFunc(ft_mydatetime, len, eEqual, 0);
2930
+ maDateTime ld(2, true), rd(2, true);
2931
+ ld = _T("1900-01-02 00:00:59.01"); rd = _T("1900-01-02 00:00:59.02"); l = ld.getValue(); r = rd.getValue();
2932
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2933
+ ld = _T("1900-01-02 00:00:59.01"); rd = _T("1900-01-02 00:00:59.01"); l = ld.getValue(); r = rd.getValue();
2934
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2935
+ ld = _T("1900-01-02 00:00:59.01"); rd = _T("1900-01-02 00:00:59.00"); l = ld.getValue(); r = rd.getValue();
2936
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2937
+ }
2938
+
2939
+ len = 7;
2940
+ {
2941
+ comp1Func compFunc = getCompFunc(ft_mydatetime, len, eEqual, 0);
2942
+ maDateTime ld(3, true), rd(3, true);
2943
+ ld = _T("1900-01-02 00:00:59.001"); rd = _T("1900-01-02 00:00:59.002"); l = ld.getValue(); r = rd.getValue();
2944
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2945
+ ld = _T("1900-01-02 00:00:59.001"); rd = _T("1900-01-02 00:00:59.001"); l = ld.getValue(); r = rd.getValue();
2946
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2947
+ ld = _T("1900-01-02 00:00:59.001"); rd = _T("1900-01-02 00:00:59.000"); l = ld.getValue(); r = rd.getValue();
2948
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2949
+ }
2950
+
2951
+ {
2952
+ comp1Func compFunc = getCompFunc(ft_mydatetime, len, eEqual, 0);
2953
+ maDateTime ld(4, true), rd(4, true);
2954
+ ld = _T("1900-01-02 00:00:59.0000"); rd = _T("1900-01-02 00:00:59.0001"); l = ld.getValue(); r = rd.getValue();
2955
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2956
+ ld = _T("1900-01-02 00:00:59.0001"); rd = _T("1900-01-02 00:00:59.0001"); l = ld.getValue(); r = rd.getValue();
2957
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2958
+ ld = _T("1900-01-02 00:00:59.0001"); rd = _T("1900-01-02 00:00:59.0000"); l = ld.getValue(); r = rd.getValue();
2959
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2960
+ }
2961
+
2962
+ len = 8;
2963
+ {
2964
+ comp1Func compFunc = getCompFunc(ft_mydatetime, len, eEqual, 0);
2965
+ maDateTime ld(5, true), rd(5, true);
2966
+ ld = _T("1900-01-02 00:00:59.00001"); rd = _T("1900-01-02 00:00:59.00002"); l = ld.getValue(); r = rd.getValue();
2967
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2968
+ ld = _T("1900-01-02 00:00:59.00001"); rd = _T("1900-01-02 00:00:59.00001"); l = ld.getValue(); r = rd.getValue();
2969
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2970
+ ld = _T("1900-01-02 00:00:59.00001"); rd = _T("1900-01-02 00:00:59.00000"); l = ld.getValue(); r = rd.getValue();
2971
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2972
+ }
2973
+
2974
+ {
2975
+ comp1Func compFunc = getCompFunc(ft_mydatetime, len, eEqual, 0);
2976
+ maDateTime ld(6, true), rd(6, true);
2977
+ ld = _T("1900-01-02 01:00:59.999999"); rd = _T("1900-01-02 10:00:59.100001"); l = ld.getValue(); r = rd.getValue();
2978
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2979
+ ld = _T("1900-01-02 00:00:59.000001"); rd = _T("1900-01-02 00:00:59.000001"); l = ld.getValue(); r = rd.getValue();
2980
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2981
+ ld = _T("1900-01-02 10:00:59.000000"); rd = _T("1900-01-02 10:00:58.999999"); l = ld.getValue(); r = rd.getValue();
2982
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2983
+ }
2984
+
2985
+ {
2986
+ comp1Func compFunc = getCompFunc(ft_mydatetime_num_cmp, len, eEqual, 0);
2987
+ maDateTime ld(0, false), rd(0, false);
2988
+ ld = _T("1900-01-02 00:00:59"); rd = _T("1900-01-02 16:59:00"); l = ld.getValue(); r = rd.getValue();
2989
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
2990
+ ld = _T("1900-01-02 00:00:01"); rd = _T("1900-01-02 00:00:01"); l = ld.getValue(); r = rd.getValue();
2991
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
2992
+ ld = _T("1900-01-02 16:59:00"); rd = _T("1900-01-02 00:00:59"); l = ld.getValue(); r = rd.getValue();
2993
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
2994
+ }
2995
+ }
2996
+ }
2997
+
2998
+ void testCompTimeStampMa()
2999
+ {
3000
+ __int64 l, r;
3001
+ {
3002
+ ushort_td len = 4;
3003
+ {
3004
+ comp1Func compFunc = getCompFunc(ft_mytimestamp, len, eEqual, 0);
3005
+ maTimeStamp ld(0, true), rd(0, true);
3006
+ ld = _T("1970-01-02 00:00:59"); rd = _T("1970-01-02 16:59:00"); l = ld.getValue(); r = rd.getValue();
3007
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
3008
+ ld = _T("1970-01-02 00:00:01"); rd = _T("1970-01-02 00:00:01"); l = ld.getValue(); r = rd.getValue();
3009
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
3010
+ ld = _T("1970-01-02 16:59:00"); rd = _T("1970-01-02 00:00:59"); l = ld.getValue(); r = rd.getValue();
3011
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
3012
+ }
3013
+
3014
+ {
3015
+ comp1Func compFunc = getCompFunc(ft_mytimestamp_num_cmp, len, eEqual, 0);
3016
+ maTimeStamp ld(0, false), rd(0, false);
3017
+ ld = _T("1970-01-02 00:00:59"); rd = _T("1970-01-02 16:59:00"); l = ld.getValue(); r = rd.getValue();
3018
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
3019
+ ld = _T("1970-01-02 00:00:01"); rd = _T("1970-01-02 00:00:01"); l = ld.getValue(); r = rd.getValue();
3020
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
3021
+ ld = _T("1970-01-02 16:59:00"); rd = _T("1970-01-02 00:00:59"); l = ld.getValue(); r = rd.getValue();
3022
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
3023
+ }
3024
+
3025
+ len = 5;
3026
+ {
3027
+ comp1Func compFunc = getCompFunc(ft_mytimestamp, len, eEqual, 0);
3028
+ maTimeStamp ld(1, true), rd(1, true);
3029
+ ld = _T("1970-01-02 00:00:59.1"); rd = _T("1970-01-02 00:00:59.2"); l = ld.getValue(); r = rd.getValue();
3030
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
3031
+ ld = _T("1970-01-02 00:00:59.1"); rd = _T("1970-01-02 00:00:59.1"); l = ld.getValue(); r = rd.getValue();
3032
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
3033
+ ld = _T("1970-01-02 00:00:59.1"); rd = _T("1970-01-02 00:00:59.0"); l = ld.getValue(); r = rd.getValue();
3034
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
3035
+ }
3036
+
3037
+ {
3038
+ comp1Func compFunc = getCompFunc(ft_mytimestamp, len, eEqual, 0);
3039
+ maTimeStamp ld(2, true), rd(2, true);
3040
+ ld = _T("1970-01-02 00:00:59.01"); rd = _T("1970-01-02 00:00:59.02"); l = ld.getValue(); r = rd.getValue();
3041
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
3042
+ ld = _T("1970-01-02 00:00:59.01"); rd = _T("1970-01-02 00:00:59.01"); l = ld.getValue(); r = rd.getValue();
3043
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
3044
+ ld = _T("1970-01-02 00:00:59.01"); rd = _T("1970-01-02 00:00:59.00"); l = ld.getValue(); r = rd.getValue();
3045
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
3046
+ }
3047
+
3048
+ len = 6;
3049
+ {
3050
+ comp1Func compFunc = getCompFunc(ft_mytimestamp, len, eEqual, 0);
3051
+ maTimeStamp ld(3, true), rd(3, true);
3052
+ ld = _T("1970-01-02 00:00:59.001"); rd = _T("1970-01-02 00:00:59.002"); l = ld.getValue(); r = rd.getValue();
3053
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) < 0);
3054
+ ld = _T("1970-01-02 00:00:59.001"); rd = _T("1970-01-02 00:00:59.001"); l = ld.getValue(); r = rd.getValue();
3055
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
3056
+ ld = _T("1970-01-02 00:00:59.001"); rd = _T("1970-01-02 00:00:59.000"); l = ld.getValue(); r = rd.getValue();
3057
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
3058
+ }
3059
+
3060
+ {
3061
+ comp1Func compFunc = getCompFunc(ft_mytimestamp, len, eEqual, 0);
3062
+ maTimeStamp ld(4, true), rd(4, true);
3063
+ ld = _T("1970-01-02 00:00:59.0000"); rd = _T("1970-01-02 00:00:59.0001"); l = ld.getValue(); r = rd.getValue();
3064
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == -1);
3065
+ ld = _T("1970-01-02 00:00:59.0001"); rd = _T("1970-01-02 00:00:59.0001"); l = ld.getValue(); r = rd.getValue();
3066
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
3067
+ ld = _T("1970-01-02 00:00:59.0001"); rd = _T("1970-01-02 00:00:59.0000"); l = ld.getValue(); r = rd.getValue();
3068
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
3069
+ }
3070
+
3071
+ len = 7;
3072
+ {
3073
+ comp1Func compFunc = getCompFunc(ft_mytimestamp, len, eEqual, 0);
3074
+ maTimeStamp ld(5, true), rd(5, true);
3075
+ ld = _T("1970-01-02 00:00:59.00001"); rd = _T("1970-01-02 00:00:59.00002"); l = ld.getValue(); r = rd.getValue();
3076
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == -1);
3077
+ ld = _T("1970-01-02 00:00:59.00001"); rd = _T("1970-01-02 00:00:59.00001"); l = ld.getValue(); r = rd.getValue();
3078
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
3079
+ ld = _T("1970-01-02 00:00:59.00001"); rd = _T("1970-01-02 00:00:59.00000"); l = ld.getValue(); r = rd.getValue();
3080
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
3081
+ }
3082
+
3083
+ {
3084
+ comp1Func compFunc = getCompFunc(ft_mytimestamp, len, eEqual, 0);
3085
+ maTimeStamp ld(6, true), rd(6, true);
3086
+ ld = _T("1970-01-02 01:00:59.999999"); rd = _T("1970-01-02 10:00:59.100001"); l = ld.getValue(); r = rd.getValue();
3087
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == -1);
3088
+ ld = _T("1970-01-02 00:00:59.000001"); rd = _T("1970-01-02 00:00:59.000001"); l = ld.getValue(); r = rd.getValue();
3089
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) == 0);
3090
+ ld = _T("1970-01-02 10:00:59.000000"); rd = _T("1970-01-02 10:00:58.999999"); l = ld.getValue(); r = rd.getValue();
3091
+ BOOST_CHECK(compFunc((const char*)&l, (const char*)&r, len) > 0);
3092
+ }
3093
+ }
3094
+ }
3095
+
3096
+ void doTestCompStringOne(const char* lt , const char* rt, int ret, int len,
3097
+ int sizeByte, comp1Func compFunc)
3098
+ {
3099
+ char l[128] = {0x00};
3100
+ char r[128] = {0x00};
3101
+ strcpy(l + sizeByte, lt); strcpy(r + sizeByte, rt);
3102
+ if (sizeByte)
3103
+ {
3104
+ l[0] = (char)strlen(lt);
3105
+ r[0] = (char)len;
3106
+ }
3107
+ int v = compFunc((const char*)l, (const char*)r, len);
3108
+ if (ret > 0)
3109
+ BOOST_CHECK( v > 0);
3110
+ else if (ret == 0)
3111
+ BOOST_CHECK( v == 0);
3112
+ else
3113
+ BOOST_CHECK( v < 0);
3114
+ }
3115
+
3116
+ void doTestCompString(uchar_td type, int sizeByte)
3117
+ {
3118
+ uchar_td logType = eEqual;
3119
+ ushort_td len = 2;
3120
+ comp1Func compFunc = getCompFunc(type, 0, logType, sizeByte);
3121
+ doTestCompStringOne("abcc", "ac", -1, len, sizeByte, compFunc);
3122
+ doTestCompStringOne("a", "ac", -1, len, sizeByte, compFunc);
3123
+ doTestCompStringOne("ab99", "abcc", 0, len, sizeByte, compFunc);
3124
+ doTestCompStringOne("accc", "ab0", 1, len, sizeByte, compFunc);
3125
+
3126
+ logType |= CMPLOGICAL_CASEINSENSITIVE;
3127
+ compFunc = getCompFunc(type, 0, logType, sizeByte);
3128
+
3129
+ doTestCompStringOne("Abc", "ac", -1, len, sizeByte, compFunc);
3130
+ doTestCompStringOne("Abc", "aBc", 0, len, sizeByte, compFunc);
3131
+ doTestCompStringOne("acc", "Abc", 1, len, sizeByte, compFunc);
3132
+
3133
+ logType = eEqual | CMPLOGICAL_VAR_COMP_ALL;
3134
+ compFunc = getCompFunc(type, 0, logType, sizeByte);
3135
+ doTestCompStringOne("ab", "ac", -1, len, sizeByte, compFunc);
3136
+ doTestCompStringOne("ab", "ab", 0, len, sizeByte, compFunc);
3137
+ doTestCompStringOne("ac", "ab", 1, len, sizeByte, compFunc);
3138
+
3139
+
3140
+ logType |= CMPLOGICAL_CASEINSENSITIVE;
3141
+ compFunc = getCompFunc(type, 0, logType, sizeByte);
3142
+ doTestCompStringOne("Ab", "ac", -1, len, sizeByte, compFunc);
3143
+ doTestCompStringOne("Ab", "aB", 0, len, sizeByte, compFunc);
3144
+ doTestCompStringOne("ac", "Ab", 1, len, sizeByte, compFunc);
3145
+
3146
+ }
3147
+
3148
+ void testCompString()
3149
+ {
3150
+ doTestCompString(ft_mychar, 0);
3151
+ doTestCompString(ft_string, 0);
3152
+ doTestCompString(ft_zstring, 0);
3153
+ doTestCompString(ft_note, 0);
3154
+ doTestCompString(ft_myvarchar, 1);
3155
+ doTestCompString(ft_myvarchar, 2);
3156
+ doTestCompString(ft_myvarbinary, 1);
3157
+ doTestCompString(ft_myvarbinary, 2);
3158
+ doTestCompString(ft_lstring, 1);
3159
+ doTestCompString(ft_lstring, 2);
3160
+ }
3161
+
3162
+ #ifdef _WIN32
3163
+ void doTestCompWStringOne(const wchar_t* lt , const wchar_t* rt, int ret, int len,
3164
+ int sizeByte, comp1Func compFunc)
3165
+ {
3166
+ char l[128] = {0x00};
3167
+ char r[128] = {0x00};
3168
+ wcscpy((wchar_t*)(l + sizeByte), lt); wcscpy((wchar_t*)(r + sizeByte), rt);
3169
+
3170
+ if (sizeByte)
3171
+ {
3172
+ l[0] = (char)wcslen(lt) * 2;
3173
+ r[0] = (char)len;
3174
+ }
3175
+ int v = compFunc((const char*)l, (const char*)r, len);
3176
+ if (ret > 0)
3177
+ BOOST_CHECK( v > 0);
3178
+ else if (ret == 0)
3179
+ BOOST_CHECK( v == 0);
3180
+ else
3181
+ BOOST_CHECK( v < 0);
3182
+ }
3183
+
3184
+ void doTestCompWString(uchar_td type, int sizeByte)
3185
+ {
3186
+ uchar_td logType = eEqual;
3187
+ ushort_td len = 4;
3188
+ comp1Func compFunc = getCompFunc(type, 0, logType, sizeByte);
3189
+ doTestCompWStringOne(L"abcc", L"ac", -1, len, sizeByte, compFunc);
3190
+ doTestCompWStringOne(L"a", L"ac", -1, len, sizeByte, compFunc);
3191
+ doTestCompWStringOne(L"ab99", L"abcc", 0, len, sizeByte, compFunc);
3192
+ doTestCompWStringOne(L"accc", L"ab0", 1, len, sizeByte, compFunc);
3193
+
3194
+ logType |= CMPLOGICAL_CASEINSENSITIVE;
3195
+ compFunc = getCompFunc(type, 0, logType, sizeByte);
3196
+
3197
+ doTestCompWStringOne(L"Abc", L"ac", -1, len, sizeByte, compFunc);
3198
+ doTestCompWStringOne(L"Abc", L"aBc", 0, len, sizeByte, compFunc);
3199
+ doTestCompWStringOne(L"acc", L"Abc", 1, len, sizeByte, compFunc);
3200
+
3201
+ logType = eEqual | CMPLOGICAL_VAR_COMP_ALL;
3202
+ compFunc = getCompFunc(type, 0, logType, sizeByte);
3203
+ doTestCompWStringOne(L"ab", L"ac", -1, len, sizeByte, compFunc);
3204
+ doTestCompWStringOne(L"ab", L"ab", 0, len, sizeByte, compFunc);
3205
+ doTestCompWStringOne(L"ac", L"ab", 1, len, sizeByte, compFunc);
3206
+
3207
+
3208
+ logType |= CMPLOGICAL_CASEINSENSITIVE;
3209
+ compFunc = getCompFunc(type, 0, logType, sizeByte);
3210
+ doTestCompWStringOne(L"Ab", L"ac", -1, len, sizeByte, compFunc);
3211
+ doTestCompWStringOne(L"Ab", L"aB", 0, len, sizeByte, compFunc);
3212
+ doTestCompWStringOne(L"ac", L"Ab", 1, len, sizeByte, compFunc);
3213
+
3214
+ }
3215
+
3216
+ void testCompWString()
3217
+ {
3218
+ doTestCompWString(ft_mywchar, 0);
3219
+ doTestCompWString(ft_wstring, 0);
3220
+ doTestCompWString(ft_wzstring, 0);
3221
+ doTestCompWString(ft_mywvarchar, 1);
3222
+ doTestCompWString(ft_mywvarchar, 2);
3223
+ doTestCompWString(ft_mywvarbinary, 1);
3224
+ doTestCompWString(ft_mywvarbinary, 2);
3225
+ }
3226
+
3227
+ #endif
3228
+
3229
+
3230
+
3231
+ void doTestCompBlobOne(const char* lt , const char* rt, int ret, int len,
3232
+ int sizeByte, comp1Func compFunc)
3233
+ {
3234
+ char l[128] = {0x00};
3235
+ char lb[128] = {0x00};
3236
+ char r[128] = {0x00};
3237
+ strcpy(lb, lt); strcpy(r + sizeByte, rt);
3238
+ l[0] = (char)strlen(lt);
3239
+ char** p = (char**)(l + sizeByte);
3240
+ *p = lb;
3241
+
3242
+ r[0] = (char)len;
3243
+ int v = compFunc((const char*)l, (const char*)r, len);
3244
+ if (ret > 0)
3245
+ BOOST_CHECK( v > 0);
3246
+ else if (ret == 0)
3247
+ BOOST_CHECK( v == 0);
3248
+ else
3249
+ BOOST_CHECK( v < 0);
3250
+ }
3251
+
3252
+ void doTestCompBlob(uchar_td type, int sizeByte)
3253
+ {
3254
+ uchar_td logType = eEqual;
3255
+ ushort_td len = 2;
3256
+ comp1Func compFunc = getCompFunc(type, 0, logType, sizeByte);
3257
+ doTestCompBlobOne("abcc", "ac", -1, len, sizeByte, compFunc);
3258
+ doTestCompBlobOne("a", "ac", -1, len, sizeByte, compFunc);
3259
+ doTestCompBlobOne("ab99", "abcc", 0, len, sizeByte, compFunc);
3260
+ doTestCompBlobOne("accc", "ab0", 1, len, sizeByte, compFunc);
3261
+
3262
+ logType |= CMPLOGICAL_CASEINSENSITIVE;
3263
+ compFunc = getCompFunc(type, 0, logType, sizeByte);
3264
+
3265
+ doTestCompBlobOne("Abc", "ac", -1, len, sizeByte, compFunc);
3266
+ doTestCompBlobOne("Abc", "aBc", 0, len, sizeByte, compFunc);
3267
+ doTestCompBlobOne("acc", "Abc", 1, len, sizeByte, compFunc);
3268
+
3269
+ logType = eEqual | CMPLOGICAL_VAR_COMP_ALL;
3270
+ compFunc = getCompFunc(type, 0, logType, sizeByte);
3271
+ doTestCompBlobOne("ab", "ac", -1, len, sizeByte, compFunc);
3272
+ doTestCompBlobOne("ab", "ab", 0, len, sizeByte, compFunc);
3273
+ doTestCompBlobOne("ac", "ab", 1, len, sizeByte, compFunc);
3274
+
3275
+
3276
+ logType |= CMPLOGICAL_CASEINSENSITIVE;
3277
+ compFunc = getCompFunc(type, 0, logType, sizeByte);
3278
+ doTestCompBlobOne("Ab", "ac", -1, len, sizeByte, compFunc);
3279
+ doTestCompBlobOne("Ab", "aB", 0, len, sizeByte, compFunc);
3280
+ doTestCompBlobOne("ac", "Ab", 1, len, sizeByte, compFunc);
3281
+
3282
+ }
3283
+
3284
+ void testCompBlob()
3285
+ {
3286
+ doTestCompBlob(ft_mytext, 1);
3287
+ doTestCompBlob(ft_mytext, 2);
3288
+ doTestCompBlob(ft_mytext, 3);
3289
+ doTestCompBlob(ft_mytext, 4);
3290
+ doTestCompBlob(ft_myblob, 1);
3291
+ doTestCompBlob(ft_myblob, 2);
3292
+ doTestCompBlob(ft_myblob, 3);
3293
+ doTestCompBlob(ft_myblob, 4);
3294
+ }
3295
+
3296
+ void testCompDecimal()
3297
+ {
3298
+ comp1Func compFunc = getCompFunc(ft_mydecimal, 0, 0, 0);
3299
+ BOOST_CHECK(compFunc != NULL);
3300
+
3301
+ }
3302
+
3303
+ #pragma warning(default : 4996)
3304
+
3305
+ #endif // BZS_TEST_TRDCLENGN_TESTFIELD_H