Transactd 開発者ガイド
サポートする言語
現在、Transactd クライアントを用いたアプリケーション開発を行える言語は、以下の通りです。
(Java、Pythonなどを順次対応予定)
マルチスレッドサポート
すべての言語のクライアントにおいて、接続データベース単位でのマルチスレッドをサポートしています。
あるデータベースとそれに付随するテーブルなどのオブジェクトグループは、1つのスレッドからは安全に操作できます。
言い換えると、スレッドごとに専用のデータベースオブジェクトを利用すれば安全に操作できます。
その際、個々のデータベースオブジェクトのconnect
メソッドオプションで専用のTCPコネクションを張るように指示してください。
Apache 2のworkerMPMやIISのISAPIエクステンションからも安全に実行することができます。
Ruby クライアント
Ruby 1.9系 および Ruby 2.0系 用のRubyGemを用意しています。
仕様と制限
RubyのクライアントはC++のAPIをラップした形になっており、以下の点を除いてC++のAPIと同じです。
C++ APIに対するRubyクライアントの相違点(2015/06/09) |
全般 |
- クラス名の先頭は大文字(例:
database →Database )
- 定数の先頭は大文字(例:
ft_integer →Ft_integer )
- ネストした名前空間はなく、すべてが
Transactd 名前空間に置かれる
(例:bzs::db::protocol::tdap::client::database → Transactd::Database )
|
終了処理 |
- メモリの解放はRubyのGCによって行われるため、明示的なメモリ解放処理は不要。
database::release およびnstable::release は存在しない。
- メモリ解放時にコネクションの切断も行われるが、明示的に切断処理を記述することを推奨する。
Database.close およびTable.close を使用する。
db.open(uri, 0, Transactd::TD_OPEN_NORMAL, '', '') # open database
tb = db.openTable('user', Transactd::TD_OPEN_NORMAL, true) # open table
# ... some operations ...
tb.close() # close table
db.close() # close database
|
文字コード |
- Windows上であってもマルチバイトに限定され、Unicodeは使用できない。
(
tdclcpp_*m*.dll を使用する)
- ソースコードファイルのエンコーディングにはUTF-8を使用する。
- 使用可能な文字コードはSDKドキュメントの文字コードの項目を参照。
|
整数 |
- データベースに格納されたUNSIGNED BIGINT型の値について、63bitまでの整数は
Table::getFV64 Field::i64 メソッドで取得できます。それ以上の値は、バイト列を符号付64bitの値とみなした数値が取得されます。
Table::getFVstr Field::str メソッドを使用すると、10進数の文字列表現として取得できます。
|
メソッドの 変更 |
keydef::segments[] へのアクセスをKeydef::segment メソッドに変更。
tabledef::fieldDefs[] へのアクセスをTabledef::fieldDef メソッドに変更。
tabledef::keyDefs[] へのアクセスをTabledef::keyDef メソッドに変更。
btrVersions::versions[] へのアクセスをBtrVersions::version メソッドに変更。
BtrTimeStamp::toString, btrdtoa, btrttoa, btrstoa のシグネチャを変更。
nowdate = Transactd::getNowDate()
# 引数の char* が削除され、文字列を返す。
nowdate_str = Transactd::btrdtoa(nowdate, true)
Record クラスにオブジェクトからフィールドの値をセットするset_value_by_object を追加。
Recordset クラスとTable クラスにfetchMode を追加。詳細は
PHPとRubyにおける行取得の追加機能を参照。
Recordset クラスにgetRecord を追加。getRecord はfetchMode の値に関わらず
record オブジェクトを返します。
Table クラスにgetRow を追加。getRow はfields メソッドのエイリアスです。
Table クラスに、オブジェクトをパラメータにとりプライマリキーでCRUDを行うオペレーション
table::save_by_object table::update_by_object
table::insert_by_object table::read_by_object table::delete_by_object を追加。
Table クラスに、キーの値でレコードを移動するseek_key_value(keyValues) メソッドを追加。このメソッドは以下の内容をエクステンション内で処理します。
def seek_key_value(keyValues)
tb.clearBuffer
i = 0
for value in keyValues
tb.setFV(keyseg(i), value)
i += 1
end
tb.seek
return tb.stat
end
- 各クラスおよびモジュールのメソッド名とプロパティ名について、以下の規則に従った別名を追加しました。
camelCase 形式の名前にsnake_case 形式の別名を追加。
is_XXX という名前で、戻り値が真偽値のものにis_XXX? の別名を追加。
set_XXX という名前で、引数が1つかつ戻り値がないものにXXX= の別名を追加。
|
未対応の 機能 |
onCopyData ,onDeleteRecord のコールバック関数機能は未対応(今後対応予定)
table::insertBookmarks は非対応。
fielddefs::addAllFields は非対応。
fielddefs::append は非対応。
fielddefs::addSelectedFields は非対応。
fielddefs::addAliasName は非対応。
fielddef::blobLenBytes は非対応。
fielddef::varLenBytes は非対応。
nstable::stats は非対応。
table::optionalData は非対応。
table::setOptionalData は非対応。
database::optionalData は非対応。
database::setOptionalData は非対応。
connection::record::status は非対応。
tdap::getFilterLogicTypeCode は非対応。
|
COM クライアント
COMはWindowsでのみ使用可能です。
仕様と制限
ActiveX(COM)はC++のAPIをラップした形になっており、以下の点を除いてC++のAPIと同じです。
C++ APIに対するActiveX(COM)インターフェースの相違点(2015/06/09) |
全般 |
- クラス名の先頭は大文字(例:
database →Database )
- メソッド名の先頭は大文字(例:
openTable →OpenTable )
- getter関数とsetter関数が対であるメソッドは、メンバー変数のように = で参照と値の設定を行う
(例:table.setUsePadChar(true); →table.UsePadChar = true;
value = table.usePadChar(); →value = table.UsePadChar; )
- ネストした名前空間はなく、すべてが
transactd 名前空間に置かれる
(例:bzs::db::protocol::tdap::client::database →transactd.Database )
|
定数(enum) |
- スクリプト言語で使用する場合は、スクリプト内で定義する。
- タイプライブラリが使えるIDEでは、
eXxx 名前空間でアクセス可能。(例:eStatus.STATUS_SUCCESS )
|
終了処理 |
- メモリの解放はCOMによって行われるため、明示的なメモリ解放処理は不要。
database::release およびnstable::release は存在しない。
- メモリ解放時にコネクションの切断も行われるが、明示的に切断処理を記述することを推奨する。
Database.Close およびTable.Close を使用する。
db.Open(uri, TYPE_BDF, OPEN_NORMAL); // open database
var tb = db.OpenTable('user', TD_OPEN_NORMAL); // open table
// ... some operations ...
tb.Close(); // close table
db.Close(); // close database
|
文字コード |
Unicodeに限定され、マルチバイトは使用できない。(tdclcpp_*****_**u_*_*.dll を使用する)
|
整数 |
- 符号付32bitの範囲に収まる整数は
table::GetFVint field::I メソッドで取得できます。
- その範囲に収まらない整数は、
Table::GetFVstr Field::Str メソッドを使用すると、10進数の文字列表現として取得できます。
|
メソッドの 変更 |
Database オブジェクト作成方法
var db = new ActiveXObject('transactd.Database');
keydef::segments[] へのアクセスをKeydef.Segments メソッドに変更。
tabledef::fieldDefs[] へのアクセスをTabledef.FieldDef メソッドに変更。
tabledef::keyDefs[] へのアクセスをTabledef.KeyDef メソッドに変更。
btrVersions クラスをTdVersion クラスに変更。
QueryBase オブジェクトの作成方法
var query = new ActiveXObject('transactd.query');
QueryBase::addLogic はQueryBase::Where 、QueryBase::And 、QueryBase::Or に置き換え。コード例:
query.Where("id", ">=", 1).And("id", "<", 3).Or("name", "=", "akio");
QueryBase::addField はQueryBase::Select に置き換え。1回で11個まで記述可能。
それ以上の場合は再度Select を呼ぶことで追加できる。コード例:
query.Select("id", "name", "email");
QueryBase::addSeekKeyValue はQueryBase::AddInValue に名前を変更。
QueryBase::In メソッドを追加。1回で11個まで記述可能。
それ以上の場合は再度In を呼ぶことで追加できる。コード例:
query.In(1, 2, 10, 23, 30, 40, 55);
GroupQuery::AddFunction メソッドのパラメータが異なる。
AddFunction(func, targetNames, resultName, recordsetQuery)
func
- 他の言語では関数のオブジェクトを渡すが、以下に挙げる関数の番号を指定する。
enum eGroupFunc
{
fsum = 0,
fcount = 1,
favg = 2,
fmin = 3,
fmax = 4,
ffirst = 5,
flast = 6
}eGroupFunc;
targetNames
- 計算の対象となるフィールドを指定した
FieldNames オブジェクトを指定する。
func がfcount の場合はnull を指定する。
resultName
- 計算結果を受け取る列名を指定する。省略した場合は
targetNames で指定された最初のフィールドの名前が使用される。
recordsetQuery
- 計算対象のレコードを限定する場合は、
RecordsetQuery オブジェクトをセットしwhen で条件を指定する。指定しない場合は省略可。
- 戻り値
GroupQuery オブジェクトのインスタンス。thisを返す。
canRecoverNetError 関数は非対応。以下のコードで同様な結果を得られます
function CanRecoverNetError(var code)
{
return (code >= ERROR_TD_CONNECTION_FAILURE) &&
(code < ERROR_TD_RECONNECTED) &&
(code != ERROR_TD_NET_TOO_BIGDATA);
}
|
未対応の 機能 |
table::insertBookmarks は非対応。
- btrDate.hとmyDateTime.hで定義される日付と時刻を数値で扱うクラス、関数は未対応
fielddefs::addAllFileds は非対応。
fielddefs::append は非対応。
fielddefs::addSelectedFields は非対応。
fielddefs::addAliasName は非対応。
fielddef::blobLenBytes は非対応。
fielddef::varLenBytes は非対応。
recordset::appendField(fielddef) は非対応。
|
PHP クライアント
PHP5系 PHP7系用のextensionを用意しています。
仕様と制限
PHPのクライアントはC++のAPIをラップした形になっており、以下の点を除いてC++のAPIと同じです。
C++ APIに対するPHPクライアントの相違点(2015/06/09) |
全般 |
- クラスは名前空間で修飾されない。
(例:bzs::db::protocol::tdap::client::database → database )
- クラスのメンバでない定数や関数は
transactd クラスに置かれる。
(例:bzs::db::protocol::tdap::btrttoa → transactd::btrttoa )
- バッファに結果をコピーして返す関数は、自動でバッファが用意されるため、そのパラメータは不要。同時にバッファの
長さを示すパラメータも不要。
(例:const _TCHAR* nstable::getDirURI(const _TCHAR *uri, const _TCHAR* retbuf) → $s = nstable::getDirURI($uri) )
|
終了処理 |
- メモリの解放はPHPのGCによって行われるため、明示的なメモリ解放処理は不要。
database::release およびnstable::release は存在しない。
- メモリ解放時にコネクションの切断も行われるが、明示的に切断処理を記述することを推奨する。
database.close およびtable.close を使用する。
$db->open(uri, 0, transactd::TD_OPEN_NORMAL); // open database
$tb = $db->openTable("user", transactd::TD_OPEN_NORMAL, true); // open table
/* ... some operations ... */
$tb->close(); // close table
$db->close(); // close database
|
文字コード |
- Windows上であってもマルチバイトに限定され、Unicodeは使用できない。
- マルチバイト文字列のエンコーディングにはUTF-8を使用する。
mb_internal_encoding('UTF-8');
- 使用可能な文字コードはSDKドキュメントの文字コードの項目を参照。
|
整数 |
- 符号付32bitの範囲に収まる整数は
table::getFVint field::i メソッドで取得できます。
- その範囲に収まらない整数は、
table::GetFVstr field::str メソッドを使用すると、10進数の文字列表現として取得できます。
|
メソッドの 変更 |
keydef::segments[] へのアクセスをkeydef::segment メソッドに変更。
tabledef::fieldDefs[] へのアクセスをtabledef::fieldDef メソッドに変更。
tabledef::keyDefs[] へのアクセスをtabledef::keyDef メソッドに変更。
btrVersions::versions[] へのアクセスをbtrVersions::version メソッドに変更。
btrTimeStamp::toString, btrdtoa, btrttoa, btrstoa のシグネチャを変更。
$nowdate = transactd::getNowDate();
// 引数の char* が削除され、文字列を返す。
$nowdate_str = transactd::btrdtoa($nowdate, true);
fielddefs クラスにArrayAccess, Countable, IteratorAggregate, Generator methodを実装。
Record クラスにArrayAccess, Countable, IteratorAggregate, Generator methodを実装。
Record クラスにオブジェクトからフィールドの値をセットするsetValueByObject を追加。
Recordset クラスにArrayAccess, Countable, IteratorAggregate, Generator methodを実装。
Recordset クラスとTable クラスにfetchMode を追加。詳細は
PHPとRubyにおける行取得の追加機能を参照。
Recordset クラスにgetRecord を追加。getRecord はfetchMode の値に関わらず
record オブジェクトを返します。
Table クラスにgetRow を追加。getRow はfields メソッドのエイリアスです。
Table クラスに、オブジェクトをパラメータにとりプライマリキーでCRUDを行うオペレーション
table::saveByObject table::updateByObject
table::insertByObject table::readByObject table::deleteByObject を追加。
Table クラスに、キーの値でレコードを移動するseekKeyValue($keyValues) メソッドを追加。このメソッドは以下の内容をエクステンション内で処理します。
function seekKeyValue($keyValues)
{
$tb->clearBuffer();
$i = 0;
foreach($keyValues as $value)
$tb->setFV(keyseg($i++), $value);
$tb->seek();
return $tb->stat();
}
|
未対応の 機能 |
onCopyData ,onDeleteRecord のコールバック関数機能は未対応(今後対応予定)
table::insertBookmarks は非対応。
fielddefs::addAllFileds は非対応。
fielddefs::append は非対応。
fielddefs::addSelectedFields は非対応。
fielddefs::addAliasName は非対応。
fielddef::blobLenBytes は非対応。
fielddef::varLenBytes は非対応。
nstable::stats は非対応。
table::optionalData は非対応。
table::setOptionalData は非対応。
database::optionalData は非対応。
database::setOptionalData は非対応。
connection::record::status は非対応。
tdap::getFilterLogicTypeCode は非対応。
|
PHPとRubyにおける行取得の追加機能
すべてのクライアントにおいて、recordset::record
およびtable::fields
メソッドを使用し、record
オブジェクトとして行を取得することができます。
PHPとRubyではさらに、配列・ハッシュ・標準オブジェクト・ユーザークラスの形式で取得可能です。
形式の指定
形式の指定はfetchMode
プロパティで行います。
fetchModeの値 | 内容 |
---|
FETCH_VAL_NUM = 1 | 配列(フィールド番号 => 値) |
FETCH_VAL_ASSOC = 2 | ハッシュ(フィールド名 => 値) |
FETCH_VAL_BOTH = 3 | フィールド番号のキーも含むハッシュ |
FETCH_OBJ = 4 | 標準オブジェクト(無名オブジェクト) |
FETCH_USR_CLASS = 8 | ユーザー定義クラス |
FETCH_RECORD_INTO = 16 | Transactdのrecord オブジェクト |
配列ではフィールド番号でフィールドの値にアクセスします。ハッシュではフィールド名のキーで値にアクセスします。
オブジェクトとユーザークラスでは、フィールド名と同名のパブリックプロパティで値にアクセスできます。
fetchMode
のデフォルトはFETCH_RECORD_INTO
です。
PHP 例
$tb->fetchMode = transactd::FETCH_OBJ;
$tb->seekFirst();
$obj = tb->fields(); // <--- 行の取り出し
$id = $obj->id;
Ruby 例
tb.fetchMode = Transactd::FETCH_OBJ
tb.seekFirst()
obj = tb.fields() # <--- 行の取り出し
id = obj.id
ユーザー定義クラスの指定
ユーザー定義クラスの場合は、fetchClass
でクラス名(RubyではClassオブジェクトでも可)を、
ctorArgs
でコンストラクタへの引数を指定します。
コンストラクタへの引数は不要であれば省略可能です。
PHP 例
$tb->fetchMode = transactd::FETCH_USR_CLASS;
$tb->fetchClass = 'User';
$tb->ctorArgs = $userName;
$tb->seekFirst();
$user = tb->fields(); // <--- 行の取り出し
$id = $user->id;
Ruby 例
tb.fetchMode = Transactd::FETCH_USR_CLASS
tb.fetchClass = User
tb.ctorArgs = userName
tb.seekFirst()
user = tb.fields() # <--- 行の取り出し
id = user.id
recordsetにおける全行取得
recordset
ではすべての行を指定したfetchMode
で取得し配列にして返す
toArray
もしくはto_a
を使用できます。
PHP 例
$rs->fetchMode = transactd::FETCH_USR_CLASS;
$rs->fetchClass = 'User';
$rs->ctorArgs = $userName;
$users = $rs->toArray();
$user = $users[0];
Ruby 例
rs.fetchMode = Transactd::FETCH_USR_CLASS
rs.fetchClass = User
rs.ctorArgs = userName
users = rs.to_a()
user = users[0]