Un attribut est la plus petite cellule de stockage dans une base de données relationnelle (voir aussi Attribut relationnel). Ne confondez pas les attributs de la dataclass et les attributs d'entités :
Dans un objet dataclass, chaque propriété est un attribut de dataclass qui correspond à un champ dans la table correspondante (même nom et même type).
Dans un objet entity, les attributs d'entités sont des propriétés qui contiennent les valeurs pour les attributs du datastore correspondant.
Note : Attributs et les propriétés sont des concepts similaires. "Attribut" est utilisé pour désigner les propriétés de la dataclass qui stockent les données, tandis que "propriété" est plus générique et définit une donnée stockée dans un objet.
Une dataclass est un objet qui décrit les données. Les tables de la base de données fournies par le datastore sont gérées via des dataclasses. Chaque table de la base de données fournie par le datastore possède une dataclass correspondante et portant le même nom. Chaque champ de la table est un attribut de la dataclass.
Une dataclass est reliée à un seul datastore.
Pour plus d'informations, voir le chapitre Dataclasses.
Un datastore est l'objet d'interface fourni par ORDA pour référencer une base de données et accéder à ses données. La base de données principale, retournée par la commande ds, est disponible en tant que datastore (le datastore principal).
Un datastore fournit :
une connexion à la base de données 4D
un ensemble de dataclasses pour travailler avec la base de données
La base peut être une base locale 4D (le datastore principal), ou une base 4D Server exposée en ressource REST (un datastore distant).
Lorsqu'il est géré via le code, le datastore est un objet dont les propriétés sont toutes les dataclasses définies. Un datastore ne référence qu'une seule base de données. Il est toutefois possible d'ouvrir plusieurs datastores pour accéder à plusieurs bases.
Notes :
Un datastore référence uniquement les tables avec une seule clé primaire. Les tables sans clé primaire ou avec clé primaire composite ne sont pas référencées.
Les attributs de type BLOB ne sont pas gérés dans le datastore.
Une copie profonde (deep copy) duplique un objet et toutes les références qu'il contient. Après une deep copy, une collection copiée contient des éléments dupliqués et donc de nouvelles références de tous les éléments originaux. Voir aussi Copie superficielle.
ds est la commande de langage 4D qui renvoie une référence d'objet du datastore. Elle correspond au datastore disponible sur la base de données principale 4D.
Une entité est un objet qui correspond à un modèle de base de données. Une entité contient les mêmes attributs que la dataclass.
Une entité peut être vue comme une instance de la dataclass, comme un enregistrement de la table correspondante à la dataclass dans son datastore associé. Cependant, une entité contient également des données connexes. Le but de l'entité est de gérer les données (créer, mettre à jour, supprimer).
Pour plus d'informations, voir le chapitre Entités.
Une sélection d'entités (entitySelection) est un objet. Lorsqu'une requête est envoyée au datastore, une sélection d'entités est un ensemble de références à des entités liées à la même dataclass.
Une sélection d'entités contient :
un ensemble de 0 à X références d'entités.
une propriété length (toujours),
les propriétés queryPlan et queryPath (si demandées lors de la requête).
Commes les entités sont gérées comme des références, les données sont chargées uniquement lorsque cela est nécessaire, c'est-à-dire lors de l'accès dans le code ou via des widgets d'interface. Ce principe d'optimisation est appelé lazy loading.
Les objets ORDA tels que les datastores, dataclasses, entity selections et entities définissent les classes d'objets. Ils fournissent des méthodes spécifiques pour interagir directement avec eux. Ces méthodes sont aussi appelées member functions. Ces méthodes sont utilisées en étant appelées sur une instance de l'objet.
Par exemple, la méthode query() est une member function de dataclass. Si vous avez stocké un objet dataclass dans la variable $myClass, vous pouvez écrire :
Dans cette documentation, le type de données "Mixte" est utilisé pour désigner les différents types de valeurs qui peuvent être stockés dans les attributs d'une dataclass. Cela inclut :
nombre
texte
null
booléen
date
objet
collection
image (*)
(*) le type Image n'est pas supporté par des méthodes statistiques telles que entitySelection.max( ).
En mode "verrouillage optimiste", les entités ne sont pas verrouillées explicitement avant d'être mises à jour. Chaque entité a un marqueur interne qui est automatiquement incrémenté chaque fois que l'entité est enregistrée sur le disque. Les méthodes entity.save( ) ou entity.drop( ) retourneront une erreur si le marqueur de l'entité chargée en mémoire et le marqueur de l'entité sur le disque ne correspondent pas, ou si l'entité a été supprimée. Le verrouillage optimiste est uniquement disponible dans l'implémentation ORDA. Voir aussi "verrouillage pessimiste".
Un "verrouillage pessimiste" signifie qu'une entité est verrouillée avant que l'on y accède, en utilisant la méthode entity.lock( ). Les autres process ne peuvent ni mettre à jour ni supprimer l'entité tant qu'elle n'est pas déverrouillée. Le langage 4D classique n'autorise que les verrouillages pessimistes. Voir "Verrouillage optimiste".
Note :Attributs et propriétés sont des concepts similaires. "Attribut" est utilisé pour désigné les propriétés de la dataclass qui stockent les données, tandis que "propriété" est plus générique et définit une donnée stockée dans un objet.
Un propertyPath est le chemin d'accès à une propriété dans un objet donné. Si la propriété est imbriquée dans plusieurs niveaux, chaque niveau est séparé par un point (".").
Les attributs relationnels sont utilisés pour conceptualiser les relations entre les dataclasses (N vers 1 et 1 vers N).
Relation N vers 1 (la dataclassA référence une occurence de la dataclassB) : un attribut relationnel est disponible dans la dataclassA et référence une instance de la dataclassB.
Relation 1 vers N (une occurence de la dataclassB référence plusieurs occurences de la dataclassA) : un attribut relationnel est disponible dans la dataclassB et référence plusieurs instances de la dataclassA.
Une dataclass peut avoir des attributs relationnels récursifs.
Dans une entité, la valeur d'un attribut relationnel peut être de type entity ou entity selection.
Une entité liée peut être vue comme l'instance d'un attribut relationnel dans une dataclass.
Les sélections d'entités peuvent faire référence à des entités liées en fonction des attributs relationnels définis dans les dataclasses correspondantes.
Une base 4D ouverte sur un 4D ou un 4D Server (disponible via HTTP) et exposée en ressource REST. Cette base peut être référencée localement comme un Datastore depuis d'autres postes de travail où un locaID est assigné. Le datastore distant peut être utilisé par des concepts ORDA (datastore, dataclass, entity selection, etc.). Cette utilisation est soumise à un système de licence.
Lorsque l'application 4D est connectée à un Datastore distant, une session est créée sur le 4D Server (HTTP). Un cookie de session est généré et associé à l'identifiant du datastore local.
Chaque fois qu'une nouvelle session est ouverte, une licence est utilisée. Chaque fois qu'une session est fermée, la licence est libérée.
Les sessions inactives sont automatiquement fermées après le timeout. Le timeout par défaut est de 48 heures, et peut être paramétré par le développeur (il doit être supérieur à 60 minutes).
Une copie superficielle (shallow copy) ne fait que dupliquer la structure des éléments et conserve les mêmes références internes. Après une copie superficielle, deux collections partageront les éléments individuels. Voir aussi Copie profonde.
Utilisé dans la technologie du verrouillage "optimiste". Toutes les entités ont un compteur interne, le marqueur, qui est incrémenté chaque fois que l'entité est sauvegardée. En comparant automatiquement les marqueurs entre une entité sauvegardée et sa version stockée sur disque, 4D peut empêcher les modifications simultanées sur les mêmes entités.