4D-jp 4D Japan Technical Support Team

複数の4Dデータソースに興味がありますか?

2019-11-07
Marie-Sophie Landrieu-Yvert

Multiple 4D datasource

このタイトルが既にヒントかもしれませんが、ワクワクするような新しい機能が4D v18で告知されました!

この機能はクライアント/サーバーの動作に新しい可能性を開くものです。カレントのデータベースに限定するのではなく、永続的なネットワーク接続を必要とするのもなく、4D v18のアプリケーションは4D Server上に公開された、別の、リモートの、4Dデータベースからデータを入手できます!

この機能のおかげで多くのオプションが可能になりました。例えば、オフラインで動き、リモートデータにアクセス可能な時にだけローカルデータを同期するアプリケーションを構成することができます。あるいは、複数のサーバーにデータを公開し、必要に応じて切り替えることも考えられます。別のオプションとしては、異なるデータベース(例:ローカルデータ、インターナショナルデータ)上にデータモデルを分割しすることも可能です。別の場所にデータを配信して一つの4Dクライアント・コード(プロジェクト・メソッドとフォームオブジェクト)を通じてアクセスできるようにするのはいかがでしょう?これらすべてのシナリオは実現可能で、このブログでその方法を説明します。

リモートデータストアと作業する方法

4D v18を使えば、他の4Dクライアントに対して、RESTサーバーとして公開できます。これは、4Dクライアントが公開したデータと相互通信(作成、読み込み、更新、削除)できることを意味します。さらに良いことに:この通信はORDAコンセプトをベースにしているので、完全にオブジェクト指向なのです!

どのように4Dデータベースをリモートアクセスに対して公開するのか?

データベース中のウェブ設定は:

  • 設定タブで、HTTPポートを設定します。(セキュリティーのため、プロダクションモードではHTTPSを使うことを確認します!) Multiple 4D datastore

  • RESTリソース・タブ上で、「RESTサーバーとして公開」オプションを選択します。 Multiple 4D datastore

  • Webサーバーを開始します。上記のサンプルでは、データベース起動時にサーバーを開始するを選択します。
  • 4D Server上でデータベースを開きます。
  • おめでとうございます!あなたのデータベースが、あなたのマシンのIPと設定したポートを経由して、リモートアクセスで接続可能になりました!

注意:Webサーバーを使ってRESTサーバーへアクセスするには、Webサーバー・ライセンスは必要ありません。接続には標準の4Dクライアント・ライセンスが使われます。

リモートデータベースを使って動作する

OPEN DATASTOREコマンド

前述のように、あなたのデータベースはORDAコンセプト経由で接続可能になります:データベースはdatastoreオブジェクトを使って操作されます。従って、最初のステップは、アクセスしたいリモートデータベースに関連したdatastoreオブジェクトを得ることです。問題ありません!Open datastoreコマンドで正確なホスト名を呼び出せば動きます。

datastoreオブジェクトをローカルID “students”に関連付けます。これでORDAを使ってリモートデータベースと作業(クエリーの起動、エンティティのロード/更新など)が出るようになります。

C_OBJECT($connectTo;$schoolDS;$s)
C_TEXT($dataClass)

//The database contains a Students data class
$dataClass;="Students"

$connectTo:=New object("hostname";"school.acme.com")
$schoolDS:=Open datastore($connectTo;"students") //local id of this remote datastore is "students"

//Start working with ORDA means
ALERT("They are "+String($schoolDS[$dataClass].all().length)+" students")

//Run an ORDA query on the Students dataclass
$s:=$schoolDS[$dataClass].query("lastname=:1";"Smith").first()
If ($s#Null)
ALERT("Student "+$s.lastname+" lives in "+$s.address.city)
End if

Open datastoreドキュメントをチェックして、安全な接続(TLS)でリモートデータベースにアクセスする方法を参照してください。

複数のリモートデータベースを使う

以下は、複数のリモートデータベースで動作させるのがいかに簡単かを説明した短い例です。二つのデータベースがあります:一つはフランス人の生徒が含まれていて、もう一つにはイギリス人の生徒が含まれています。

フランス人の生徒を見るか、イギリス人の生徒を見るか選択できます。 Multiple 4D datastore Multiple 4D datastore

フォームメソッド:

Case of
:(FORM Event.code=On Load)
Form.frenchServer:="french.acme.com"
Form.englishServer:="english.acme.com"
End case

「フランス人の生徒を見る」ボタンの背後にあるオブジェクトメソッドです:

C_OBJECT($connectTo;$students)
$connectTo:=New object()
$connectTo.hostname:=Form.frenchServer
$students:=Open datastore($connectTo;"french") //datastore containing French students
Form.students:=$students.Students.all()

「イギリス人の生徒を見る」ボタンの背後にあるオブジェクトメソッドです:

C_OBJECT($connectTo;$students)
$connectTo:=New object()
$connectTo.hostname:=Form.englishServer
$students:=Open datastore($connectTo;"english") //datastore containing English students
Form.students:=$students.Students.all()

Open datastoreコマンドを最初に呼び出した時は、データストアオブジェクトはメモリーにロードされ、セッションはサーバーで開かれます。その後の呼び出しでは、このデータストアオブジェクトの参照を返すだけです。

リモートデータベースへのアクセスを管理

公開したデータベースを安全に保つために、アクセスにフィルターをかけることができます。Open datastoreコマンドを別の面で見てみましょう。以下のようにユーザーとパスワードを渡すことができます。

C_OBJECT($connectTo;$myStudents)

ON ERR CALL("manageErrors")
$connectTo:=New object()
$connectTo.hostname:="students.acme.com"
$connectTo.user:="mary@4d.com"
$connectTo.password:=Form.password

//local id of this remote datastore is "students"
$myStudents:=Open datastore($connectTo;"students")

ON ERR CALL("") </code>

4Dは二つの方法で権限のあるユーザーのアクセスを制限できます。

4Dユーザーグループを使う

4Dユーザーグループを使ってアクセスを制限できます。データベースを公開した時に、Web設定ページのRESTリソース・タブでアクセスを許可するグループを選択します。

Multiple 4D datastore

もしもOpen datastoreコマンドで与えられたユーザーが、選択されたグループに属している場合、アクセスは受け入れられますが、そうでない場合は承認エラーが生成されます。

ON REST AUTHENTICATIONデータベース・メソッドを使う

また、新しいOn REST authenticationデータベース・メソッドを使って、公開したデータベースへの独自のアクセスコントロールをコード化することもできます。このメソッドは、Open datastoreコマンド中のユーザーの資格を受け取ります。もしユーザーがリモートデータベースでの作業を許されている場合はシンプルにTrueを返します。

下記はサンプルです:

C_TEXT($1;$name;$2;$password)
C_BOOLEAN($0;$result;$3;$digest)
C_OBJECT($user)

$name:=$1 // The user to provide in Open datastore command
$password:=$2 // The password to provide in Open datastore command
$digest:=$3 // True if password is hashed

$result:=False

//Search for the user in our Users dataclass
$user:=ds.Users.query("name=:1";$name).first()

If ($user#Null)
// Passwords are hashed in Users dataclass
If ($digest & ($user.password=$password))
$result:=True
End if
$0:=$result

注意dsdatastore.getInfo()コマンドは更新されて、新たに三つのメソッドが追加されました:datastore.startTransaction()datastore.cancelTransaction()datastore.validateTransaction()です。

では、HDI(例題)をダウンロードしてこの素晴らしい機能を学びましょう!


関連記事

リンク