全て クラス 名前空間 関数 変数 型定義 列挙型 列挙値 ページ
Version3 リリースノート

Version3 リリースノート

フィールドのNULL対応

NULLを許可するフィールドの扱いは完全にSQLコマンドのそれと同じになりました。 NULLの扱いと言ってもさまざまな点がありますので詳しく説明します。

項目内容
NULL可否テーブル作成時にフィールドのNULL可否の指定
デフォルトNULLNULLを許可するフィールドのデフォルト値としてのNULL指定
スキーマテーブル自動生成スキーマテーブル自動生成時にNULLの可否とデフォルト値の反映
NULLの指定と読取NULLを許可するフィールドの値としてNULLを読み書きする
NULLの演算レコードのフィルタリングまたはソート時にNULLとそのほかの値の比較

これらについて、2.xと3.0でそれぞれ対応内容をまとめます。

Transactd 2.xまでと3.0での扱い方の違い

内容2.x3.0
NULL可否NULL可を指定できないNULL可否を指定できる
デフォルトNULLデフォルト値を指定できないNULLを含めたデフォルト値を指定できる
スキーマテーブル自動生成NULLの可否をおよびデフォルト値を反映しないNULLの可否をおよびデフォルト値を反映する
NULLの指定と読取読み取りでNULLはゼロまたは""(空文字)として返す。
書き込みでNULLを許可する場合、ゼロまたは""(空文字)はNULLとして保存
NULLの指定と読取ができる
NULLの演算N/ANULL同士またはNULLと値を比較できる

Transactd 2.xでは、NULLをゼロまたは""(空文字)として扱うものとして、NULLという概念を導入していませんでした。 これはTransactdだけですべての処理を行う場合とてもシンプルで判りやすいものです。 しかしながら、すでにSQLで作成されたNULLを含んだテーブルでNULLをゼロまたは空文字と区別して扱う場合は都合が悪いものでした。 (NULLをゼロまたは空文字と区別して扱っていない場合は問題なく処理できます)
Transactd 3.0では、NULLをゼロまたは空文字と区別して扱えるよう完全にNULLをサポートします。 また、従来のようにシンプルに扱える2.x互換モードもサポートします。

NULLモードの切り替え

NULLを完全に扱うモードと従来のモードを database::setCompatibleMode(int) で切り替えることができます。 CMP_MODE_MYSQL_NULL = 1 がデフォルトでNULLを完全に扱うモードです。 CMP_MODE_OLD_NULL = 0 を指定すると 2.x互換のモードで動作します。

Transactd 3.0で従来の2.xと同じように動作させたい場合は、プログラムの先頭で、 database::setCompatibleMode(CMP_MODE_OLD_NULL)と指定してください。

注釈
2.x互換モードで、フィールドの値にNULLが保存されていた場合はゼロまたは空文字として読み取られます。 また、NULLを許可するフィールドにゼロまたは空文字を指定するとフィールドの値はNULLが保存されます。

NULL値の設定と取得

table クラスと field クラスにNULLの設定と読み取りメソッドが追加されました。

tablefield
setsetFVNull(short index, bool value) setNull(bool value)
getgetFVNull(short index) isNull()

NULLが設定されたフィールドに、 table::setFV()field::operator=() 関数などで数値や文字列の値をセットすると自動で非NULLに設定されます。 また、それらの関数に各言語のnullまたはNULLポインターを渡すことでsetNull(true)と同じ処理をすることもできます。

フィールドの値の比較

フィールドがNULLかどうかの比較は、比較演算子に "<==>" と "<!=>"が使用できます。最初の"<==>"はNULLにマッチし、"<!=>"は非NULLにマッチ します。比較演算子に値の意味も含むため値は無視されます。
具体的にはwhere("name", "<==>", "") のように使用します。また、NULL専用の比較メソッド whereIsNull("name") も追加されました。このメソッドは先ほどの where() と全く同じ意味になります。

フィールドの値とNULLの比較方法

内容専用関数で記述汎用関数で記述<
NULLにマッチwhereIsNull("name")
andIsNull("name")
orIsNull("name")
where("name", "<==>", "")
and_("name", "<==>", "")
or_("name", "<==>", "")
非NULLにマッチwhereIsNotNull("name")
andIsNotNull("name")
orIsNotNull("name")
where("name", "<!=>", "")
and_("name", "<!=>", "")
or_("name", "<!=>", "")
注釈
recordsetQueryの場合は whereの代わりにwhenで始まる名前になります。

フィールドのデフォルト値に対応

Transactd APIによるテーブルの作成でデフォルト値が指定できるようになりました。TIMESTAMPのDEFAULT CURRENT_TIMESTAMPなどの指定も可能です。 指定方法は fielddef::setDefaultValue() を参照してください。
また、 table::clearBuffer() を呼び出すと、デフォルト値が設定されたフィールドの値はその値で初期化されます。DEFAULT NULLの場合はNULL値になります。

注釈
database::setCompatibleMode() によるモードに CMP_MODE_OLD_NULL を指定した場合は、table::clearBuffer() はデフォルト値ではなく従来と同じ、バイナリーゼロですべて埋められます。

スキーマテーブル自動生成もNULLとデフォルト値に対応

スキーマテーブルを自動生成する際もNULLの可否とデフォルト値を正しく読み取ってtransactd用のスキーマテーブルに保存します。
ほとんどの場合、従来のアプリケーションもこれで問題なく動作しますが、インデックスフィールドにNULLを許可するフィールドがある場合は、それを通常のキーとするか、NULLにはアクセスしないNULLキーとするか指定が必要です。
指定は、スキーマテーブルを自動生成する前に、 database::setAutoSchemaUseNullkey(bool ) で行います。trueを指定すると、インデックスフィールドにNULLを許可するフィールドがある場合は、そのキーをNULLキーとマークします。
何も設定しない場合、デフォルトでfalseです。

注釈
NULLキーは、P.SQLとの互換性のためにあります。

スキーマテーブルを不要に

Transactdクライアントに、スキーマ情報は必須ですがそれをテーブルとして保存が必須ではなくなりました。
スキーマテーブル使用しない場合は、 database::open() のuri でスキーマテーブルの指定を省略できます。 また、テーブルのオープンは必ず名前を指定して行います。正しく オープンできると、サーバー側でダイナミックにスキーマ情報生成 しクライアントに転送します。
NULLの対応と併せてSQL文主体によるアプリケーションで、部分的にTransactdを使用するのがとても手軽になりました。
また、テーブル構造の変更などがあった場合も、スキーマテーブルを実態に同期させる必要がないため運用も簡単です。

注釈
転送されたスキーマ情報は、 database クラスのインスタンス単位でキャッシュされます。一度開いたテーブルは2回目以降 databaseを閉じるまで再利用され、スキーマ情報は再送されません。これにより、ダイナミック生成と転送のオーバーヘッドを削減します。
database::setCompatibleMode() によるモードに CMP_MODE_OLD_NULL を指定した場合は、スキーマテーブルの指定が必要です。 省略すると、STATUS_INVALID_NULLMODE エラーが返ります。

Transactd 2.xと3.0の混在運用

Transactd 2.4 と3.0はプラグイン、クライアントのバージョンが異なっても正しく動作します。 ただし、どちらか一方が2.4の場合、3.0の新機能は利用できません。
また、クライアントが3.0で、プラグインが2.4の場合は、database::setCompatibleMode(CMP_MODE_OLD_NULL)を必ず 指定しなければなりません。指定しなかった場合は、 database::openTable() でSTATUS_INVALID_NULLMODEエラーが返ります。

その他の変更点

Transactd SDK 2018年07月31日(火) 19時40分24秒 doxygen