4D v18 のエキサイティングな新機能を発表します! タイトルからすでにヒントがあるかもしれませんね。
この機能は、クライアント/サーバーの新しい可能性を開きます。4D v18 のアプリケーションは、永続的なネットワーク接続を必要とするカレントデータベースに限定されるのではなく、4D Server 上に公開された別のリモート4Dデータベースからデータを取得することができます!
この機能により、選択肢が大きく広がります。たとえば、基本的にオフラインで動作するようにアプリケーションを構成し、リモートデータにアクセスできるときだけローカルデータを同期させることができます。あるいは、複数のサーバーでデータを公開し、必要に応じて切り替えることもできます。また、データモデルを異なるデータベースに分散させるという方法もあります (ローカルデータ、海外データなど)。異なる場所にデータを分散させながら、 1つの 4Dクライアントコード (プロジェクトメソッドやフォームオブジェクト) でアクセス可能にするのはどうでしょうか。このブログ記事では、これらのシナリオを実現する方法を紹介します。
4D v18 では、他の 4Dクライアントアプリケーションに対して、4Dデータベースを RESTサーバーとして公開することができます。これは、公開されたデータを 4Dクライアントが操作 (作成・読み取り・更新・削除) できることを意味します。さらに良いニュースです: このやり取りは ORDA の概念に基づいているため、完全にオブジェクト指向です!
4Dデータベースをリモートアクセスのために公開する方法
データベースの Web設定にて:
- “設定” タブで、HTTPポートを設定します (セキュリティ上の理由から、本番では必ず HTTPS を使用してください!)。
- “RESTリソース” タブで、“RESTサーバーとして公開” オプションを選択します。
- Webサーバーの起動が必要です。上記の例では、データベースの起動時にサーバーを起動するように選択しました。
- 4D Server でデータベースを開きます。
- これで、あなたのマシンの IP と設定したポートから、データベースにリモートアクセスできるようになりました!
注記: RESTサーバーにアクセスするために Webサーバーを使用する場合、Webサーバーのライセンスは必要ありません。標準の 4D Clientライセンスが接続に使用されます。
リモートデータベースの操作
Open datastore コマンド
先に述べたように、データベースは ORDA の概念を介してアクセス可能です: データベースはデータストアオブジェクトで扱われます。したがって、最初のステップは、アクセスしたいリモートデータベースに対応するデータストアオブジェクトを取得することです。これは、正しいホスト名で Open datastore コマンドを正しいホスト名で呼び出せば、すぐに実行できます。
ここでは、データストアオブジェクトをローカルID “students” に関連付けます。これで、ORDA を使ったリモートデータベースでの作業を開始できます (クエリの実行、エンティティのロード / 更新など)。
C_OBJECT($connectTo;$schoolDS;$s)
C_TEXT($dataClass)
// リモートデータベースは Students データクラスを持ちます
$dataClass:="Students"
$connectTo:=New object("hostname";"school.acme.com")
$schoolDS:=Open datastore($connectTo;"students") // リモートデータストアのローカルID を "students" にします
// ORDA を使って下のような処理が可能です
ALERT("総生徒数は "+String($schoolDS[$dataClass].all().length)+" 名です。")
// Students データクラスに対して ORDAクエリを実行できます
$s:=$schoolDS[$dataClass].query("lastname=:1";"Smith").first()
If ($s#Null)
ALERT($s.lastname+" さんは "+$s.address.city+" に住んでいます。")
End if
セキュアな接続 (TLS) でリモートデータベースにアクセスする方法については、Open datastoreのドキュメントを参照ください。
複数のリモートデータベースの使用
ここでは、複数のリモートデータベースを操作する簡単な例を紹介します。2つのデータベースがあるとします。1つはフランス語の生徒、もう 1つは英語の生徒に関するデータを格納しています。
フランス語または英語の生徒のどちらを表示するかが選択できるダイアログを作成します:
フォームメソッドです:
Case of
: (FORM Event.code=On Load)
Form.frenchServer:="french.acme.com"
Form.englishServer:="english.acme.com"
End case
“フランス語の生徒を見る (View French students)” ラジオボタンに設定されているオブジェクトメソッドです:
C_OBJECT($connectTo;$students)
$connectTo:=New object()
$connectTo.hostname:=Form.frenchServer
$students:=Open datastore($connectTo;"french") // フランス語の生徒を格納しているデータストア
Form.students:=$students.Students.all()
“英語の生徒を見る(View English students)” ラジオボタンに設定されているオブジェクトメソッドです:
C_OBJECT($connectTo;$students)
$connectTo:=New object()
$connectTo.hostname:=Form.englishServer
$students:=Open datastore($connectTo;"english") // 英語の生徒を格納しているデータストア
Form.students:=$students.Students.all()
注記: Open datastore コマンドの初回の呼び出しで、データストアオブジェクトがメモリ上にロードされ、サーバー上でセッションが開始されます。それ以降の呼び出しでは、単にこのデータストアオブジェクトの参照を返します。
リモートデータベースへのアクセスを制御する
公開した 4Dデータベースを安全に保つために、アクセスをフィルタリングすることができます。もう一度 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
// リモートデータストアのローカルID を "students" にします
$myStudents:=Open datastore($connectTo;"students")
ON ERR CALL("")
4D では、許可されたユーザーのアクセスを制限する方法が 2つあります。
4Dユーザーグループを使用する
4Dユーザーグループを使用して、アクセスを制限することができます。データベースを公開する際に、Web設定ページの “RESTリソース” タブで、アクセスを許可するグループを選択します。
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 // Open datastore コマンドに渡すユーザー名
$password:=$2 // Open datastore コマンドに渡すパスワード
$digest:=$3 // パスワードがハッシュ化されている場合は True
$result:=False
// 該当するユーザーがいるか、Users データクラスを検索します
$user:=ds.Users.query("name=:1";$name).first()
If ($user#Null)
// Users データクラスのパスワードもハッシュ化されています
If ($digest & ($user.password=$password))
$result:=True
End if
End if
$0:=$result
注記: ds と datastore.getInfo()コマンドが更新され、3つの新しいメソッドが追加されました: datastore.startTransaction(), datastore.cancelTransaction(), datastore.validateTransaction().
さあ、上の HDI をダウンロードして、この素晴らしい機能を実際に触ってみましょう!