メインコンテンツまでスキップ
バージョン: 20

DataStore

データストア とは、ORDA によって提供されるインターフェースオブジェクトです。データストアはデータベースへの参照とアクセスを提供します。 Datastore オブジェクトは以下のコマンドによって返されます:

  • ds: メインデータストアへのショートカット
  • Open datastore: リモートデータストアを開きます

概要

.cancelTransaction()    トランザクションをキャンセルします
.clearAllRemoteContexts()    データストアのすべてのアクティブコンテキストの全属性をクリアします
.dataclassName : 4D.DataClass    データクラスの詳細が格納されています
.encryptionStatus(): Object    カレントデータファイルの暗号化状態を示すオブジェクトを返します
.flushAndLock()    ローカルデータストアのキャッシュをフラッシュし、データベースに対して他のプロセスが書き込み操作をおこなうのを防ぎます
.getAllRemoteContexts() : Collection    データストア内のすべてのアクティブな最適化コンテキストに関する情報を格納するオブジェクトのコレクションを返します
.getInfo(): Object    データストアの情報を提供するオブジェクトを返します
.getRemoteContextInfo(contextName : Text) : Object      contextName で指定したデータストアの最適化コンテキストに関する情報を格納するオブジェクトを返します
.getRequestLog() : Collection    クライアント側のメモリに記録されている ORDAリクエストを返します
.locked() : Boolean    ローカルデータストアが現在ロックされている場合、true を返します
.makeSelectionsAlterable()    カレントアプリケーションのデータストアにおいて、すべての新規エンティティセレクションをデフォルトで追加可能に設定します
.provideDataKey( curPassPhrase : Text ) : Object
.provideDataKey( curDataKey : Object ) : Object
    データストアのカレントデータファイルのデータ暗号化キーを受け取り、暗号化されたデータと合致するかどうかチェックします
.setAdminProtection( status : Boolean )    WebAdminセッションにおける データエクスプローラー 含め、Web管理ポート上でのデータアクセスを無効に設定することができます
.setRemoteContextInfo( contextName : Text ; dataClassName : Text ; attributes : Text {; contextType : Text { ; pageLength : Integer}})
.setRemoteContextInfo( contextName : Text ; dataClassName : Text; attributesColl : Collection {; contextType : Text { ; pageLength : Integer }} )
.setRemoteContextInfo( contextName : Text ; dataClassObject : 4D.DataClass ; attributes : Text {; contextType : Text { ; pageLength : Integer }})
.setRemoteContextInfo( contextName : Text ; dataClassObject : 4D.DataClass ; attributesColl : Collection {; contextType : Text { ; pageLength : Integer }} )
    指定したデータクラス属性を contextName の最適化コンテキストにリンクします
.startRequestLog()
.startRequestLog( file : 4D.File )
.startRequestLog( file : 4D.File ; options : Integer )
.startRequestLog( reqNum : Integer )
    クライアント側またはサーバー側で ORDAリクエストのログを開始します
.startTransaction()    対象データストアに対応するデータベース上で、カレントプロセス内のトランザクションを開始します
.stopRequestLog()     クライアント側またはサーバー側の ORDAリクエストのログをすべて停止します
.unlock()    データストアにおける、書き込み操作に対する現在のロックが同じプロセスで設定されていた場合、そのロックを解除します
.validateTransaction()     トランザクションを受け入れます

ds

履歴
リリース内容
18localID パラメーターをサポート
17追加

ds { ( localID : Text ) } : cs.DataStore

引数説明
localIDText->参照を取得したいリモートデータストアのローカルID
戻り値cs.DataStore<-データストア参照

|

説明

ds コマンドは、 カレントの 4Dデータベース、または localID で指定したデータベースに合致するデータストアの参照を返します.

localID を省略した (または空の文字列 "" を渡した) 場合には、ローカル4Dデータベース (4D Server でリモートデータベースを開いている場合にはそのデータベース) に合致するデータストアの参照を返します。 データストアは自動的に開かれ、ds を介して直接利用することができます。

開かれているリモートデータストアのローカルIDを localID パラメーターに渡すと、その参照を取得できます。 このデータストアは、あらかじめカレントデータベース (ホストまたはコンポーネント) によって Open datastore コマンドで開かれている必要があります。 このコマンドを使用したときにローカルIDが定義されます。

ローカルIDのスコープは、当該データストアを開いたデータベースです。

localID に合致するデータストアが見つからない場合、コマンドは Null を返します。

cs.Datastore が提供するオブジェクトは、ORDAマッピングルール に基づいて、ターゲットデータベースからマッピングされます。

例題 1

4Dデータベースのメインデータストアを使用します:

 $result:=ds.Employee.query("firstName = :1";"S@")

例題 2

 var $connectTo; $firstFrench; $firstForeign : Object

var $frenchStudents; $foreignStudents : cs.DataStore

$connectTo:=New object("type";"4D Server";"hostname";"192.168.18.11:8044")
$frenchStudents:=Open datastore($connectTo;"french")

$connectTo.hostname:="192.168.18.11:8050"
$foreignStudents:=Open datastore($connectTo;"foreign")
//...
//...
$firstFrench:=getFirst("french";"Students")
$firstForeign:=getFirst("foreign";"Students")
  // getFirst メソッド
// getFirst(localID;dataclass) -> entity
#DECLARE( $localId : Text; $dataClassName : Text ) -> $entity : 4D.Entity

$0:=ds($localId)[$dataClassName].all().first()

Open datastore

履歴
リリース内容
20.3新しい passwordAlgorithm プロパティ
18追加

Open datastore( connectionInfo : Object ; localID : Text ) : cs.DataStore

引数説明
connectionInfoObject->リモートデータストアへの接続に使用する接続プロパティ
localIDText->ローカルアプリケーション内で、開かれたデータストアに対して割り当てる ID (必須)
戻り値cs.DataStore<-データストアオブジェクト

|

説明

Open datastore コマンドは、 connectionInfo 引数が指定する 4Dデータベースにアプリケーションを接続します 。戻り値は、localID ローカルエイリアスに紐づけられた cs.DataStore オブジェクトです。

connectionInfo で指定する 4Dデータベースはリモートデーターストアとして利用可能でなければなりません。つまり、以下の条件を満たしている必要があります:

  • データベースの Webサーバーは、http または https が有効化された状態で開始されていなければなりません。
  • データベースの REST サーバーとして公開 オプションがチェックされている必要があります。
  • データベースにおいて、少なくとも 1つのクライアントライセンスが利用可能でなければなりません。

合致するデータベースが見つからない場合、Open datastoreNull を返します。

localID 引数は、リモートデータストア上で開かれるセッションのローカルエイリアスです。 localID 引数の ID がすでにアプリケーションに存在している場合、その ID が使用されています。 そうでない場合、データストアオブジェクトが使用されたときに localID のセッションが新規に作成されます。

cs.Datastore が提供するオブジェクトは、ORDAマッピングルール に基づいて、ターゲットデータベースからマッピングされます。

一旦セッションが開かれると、以下の 2行の宣言は同等のものとなり、同じデータストアオブジェクトへの参照を返します:

 $myds:=Open datastore(connectionInfo;"myLocalId")
$myds2:=ds("myLocalId")
//$myds と $myds2 は同一のものです

connectionInfo には、接続したいリモートデータストアの詳細を格納したオブジェクトを渡します。 オブジェクトは以下のプロパティを格納することができます (hostname を除き、すべてのプロパティは任意です):

プロパティ説明
hostnameTextリモートデータストアの名前または IPアドレス + ":" + ポート番号 (ポート番号は必須)
userTextユーザー名
passwordTextユーザーパスワード。 デフォルトでは、パスワードは平文で送信されるため、tls プロパティに true を渡して暗号化通信を使用することが強く推奨されます。
idleTimeoutLongintアクティビティがなかった場合に、セッションがタイムアウトするまでの時間 (分単位)。この時間を過ぎると、4D によって自動的にセッションが閉じられます。 省略時のデフォルトは 60 (1時間) です。 60 (分) 未満の値を指定することはできません (60 未満の値を渡した場合、タイムアウトは 60 (分) に設定されます)。 詳細については、セッションの終了 を参照ください。
tlsBoolean安全な接続を使用します(*)。 省略時のデフォルトは false です。 可能なかぎり安全な接続を使用することが推奨されます。
passwordAlgorithmTextValidate password コマンドで digest パラメーターを true に設定してサーバーがパスワードを検証する場合は、"4d-rest-digest" を指定します。
typeText"4D Server" でなければなりません

(*) tls が true だった場合、以下の条件が満たされていれば、HTTPSプロトコルが使用されます:

  • リモートデータストアで HTTPS が有効化されている。
  • 指定されたポート番号は、データベース設定で設定されている HTTPS ポートと合致している。
  • データベースに有効な証明書と非公開暗号鍵がインストールされている。 条件を満たさない場合、エラー "1610 - ホスト xxx へのリモートリクエストに失敗しました" が生成されます。

例題 1

user / password を指定せずにリモートデータストアに接続します:

 var $connectTo : Object
var $remoteDS : cs.DataStore
$connectTo:=New object("type";"4D Server";"hostname";"192.168.18.11:8044")
$remoteDS:=Open datastore($connectTo;"students")
ALERT("このリモートデータストアには "+String($remoteDS.Students.all().length)+" 名の生徒が登録されています")

例題 2

user / password / timeout / tls を指定してリモートデータストアに接続します:

 var $connectTo : Object
var $remoteDS : cs.DataStore
$connectTo:=New object("type";"4D Server";"hostname";\"192.168.18.11:4443";\
"user";"marie";"password";$pwd;"idleTimeout";70;"tls";True)
$remoteDS:=Open datastore($connectTo;"students")
ALERT("このリモートデータストアには "+String($remoteDS.Students.all().length)+" 名の生徒が登録されています")

例題 3

複数のリモートデータストアと接続します:

 var $connectTo : Object
var $frenchStudents; $foreignStudents : cs.DataStore
$connectTo:=New object("hostname";"192.168.18.11:8044")
$frenchStudents:=Open datastore($connectTo;"french")
$connectTo.hostname:="192.168.18.11:8050"
$foreignStudents:=Open datastore($connectTo;"foreign")
ALERT("フランスの生徒は "+String($frenchStudents.Students.all().length)+" 名です")
ALERT("外国の生徒は "+String($foreignStudents.Students.all().length)+" 名です")

エラー管理

エラーが起きた場合、コマンドは Null を返します。 リモートデータベースにアクセスできなかった場合 (アドレス違い、Webサーバーが開始されていない、http/https が有効化されていない、等)、エラー1610 "ホスト XXX へのリモートリクエストに失敗しました" が生成されます。 このエラーは ON ERR CALL で実装されたメソッドで割り込み可能です。

.dataclassName

履歴
リリース内容
17追加

.dataclassName : 4D.DataClass

説明

データストアの各データクラスは DataStore オブジェクト のプロパティとして利用可能です。 戻り値のオブジェクトには、 データクラスの詳細が格納されています.

例題

 var $emp : cs.Employee
var $sel : cs.EmployeeSelection
$emp:=ds.Employee //$emp は Employeeデータクラスを格納します
$sel:=$emp.all() // 全従業員のエンティティセレクションを取得します

// あるいは以下のように直接書くことも可能です:
$sel:=ds.Employee.all()

.cancelTransaction()

履歴
リリース内容
18追加

.cancelTransaction()

| 引数 | 型 | | 説明 | | -- | - |::| -------------------------------------------- | | | | | このコマンドは引数を必要としません|

|

説明

.cancelTransaction() 関数は、 トランザクションをキャンセルします 。このトランザクションは、指定データストアのカレントプロセスにおいて、.startTransaction() によって開かれたものです。

.cancelTransaction() 関数は、トランザクション中におこなわれたデータ変更をすべてキャンセルします。

複数のトランザクションをネストすること (サブトランザクション) が可能です。 メイントランザクションがキャンセルされると、サブトランザクションも (たとえ個々に.validateTransaction() 関数で承認されていても) すべてキャンセルされます。

例題

.startTransaction() 関数の例題を参照ください。

.clearAllRemoteContexts()

履歴
リリース内容
19 R5追加

.clearAllRemoteContexts()

| 引数 | 型 | | 説明 | | -- | - |::| -------------------------------------------- | | | | | このコマンドは引数を必要としません|

|

説明

.clearAllRemoteContexts() 関数は、 データストアのすべてのアクティブコンテキストの全属性をクリアします.

この機能は主にデバッグで使用されます。 注意しなければならないのは、デバッガーを開くと、デバッガーはサーバーにリクエストを送り、データクラス属性をすべてクエリして表示することです。 このため、不要なデータでコンテキストが過負荷になることがあります。

そのような場合は、.clearAllRemoteContexts() を使用してコンテキストをクリアし、クリーンな状態を保つことができます。

参照

.getRemoteContextInfo()
.getAllRemoteContexts()
.setRemoteContextInfo()

.encryptionStatus()

履歴
リリース内容
17 R5追加

.encryptionStatus(): Object

引数説明
戻り値Object<-カレントデータストアと、各テーブルの暗号化についての情報

|

説明

.encryptionStatus() 関数は、 カレントデータファイルの暗号化状態を示すオブジェクトを返します 。カレントデータファイルとはつまり、ds データストアのデータファイルです。 各テーブルの状態も提供されます。

その他のデータファイルの暗号化状態を調べるには、Data file encryption status コマンドを使います。

戻り値

戻り値のオブジェクトには、以下のプロパティが格納されています:

プロパティ説明
isEncryptedBooleanデータファイルが暗号化されていれば true
keyProvidedBoolean暗号化されたデータファイルに合致する暗号化キーが提供されていれば true (*)
テーブルObject暗号化可能および暗号化されたテーブルと同じ数のプロパティを持つオブジェクト
tableNameObject暗号化可能または暗号化されたテーブル
nameTextテーブル名
numNumberテーブル番号
isEncryptableBooleanストラクチャーファイルにおいて、テーブルが暗号化可能と宣言されていれば true
isEncryptedBooleanデータファイルにおいて、テーブルのレコードが暗号化されていれば true

(*) 暗号化キーは、以下の手段のいずれかで提供されます:

  • .provideDataKey() コマンド
  • データストアを開く前に接続されていたデバイスのルート
  • Discover data key コマンド

例題

カレントデータファイル内で暗号化されているテーブルの数を知りたい場合:

 var $status : Object

$status:=ds.encryptionStatus()

If($status.isEncrypted) // データベースが暗号化されていれば
C_LONGINT($vcount)
C_TEXT($tabName)
For each($tabName;$status.tables)
If($status.tables[$tabName].isEncrypted)
$vcount:=$vcount+1
End if
End for each
ALERT("データベースには "+String($vcount)+" 件の暗号化されたテーブルが存在しています。")
Else
ALERT("このデータベースは暗号化されていません。")
End if

.flushAndLock()

履歴
リリース内容
20追加

.flushAndLock()

| 引数 | 型 | | 説明 | | -- | - | | -------------------------------------------- | | | | | このコマンドは引数を必要としません|

|

説明

.flushAndLock() 関数は、 ローカルデータストアのキャッシュをフラッシュし、データベースに対して他のプロセスが書き込み操作をおこなうのを防ぎます. これにより、データストアは凍結状態におかれます。 この関数は、たとえばアプリケーションのスナップショットを実行する前に呼び出す必要があります。

info

この関数は次の場合にのみ使えます:

  • ローカルデータストア (ds) を対象に。
  • クライアント/サーバー環境では、サーバーマシン上にて。

この関数が実行されると、他のすべてのプロセスで .save() などの書き込み操作や、追加の .flushAndLock() の呼び出しが凍結され、データストアのロックが解除されるまで続きます。

同一プロセス内で .flushAndLock() を複数回呼び出した場合、データストアのロックを解除するには、同じ回数だけ .unlock() を呼び出す必要があります。

データストアのロックが解除されるのは、以下の場合です:

  • 同プロセス内で .unlock() 関数が呼び出された場合、または
  • .flushAndLock() 関数を呼び出したプロセスが終了した場合。

データストアがすでに他のプロセスからロックされている場合、.flushAndLock() の呼び出しは凍結され、データストアのロックが解除されたときに実行されます。

.flushAndLock() 関数が実行できない場合 (リモートの 4D で実行された場合など) には、エラーが発生します。

caution

バックアップVSSMSC を含む他の 4D機能およびサービスもデータストアをロックすることがあります。 予期せぬ相互作用を避けるため、.flushAndLock() を呼び出す前に、データストアをロックするような他の操作がおこなわれていないことを確認してください。

例題

データフォルダーとともにカレントジャーナルファイルのコピーを作成します:

$destination:=Folder(fk documents folder).folder("Archive")
$destination.create()

ds.flushAndLock() // 他のプロセスからの書き込み操作をブロックします

$dataFolder:=Folder(fk data folder)
$dataFolder.copyTo($destination) // データフォルダーをコピーします

$oldJournalPath:=New log file // ジャーナルを閉じて、新しいものを作成します
$oldJournal:=File($oldJournalPath; fk platform path)
$oldJournal.moveTo($destination) // 閉じたジャーナルを保存します

ds.unlock() // コピー操作をおこなったので、データストアのロックを解除します

参照

.locked()
.unlock()

.getAllRemoteContexts()

履歴
リリース内容
19 R5追加

.getAllRemoteContexts() : Collection

引数説明
戻り値Collection<-最適化コンテキストオブジェクトのコレクション

|

上級者向け: この機能は、特定の構成のため、ORDAのデフォルト機能をカスタマイズする必要がある開発者向けです。 ほとんどの場合、使用する必要はないでしょう。

説明

.getAllRemoteContexts() 関数は、 データストア内のすべてのアクティブな最適化コンテキストに関する情報を格納するオブジェクトのコレクションを返します.

コンテキストの作成に関する詳細については、クライアント/サーバーの最適化 を参照ください。

返されたコレクション内の各オブジェクトは、.getRemoteContextInfo() セクションに記載されているプロパティを持ちます。

例題

次のコードは 2つのコンテキストを設定し、.getAllRemoteContexts() を使用してそれらを取得します:

var $ds : 4D.DataStoreImplementation
var $persons : cs.PersonsSelection
var $addresses : cs.AddressSelection
var $p : cs.PersonsEntity
var $a : cs.AddressEntity
var $contextA; $contextB : Object
var $info : Collection
var $text : Text

// リモートデータストアを開きます
$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")

// コンテキストA を設定します
$contextA:=New object("context"; "contextA")
$persons:=$ds.Persons.all($contextA)
$text:=""
For each ($p; $persons)
$text:=$p.firstname+" lives in "+$p.address.city+" / "
End for each

// コンテキストB を設定します
$contextB:=New object("context"; "contextB")
$addresses:=$ds.Address.all($contextB)
$text:=""
For each ($a; $addresses)
$text:=$a.zipCode
End for each

// すべてのリモートコンテキストを取得します (contextA と contextB)
$info:=$ds.getAllRemoteContexts()
//$info = [{name:"contextB"; dataclass:"Address"; main:"zipCode"},
{name:"contextA";dataclass:"Persons";main:"firstname,address.city"}]

この例はデモンストレーションであり、実際の実装を想定したものではありません。

参照

.getRemoteContextInfo()
.setRemoteContextInfo()
.clearAllRemoteContexts()

.getInfo()

履歴
リリース内容
17追加

.getInfo(): Object

引数説明
戻り値Object<-データストアのプロパティ

|

説明

.getInfo() 関数は、 データストアの情報を提供するオブジェクトを返します. このメソッドは汎用的なコードを書くのに有用です。

返されるオブジェクト

プロパティ説明
typestring
  • "4D": ds で利用可能なメインデータストア
  • "4D Server": Open datastore で開かれたリモートデータストア
  • networkedboolean
  • true: ネットワーク接続を介してアクセスされたデータストア
  • false: ネットワーク接続を介さずにアクセスしているデータストア (ローカルデータベース)
  • localIDtextマシン上のデータストアID。 これは、Open datastore コマンドで返される localId 文字列です。 メインデータストアの場合は空の文字列 ("") です。
    connectionobjectリモートデータストア接続の情報を格納したオブジェクト (メインデータストアの場合は返されません)。 次のプロパティを含みます:
    プロパティ説明
    hostnametextリモートデータストアの IPアドレスまたは名称 + ":" + ポート番号
    tlsbooleanリモートデータストアとセキュア接続を利用している場合は true
    idleTimeoutnumberセッション非アクティブタイムアウト (分単位)。
    usertextリモートデータストアにて認証されたユーザー
    • .getInfo() 関数が、4D Server またはシングルユーザー版 4D 上で実行された場合、networked は false となります。
    • .getInfo() 関数が、リモート版 4D 上で実行された場合、networked は true となります。

    例題 1

     var $info : Object

    $info:=ds.getInfo() // 4D Server または 4D 上で実行した場合
    //{"type":"4D","networked":false,"localID":""}

    $info:=ds.getInfo() // リモート版4D 上で実行した場合
    //{"type":"4D","networked":true,"localID":""}

    例題 2

    リモートデータストアの場合:

      var $remoteDS : cs.DataStore
    var $info; $connectTo : Object

    $connectTo:=New object("hostname";"111.222.33.44:8044";"user";"marie";"password";"aaaa")
    $remoteDS:=Open datastore($connectTo;"students")
    $info:=$remoteDS.getInfo()

    //{"type":"4D Server",
    //"localID":"students",
    //"networked":true,
    //"connection":{hostname:"111.222.33.44:8044","tls":false,"idleTimeout":2880,"user":"marie"}}

    .getRemoteContextInfo()

    履歴
    リリース内容
    19 R5追加

    .getRemoteContextInfo(contextName : Text) : Object

    引数説明
    contextNameText->コンテキストの名称
    戻り値Object<-最適化コンテキストの詳細

    |

    上級者向け: この機能は、特定の構成のため、ORDAのデフォルト機能をカスタマイズする必要がある開発者向けです。 ほとんどの場合、使用する必要はないでしょう。

    説明

    .getRemoteContextInfo() 関数は、 contextName で指定したデータストアの最適化コンテキストに関する情報を格納するオブジェクトを返します.

    最適化コンテキストの作成に関する詳細については、クライアント/サーバーの最適化 を参照ください。

    返されるオブジェクト

    戻り値のオブジェクトには、以下のプロパティが格納されています:

    プロパティ説明
    nameTextコンテキストの名称
    mainTextコンテキストに関連する属性 (複数の場合はカンマ区切り)
    dataclassTextデータクラスの名称
    currentItem (任意)Textコンテキストがリストボックスとリンクしている場合の ページモード の属性。 コンテキスト名がリストボックスに使用されていない場合、または currentItem に対応するコンテキストが存在しない場合は、Null または空のテキスト要素として返されます。

    コンテキストは属性に対するフィルターとして動作するため、main が空で返された場合、それはフィルターが適用されておらず、サーバーがすべてのデータクラス属性を返すことを意味します。

    例題

    .setRemoteContextInfo() の例題を参照ください。

    参照

    .setRemoteContextInfo()
    .getAllRemoteContexts()
    .clearAllRemoteContexts()

    .getRequestLog()

    履歴
    リリース内容
    17 R6追加

    .getRequestLog() : Collection

    引数説明
    戻り値Collection<-オブジェクトのコレクション (要素毎に一つのリクエストを記述します)

    |

    説明

    .getRequestLog() 関数は、 クライアント側のメモリに記録されている ORDAリクエストを返します. ORDAリクエストのログが、.startRequestLog() 関数によって事前に有効化されている必要があります。

    このメソッドはリモートの 4D で呼び出す必要があり、そうでない場合には空のコレクションを返します。 これはクライアント/サーバー環境でのデバッグを想定して設計されています。

    戻り値

    スタックされたリクエストオブジェクトのコレクションが返されます。 直近のリクエストにはインデックス 0 が振られています。

    ORDAリクエストログのフォーマットの詳細は、ORDAクライアントリクエスト の章を参照ください。

    例題

    .startRequestLog() の例題2を参照ください。

    .isAdminProtected()

    履歴
    リリース内容
    18 R6追加

    .isAdminProtected() : Boolean

    引数説明
    戻り値Boolean<-データエクスプローラーへのアクセスが無効に設定されている場合は true、有効の場合は false (デフォルト)

    |

    説明

    .isAdminProtected() 関数は、 現在のセッションにおいて データエクスプローラー へのアクセスが無効に設定されているの場合は trueを返します.

    webAdminセッションにおいて、データエクスプローラーへのアクセスはデフォルトで有効となっていますが、管理者によるデータアクセスを禁止するため無効にすることもできます (.setAdminProtection() 関数参照)。

    参照

    .setAdminProtection()

    .locked()

    履歴
    リリース内容
    20追加

    .locked() : Boolean

    引数説明
    戻り値Boolean<-ロックされている場合は true

    |

    説明

    .locked() 関数は、 ローカルデータストアが現在ロックされている場合、true を返します.

    データファイルのスナップショットを実行する前などに、.flushAndLock() 関数を使用してデータストアをロックすることができます。

    caution

    この関数は、データストアがバックアップや VSS などの他の管理機能によってロックされた場合にも、 true を返します (.flushAndLock() 参照)。

    参照

    .flushAndLock()
    .unlock()

    .makeSelectionsAlterable()

    履歴
    リリース内容
    18 R5追加

    .makeSelectionsAlterable()

    | 引数 | 型 | | 説明 | | -- | - |::| -------------------------------------------- | | | | | このコマンドは引数を必要としません|

    |

    説明

    .makeSelectionsAlterable() 関数は、 カレントアプリケーションのデータストアにおいて、すべての新規エンティティセレクションをデフォルトで追加可能に設定します (リモートデータストア を含む)。 これはたとえば On Startup データベースメソッドなどで、一度だけ使用することが想定されています。

    このメソッドが呼ばれてない場合、新規エンティティセレクションはそれぞれの "親" の性質や作成方法に応じて、共有可能に設定される場合もあります (共有可能/追加可能なエンティティセレクション 参照)。

    この関数は、OB Copy または .copy()ck shared オプションを明示的に使用して作成されたエンティティセレクションには適用されません。

    互換性に関する注記: このメソッドは 4D v18 R5 より前のバージョンから変換されたプロジェクトで、.add() の呼び出しを使用しているものにおいてのみ使用してください。 このコンテキストにおいては、.makeSelectionsAlterable() を使用することで、既存プロジェクト内で以前の 4D のふるまいを再現し、時間を節約できます。 逆に、4D v18 R5 以降のバージョンで作成された新規プロジェクトにおいては、この関数の使用は 推奨されていません。エンティティセレクションを共有可能にできないため、パフォーマンスとスケーラビリティの観点で妨げになるからです。

    .provideDataKey()

    履歴
    リリース内容
    17 R5追加

    .provideDataKey( curPassPhrase : Text ) : Object
    .provideDataKey( curDataKey : Object ) : Object

    引数説明
    curPassPhraseText->カレントのパスフレーズ
    curDataKeyObject->カレントのデータ暗号化キー
    戻り値Object<-暗号化キーのチェックの結果

    |

    説明

    .provideDataKey() 関数は、 データストアのカレントデータファイルのデータ暗号化キーを受け取り、暗号化されたデータと合致するかどうかチェックします. この関数は、暗号化されたデータベースを開くときや、データファイルの再暗号化など暗号化キーが必要となる暗号化オペレーションを実行する際に使用します。

    • .provideDataKey() 関数は暗号化されたデータベース内で呼び出される必要があります。 暗号化されていないデータベース内で呼び出した場合、エラー2003 (暗号化キーはデータと合致しません) が返されます。 データベースが暗号化されているかどうかを調べるには Data file encryption status コマンドを使用します。
    • リモートの 4D または暗号化されたリモートデータストアから、.provideDataKey() 関数を呼び出すことはできません。

    curPassPhrase パラメーターを使用する場合は、データ暗号化キーの生成に使用した文字列を渡します。 このパラメーターを使用した場合、暗号化キーが生成されます。

    curDataKey パラメーターを使用する場合は、データ暗号化キー (encodedKey プロパティ) を格納するオブジェクトを渡します。 このキーは、New data key コマンドで生成された可能性があります。

    有効な暗号化キーが提供された場合、そのキーはメモリ内の keyChain に追加され、暗号化モードが有効になります:

    • 暗号化可能テーブルに対するデータ編集はすべて、ディスク上 (.4DD、.journal、 .4Dindx ファイル) で暗号化されます。
    • 暗号化可能テーブルから読み出したすべてのデータは、メモリ内で復号化されます。

    戻り値

    コマンドの実行結果は、戻り値のオブジェクトに格納されます:

    プロパティ説明
    successBoolean提供された暗号化キーが暗号化データと合致すれば true、それ以外は false
    以下のプロパティは、success が FALSE であった場合にのみ返されます。
    statusNumberエラーコード (提供された暗号化キーが間違っていた場合には 4)
    statusTextTextエラーメッセージ
    errorsCollectionエラーのスタック。 最初のエラーに最も高いインデックスが割り当てられます。
    [ ].componentSignatureText内部コンポーネント名
    [ ].errCodeNumberエラー番号
    [ ].messageTextエラーメッセージ

    curPassphrase および curDataKey のどちらの引数も渡されなかった場合、.provideDataKey()null を返します (この場合エラーは生成されません)。

    例題

     var $keyStatus : Object
    var $passphrase : Text

    $passphrase:=Request("パスフレーズを入力してください。")
    If(OK=1)
    $keyStatus:=ds.provideDataKey($passphrase)
    If($keyStatus.success)
    ALERT("提供された暗号化キーは有効です。")
    Else
    ALERT("提供された暗号化キーは無効です。暗号化データの編集はできません。")
    End if
    End if

    .setAdminProtection()

    履歴
    リリース内容
    18 R6追加

    .setAdminProtection( status : Boolean )

    引数説明
    statusBoolean->webAdminポート上で、データエクスプローラーによるデータアクセスを無効にするには true、アクセスを有効にするには false (デフォルト)

    |

    説明

    .setAdminProtection() 関数は、 WebAdminセッションにおける データエクスプローラー 含め、Web管理ポート上でのデータアクセスを無効に設定することができます.

    この関数が呼び出されなかった場合のデフォルトでは、データエクスプローラーを使用した WebAdmin 権限を持つセッションについて、Web管理ポート上のデータアクセスは常に許可されます。 環境によっては (たとえば、アプリケーションサーバーが第三者のマシン上でホストされている場合)、 管理者に対して access key 設定を含むサーバー設定の編集は許可しても、データ閲覧はできないようにしたいかもしれません。

    このような場合にこの関数を呼び出すことで、ユーザーセッションが WebAdmin 権限を持っていても、マシンの Web管理ポート上でのデータエクスプローラーによるデータアクセスを無効にすることができます。 この関数を実行するとデータファイルは即座に保護され、そのステータスがディスク上に保存されます: アプリケーションを再起動しても、データファイルは保護されたままです。

    例題

    運用前に呼び出す protectDataFile プロジェクトメソッドを作成します:

     ds.setAdminProtection(True) // データエクスプローラーによるデータアクセスを無効化します

    参照

    .isAdminProtected()

    .setRemoteContextInfo()

    履歴
    リリース内容
    19 R5追加

    .setRemoteContextInfo( contextName : Text ; dataClassName : Text ; attributes : Text {; contextType : Text { ; pageLength : Integer}})
    .setRemoteContextInfo( contextName : Text ; dataClassName : Text; attributesColl : Collection {; contextType : Text { ; pageLength : Integer }} )
    .setRemoteContextInfo( contextName : Text ; dataClassObject : 4D.DataClass ; attributes : Text {; contextType : Text { ; pageLength : Integer }})
    .setRemoteContextInfo( contextName : Text ; dataClassObject : 4D.DataClass ; attributesColl : Collection {; contextType : Text { ; pageLength : Integer }} )

    引数説明
    contextNameText->コンテキストの名称
    dataClassNameText->データクラスの名称
    dataClassObject4D.DataClass->DataClass オブジェクト (例: datastore.Employee)
    attributesText->カンマ区切りの属性リスト
    attributesCollCollection->属性名 (テキスト) のコレクション
    contextTypeText->渡す場合、値は "main" または "currentItem" のいずれか
    pageLengthInteger->コンテキストにリンクされたエンティティセレクションのページ長 (デフォルトは 80)

    |

    上級者向け: この機能は、特定の構成のため、ORDAのデフォルト機能をカスタマイズする必要がある開発者向けです。 ほとんどの場合、使用する必要はないでしょう。

    説明

    .setRemoteContextInfo() 関数は、 指定したデータクラス属性を contextName の最適化コンテキストにリンクします. 指定した属性に対して最適化コンテキストが既に存在する場合、このコマンドはそれを置き換えます。

    ORDAクラスの関数にコンテキストを渡すと、RESTリクエストの最適化が即座に発動します:

    • 自動モードのときとは異なり、先頭エンティティは完全にロードされません。
    • 80件のエンティティ (または pageLength に対応するエンティティ数) のページが直ちにサーバーに要求される際、コンテキストの属性のみが要求されます。

    最適化コンテキストの作成に関する詳細については、クライアント/サーバーの最適化 を参照ください。

    contextName には、データクラス属性にリンクする最適化コンテキストの名前を渡します。

    コンテキストを受け取るデータクラスを指定するために、dataClassName または dataClassObject を渡すことができます。

    コンテキストにリンクする属性を指定するには、attributes (テキスト) にカンマ区切りの属性リストを渡すか、属性名のコレクションを attributesColl (テキストのコレクション) に渡します。

    attributes が空のテキスト、または attributesColl が空のコレクションの場合、データクラスのすべてのスカラー属性が最適化コンテキストに置かれます。 データクラスに存在しない属性を渡した場合、それは無視され、エラーが返されます。

    contextType を渡して、コンテキストが標準コンテキストか、リストボックスに表示されているカレントエンティティセレクション項目のコンテキストかを指定することができます。

    • "main" (デフォルト) を渡すと、contextName は標準コンテキストを指定します。
    • "currentItem" の場合には、渡された属性はカレント項目のコンテキストに置かれます。 エンティティセレクション型リストボックス を参照ください。

    pageLength には、サーバーに要求するデータクラスエンティティの数を指定します。

    エンティティセレクションであるリレーション属性 (1対N) について、pageLength を渡すことができます。 シンタックスは、relationAttributeName:pageLength です (例: employees:20)。

    例題 1

    var $ds : 4D.DataStoreImplementation
    var $persons : cs.PersonsSelection
    var $p : cs.PersonsEntity
    var $contextA : Object
    var $info : Object
    var $text : Text

    // リモートデータストアを開きます
    $ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")

    // コンテキストを設定します
    $contextA:=New object("context"; "contextA")
    $ds.setRemoteContextInfo("contextA"; $ds.Persons; "firstname, lastname")

    // ループを使い、サーバーにリクエストを送信します
    $persons:=$ds.Persons.all($contextA)
    $text:=""
    For each ($p; $persons)
    $text:=$p.firstname + " " + $p.lastname
    End for each

    // コンテキストの情報を確認します
    $info:=$ds.getRemoteContextInfo("contextA")
    // $info = {name:"contextA";dataclass:"Persons";main:"firstname, lastname"}

    この例はデモンストレーションであり、実際の実装を想定したものではありません。

    例題 2

    以下のコードでは、Address データクラスのエンティティ 30件のページをサーバーに要求しています。 返されるエンティティは、zipCode 属性のみを含みます。

    Address エンティティに対して、20件の Persons エンティティが返され、それらには lastnamefirstname 属性のみが含まれます:

    var $ds : 4D.DataStoreImplementation

    $ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")

    $ds.setRemoteContextInfo("contextA"; $ds.Address; "zipCode, persons:20,\
    persons.lastname, persons.firstname"; "main"; 30)

    例題 3 - リストボックス

    // フォームのロード時に
    Case of
    : (Form event code=On Load)

    Form.ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")

    // ページコンテキストの属性を設定します
    Form.ds.setRemoteContextInfo("LB"; Form.ds.Persons; "age, gender,\
    children"; "currentItem")

    Form.settings:=New object("context"; "LB")
    Form.persons:=Form.ds.Persons.all(Form.settings)
    // Form.persons がリストボックスに表示されます
    End case

    // カレント項目のコンテキストの属性を取得します
    Form.currentItemLearntAttributes:=Form.selectedPerson.getRemoteContextAttributes()
    // Form.currentItemLearntAttributes = "age, gender, children"

    参照

    .getRemoteContextInfo()
    .getAllRemoteContexts()
    .clearAllRemoteContexts()

    .startRequestLog()

    履歴
    リリース内容
    20サーバー側のサポート、新しい options 引数
    17 R6追加

    .startRequestLog()
    .startRequestLog( file : 4D.File )
    .startRequestLog( file : 4D.File ; options : Integer )
    .startRequestLog( reqNum : Integer )

    引数説明
    file4D.File->File オブジェクト
    optionsInteger->ログレスポンスオプション (サーバーのみ)
    reqNumInteger->メモリ内に保管するリクエストの数 (クライアントのみ)

    |

    説明

    .startRequestLog() 関数は、 クライアント側またはサーバー側で ORDAリクエストのログを開始します. これはクライアント/サーバー環境でのデバッグを想定して設計されています。

    info

    ORDAリクエストログのフォーマットの詳細は、ORDAリクエスト の章を参照ください。

    クライアント側

    クライアント側の ORDAリクエストログを作成するには、リモートマシン上でこの関数を呼び出します。 ログは、渡した引数によってファイルまたはメモリに送ることができます:

    • File コマンドで作成された file オブジェクトを渡した場合、ログデータはオブジェクト (JSON フォーマット) のコレクションとしてこのファイルに書き込まれます。 各オブジェクトは一つのリクエストを表します。
      ファイルがまだ存在しない場合には、作成されます。 もしファイルが既に存在する場合、新しいログデータはそこに追加されていきます。 メモリへのログ記録が既に始まっている状態で、 .startRequestLog()が file 引数付きで呼び出された場合、メモリに記録されていたログは停止され消去されます。

    JSON 評価を実行するには、ファイルの終わりに手動で ] 文字を追加する必要があります。

    • reqNum (倍長整数) 引数を渡した場合、メモリ内のログは (あれば) 消去され、新しいログが初期化されます。 reqNum 引数が指定する数にリクエスト数が到達するまでは、ログはメモリに保管され、到達した場合には古いエントリーから消去されていきます (FIFO スタック)。
      ファイルへのログ記録が既に始まっている状態で、.startRequestLog()reqNum 引数付きで呼び出された場合、ファイルへのログは停止されます。

    • 引数を何も渡さなかった場合、ログはメモリに記録されていきます。 前もって .startRequestLog()reqNum 引数付きで 呼び出されていた場合 (ただし .stopRequestLog() の前)、ログが次回消去されるかまたは.stopRequestLog() が呼び出されるまで、ログデータはメモリ内にスタックされます。

    サーバー側

    サーバー側の ORDAリクエストログを作成するには、サーバーマシン上でこの関数を呼び出します。 ログは、.jsonl 形式のファイルに書き込まれます。 各オブジェクトは 1つのリクエストを表します。 ファイルが存在しない場合は、作成されます。 もしファイルが既に存在する場合、新しいログデータはそこに追加されていきます。

    • file 引数を渡した場合、ログデータはこのファイルの指定位置に書き込まれます。 - file 引数を省略した場合、または引数が NULL の場合、ログデータは ordaRequests.jsonl という名前のファイルに書き込まれ、"/LOGS" フォルダーに保存されます。
    • options 引数を使って、サーバーのレスポンスをログに記録するかどうか、および本文をログに含めるかどうかを指定することができます。 引数を省略した場合のデフォルトでは、全レスポンスがログに記録されます。 この引数には、以下の定数を使用することができます:
    定数説明
    srl log all全レスポンスをログに残します (デフォルト値)
    srl log no responseレスポンスの記録を無効化します
    srl log response without body本文を除いたレスポンスをログに残します

    例題 1

    ORDA クライアントリクエストをファイルに記録し、ログシーケンス番号を使用します:

     var $file : 4D.File
    var $e : cs.PersonsEntity

    $file:=File("/LOGS/ORDARequests.txt") // Logs フォルダー

    SET DATABASE PARAMETER(Client Log Recording;1) // グローバルログシーケンス番号をトリガーします
    ds.startRequestLog($file)
    $e:=ds.Persons.get(30001) // リクエストを送信します
    ds.stopRequestLog()
    SET DATABASE PARAMETER(Client Log Recording;0)

    例題 2

    ORDA クライアントリクエストをメモリに記録します:

     var $es : cs.PersonsSelection
    var $log : Collection

    ds.startRequestLog(3) // メモリにはリクエストを 3つまで保管します
    $es:=ds.Persons.query("name=:1";"Marie")
    $es:=ds.Persons.query("name IN :1";New collection("Marie"))
    $es:=ds.Persons.query("name=:1";"So@")

    $log:=ds.getRequestLog()
    ALERT("The longest request lasted: "+String($log.max("duration"))+" ms")

    例題 3

    ORDA サーバーリクエストを専用ファイルに記録し、ログシーケンス番号と処理時間の記録を有効化します:

    SET DATABASE PARAMETER(4D Server Log Recording;1)

    $file:=Folder(fk logs folder).file("myOrdaLog.jsonl")
    ds.startRequestLog($file)
    ...
    ds.stopRequestLog()
    SET DATABASE PARAMETER(4D Server Log Recording;0)


    .startTransaction()

    履歴
    リリース内容
    18追加

    .startTransaction()

    | 引数 | 型 | | 説明 | | -- | - |::| -------------------------------------------- | | | | | このコマンドは引数を必要としません|

    |

    説明

    .startTransaction() 関数は、 対象データストアに対応するデータベース上で、カレントプロセス内のトランザクションを開始します. トランザクションプロセス中にデータストアのエンティティに加えられた変更は、トランザクションが確定されるかキャンセルされるまで一時的に保管されたままになります。

    このメソッドがメインのデータストア (ds コマンドで返されるデータストア) で呼ばれた場合、トランザクションはメインのデータストアとそのデータベースで実行されるすべてのオペレーションに適用されます。これには、そこで実行される ORDA とクラシック言語も含まれます。

    複数のトランザクションをネストすること (サブトランザクション) が可能です。 個々のトランザクションまたはサブトランザクションは、それぞれキャンセルするか確定される必要があります。 メイントランザクションがキャンセルされると、サブトランザクションも (たとえ個々に.validateTransaction() 関数で承認されていても) すべてキャンセルされます。

    例題

     var $connect; $status : Object
    var $person : cs.PersonsEntity
    var $ds : cs.DataStore
    var $choice : Text
    var $error : Boolean

    Case of
    :($choice="local")
    $ds:=ds
    :($choice="remote")
    $connect:=New object("hostname";"111.222.3.4:8044")
    $ds:=Open datastore($connect;"myRemoteDS")
    End case

    $ds.startTransaction()
    $person:=$ds.Persons.query("lastname=:1";"Peters").first()

    If($person#Null)
    $person.lastname:="Smith"
    $status:=$person.save()
    End if
    ...
    ...
    If($error)
    $ds.cancelTransaction()
    Else
    $ds.validateTransaction()
    End if

    .stopRequestLog()

    履歴
    リリース内容
    20サーバー側のサポート
    17 R6追加

    .stopRequestLog()

    | 引数 | 型 | | 説明 | | -- | - | | -------------------------------------------- | | | | | このコマンドは引数を必要としません|

    |

    説明

    .stopRequestLog() 関数は、 クライアント側またはサーバー側の ORDAリクエストのログをすべて停止します.

    実際には、ディスク上で開かれているドキュメントを閉じます。 クライアント側で、メモリ上でログの記録が開始されていた場合、そのログを停止します。

    ORDAリクエストログがマシン上で開始されていない場合、この関数は何もしません。

    例題

    .startRequestLog() の例題を参照ください。

    .unlock()

    履歴
    リリース内容
    20追加

    .unlock()

    | 引数 | 型 | | 説明 | | -- | - | | -------------------------------------------- | | | | | このコマンドは引数を必要としません|

    |

    説明

    .unlock() 関数は、 データストアにおける、書き込み操作に対する現在のロックが同じプロセスで設定されていた場合、そのロックを解除します. ローカルデータストアの書き込み操作は、.flushAndLock() 関数を使用してロックすることができます。

    現在のロックがデータストアの唯一のロックであった場合、書き込み操作は直ちに可能になります。 .flushAndLock() 関数がプロセス内で複数回呼ばれている場合、データストアのロックを解除するには、同じ回数だけ .unlock() を呼び出す必要があります。

    .unlock() 関数は、対応する .flushAndLock() を呼び出したプロセス内で呼び出す必要があります。そうでない場合には、この関数は何もおこなわず、ロックも解除されません。

    ロックが解除されているデータストアで .unlock() 関数を呼び出した場合、何もおこりません。

    参照

    .flushAndLock()
    .locked()

    .validateTransaction()

    履歴
    リリース内容
    18追加

    .validateTransaction()

    | 引数 | 型 | | 説明 | | -- | - | | -------------------------------------------- | | | | | このコマンドは引数を必要としません|

    |

    説明

    .validateTransaction() 関数は、 トランザクションを受け入れます 。このトランザクションは、対象データストアの対応するレベルで .startTransaction() で開始されたものです。

    この関数は、トランザクション中におこなわれたデータストア上のデータの変更を保存します。

    複数のトランザクションをネストすること (サブトランザクション) が可能です。 メイントランザクションがキャンセルされると、サブトランザクションも (たとえ個々にこの関数で承認されていても) すべてキャンセルされます。

    例題

    .startTransaction() の例題を参照ください。