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.
- checksums.yaml +4 -4
- data/CMakeLists.txt +37 -4
- data/bin/common/tdclc_32_1_2.dll +0 -0
- data/bin/common/tdclc_64_1_2.dll +0 -0
- data/build/common/transactd_cl_common.cmake +0 -1
- data/build/common/transactd_common.cmake +26 -6
- data/build/swig/php/generate.cmake.in +58 -0
- data/build/swig/php/generate.cmd.in +41 -0
- data/build/swig/php/php.swg +155 -0
- data/build/swig/ruby/ruby.swg +38 -0
- data/build/swig/tdcl.i +133 -3
- data/build/tdclc/CMakeLists.txt +4 -1
- data/build/tdclc/tdclc_32.cbproj +1 -1
- data/build/tdclc/tdclc_64.cbproj +1 -1
- data/build/tdclcpp/CMakeLists.txt +1 -1
- data/build/tdclcpp/tdclcpp_bcb_32.cbproj +1 -4
- data/build/tdclcpp/tdclcpp_bcb_64.cbproj +0 -3
- data/build/tdclrb/CMakeLists.txt +1 -1
- data/build/tdclrb/GEM_VERSION +2 -2
- data/source/bzs/db/engine/mysql/IReadRecords.h +1 -1
- data/source/bzs/db/engine/mysql/bookmark.h +3 -3
- data/source/bzs/db/engine/mysql/database.cpp +95 -19
- data/source/bzs/db/engine/mysql/database.h +6 -6
- data/source/bzs/db/engine/mysql/mysqlInternal.h +43 -1
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +10 -8
- data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +1 -1
- data/source/bzs/db/protocol/tdap/btrDate.h +2 -2
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +15 -8
- data/source/bzs/db/protocol/tdap/client/dbDef.h +2 -2
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +4 -0
- data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +0 -5
- data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +0 -4
- data/source/bzs/db/protocol/tdap/client/filter.cpp +0 -484
- data/source/bzs/db/protocol/tdap/client/filter.h +696 -84
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +13 -3
- data/source/bzs/db/protocol/tdap/client/nsTable.h +12 -6
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +2 -1
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +1 -0
- data/source/bzs/db/protocol/tdap/client/table.cpp +519 -75
- data/source/bzs/db/protocol/tdap/client/table.h +49 -7
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +145 -124
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +39 -0
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +872 -0
- data/source/bzs/db/protocol/tdap/myDateTime.cpp +8 -8
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +7 -9
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +406 -195
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +64 -13
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +2 -1
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +35 -3
- data/source/bzs/db/protocol/tdap/tdapSchema.h +11 -3
- data/source/bzs/db/protocol/tdap/tdapcapi.h +63 -53
- data/source/bzs/env/crosscompile.h +8 -3
- data/source/bzs/example/connection_pool_c.cpp +1 -7
- data/source/bzs/example/useORM.cpp +585 -0
- data/source/bzs/rtl/exception.h +6 -0
- data/source/bzs/test/tdclatl/bench_tdclatl.js +12 -7
- data/source/bzs/test/tdclphp/transactd_Test.php +1845 -0
- data/source/bzs/test/tdclphp/transactd_blob_Test.php +325 -0
- data/source/bzs/test/tdclphp/transactd_datetime_Test.php +183 -0
- data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +212 -0
- data/source/bzs/test/tdclrb/transactd_blob_spec.rb +332 -0
- data/source/bzs/test/tdclrb/transactd_spec.rb +256 -1
- data/source/bzs/test/trdclengn/test_blob.cpp +327 -0
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +485 -5
- data/source/global/tdclatl/QueryBase.cpp +231 -0
- data/source/global/tdclatl/QueryBase.h +96 -0
- data/source/global/tdclatl/Table.cpp +24 -0
- data/source/global/tdclatl/Table.h +2 -1
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/tdclatl.idl +88 -2
- metadata +16 -3
- data/bin/common/tdclc_32_1_1.dll +0 -0
- 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
|