Sources de données 4D multiples, intéressé ?

Traduit automatiquement de Deepl

Nous avons une nouvelle fonctionnalité passionnante à annoncer dans 4D v18 et le titre vous a peut-être déjà donné un indice !

Cette fonctionnalité ouvre de nouvelles possibilités pour le travail client/serveur. Plutôt que d’être limitée à la base de données actuelle et de nécessiter une connexion réseau permanente, une application dans 4D v18 peut obtenir des données d’une autre base de données 4D, distante, exposée sur un serveur 4D !

De nombreuses options deviennent disponibles grâce à cette fonctionnalité. Par exemple, vous pouvez organiser vos applications pour qu’elles fonctionnent hors ligne et ne synchronisent les données locales que lorsque les données distantes sont accessibles. Vous pouvez aussi envisager de publier vos données sur plusieurs serveurs et passer de l’un à l’autre si nécessaire. Une autre option pourrait consister à répartir votre modèle de données entre différentes bases de données( par exemple, données locales, données internationales). Que diriez-vous d’avoir vos données distribuées en différents endroits mais toujours accessibles par un seul code client 4D (méthodes de projet et objets de formulaire) ? Tous ces scénarios sont désormais possibles et cet article de blog vous explique comment !

HDI : Comment travailler avec un datastore distant

Avec 4D v18, votre base de données 4D peut être exposée comme un serveur REST pour d’autres applications clientes 4D. Cela signifie qu’un client 4D peut interagir avec les données que vous avez exposées (création, lecture, mise à jour, suppression). Et encore une bonne nouvelle : cette interaction est basée sur les concepts ORDA, elle est donc complètement orientée objet !

Comment exposer votre base de données 4D pour un accès à distance ?

Dans les paramètres Web de la base de données :

  • Dans l’onglet Configuration, configurez un port HTTP (pour des raisons de sécurité, veillez à utiliser HTTPS pour le mode production !)

  • Dans l’onglet REST resource, sélectionnez l’option« Expose as REST Server« .

blank

  • Démarrez le serveur Web. Dans l’exemple ci-dessus, nous avons choisi de démarrer le serveur au démarrage de la base de données.
  • Ouvrez votre base de données sur le serveur 4D.
  • Félicitations ! Votre base de données est maintenant accessible à distance via l’IP de votre machine et le port que vous avez configuré !

Remarque: l’utilisation du serveur Web pour accéder au serveur REST ne nécessite pas de licence de serveur Web. Les licences 4D Client standard sont utilisées pour les connexions.

Travailler avec des bases de données distantes

Commande Open datastore

Comme nous l’avons dit précédemment, votre base de données est accessible via les concepts ORDA: une base de données est manipulée avec un objet datastore. Par conséquent, la première étape consiste à obtenir l’objet datastore correspondant à la base de données distante à laquelle vous souhaitez accéder. Aucun problème ! Appelez la commande Open datastore avec le nom d’hôte correct et vous êtes opérationnel.

Nous associons l’objet datastore à l’ID local, « students ». Nous pouvons maintenant commencer à travailler avec notre base de données distante en utilisant ORDA (exécuter des requêtes, charger/mettre à jour des entités, etc.)

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

//The database contains a Students dataclass
$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 ( # ) ("L'étudiant "+ . +" vit à "+ . . )$sNull
ALERT$slastname$saddresscity
End if

Consultez la Open datastore pour en savoir plus sur la façon dont vous pouvez accéder à une base de données distante avec une connexion sécurisée (TLS).

utilisation de plusieurs bases de données distantes

Voici un petit exemple qui montre à quel point il est facile de travailler avec plusieurs bases de données distantes. Nous avons deux bases de données : l’une contient les étudiants français, l’autre les étudiants anglais.

Nous pouvons choisir d’afficher les étudiants français ou anglais.

blank

blank

La méthode du formulaire :

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

La méthode objet derrière le bouton radio « View French students » :

C_OBJECT($connectTo;$students)
$connectTo :=New object()
$connectTo .hostname:=Form.frenchServer
$students :=Open datastore($connectTo; "français") //datastore containing French students

Form.students:=$students.Students.all()

La méthode objet derrière le bouton radio « View English students » :

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()

Remarque: La première fois que la commande Open datastore est appelée, l’objet datastore est chargé en mémoire et une session est ouverte sur le serveur. Lors des appels suivants, elle renvoie simplement une référence sur cet objet datastore.

contrôlez l’accès à votre base de données distante

Pour sécuriser la base de données 4D que vous avez exposée, vous pouvez en filtrer l’accès. Jetons un autre coup d’œil à la commande Open datastore . Comme indiqué ci-dessous, il est possible de lui transmettre un utilisateur et un mot de passe.

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 ("")

4D propose deux façons de restreindre l’accès aux utilisateurs autorisés :

Utiliser un groupe d’utilisateurs 4D

L’accès peut être restreint en utilisant un groupe d’utilisateurs 4D. Lorsque vous exposez la base de données, sélectionnez le groupe autorisé à accéder à l’onglet REST resource de la page des paramètres Web.

blank

Si l’utilisateur indiqué dans la commande Open datastore appartient au groupe sélectionné, l’accès est accordé, sinon une erreur d’authentification est générée.

Utiliser la méthode de base de données d’authentification au repos

Vous pouvez également utiliser la nouvelle méthode d’authentification REST de la base de données pour coder votre propre contrôle d’accès à la base de données que vous avez exposée. Cette méthode reçoit les informations d’identification de l’utilisateur dans la commande Open datastore commande. Il suffit de renvoyer True si l’utilisateur est autorisé à travailler avec votre base de données distante.

Voici un exemple :

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 ( # ) ( & ( . = )) := :=$userNull
// Passwords are hashed in Users dataclass
If$digest$userpassword$password
$resultTrue
End if
End if


$0$result

Remarque: Les symbolesds et datastore.getInfo() ont été mises à jour, et trois nouvelles méthodes ont été ajoutées : datastore.startTransaction(), datastore.cancelTransaction(), et datastore.validateTransaction().

Il est maintenant temps de télécharger l’IDH ci-dessus pour en savoir plus sur cette fonctionnalité étonnante !

Avatar
- Product Owner - Marie-Sophie Landrieu-Yvert a rejoint l'équipe de 4D Product en tant que Product Owner en 2017. En tant que Product Owner, elle est en charge de rédiger les user stories puis de les traduire en spécifications fonctionnelles. Son rôle est également de s'assurer que l'implémentation de la fonctionnalité livrée répond au besoin du client.Marie-Sophie est diplômée de l'école d'ingénieur ESIGELEC et a commencé sa carrière en tant qu'ingénieur chez IBM en 1995. Elle a participé à divers projets (projets de maintenance ou de construction) et a travaillé en tant que développeur Cobol. Elle a ensuite travaillé en tant que concepteur UML et développeur Java. Dernièrement, ses principaux rôles étaient d'analyser et de rédiger des exigences fonctionnelles, de coordonner les équipes commerciales et de développement.