ORDA: Blob/ピクチャー属性へのパスの割り当て

従来のやり方では、SET EXTERNAL DATA PATHコマンドを使うことによって、ピクチャーや BLOB をデータファイルの外に置くことができました。このコマンドは ORDA に適応していないため、v20 R3 では同様の機能を追加することにしました: Blob およびピクチャー属性に、ファイルへの参照を割り当てる機能です。詳しく説明しましょう。

HDI: ピクチャー/Blob属性にファイル参照を代入する

まず最初に、このコードを見てみましょう:

$myRecord:=ds.MyTable.new()
$myRecord.image:="C:/FolderWithMyFiles/myImage"
$myRecord.binary:="C:/FolderWithMyFiles/myBinary"
$myRecord.save()

上の image属性と binary属性は、それぞれピクチャー属性および Blob属性です。実際のピクチャーや BLOB の代わりにファイルパスを割り当てることで、4D は指定されたパスのみをデータファイルに格納します。ピクチャーや BLOB を実際に使用するときだけ、4D はディスクからファイルを読み込み、適切なピクチャーや BLOB変数を作成します。この処理は完全に透過的におこなわれます。

メリットと注意事項

この方法にはいくつかの利点があります:
– データファイル内にバイナリファイルを保存しないため、データファイルをより小さく、より管理しやすくできます。
– ファイルを重複保存せずに、複数のレコードに同じファイルを使用できます。
– ファイルを好きなように整理し、4D以外のソフトウェアで使用することもできます。

しかし、注意点もあります:
– 4D はディスク上のファイルを必要とします。4D がいつでもアクセスできるようにしておかなければなりません。
– ピクチャーや Blob属性にパスを割り当てると、データベースストラクチャーの “格納場所” フィールドプロパティをバイパスします (“格納場所” プロパティは、ピクチャーや BLOB コンテンツの保存先 (データファイルか外部データファイル) を指定します)。

POSIXパスまたは 4D.File

上述のコードでは、属性に POSIXパスを割り当てています (POSIXパスのみ使用できます) が、下の例のように 4D.File を割り当てる方法もあります:

$file:=File("/PACKAGE/FolderWithMyFiles/myImage")
$myRecord:=ds.MyTable.new()
$myRecord.image:=$file
$myRecord.save()

このコードは 4D.File のパスを属性に割り当てます。

ディスク上のファイルを変更した場合は?

これは少々やっかいな問題です。4D は BLOB やピクチャーのコンテンツをキャッシュに保存するため、アプリケーションを再起動するまで、変更は反映されないかもしれません。もし、本当にランタイムでファイルを変更したいのであれば、1つのコツがあります: パスをもう一度属性に割り当てることです。新しい値を検出すると、4D はキャッシュを削除し、次にピクチャーや BLOB を使用するときに新しいファイルを取得します。
注記: Qodly やデータエクスプローラーなど、ピクチャーや BLOB にブラウザーからアクセスする場合は、ブラウザーのキャッシュも忘れずにクリアする必要があります。

ご質問がある場合はフォーラムをご利用ください

この新機能の使用方法については、ドキュメントをご覧ください。また、ご質問やご意見がありましたら、遠慮なくフォーラムまでお寄せください!

Nicolas Brachfogel
- プロダクトオーナー & シニアデベロッパー - Nicolas Brachfogelは、2017年にシニアデベロッパーとして4Dに入社しました(4D Serverとネットワークを担当)。Apple Siliconのリリースを管理するプロダクトオーナーとして、ユーザーストーリーを書いて機能仕様に落とし込み、機能実装が顧客のニーズを満たしているかを確認する役割を担っています。Institut Supérieur d'Informatique Appliquée (INSIA) を卒業した Nicolas は、2001年にソフトウェア開発者としてのキャリアをスタートさせました。JavaとC++で数年間コーディングした後、ゲーム会社のクライアント・サーバー開発を専門に担当。サーバー開発者/アーキテクトとして、多くのゲーム(Dofus Arena、Drakerz、Trivial Pursuit Go!)のサーバーアーキテクチャに携わり、成功を収めてきました。