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,743 @@
1
+ <?php
2
+ /* ================================================================
3
+ Copyright (C) 2015 BizStation Corp All rights reserved.
4
+
5
+ This program is free software; you can redistribute it and/or
6
+ modify it under the terms of the GNU General Public License
7
+ as published by the Free Software Foundation; either version 2
8
+ of the License, or (at your option) any later version.
9
+
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License
16
+ along with this program; if not, write to the Free Software
17
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
18
+ 02111-1307, USA.
19
+ ================================================================ */
20
+ mb_internal_encoding('UTF-8');
21
+
22
+ require_once("transactd.php");
23
+ use BizStation\Transactd as bz;
24
+
25
+ function getHost()
26
+ {
27
+ $host = getenv('TRANSACTD_PHPUNIT_HOST');
28
+ if (strlen($host) == 0)
29
+ {
30
+ $host = '127.0.0.1/';
31
+ }
32
+ if ($host[strlen($host) - 1] != '/')
33
+ {
34
+ $host = $host . '/';
35
+ }
36
+ return $host;
37
+ }
38
+
39
+ define("HOSTNAME", getHost());
40
+ define("USERNAME", getenv('TRANSACTD_PHPUNIT_USER'));
41
+ define("USERPART", strlen(USERNAME) == 0 ? '' : USERNAME . '@');
42
+ define("PASSWORD", getenv('TRANSACTD_PHPUNIT_PASS'));
43
+ define("PASSPART", strlen(PASSWORD) == 0 ? '' : '&pwd=' . PASSWORD);
44
+ define("PASSPART2", strlen(PASSWORD) == 0 ? '' : '?pwd=' . PASSWORD);
45
+ define("DBNAME", "test_v3");
46
+ define("TABLENAME", "user");
47
+ define("PROTOCOL", "tdap://");
48
+ define("BDFNAME", "?dbfile=test.bdf");
49
+ define("URL", PROTOCOL . USERPART . HOSTNAME . DBNAME . BDFNAME . PASSPART);
50
+
51
+ // multi thread test if `php_pthreads` exists.
52
+ if(class_exists('Thread')){
53
+ class SeekLessThanWorker extends Thread
54
+ {
55
+ public function __construct()
56
+ {
57
+ $this->value = -1;
58
+ }
59
+ public function run()
60
+ {
61
+ $dbm = new bz\pooledDbManager(new bz\connectParams(URL));
62
+ $tb = $dbm->table('user');
63
+ $tb->setFV(FDI_ID, 300000);
64
+ $tb->seekLessThan(false, bz\transactd::ROW_LOCK_X);
65
+ $this->value = $tb->getFVint(FDI_ID);
66
+ $tb->unlock();
67
+ $tb->close();
68
+ $dbm->unUse();
69
+ }
70
+ public function getResult()
71
+ {
72
+ return $this->value;
73
+ }
74
+ }
75
+ }
76
+
77
+ class transactdTest extends PHPUnit_Framework_TestCase
78
+ {
79
+ private function dropDatabase($db)
80
+ {
81
+ $db->open(URL);
82
+ $this->assertEquals($db->stat(), 0);
83
+ $db->drop();
84
+ $this->assertEquals($db->stat(), 0);
85
+ }
86
+ private function createDatabase($db)
87
+ {
88
+ $db->create(URL);
89
+ if ($db->stat() == bz\transactd::STATUS_TABLE_EXISTS_ERROR)
90
+ {
91
+ $this->dropDatabase($db);
92
+ $db->create(URL);
93
+ }
94
+ $this->assertEquals($db->stat(), 0);
95
+ }
96
+ private function openDatabase($db)
97
+ {
98
+ return $db->open(URL, bz\transactd::TYPE_SCHEMA_BDF, bz\transactd::TD_OPEN_NORMAL);
99
+ }
100
+ private function isMySQL5_5($db)
101
+ {
102
+ $vv = new bz\btrVersions();
103
+ $db->getBtrVersion($vv);
104
+ $server_ver = $vv->version(1);
105
+ return ($db->stat() == 0) &&
106
+ ((5 == $server_ver->majorVersion) &&
107
+ (5 == $server_ver->minorVersion));
108
+ }
109
+ private function isLegacyTimeFormat($db)
110
+ {
111
+ $vv = new bz\btrVersions();
112
+ $db->getBtrVersion($vv);
113
+ $server_ver = $vv->version(1);
114
+ return ($db->stat() == 0) &&
115
+ ((5 == $server_ver->majorVersion) &&
116
+ (5 == $server_ver->minorVersion)) &&
117
+ ($server_ver->type == bz\transactd::MYSQL_TYPE_MYSQL);
118
+ }
119
+ private function createUserTable($db)
120
+ {
121
+
122
+ $dbdef = $db->dbDef();
123
+ $this->assertNotEquals($dbdef, NULL);
124
+ $td = new bz\tabledef();
125
+ $td->schemaCodePage = bz\transactd::CP_UTF8;
126
+ $td->setTableName(TABLENAME);
127
+ $td->setFileName(TABLENAME . '.dat');
128
+ $td->charsetIndex = bz\transactd::CHARSET_UTF8;
129
+ $tableid = 1;
130
+ $td->id = $tableid;
131
+ $td->pageSize = 2048;
132
+ $dbdef->insertTable($td);
133
+ $this->assertEquals($dbdef->stat(), 0);
134
+
135
+ $fieldIndex = 0;
136
+ $fd = $dbdef->insertField($tableid, $fieldIndex);
137
+ $fd->setName('id');
138
+ $fd->type = bz\transactd::ft_autoinc;
139
+ $fd->len = 4;
140
+
141
+ $fd = $dbdef->insertField($tableid, ++$fieldIndex);
142
+ $fd->setName('名前');
143
+ $fd->type = bz\transactd::ft_myvarchar;
144
+ $fd->len = 2;
145
+ $this->assertEquals($fd->isValidCharNum(), false);
146
+ $fd->SetLenByCharnum(20);
147
+ $this->assertEquals($fd->isValidCharNum(), true);
148
+ $fd->setDefaultValue("John");
149
+ $this->assertEquals($fd->isPadCharType(), false);
150
+ $this->assertEquals($fd->isDateTimeType(), false);
151
+
152
+ $fd = $dbdef->insertField($tableid, ++$fieldIndex);
153
+ $fd->setName('group');
154
+ $fd->type = bz\transactd::ft_integer;
155
+ $fd->len = 4;
156
+ $fd->setNullable(true, false);
157
+ $fd->setDefaultValue(10);
158
+
159
+ $fd = $dbdef->insertField($tableid, ++$fieldIndex);
160
+ $fd->setName('tel');
161
+ $fd->type = bz\transactd::ft_myvarchar;
162
+ $fd->len = 4;
163
+ $fd->setLenByCharnum(21);
164
+ $fd->setNullable(true);
165
+
166
+ $fd = $dbdef->insertField($tableid, ++$fieldIndex);
167
+ $fd->setName('update_datetime');
168
+ $fd->type = bz\transactd::ft_mytimestamp;
169
+ $fd->len = 7;
170
+ $fd->setDefaultValue(bz\transactd::DFV_TIMESTAMP_DEFAULT);
171
+ $fd->setTimeStampOnUpdate(true);
172
+ $this->assertEquals($fd->isTimeStampOnUpdate(), true);
173
+
174
+ $fd = $dbdef->insertField($tableid, ++$fieldIndex);
175
+ $fd->setName('create_datetime');
176
+ if ($this->isMySQL5_5($db))
177
+ {
178
+ $fd->type = bz\transactd::ft_mydatetime;
179
+ $fd->len = 8;
180
+ }
181
+ else
182
+ {
183
+ $fd->type = bz\transactd::ft_mytimestamp;
184
+ $fd->len = 4;
185
+ $fd->setDefaultValue(bz\transactd::DFV_TIMESTAMP_DEFAULT);
186
+ }
187
+ $fd->setTimeStampOnUpdate(false);
188
+ $this->assertEquals($fd->isTimeStampOnUpdate(), false);
189
+ $this->assertEquals($fd->isPadCharType(), false);
190
+ $this->assertEquals($fd->isDateTimeType(), true);
191
+
192
+ $keynum = 0;
193
+ $kd = $dbdef->insertKey($tableid, $keynum);
194
+ $kd->segment(0)->fieldNum = 0;
195
+ $kd->segment(0)->flags->bit8 = 1;
196
+ $kd->segment(0)->flags->bit1 = 1;
197
+ $kd->segmentCount = 1;
198
+ $td = $dbdef->tableDefs($tableid);
199
+ $td->primaryKeyNum = $keynum;
200
+
201
+ $kd = $dbdef->insertKey($tableid, ++$keynum);
202
+ $kd->segment(0)->fieldNum = 2;
203
+ $kd->segment(0)->flags->bit0 = 1; // key_duplicate
204
+ $kd->segment(0)->flags->bit8 = 1;
205
+ $kd->segment(0)->flags->bit1 = 1;
206
+ $kd->segmentCount = 1;
207
+
208
+ $dbdef->updateTableDef($tableid);
209
+ $this->assertEquals($dbdef->stat(), 0);
210
+ }
211
+ private function createUserExtTable($db)
212
+ {
213
+ $this->openDatabase($db);
214
+ $dbdef = $db->dbDef();
215
+ $this->assertNotEquals($dbdef, NULL);
216
+ $td = new bz\tabledef();
217
+
218
+ $td->schemaCodePage = bz\transactd::CP_UTF8;
219
+ $td->setTableName("extention");
220
+ $td->setFileName("extention");
221
+ $td->charsetIndex = bz\transactd::CHARSET_UTF8;
222
+ $tableid = 3;
223
+ $td->id = $tableid;
224
+ $dbdef->insertTable($td);
225
+ $this->assertEquals($dbdef->stat(), 0);
226
+
227
+ $fieldIndex = 0;
228
+ $fd = $dbdef->insertField($tableid, $fieldIndex);
229
+ $fd->setName('id');
230
+ $fd->type = bz\transactd::ft_integer;
231
+ $fd->len = 4;
232
+
233
+ $fd = $dbdef->insertField($tableid, ++$fieldIndex);
234
+ $fd->setName('comment');
235
+ $fd->type = bz\transactd::ft_myvarchar;
236
+ $fd->SetLenByCharnum(60);
237
+ $fd->setNullable(true);
238
+ $this->assertEquals($fd->isDefaultNull(), true);
239
+
240
+ $fd = $dbdef->insertField($tableid, ++$fieldIndex);
241
+ $fd->setName('bits');
242
+ $fd->type = bz\transactd::ft_integer;
243
+ $fd->len = 8;
244
+ $this->assertEquals($fd->isDefaultNull(), false);
245
+
246
+ $keynum = 0;
247
+ $kd = $dbdef->insertKey($tableid, $keynum);
248
+ $kd->segment(0)->fieldNum = 0;
249
+ $kd->segment(0)->flags->bit8 = 1;
250
+ $kd->segment(0)->flags->bit1 = 1;
251
+ $kd->segmentCount = 1;
252
+ $td = $dbdef->tableDefs($tableid);
253
+ $td->primaryKeyNum = $keynum;
254
+
255
+ $dbdef->updateTableDef($tableid);
256
+ $this->assertEquals($dbdef->stat(), 0);
257
+ }
258
+
259
+ private function insertData($db)
260
+ {
261
+ $tb = $db->openTable("user", bz\transactd::TD_OPEN_NORMAL);
262
+ $tb3 = $db->openTable("extention", bz\transactd::TD_OPEN_NORMAL);
263
+
264
+ try
265
+ {
266
+ $db->beginTrn();
267
+ $tb->clearBuffer();
268
+ for ($i= 1;$i<= 1000;++$i)
269
+ {
270
+ $tb->setFV(0, $i);
271
+ $tb->setFV(1, $i." user");
272
+ $tb->setFV(2, (($i-1) % 5)+1);
273
+ $tb->insert();
274
+ }
275
+
276
+ $tb3->clearBuffer();
277
+ for ($i= 1;$i<= 1000;++$i)
278
+ {
279
+ $tb3->setFV(0, $i);
280
+ $tb3->setFV(1, $i." comment");
281
+ $tb3->insert();
282
+ }
283
+ $db->endTrn();
284
+ }
285
+ catch(Exception $e)
286
+ {
287
+ $db->abortTrn();
288
+ $this->assertEquals(true, false);
289
+ }
290
+ }
291
+ private function openTable($db)
292
+ {
293
+ $this->openDatabase($db);
294
+ $tb = $db->openTable(TABLENAME);
295
+ $this->assertEquals($db->stat(), 0);
296
+ //test statMsg
297
+ $this->assertEquals($db->statMsg(), '');
298
+ return $tb;
299
+ }
300
+
301
+ public function test()
302
+ {
303
+ $db = new bz\database();
304
+
305
+ $this->createDatabase($db);
306
+ $this->openDatabase($db);
307
+ $this->createUserTable($db);
308
+ $this->createUserExtTable($db);
309
+ $this->insertData($db);
310
+ $mysql_5_5 = $this->isMySQL5_5($db);
311
+
312
+ $db->setAutoSchemaUseNullkey(true);
313
+ $this->assertEquals($db->autoSchemaUseNullkey(), true);
314
+ $db->setAutoSchemaUseNullkey(false);
315
+ $this->assertEquals($db->autoSchemaUseNullkey(), false);
316
+
317
+ $this->assertEquals($db::compatibleMode(), bz\database::CMP_MODE_MYSQL_NULL);
318
+
319
+ bz\database::setCompatibleMode(bz\database::CMP_MODE_OLD_NULL);
320
+ $this->assertEquals(bz\database::compatibleMode(), bz\database::CMP_MODE_OLD_NULL);
321
+
322
+ bz\database::setCompatibleMode(bz\database::CMP_MODE_MYSQL_NULL);
323
+ $this->assertEquals(bz\database::compatibleMode(), bz\database::CMP_MODE_MYSQL_NULL);
324
+
325
+ $dbdef = $db->dbDef();
326
+ $td = $dbdef->tableDefs(1);
327
+ //isMysqlNullMode //size()
328
+ $this->assertEquals($td->isMysqlNullMode() , true);
329
+
330
+ //recordlen()
331
+ $len = 145;
332
+ if ($mysql_5_5) $len += 4;
333
+ if ($this->isLegacyTimeFormat($db)) $len -= 3;
334
+ $this->assertEquals($td->recordlen() , $len);
335
+
336
+ //size()
337
+ $this->assertEquals($td->size() , 1184);
338
+
339
+ //InUse
340
+ $this->assertEquals($td->inUse() , 0);
341
+
342
+ //nullfields
343
+ $this->assertEquals($td->nullfields(), 2);
344
+
345
+
346
+
347
+ //fieldNumByName
348
+ $this->assertEquals($td->fieldNumByName("tel") , 3);
349
+
350
+ //default value
351
+ $fd = $td->fieldDef(1);
352
+ $this->assertEquals($fd->defaultValue(), "John");
353
+ $fd = $td->fieldDef(2);
354
+ $this->assertEquals($fd->defaultValue(), 10);
355
+ $fd = $td->fieldDef(3);
356
+ $this->assertEquals($fd->isDefaultNull(), true);
357
+ $fd = $td->fieldDef(4);
358
+ $this->assertEquals($fd->defaultValue(), bz\transactd::DFV_TIMESTAMP_DEFAULT);
359
+ $this->assertEquals($fd->isTimeStampOnUpdate(), true);
360
+ $fd = $td->fieldDef(5);
361
+ $this->assertEquals($fd->isTimeStampOnUpdate(), false);
362
+
363
+ $fd = $td->fieldDef(1);
364
+ // synchronizeSeverSchema
365
+ $len = $fd->len;
366
+
367
+ $fd->setLenByCharnum(19);
368
+ $this->assertNotEquals($len, $fd->len);
369
+ $dbdef->synchronizeSeverSchema(1);
370
+ $td = $dbdef->tableDefs(1);
371
+ $fd = $td->fieldDef(1);
372
+ $this->assertEquals($len, $fd->len);
373
+
374
+ // syncronize default value
375
+ $fd = $td->fieldDef(1);
376
+ $this->assertEquals($fd->defaultValue(), "John");
377
+ $fd = $td->fieldDef(2);
378
+ $this->assertEquals($fd->defaultValue(), 10);
379
+ $fd = $td->fieldDef(3);
380
+ $this->assertEquals($fd->isDefaultNull(), true);
381
+ $fd = $td->fieldDef(4);
382
+ $this->assertEquals($fd->isTimeStampOnUpdate(), true);
383
+ $fd = $td->fieldDef(5);
384
+ $this->assertEquals($fd->isTimeStampOnUpdate(), false);
385
+
386
+ // nullable
387
+ $fd = $td->fieldDef(3);
388
+ $this->assertEquals($fd->isNullable(), true);
389
+
390
+ // getSqlStringForCreateTable
391
+ $sql = $db->getSqlStringForCreateTable("extention");
392
+ $this->assertEquals($db->stat(), 0);
393
+ $this->assertEquals($sql, 'CREATE TABLE `extention` (`id` INT NOT NULL ,`comment` VARCHAR(60) binary NULL DEFAULT NULL,`bits` BIGINT NOT NULL , UNIQUE key0(`id`)) ENGINE=InnoDB default charset=utf8');
394
+
395
+ // setValidationTarget(bool isMariadb, uchar_td srvMinorVersion)
396
+ $td = $dbdef->tableDefs(1);
397
+ $td->setValidationTarget(true, 0);
398
+
399
+
400
+ $q = new bz\query();
401
+ $atu = new bz\activeTable($db, "user");
402
+
403
+ // segmentsSizeForInValue
404
+ $this->assertEquals($q->segmentsForInValue(3)->getJoinKeySize(), 3);
405
+ $q->reset();
406
+ $this->assertEquals($q->getJoinKeySize(), 0);
407
+
408
+ // keyValue null
409
+ $tb1 = $atu->table();
410
+ $tb1->setFV(2, null);
411
+ $this->assertEquals($tb1->getFVNull(2), true);
412
+ $tb1->setFVNull(2, false);
413
+ $this->assertEquals($tb1->getFVNull(2), false);
414
+ $atu->index(1)->keyValue(null);
415
+ $this->assertEquals($tb1->getFVNull(2), true);
416
+
417
+ // isNull setNull
418
+ $atu->alias("名前", "name");
419
+
420
+ $q->select("id", "name", "group", "tel")->where("id", "<=", 10);
421
+ $rs = $atu->index(0)->keyValue(1)->read($q);
422
+ $this->assertEquals($rs->count(), 10);
423
+ $rec = $rs->first();
424
+ $this->assertEquals($rec[3]->isNull(), true);
425
+ $rec[3]->setNull(false);
426
+ $this->assertEquals($rec[3]->isNull(), false);
427
+
428
+ //Join null
429
+ $q->reset();
430
+ $ate = new bz\activeTable($db, "extention");
431
+ $last = $ate->index(0)->join($rs, $q->select("comment")
432
+ ->optimize(bz\query::joinHasOneOrHasMany), "id")->reverse()->first();
433
+ $this->assertEquals($rs->count(), 10);
434
+ $this->assertEquals($last["id"]->i(), 10);
435
+ $this->assertEquals($last["id"]->i64(), 10);
436
+ $this->assertEquals($last["id"]->d(), 10);
437
+ $this->assertEquals($rec[4]->isNull(), false);
438
+ $rec[4]->setNull(true);
439
+
440
+ //setValue null
441
+ $this->assertEquals($rec[4]->isNull(), true);
442
+ $rec[4]->setNull(false);
443
+ $this->assertEquals($rec[4]->isNull(), false);
444
+ $rec[4]->setValue(null);
445
+ $this->assertEquals($rec[4]->isNull(), true);
446
+
447
+ //WritableRecord.clear()
448
+ $wr = $atu->getWritableRecord();
449
+ $wr->clear();
450
+ $wr["id"]->setValue(5);
451
+ $wr["tel"]->setValue("0236-99-9999");
452
+ $wr->update();
453
+
454
+ $wr->clear();
455
+ $wr["id"]->setValue(5);
456
+ $this->assertEquals($wr->read(), true);
457
+ $this->assertEquals($wr["tel"]->str(), "0236-99-9999");
458
+
459
+ //whereIsNull
460
+ $q->reset();
461
+ $q->select("id", "tel")->whereIsNull("tel")->reject(0xFFFF);
462
+ $rs = $atu->index(0)->keyValue(0)->read($q);
463
+ $this->assertEquals($rs->count(), 999);
464
+
465
+ //whereIsNotNull
466
+ $q->reset();
467
+ $q->select("id", "tel")->whereIsNotNull("tel")->reject(0xFFFF);
468
+ $rs = $atu->Index(0)->keyValue(0)->read($q);
469
+ $this->assertEquals($rs->count(), 1);
470
+
471
+ //AndIsNull
472
+ $q->reset();
473
+ $q->Select("id", "tel")->where("id", "<=", 10)->andIsNull("tel")->reject(0xFFFF);
474
+ $rs = $atu->Index(0)->keyValue(0)->read($q);
475
+ $this->assertEquals($rs->count(), 9);
476
+
477
+ //AndIsNotNull
478
+ $q->reset();
479
+ $q->Select("id", "tel")->where("id", "<", 10)->andIsNotNull("tel")->reject(0xFFFF);
480
+ $rs = $atu->Index(0)->keyValue(0)->read($q);
481
+ $this->assertEquals($rs->count(), 1);
482
+
483
+ //OrIsNull
484
+ $q->reset();
485
+ $q->Select("id", "tel")->where("id", "<=", 10)->orIsNull("tel")->reject(0xFFFF);
486
+ $rs = $atu->Index(0)->keyValue(0)->read($q);
487
+ $this->assertEquals($rs->count(), 1000);
488
+
489
+ //OrIsNotNull
490
+ $q->reset();
491
+ $q->Select("id", "tel")->where("id", "<=", 10)->orIsNotNull("tel")->reject(0xFFFF);
492
+ $rs = $atu->Index(0)->keyValue(0)->read($q);
493
+ $this->assertEquals($rs->count(), 10);
494
+
495
+ //test recordset query
496
+ $q->reset();
497
+ $q->select("id", "name", "group", "tel");
498
+ $rs = $atu->index(0)->keyValue(0)->read($q);
499
+ $this->assertEquals($rs->count(), 1000);
500
+
501
+ // recordset whenIsNull
502
+ $rq = new bz\recordsetQuery();
503
+ $rq->whenIsNull("tel");
504
+ $rs2 = clone $rs;
505
+ $rs2 = $rs2->matchBy($rq);
506
+ $this->assertEquals($rs2->count(), 999);
507
+
508
+ //recordset whenIsNotNull
509
+ $rq->reset();
510
+ $rq->whenIsNotNull("tel");
511
+ $rs2 = clone $rs;
512
+ $rs2 = $rs2->matchBy($rq);
513
+ $this->assertEquals($rs2->count(), 1);
514
+
515
+ //recordset andIsNull
516
+ $rq->reset();
517
+ $rq->when("id", "<=", 10)->andIsNull("tel");
518
+ $rs2 = clone $rs;
519
+ $rs2 = $rs2->matchBy($rq);
520
+ $this->assertEquals($rs2->count(), 9);
521
+
522
+ //recordset andIsNotNull
523
+ $rq->reset();
524
+ $rq->when("id", "<", 10)->andIsNotNull("tel");
525
+ $rs2 = clone $rs;
526
+ $rs2 = $rs2->matchBy($rq);
527
+ $this->assertEquals($rs2->count(), 1);
528
+
529
+ // recordset orIsNull
530
+ $rq->reset();
531
+ $rq->when("id", "<=", 10)->orIsNull("tel");
532
+ $rs2 = clone $rs;
533
+ $rs2 = $rs2->matchBy($rq);
534
+ $this->assertEquals($rs2->count(), 1000);
535
+
536
+ //recordset orIsNotNull
537
+ $rq->reset();
538
+ $rq->when("id", "<=", 10)->orIsNotNull("tel");
539
+ $rs2 = clone $rs;
540
+ $rs2 = $rs2->matchBy($rq);
541
+ $this->assertEquals($rs2->count(), 10);
542
+
543
+ //setBin bin
544
+ $bin = "4321";
545
+ $bin[0] = chr(0xFF);
546
+ $bin[1] = chr(0x01);
547
+ $bin[2] = chr(0xFF);
548
+ $bin[3] = chr(0x02);
549
+ $wr["tel"]->setBin($bin);
550
+ $ret = $wr["tel"]->bin();
551
+ $this->assertEquals(ord($ret[0]), 0xFF, "SetBin Bin");
552
+ $this->assertEquals(ord($ret[1]), 0x01, "SetBin Bin");
553
+ $this->assertEquals(ord($ret[2]), 0xFF, "SetBin Bin");
554
+ $this->assertEquals(ord($ret[3]), 0x02, "SetBin Bin");
555
+
556
+ // table::default NULL
557
+ $tb = $db->openTable("user");
558
+ $this->assertEquals($db->stat(), 0);
559
+ $tb->setKeyNum(0);
560
+ $tb->clearBuffer();
561
+ $this->assertEquals($tb->getFVNull(3), true);
562
+
563
+ $tb->clearBuffer(bz\table::clearNull);
564
+ $this->assertEquals($tb->getFVNull(3), false);
565
+
566
+ // table NULL
567
+ $tb->setFv("id", 1);
568
+ $tb->seek();
569
+ $this->assertEquals($tb->stat(), 0);
570
+ $this->assertEquals($tb->getFVNull(3), true);
571
+ $this->assertEquals($tb->getFVNull("tel"), true);
572
+ $tb->setFVNull(3, false);
573
+ $this->assertEquals($tb->getFVNull(3), false);
574
+
575
+ //setFV null
576
+ $tb->setFVNull("tel", true);
577
+ $this->assertEquals($tb->getFVNull("tel"), true);
578
+ $tb->setFVNull("tel", false);
579
+ $this->assertEquals($tb->getFVNull("tel"), false);
580
+ $tb->setFV("tel", null);
581
+ $this->assertEquals($tb->getFVNull("tel"), true);
582
+
583
+ //timestamp format
584
+ $date = bz\transactd::btrdtoa(bz\transactd::getNowDate(), true);
585
+ $this->assertEquals(mb_substr($tb->getFVstr("update_datetime"), 0, 10), $date);
586
+ if ($mysql_5_5 == false)
587
+ $this->assertEquals(mb_substr($tb->getFVstr("create_datetime"), 0, 10), $date);
588
+
589
+ // setTimestampMode
590
+ $tb->setTimestampMode(bz\transactd::TIMESTAMP_VALUE_CONTROL);
591
+ $tb->setTimestampMode(bz\transactd::TIMESTAMP_ALWAYS);
592
+
593
+ //isMysqlNullMode
594
+ $this->assertEquals($tb->tableDef()->isMysqlNullMode(), true);
595
+ $this->assertEquals($td->inUse() , 2);
596
+
597
+ unset($atu);
598
+ $this->assertEquals($td->inUse() , 1);
599
+ $tb->release();
600
+ $this->assertEquals($td->inUse() , 0);
601
+
602
+ }
603
+
604
+ public function test_bit()
605
+ {
606
+ $db = new bz\database();
607
+ $this->openDatabase($db);
608
+ $tb = $db->openTable("extention");
609
+ $this->assertEquals($db->stat(), 0);
610
+ $tb->setKeyNum(0);
611
+ $tb->setFV('id', 1);
612
+ $tb->seek();
613
+ $this->assertEquals($tb->stat(), 0);
614
+ $bits = new bz\bitset();
615
+ /*
616
+ $bits->set(63, true);
617
+ $bits->set(2, true);
618
+ $bits->set(5, true);
619
+ */
620
+ $bits[63] = true;
621
+ $bits[2] = true;
622
+ $bits[5] = true;
623
+
624
+ $tb->setFV('bits', $bits);
625
+ $tb->update();
626
+ $this->assertEquals($tb->stat(), 0);
627
+
628
+ $q = new bz\query();
629
+ $at = new bz\activeTable($db, "extention");
630
+ $q->where('id', '=', 1);
631
+ $rs = $at->index(0)->keyValue(1)->read($q);
632
+ $this->assertEquals($rs->size(), 1);
633
+ $bits = $rs[0]['bits']->getBits();
634
+
635
+ $this->assertEquals($bits->get(63), true);
636
+ $this->assertEquals($bits->get(2), true);
637
+ $this->assertEquals($bits->get(5), true);
638
+ $this->assertEquals($bits->get(62), false);
639
+ $this->assertEquals($bits->get(0), false);
640
+ $this->assertEquals($bits->get(12), false);
641
+
642
+ $this->assertEquals($bits[63], true);
643
+ $this->assertEquals($bits[2], true);
644
+ $this->assertEquals($bits[5], true);
645
+ $this->assertEquals($bits[62], false);
646
+ $this->assertEquals($bits[0], false);
647
+ $this->assertEquals($bits[12], false);
648
+
649
+ $wr = $at->getWritableRecord();
650
+ $wr['id'] = 1;
651
+ /*
652
+ $bits->set(63, false);
653
+ $bits->set(12, true);
654
+ $bits->set(0, true);
655
+ $bits->set(62, true);
656
+ */
657
+ $bits[63] = false;
658
+ $bits[12] = true;
659
+ $bits[0] = true;
660
+ $bits[62] = true;
661
+
662
+ $wr['bits'] = $bits;
663
+ $wr->update();
664
+ $tb->setFV('id', 1);
665
+ $tb->seek();
666
+ $this->assertEquals($tb->stat(), 0);
667
+ $bits = $tb->getFVbits('bits');
668
+
669
+ $this->assertEquals($bits->get( 63), false);
670
+ $this->assertEquals($bits->get( 2), true);
671
+ $this->assertEquals($bits->get( 5), true);
672
+ $this->assertEquals($bits->get( 12), true);
673
+ $this->assertEquals($bits->get( 0), true);
674
+ $this->assertEquals($bits->get( 62), true);
675
+ $this->assertEquals($bits->get( 11), false);
676
+ $this->assertEquals($bits->get( 13), false);
677
+
678
+ $this->assertEquals($bits[63], false);
679
+ $this->assertEquals($bits[2], true);
680
+ $this->assertEquals($bits[5], true);
681
+ $this->assertEquals($bits[12], true);
682
+ $this->assertEquals($bits[0], true);
683
+ $this->assertEquals($bits[62], true);
684
+ $this->assertEquals($bits[11], false);
685
+ $this->assertEquals($bits[13], false);
686
+
687
+ }
688
+
689
+ public function test_bitset()
690
+ {
691
+ $bits1 = new bz\bitset();
692
+ $bits2 = new bz\bitset();
693
+ $bits1[0] = true;
694
+ $bits1[1] = true;
695
+ $bits1[63] = true;
696
+
697
+ $bits2[0] = true;
698
+ $bits2[1] = false;
699
+ $bits2[63] = true;
700
+
701
+ $this->assertEquals($bits1->equals($bits2), false);
702
+ $this->assertEquals($bits1->contains($bits2), true);
703
+ $this->assertEquals($bits2->contains($bits1), false);
704
+
705
+ $all = false;
706
+ $this->assertEquals($bits2->contains($bits1, $all), true);
707
+ }
708
+
709
+ public function test_decimal()
710
+ {
711
+ $db = new bz\database();
712
+ $this->openDatabase($db);
713
+ $dbdef = $db->dbDef();
714
+ $this->assertNotEquals($dbdef, NULL);
715
+ $td = new bz\tabledef();
716
+
717
+ $td->schemaCodePage = bz\transactd::CP_UTF8;
718
+ $td->setTableName("decimal");
719
+ $td->setFileName("decimal");
720
+ $td->charsetIndex = bz\transactd::CHARSET_UTF8;
721
+ $tableid = 10;
722
+ $td->id = $tableid;
723
+ $dbdef->insertTable($td);
724
+ $this->assertEquals($dbdef->stat(), 0);
725
+
726
+ $fieldIndex = 0;
727
+ $fd = $dbdef->insertField($tableid, $fieldIndex);
728
+ $fd->setName('id');
729
+ $fd->type = bz\transactd::ft_mydecimal;
730
+ $fd->setDecimalDigits(65, 30);
731
+ $this->assertEquals($fd->digits, 65);
732
+ $this->assertEquals($fd->decimals, 30);
733
+ $this->assertEquals($fd->isIntegerType(), false);
734
+ $this->assertEquals($fd->isNumericType(), true);
735
+
736
+ $bits1 = new bz\bitset();
737
+ $bits1[2] = true;
738
+ $fd->type = bz\transactd::ft_integer;
739
+ $fd->len = 4;
740
+ $fd->setDefaultValue($bits1);
741
+ $this->assertEquals($fd->defaultValue(), '4');
742
+ }
743
+ }