|
ほとんどの場合、レコードの挿入と更新は簡単なプロセスです。つまり、Insert オペレーション(2)または Update オペレーション(3)を使用し、データ バッファーを使用してレコードを渡します。ここでは、挿入と更新に関連するいくつかの特別な場合について説明します。
MicroKernel は非常に信頼性のあるデータ管理エンジンですが、システム障害を防ぐことができません。クライアント/サーバー アプリケーションでシステム障害がよく起こるのは、ネットワーク障害が発生する可能性があるからです。以下の MicroKernel 機能を利用して、信頼性を高めることができます。
メモ
アクセラレイティド モードでファイルを開くと、そのファイルに対するトランザクション ログは実行されなくなります。つまり、アクセラレイティド モードで開かれたファイル上で行われたオペレーションはトランザクション一貫性がありません。
レコードを挿入する場合で、同じキー値が既に存在する可能性があり、それを重複させたくない場合は、次のいずれかの方法を実行します。
Insert オペレーションが単独で存在し、ファイル内の論理カレンシーに依存しない場合、各 Insert より前に Get Equal を実行すると、オーバーヘッドが増えます。しかし、挿入がグループになっている場合は、Get Equal オペレーションがキー位置を指すインデックス ページをメモリに取り込むことで、これ以降に行われる Insert オペレーションが促進されます。
可変長データ ファイルを設計する場合は、アプリケーションがサポートするレコードの可変長部分の最大サイズを決定する必要があります。固定長部分と可変長部分の最大サイズを合計したサイズを収容するレコード構造を設定する必要があります。可変長レコードの読み取り、挿入および更新を行うときは、この構造体をデータ バッファーとして使用します。
可変長レコードを挿入または更新する場合は、データ バッファー長パラメーターによって書き込むデータ量を MicroKernel に指示します。固定長部分のサイズに可変長部分の実際のデータ量を加えたサイズに、このパラメーターを設定します。データ バッファー長を、アプリケーションが可変長フィールドに対して許可する最大サイズに固定長を加えたサイズに設定しないでください。設定すると、MicroKernel は常に最大サイズを書き込みます。
たとえば、以下のレコードを挿入すると仮定します。
キー 0:Owner
30 バイト ZSTRING |
キー 1:Account
8 バイト INTEGER |
Balance(キーではない)
8 バイト |
Comments(キーではない)
1,000 バイト |
---|---|---|---|
John Q. Smith
|
263512477
|
1024.38
|
解説
|
以下に、Insert オペレーションの例を示します。ここで、データ バッファー長は固定長部分に Comments フィールド内のデータ量(8 バイト)を加えた長さとして計算されることに注意してください。加えるのは、Comments フィールドの最大サイズ(1,000 バイト)ではありません。
#define MAX_COMMENT 1000 /* コメントの最大サイズ */ typedef struct { char owner[30]; int number; int balance; } FixedData; typedef struct { FixedData fix; char variable[MAX_COMMENT]; } DataBuffer; DataBuffer account; BTI_ULONG dataBufLen; BTI_SINT status; strcpy(account.fix.owner, "John Q. Smith"); account.fix.number = 263512477; account.fix.balance = 102438; strcpy (account.variable, “Comments”); dataBufLen = sizeof(FixedData) + strlen(account.variable) +1; /* +1 はデータの後にヌル文字用 */ status = BTRV(B_INSERT, PosBlock, &account, &dataBufLen, keyBuffer, 0);
データ バッファー サイズを固定長に設定することによって、レコードの固定長部分だけを読み取ることができます。MicroKernel は、固定長部分とステータス コード 22 だけを読み取りますが、そのとき Update オペレーションを使用し、固定長部分だけを渡すと、可変長部分は失われます。その代わり、Update Chunk オペレーション(53)を使用すると、バイト オフセットと長さに基づいてレコードの一部が更新されます。バイト オフセットを 0 に設定し、その長さを固定長部分の長さに設定します。このオペレーションは固定長部分を更新し、可変長部分を残します。
変更不可と定義されているキー値を更新しようとすると、MicroKernel はステータス コード 10 を返します。いずれにしてもキー値を変更する場合は、まずレコードを Delete(4)し、次にレコードを Insert(2)する必要があります。
キー番号パラメーターに -1(0xFF)を渡すことによって、No-Currency-Change(NCC)オペレーションと呼ぶ、標準の Insert または Update のバリエーションを実行することができます。NCC オペレーションは、アプリケーションが Get Next オペレーション(6)などの別のオペレーションを実行するために元の論理位置をファイルに保存しておく必要がある場合に有効です。
NCC Insert オペレーションを使用せずに同じ効果を実現するには、以下の手順を実行する必要があります。
NCC Insert オペレーションは論理カレンシーで標準の Insert と同じ効果がありますが、物理カレンシーでは別の効果があります。たとえば、これら 2 つの手順のいずれかに続けて Get Next(6)オペレーションを実行した場合は、どちらの手順でも結果は変わりませんが、Step Next(24)を実行した場合は、異なるレコードが返される可能性があります。
NCC Update オペレーションを使用せずにオリジナルの位置を保つには、以下の手順を実行する必要があります。
|