transactd 1.1.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/CMakeLists.txt +37 -4
  3. data/bin/common/tdclc_32_1_2.dll +0 -0
  4. data/bin/common/tdclc_64_1_2.dll +0 -0
  5. data/build/common/transactd_cl_common.cmake +0 -1
  6. data/build/common/transactd_common.cmake +26 -6
  7. data/build/swig/php/generate.cmake.in +58 -0
  8. data/build/swig/php/generate.cmd.in +41 -0
  9. data/build/swig/php/php.swg +155 -0
  10. data/build/swig/ruby/ruby.swg +38 -0
  11. data/build/swig/tdcl.i +133 -3
  12. data/build/tdclc/CMakeLists.txt +4 -1
  13. data/build/tdclc/tdclc_32.cbproj +1 -1
  14. data/build/tdclc/tdclc_64.cbproj +1 -1
  15. data/build/tdclcpp/CMakeLists.txt +1 -1
  16. data/build/tdclcpp/tdclcpp_bcb_32.cbproj +1 -4
  17. data/build/tdclcpp/tdclcpp_bcb_64.cbproj +0 -3
  18. data/build/tdclrb/CMakeLists.txt +1 -1
  19. data/build/tdclrb/GEM_VERSION +2 -2
  20. data/source/bzs/db/engine/mysql/IReadRecords.h +1 -1
  21. data/source/bzs/db/engine/mysql/bookmark.h +3 -3
  22. data/source/bzs/db/engine/mysql/database.cpp +95 -19
  23. data/source/bzs/db/engine/mysql/database.h +6 -6
  24. data/source/bzs/db/engine/mysql/mysqlInternal.h +43 -1
  25. data/source/bzs/db/engine/mysql/mysqlThd.cpp +10 -8
  26. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +1 -1
  27. data/source/bzs/db/protocol/tdap/btrDate.h +2 -2
  28. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +15 -8
  29. data/source/bzs/db/protocol/tdap/client/dbDef.h +2 -2
  30. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +4 -0
  31. data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +0 -5
  32. data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +0 -4
  33. data/source/bzs/db/protocol/tdap/client/filter.cpp +0 -484
  34. data/source/bzs/db/protocol/tdap/client/filter.h +696 -84
  35. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +13 -3
  36. data/source/bzs/db/protocol/tdap/client/nsTable.h +12 -6
  37. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +2 -1
  38. data/source/bzs/db/protocol/tdap/client/stringConverter.h +1 -0
  39. data/source/bzs/db/protocol/tdap/client/table.cpp +519 -75
  40. data/source/bzs/db/protocol/tdap/client/table.h +49 -7
  41. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +145 -124
  42. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +39 -0
  43. data/source/bzs/db/protocol/tdap/client/trdormapi.h +872 -0
  44. data/source/bzs/db/protocol/tdap/myDateTime.cpp +8 -8
  45. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +7 -9
  46. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +406 -195
  47. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +64 -13
  48. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +2 -1
  49. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +35 -3
  50. data/source/bzs/db/protocol/tdap/tdapSchema.h +11 -3
  51. data/source/bzs/db/protocol/tdap/tdapcapi.h +63 -53
  52. data/source/bzs/env/crosscompile.h +8 -3
  53. data/source/bzs/example/connection_pool_c.cpp +1 -7
  54. data/source/bzs/example/useORM.cpp +585 -0
  55. data/source/bzs/rtl/exception.h +6 -0
  56. data/source/bzs/test/tdclatl/bench_tdclatl.js +12 -7
  57. data/source/bzs/test/tdclphp/transactd_Test.php +1845 -0
  58. data/source/bzs/test/tdclphp/transactd_blob_Test.php +325 -0
  59. data/source/bzs/test/tdclphp/transactd_datetime_Test.php +183 -0
  60. data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +212 -0
  61. data/source/bzs/test/tdclrb/transactd_blob_spec.rb +332 -0
  62. data/source/bzs/test/tdclrb/transactd_spec.rb +256 -1
  63. data/source/bzs/test/trdclengn/test_blob.cpp +327 -0
  64. data/source/bzs/test/trdclengn/test_trdclengn.cpp +485 -5
  65. data/source/global/tdclatl/QueryBase.cpp +231 -0
  66. data/source/global/tdclatl/QueryBase.h +96 -0
  67. data/source/global/tdclatl/Table.cpp +24 -0
  68. data/source/global/tdclatl/Table.h +2 -1
  69. data/source/global/tdclatl/resource.h +0 -0
  70. data/source/global/tdclatl/tdclatl.idl +88 -2
  71. metadata +16 -3
  72. data/bin/common/tdclc_32_1_1.dll +0 -0
  73. data/bin/common/tdclc_64_1_1.dll +0 -0
@@ -0,0 +1,212 @@
1
+ <?php
2
+ /* ================================================================
3
+ Copyright (C) 2013 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
+
24
+ define("HOSTNAME", "localhost/");
25
+ define("URL", "tdap://" . HOSTNAME . "test?dbfile=test.bdf");
26
+ define("URL_KANJI", "tdap://" . HOSTNAME . "テスト?dbfile=構成.bdf");
27
+ define("FDI_ID", 0);
28
+ define("FDN_ID", "番号");
29
+ define("FDI_NAME", 1);
30
+ define("FDN_NAME", "名前");
31
+
32
+ define("TYPE_SCHEMA_BDF", 0);
33
+
34
+ class transactdKanjiSchemaTest extends PHPUnit_Framework_TestCase
35
+ {
36
+ private function getDbObj()
37
+ {
38
+ return database::createObject();
39
+ }
40
+ private function deleteDbObj($db)
41
+ {
42
+ $db->close();
43
+ $db = NULL;
44
+ }
45
+ private function dropDatabase($db, $url)
46
+ {
47
+ $db->open($url);
48
+ $this->assertEquals($db->stat(), 0);
49
+ $db->drop();
50
+ $this->assertEquals($db->stat(), 0);
51
+ }
52
+ private function createDatabase($db, $url)
53
+ {
54
+ $db->create($url);
55
+ if ($db->stat() == transactd::STATUS_TABLE_EXISTS_ERROR)
56
+ {
57
+ $this->dropDatabase($db, $url);
58
+ $db->create($url);
59
+ }
60
+ $this->assertEquals($db->stat(), 0);
61
+ }
62
+ private function openDatabase($db, $url)
63
+ {
64
+ $db->open($url, TYPE_SCHEMA_BDF, transactd::TD_OPEN_NORMAL);
65
+ $this->assertEquals($db->stat(), 0);
66
+ }
67
+ private function createTable($db, $tableid, $tablename)
68
+ {
69
+ $dbdef = $db->dbDef();
70
+ $this->assertNotEquals($dbdef, NULL);
71
+ $td = new tabledef();
72
+ /* Set table schema codepage to UTF-8
73
+ - codepage for field NAME and tableNAME */
74
+ $td->schemaCodePage = transactd::CP_UTF8;
75
+ $td->setTableName($tablename);
76
+ $td->setFileName($tablename . '.dat');
77
+ /* Set table default charaset index
78
+ - default charset for field VALUE */
79
+ $td->charsetIndex = transactd::charsetIndex(transactd::CP_UTF8);
80
+ //
81
+ $td->id = $tableid;
82
+ $td->pageSize = 2048;
83
+ $dbdef->insertTable($td);
84
+ $this->assertEquals($dbdef->stat(), 0);
85
+ $fd = $dbdef->insertField($tableid, FDI_ID);
86
+ $fd->setName(FDN_ID);
87
+ $fd->type = transactd::ft_integer;
88
+ $fd->len = 4;
89
+ $dbdef->updateTableDef($tableid);
90
+ $this->assertEquals($dbdef->stat(), 0);
91
+ $fd = $dbdef->insertField($tableid, FDI_NAME);
92
+ $fd->setName(FDN_NAME);
93
+ $fd->type = transactd::ft_zstring;
94
+ $fd->len = 33;
95
+ $dbdef->updateTableDef($tableid);
96
+ $this->assertEquals($dbdef->stat(), 0);
97
+ /* Set field charset index
98
+ - charset for each field VALUE
99
+ $fd->setCharsetIndex(Transactd::charsetIndex(Transactd::CP_UTF8)) */
100
+ $kd = $dbdef->insertKey($tableid, 0);
101
+ $kd->segment(0)->fieldNum = 0;
102
+ $kd->segment(0)->flags->bit8 = 1;
103
+ $kd->segment(0)->flags->bit1 = 1;
104
+ $kd->segmentCount = 1;
105
+ $dbdef->updateTableDef($tableid);
106
+ $this->assertEquals($dbdef->stat(), 0);
107
+ }
108
+ private function openTable($db, $tablename)
109
+ {
110
+ $tb = $db->openTable($tablename);
111
+ $this->assertEquals($db->stat(), 0);
112
+ return $tb;
113
+ }
114
+ private function insert($db, $tablename)
115
+ {
116
+ $tb = $this->openTable($db, $tablename);
117
+ $this->assertNotEquals($tb, NULL);
118
+ $tb->clearBuffer();
119
+ $tb->setFV(FDN_ID, 1);
120
+ $tb->setFV(FDN_NAME, '小坂');
121
+ $tb->insert();
122
+ $this->assertEquals($tb->stat(), 0);
123
+ $tb->clearBuffer();
124
+ $tb->setFV(FDN_ID, 2);
125
+ $tb->setFV(FDN_NAME, '矢口');
126
+ $tb->insert();
127
+ $this->assertEquals($tb->stat(), 0);
128
+ $tb->clearBuffer();
129
+ $tb->setFV(FDN_ID, 3);
130
+ $tb->setFV(FDN_NAME, 'ビズステーション');
131
+ $tb->insert();
132
+ $this->assertEquals($tb->stat(), 0);
133
+ $tb->close();
134
+ }
135
+ private function getEqual($db, $tablename)
136
+ {
137
+ $tb = $this->openTable($db, $tablename);
138
+ $this->assertNotEquals($tb, NULL);
139
+ $tb->clearBuffer();
140
+ $tb->setFV(FDN_ID, 1);
141
+ $tb->seek();
142
+ $this->assertEquals($tb->getFVstr(FDN_NAME), '小坂');
143
+ $tb->close();
144
+ }
145
+ private function find($db, $tablename)
146
+ {
147
+ $tb = $this->openTable($db, $tablename);
148
+ $this->assertNotEquals($tb, NULL);
149
+ $tb->setKeyNum(0);
150
+ $tb->clearBuffer();
151
+ $tb->setFilter('番号 >= 1 and 番号 < 3', 1, 0);
152
+ $tb->setFV(FDN_ID, 1);
153
+ $tb->find(table::findForword);
154
+ $this->assertEquals($tb->stat(), 0);
155
+ $this->assertEquals($tb->getFVint(FDN_ID), 1);
156
+ $this->assertEquals($tb->getFVstr(FDN_NAME), '小坂');
157
+ $tb->findNext(true);
158
+ $this->assertEquals($tb->stat(), 0);
159
+ $this->assertEquals($tb->getFVint(FDN_ID), 2);
160
+ $this->assertEquals($tb->getFVstr(FDN_NAME), '矢口');
161
+ $tb->findNext(true);
162
+ $this->assertEquals($tb->stat(), transactd::STATUS_EOF);
163
+ $tb->close();
164
+ }
165
+ private function doWhole($db, $tableid, $tablename, $url)
166
+ {
167
+ $this->openDatabase($db, $url);
168
+ $this->createTable($db, $tableid, $tablename);
169
+ $tb = $this->openTable($db, $tablename);
170
+ $tb->close();
171
+ $this->insert($db, $tablename);
172
+ $this->getEqual($db, $tablename);
173
+ $this->find($db, $tablename);
174
+ }
175
+
176
+ public function testCreateDatabase()
177
+ {
178
+ $db = $this->getDbObj();
179
+ $this->createDatabase($db, URL);
180
+ $this->deleteDbObj($db);
181
+ }
182
+ public function testTableWhichHasKanjiNamedField()
183
+ {
184
+ $db = $this->getDbObj();
185
+ $this->doWhole($db, 1, 'kanji-field', URL);
186
+ $this->deleteDbObj($db);
187
+ }
188
+ public function testKanjiNamedTable()
189
+ {
190
+ $db = $this->getDbObj();
191
+ $this->doWhole($db, 2, '漢字テーブル', URL);
192
+ $this->deleteDbObj($db);
193
+ }
194
+ public function testCreateKanjiNamedDatabase()
195
+ {
196
+ $db = $this->getDbObj();
197
+ $this->createDatabase($db, URL_KANJI); // URL must be UTF-8
198
+ $this->deleteDbObj($db);
199
+ }
200
+ public function testTableWhichHasKanjiNamedFieldInKanjiNamedDatabase()
201
+ {
202
+ $db = $this->getDbObj();
203
+ $this->doWhole($db, 1, 'kanji-field', URL_KANJI);
204
+ $this->deleteDbObj($db);
205
+ }
206
+ public function testKanjiNamedTableInKanjiNamedDatabase()
207
+ {
208
+ $db = $this->getDbObj();
209
+ $this->doWhole($db, 2, '漢字テーブル', URL_KANJI);
210
+ $this->deleteDbObj($db);
211
+ }
212
+ }
@@ -0,0 +1,332 @@
1
+ # coding : utf-8
2
+ =begin ============================================================
3
+ Copyright (C) 2013 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
+ =end
21
+ require 'transactd'
22
+ require 'base64'
23
+
24
+ def getHost()
25
+ hostname = '127.0.0.1/'
26
+ if (ENV['TRANSACTD_RSPEC_HOST'] != nil && ENV['TRANSACTD_RSPEC_HOST'] != '')
27
+ hostname = ENV['TRANSACTD_RSPEC_HOST']
28
+ end
29
+ hostname = hostname + '/' unless (hostname =~ /\/$/)
30
+ return hostname
31
+ end
32
+
33
+ HOSTNAME = getHost()
34
+ URL = 'tdap://' + HOSTNAME + 'test_blob?dbfile=test.bdf'
35
+ TABLENAME = 'comments'
36
+ FDI_ID = 0
37
+ FDI_USER_ID = 1
38
+ FDI_BODY = 2
39
+ FDI_IMAGE = 3
40
+
41
+ TYPE_SCHEMA_BDF = 0
42
+
43
+ def dropDatabase(db)
44
+ db.open(URL)
45
+ expect(db.stat()).to eq 0
46
+ db.drop()
47
+ expect(db.stat()).to eq 0
48
+ end
49
+
50
+ def createDatabase(db)
51
+ db.create(URL)
52
+ if db.stat() == Transactd::STATUS_TABLE_EXISTS_ERROR
53
+ dropDatabase(db)
54
+ db.create(URL)
55
+ end
56
+ expect(db.stat()).to eq 0
57
+ end
58
+
59
+ def openDatabase(db)
60
+ db.open(URL, TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL)
61
+ expect(db.stat()).to eq 0
62
+ end
63
+
64
+ def createTable(db)
65
+ openDatabase(db)
66
+ dbdef = db.dbDef()
67
+ expect(dbdef).not_to be nil
68
+ td = Transactd::Tabledef.new()
69
+ # Set table schema codepage to UTF-8
70
+ # - codepage for field NAME and tableNAME
71
+ td.schemaCodePage = Transactd::CP_UTF8
72
+ td.setTableName(TABLENAME)
73
+ td.setFileName(TABLENAME + '.dat')
74
+ # Set table default charaset index
75
+ # - default charset for field VALUE
76
+ td.charsetIndex = Transactd::charsetIndex(Transactd::CP_UTF8)
77
+ td.id = 1
78
+ td.pageSize = 2048
79
+ dbdef.insertTable(td)
80
+ expect(dbdef.stat()).to eq 0
81
+ # id
82
+ fd = dbdef.insertField(1, FDI_ID)
83
+ fd.setName('id')
84
+ fd.type = Transactd::Ft_autoinc
85
+ fd.len = 4
86
+ dbdef.updateTableDef(1)
87
+ expect(dbdef.stat()).to eq 0
88
+ # user_id
89
+ fd = dbdef.insertField(1, FDI_USER_ID)
90
+ fd.setName('user_id')
91
+ fd.type = Transactd::Ft_integer
92
+ fd.len = 4
93
+ dbdef.updateTableDef(1)
94
+ expect(dbdef.stat()).to eq 0
95
+ # body
96
+ fd = dbdef.insertField(1, FDI_BODY)
97
+ fd.setName('body')
98
+ fd.type = Transactd::Ft_mytext
99
+ fd.len = 10 # 9:TYNYTEXT 10:TEXT 11:MIDIUMTEXT 12:LONGTEXT
100
+ dbdef.updateTableDef(1)
101
+ expect(dbdef.stat()).to eq 0
102
+ # image
103
+ fd = dbdef.insertField(1, FDI_IMAGE)
104
+ fd.setName('image')
105
+ fd.type = Transactd::Ft_myblob
106
+ fd.len = 10 # 9:TYNYBLOB 10:BLOB 11:MIDIUMBLOB 12:LONGBLOB
107
+ dbdef.updateTableDef(1)
108
+ expect(dbdef.stat()).to eq 0
109
+ # key
110
+ kd = dbdef.insertKey(1,0)
111
+ kd.segment(0).fieldNum = 0
112
+ kd.segment(0).flags.bit8 = 1
113
+ kd.segment(0).flags.bit1 = 1
114
+ kd.segmentCount = 1
115
+ dbdef.updateTableDef(1)
116
+ expect(dbdef.stat()).to eq 0
117
+ end
118
+
119
+ def openTable(db)
120
+ tb = db.openTable(TABLENAME)
121
+ expect(db.stat()).to eq 0
122
+ return tb
123
+ end
124
+
125
+ def getTestBinary()
126
+ image_base64 = 'R0lGODdhEAAQAKEBAGZmZv#/5mZmczMzCwAAAAAEAAQAAACRowzIgA6BxebTMAgG60nW5NM1kAZikGFHAmgYvYgJpW12FfTyLpJjz+IVSSXR4IlQCoUgCCG8ds0D5xZT3TJYS8IZiMJKQAAOw=='
127
+ return Base64.decode64(image_base64)
128
+ end
129
+
130
+ describe Transactd, 'blob' do
131
+ before :each do
132
+ @db = Transactd::Database.createObject()
133
+ end
134
+ after :each do
135
+ @db.close()
136
+ @db = nil
137
+ end
138
+
139
+ it 'create' do
140
+ createDatabase(@db)
141
+ openDatabase(@db)
142
+ createTable(@db)
143
+ tb = openTable(@db)
144
+ tb.close()
145
+ end
146
+
147
+ it 'insert' do
148
+ image = getTestBinary()
149
+ openDatabase(@db)
150
+ tb = openTable(@db)
151
+ expect(tb).not_to be nil
152
+ # 1
153
+ tb.clearBuffer()
154
+ tb.setFV(FDI_USER_ID, 1)
155
+ tb.setFV(FDI_BODY, "1\ntest\nテスト\n\nあいうえおあいうえお")
156
+ tb.setFV(FDI_IMAGE, image, image.bytesize)
157
+ tb.insert()
158
+ expect(tb.stat()).to eq 0
159
+ # 2
160
+ tb.clearBuffer()
161
+ tb.setFV('user_id', 1)
162
+ tb.setFV('body', "2\ntest\nテスト\n\nあいうえおあいうえお")
163
+ str = "2\ntest\nテスト\n\nあいうえおあいうえお"
164
+ tb.setFV('image', str, str.bytesize)
165
+ tb.insert()
166
+ expect(tb.stat()).to eq 0
167
+ # 3
168
+ tb.clearBuffer()
169
+ tb.setFV(FDI_USER_ID, 2)
170
+ tb.setFV(FDI_BODY, "3\ntest\nテスト\n\nあいうえおあいうえお")
171
+ str = "3\ntest\nテスト\n\nあいうえおあいうえお"
172
+ tb.setFV(FDI_IMAGE, str, str.bytesize)
173
+ tb.insert()
174
+ expect(tb.stat()).to eq 0
175
+ tb.close()
176
+ end
177
+
178
+ it 'seek' do
179
+ image = getTestBinary()
180
+ openDatabase(@db)
181
+ tb = openTable(@db)
182
+ expect(tb).not_to be nil
183
+ # 1
184
+ tb.clearBuffer()
185
+ tb.setFV(FDI_ID, 1)
186
+ tb.seek()
187
+ expect(tb.stat()).to eq 0
188
+ expect(tb.getFVint(FDI_ID)).to eq 1
189
+ expect(tb.getFVint(FDI_USER_ID)).to eq 1
190
+ expect(tb.getFVstr(FDI_BODY)).to eq "1\ntest\nテスト\n\nあいうえおあいうえお"
191
+ expect(tb.getFVbin(FDI_IMAGE)).to eq image
192
+ # 2
193
+ tb.seekNext()
194
+ expect(tb.stat()).to eq 0
195
+ expect(tb.getFVint(FDI_ID)).to eq 2
196
+ expect(tb.getFVint(FDI_USER_ID)).to eq 1
197
+ expect(tb.getFVstr(FDI_BODY)).to eq "2\ntest\nテスト\n\nあいうえおあいうえお"
198
+ expect(tb.getFVbin(FDI_IMAGE).force_encoding('UTF-8')).to eq "2\ntest\nテスト\n\nあいうえおあいうえお"
199
+ # 3
200
+ tb.seekNext()
201
+ expect(tb.stat()).to eq 0
202
+ expect(tb.getFVint(FDI_ID)).to eq 3
203
+ expect(tb.getFVint(FDI_USER_ID)).to eq 2
204
+ expect(tb.getFVstr(FDI_BODY)).to eq "3\ntest\nテスト\n\nあいうえおあいうえお"
205
+ expect(tb.getFVbin(FDI_IMAGE).force_encoding('UTF-8')).to eq "3\ntest\nテスト\n\nあいうえおあいうえお"
206
+ # 2
207
+ tb.seekPrev()
208
+ expect(tb.stat()).to eq 0
209
+ expect(tb.getFVint(FDI_ID)).to eq 2
210
+ expect(tb.getFVint(FDI_USER_ID)).to eq 1
211
+ expect(tb.getFVstr(FDI_BODY)).to eq "2\ntest\nテスト\n\nあいうえおあいうえお"
212
+ expect(tb.getFVbin(FDI_IMAGE).force_encoding('UTF-8')).to eq "2\ntest\nテスト\n\nあいうえおあいうえお"
213
+ tb.close()
214
+ end
215
+
216
+ it 'find' do
217
+ image = getTestBinary()
218
+ openDatabase(@db)
219
+ tb = openTable(@db)
220
+ expect(tb).not_to be nil
221
+ # 1
222
+ tb.setKeyNum(0)
223
+ tb.clearBuffer()
224
+ tb.setFilter('id >= 1 and id < 3', 1, 0)
225
+ expect(tb.stat()).to eq 0
226
+ tb.setFV(FDI_ID, 1)
227
+ tb.find(Transactd::Table::FindForword)
228
+ expect(tb.stat()).to eq 0
229
+ expect(tb.getFVint(FDI_ID)).to eq 1
230
+ expect(tb.getFVint(FDI_USER_ID)).to eq 1
231
+ expect(tb.getFVstr(FDI_BODY)).to eq "1\ntest\nテスト\n\nあいうえおあいうえお"
232
+ expect(tb.getFVbin(FDI_IMAGE)).to eq image
233
+ # 2
234
+ tb.findNext(true)
235
+ expect(tb.stat()).to eq 0
236
+ expect(tb.getFVint(FDI_ID)).to eq 2
237
+ expect(tb.getFVint(FDI_USER_ID)).to eq 1
238
+ expect(tb.getFVstr(FDI_BODY)).to eq "2\ntest\nテスト\n\nあいうえおあいうえお"
239
+ expect(tb.getFVbin(FDI_IMAGE).force_encoding('UTF-8')).to eq "2\ntest\nテスト\n\nあいうえおあいうえお"
240
+ # 3... but not found because filtered
241
+ tb.findNext(true)
242
+ expect(tb.stat()).to eq Transactd::STATUS_EOF
243
+ # 2... but changing seek-direction is not allowed
244
+ tb.findPrev(true)
245
+ expect(tb.stat()).to eq Transactd::STATUS_PROGRAM_ERROR
246
+ tb.close()
247
+ end
248
+
249
+ it 'update' do
250
+ image = getTestBinary()
251
+ openDatabase(@db)
252
+ tb = openTable(@db)
253
+ expect(tb).not_to be nil
254
+ # select 1
255
+ tb.clearBuffer()
256
+ tb.setFV(FDI_ID, 1)
257
+ tb.seek()
258
+ expect(tb.stat()).to eq 0
259
+ expect(tb.getFVint(FDI_ID)).to eq 1
260
+ expect(tb.getFVint(FDI_USER_ID)).to eq 1
261
+ expect(tb.getFVstr(FDI_BODY)).to eq "1\ntest\nテスト\n\nあいうえおあいうえお"
262
+ expect(tb.getFVbin(FDI_IMAGE)).to eq image
263
+ # update
264
+ tb.setFV(FDI_BODY, "1\nテスト\ntest\n\nABCDEFG")
265
+ tb.update()
266
+ expect(tb.stat()).to eq 0
267
+ # select 2
268
+ tb.seekNext()
269
+ expect(tb.stat()).to eq 0
270
+ expect(tb.getFVint(FDI_ID)).to eq 2
271
+ expect(tb.getFVint(FDI_USER_ID)).to eq 1
272
+ expect(tb.getFVstr(FDI_BODY)).to eq "2\ntest\nテスト\n\nあいうえおあいうえお"
273
+ expect(tb.getFVbin(FDI_IMAGE).force_encoding('UTF-8')).to eq "2\ntest\nテスト\n\nあいうえおあいうえお"
274
+ # update
275
+ tb.setFV(FDI_BODY, "2\nテスト\ntest\n\nABCDEFG")
276
+ tb.update()
277
+ expect(tb.stat()).to eq 0
278
+ # check 1
279
+ tb.seekPrev()
280
+ expect(tb.stat()).to eq 0
281
+ expect(tb.getFVint(FDI_ID)).to eq 1
282
+ expect(tb.getFVint(FDI_USER_ID)).to eq 1
283
+ expect(tb.getFVstr(FDI_BODY)).to eq "1\nテスト\ntest\n\nABCDEFG"
284
+ expect(tb.getFVbin(FDI_IMAGE)).to eq image
285
+ # check 2
286
+ tb.seekNext()
287
+ expect(tb.stat()).to eq 0
288
+ expect(tb.getFVint(FDI_ID)).to eq 2
289
+ expect(tb.getFVint(FDI_USER_ID)).to eq 1
290
+ expect(tb.getFVstr(FDI_BODY)).to eq "2\nテスト\ntest\n\nABCDEFG"
291
+ expect(tb.getFVbin(FDI_IMAGE).force_encoding('UTF-8')).to eq "2\ntest\nテスト\n\nあいうえおあいうえお"
292
+ tb.close()
293
+ end
294
+
295
+ it 'delete' do
296
+ image = getTestBinary()
297
+ openDatabase(@db)
298
+ tb = openTable(@db)
299
+ expect(tb).not_to be nil
300
+ # delete 2
301
+ tb.clearBuffer()
302
+ tb.setFV(FDI_ID, 2)
303
+ tb.seek()
304
+ expect(tb.stat()).to eq 0
305
+ tb.del()
306
+ expect(tb.stat()).to eq 0
307
+ # select 1
308
+ tb.clearBuffer()
309
+ tb.setFV(FDI_ID, 1)
310
+ tb.seek()
311
+ expect(tb.stat()).to eq 0
312
+ expect(tb.getFVint(FDI_ID)).to eq 1
313
+ expect(tb.getFVint(FDI_USER_ID)).to eq 1
314
+ expect(tb.getFVstr(FDI_BODY)).to eq "1\nテスト\ntest\n\nABCDEFG"
315
+ expect(tb.getFVbin(FDI_IMAGE)).to eq image
316
+ # next is 3
317
+ tb.seekNext()
318
+ expect(tb.stat()).to eq 0
319
+ expect(tb.getFVint(FDI_ID)).to eq 3
320
+ expect(tb.getFVint(FDI_USER_ID)).to eq 2
321
+ expect(tb.getFVstr(FDI_BODY)).to eq "3\ntest\nテスト\n\nあいうえおあいうえお"
322
+ expect(tb.getFVbin(FDI_IMAGE).force_encoding('UTF-8')).to eq "3\ntest\nテスト\n\nあいうえおあいうえお"
323
+ # eof
324
+ tb.seekNext()
325
+ expect(tb.stat()).to eq Transactd::STATUS_EOF
326
+ tb.close()
327
+ end
328
+
329
+ it 'drop' do
330
+ dropDatabase(@db)
331
+ end
332
+ end