Tatsu still writes something... Fourth season

これからも私はなにかをしてなにかを書く

Extensive Storage Engineを使うときの注意点

Windows UpdateMicrosoft Edgeのブックマーク等をいじるのに使うExtensive Storage Engineの使い方については、Extensible Storage Engine Referenceにリファレンスがあり、サンプルはESENT (Extensible Storage Engine) API in the Windows SDKにあるのだが、これだけでは既存のDBをいじれないので、わかるまでに時間がかかった注意点を覚え書きついでに書いておく。
既存のDBを開く場合、システムパラメータの以下の項目の設定が必要となる。

これらはJetSetSystemParameter関数を使って設定する必要があり、ページサイズはJetCreateInstanceを実行する前に、それ以外の項目はJetCreateInstanceを実行した後、JetInitを実行する前に設定する必要がある。

ページサイズ

ページサイズはJetGetDatabaseFileInfo関数を以下のように使って得た値を格納すると良い。
JetGetDatabaseFileInfo(ファイル名, &ページサイズ格納先, sizeof(unsigned long), JET_DbInfoPageSize)

トランザクションログファイル名のプリフィックス

トランザクションログファイル名のプリフィックスは3文字以下で指定する必要があることに注意が必要である。また、既存のトランザクションログファイルを使う際はプリフィックスを合わせる必要がある。

トランザクションログファイルの場所

トランザクションログファイルの場所とトランザクションファイルプリフィックスはデータベースごとに変える必要があり、場所とプリフィックスが重複すると後から開いた方でエラーとなる。

トランザクションログファイルのサイズ

既存のトランザクションログファイルを使う場合は1,024バイト単位でサイズを既存のファイルに合わせる必要がある。例えば、既存のトランザクションログファイルのサイズが524,288バイトの場合は512を指定する。

以下にJetInit関数を呼び出すまでの例を示す。


JetGetDatabaseFileInfo(dbfile, &pagesize, sizeof(unsigned long), JET_DbInfoPageSize);
JetSetSystemParameter(&instance, JET_sesidNil, JET_paramDatabasePageSize, pagesize, NULL);
JetCreateInstance(&instance, "instance");
JetSetSystemParameter(&instance, JET_sesidNil, JET_paramBaseName, 0, "edb");
JetSetSystemParameter(&instance, JET_sesidNil, JET_paramLogFileSize, 512, NULL);
JetSetSystemParameter(&instance, JET_sesidNil, JET_paramLogFilePath, 0, logdir);
JetSetSystemParameter(&instance, JET_sesidNil, JET_paramCircularLog, 1, NULL);
JetInit(&instance);

初期化ができれば、あとはC言語の知識で対応できる範囲なので、サンプルなどを見ながらのコーディングで対応できるのではないだろうか。