transactd 1.1.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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