(DRIVER-MAPPING-CURSOR `<mapping-name>`. `<cursor>`)

(DRIVER-MAPPING-CURSOR0 `<mapping>`. `<cursor>`)

[SUBR à 1 ou 2 arguments]

Variables-fonctions permettant d'accéder en lecture au curseur courant du schéma de correspondances de nom `<mapping-name>` si `<cursor>` n'est pas fourni, et de le remplacer par `<cursor>` dans le cas contraire.

Exemple:

? (DRIVER-MAPPING-CURSOR 'map1)
= #:tclass:cursor:#[ingres 0 t ()]

(DRIVER-CURRENT-CURSOR `<cursor>`)

[SUBR à 0 ou 1 argument]

Variable-fonction permettant d'accéder en lecture au curseur courant du schéma courant si `<cursor>` n'est pas fourni, et de le remplacer par `<cursor>` dans le cas contraire.

REMARQUE : Un curseur n'est courant que relativement à un schéma donné. Si le schéma courant change, le curseur courant est également susceptible de changer.

Exemple:

? (DRIVER-CURRENT-CURSOR)
= #:tclass:cursor:#[ingres 0 t ()]

DRIVER-FATAL-REQUEST-ERROR

[Variable]

Si la variable système `DRIVER-FATAL-REQUEST-ERROR` vaut t (valeur par défaut), tout échec de requête pour cause d'erreur détectée par le SGBD provoque une erreur `DRIVER`. Si elle vaut (), l'exécution continue comme si la requête était valide.

## B.2.2 Filtrage et manipulation des objets relationnels

DRIVER-COMMIT-AFTER-READING

[Variable]

Si la variable système `DRIVER-COMMIT-AFTER-READING` vaut t (valeur par défaut), toutes les requêtes de consultation qui ne sont pas faites dans le cadre d'écritures d'objets dans la base sont suivies d'une validation SGBD (commit SQL) qui déverrouille les données et les rend accessibles aux autres utilisateurs. Dans le cas contraire, seul `DRIVER-COMMIT-OBJECTS` déclenche une validation SGBD.
(DRIVER-EXISTENT-KEY-P `<class-name> <key-value>`)

(DRIVER-EXISTENT-KEY-P0 `<class> <key-value>`)

[SUBR à 2 arguments]

Ce prédicat est vrai et renvoie t si la valeur de clé `<key-value>` (liste de valeurs correspondant à la liste des attributs composant la clé de la table principale associée à la classe) correspond à un objet relationnel au moins instance de la classe de nom `<class-name>` (resp. l'objet `<class>`).

Cette fonction n'est utilisable que quand la connexion à la base a été réalisée car elle engendre une requête SQL qui est immédiatement envoyée à la base pour tester l'existence d'un n-uplet relationnel.

Exemple:

Les réponses retournées par `DRIVER-EXISTENT-KEY-P` ci-après ont été obtenues alors que :

- le tuple de clé 50 dans la relation `emp` n'existe pas;

- le tuple de clé 7027 existe mais ne vérifie pas les contraintes imposées par la classe `Employé`;

- le tuple de clé 7698 existe et vérifie les contraintes imposées par la classe `Employé` sans vérifier celles imposées par la classe `Vendeur`;

- le tuple de clé 7499 existe et vérifie les contraintes imposées par la classe `Vendeur`.

```
? (DRIVER-EXISTENT-KEY-P 'Employe '(50))
= ()
? (DRIVER-EXISTENT-KEY-P 'Employe '(7027))
= ()
? (DRIVER-EXISTENT-KEY-P 'Employe '(7698))
= t
? (DRIVER-EXISTENT-KEY-P 'Vendeur '(7698))
= ()
? (DRIVER-EXISTENT-KEY-P 'Employe '(7499))
= t
? (DRIVER-EXISTENT-KEY-P 'Vendeur '(7499))
= t
```

(DRIVER-GET-OBJECT `<class-name> <key-value>`)

(DRIVER-GET-OBJECT0 `<class> <key-value>`)

[SUBR à 2 arguments]
Renvoie l'objet jumeau associé à l'objet relationnel de classe de nom <class-name>
 resp. l'objet <class>) dont la clé dans la base a pour valeur <key-value>
 (liste de valeurs correspondant à la liste des attributs composant la clé de la table principale associée à la classe), s'il a été construit, et sinon, le défaut d'objet le représentant.

Si la variable système `DRIVER-EXISTENT-KEY-TEST` vaut t (la valeur par défaut est nil), `DRIVER` vérifie que la valeur de clé existe.

Exemple:

```sql
? (DRIVER-GET-OBJECT 'Employe '(7499))
= driver-object-default-1
```

## DRIVER-EXISTENT-KEY-TEST

[Variable]

Si la variable système `DRIVER-EXISTENT-KEY-TEST` vaut t (la valeur par défaut est nil), `DRIVER` vérifie à l'appel de `DRIVER-GET-OBJECT` que la valeur de clé correspond effectivement à un objet relationnel en appelant la fonction `DRIVER-EXISTENT-KEY-P`. Cette option est relativement coûteuse puisqu'elle engendre une requête SQL qui est immédiatement envoyée à la base.

Exemple :

```sql
? DRIVER-EXISTENT-KEY-TEST
= ()
? (DRIVER-GET-OBJECT 'Employe '(1)) ; clef inexistante dans la base
= driver-object-default-2
? (SETQ DRIVER-EXISTENT-KEY-TEST t)
= t
? (DRIVER-GET-OBJECT 'Employe '(1))
** driver-get-object : Not an existent object key : (Employe 1)
```

(DRIVER-GET-OBJECT-IF-LOADED <class-name> <key-value>)

(DRIVER-GET-OBJECT-IF-LOADED0 <class> <key-value>)

[SUBR à 2 arguments]

Renvoie l'objet jumeau associé à l'objet relationnel de classe de nom <class-name>
 (resp. l'objet <class>) et de valeur de clé <key-value> (liste de valeurs correspondant à la liste des attributs composant la clé de la table principale associée à la classe), s'il a été construit.

Exemple:

```sql
? (DRIVER-GET-OBJECT-IF-LOADED 'Employe '(7499))
= ()
```
(DRIVER-SELECT-OBJECTS `<applied-lambda>`) [SUBR à 1 argument]

Renvoie la liste des ensembles de valeurs de clé correspondant aux ensembles d'objets qui, dans la base, vérifient le filtre exprimé sous la forme d'une lambda appliquée `<applied-lambda>` :

((LAMBDA (obj1 ... objN) corps-lambda) classe-obj1 ... classe-objN)

`<applied-lambda>` est une liste dont le premier élément est une lambda, et dont les autres précisent la classe des objets associés à ses arguments. Les arguments de la lambda seront chacun instanciés à un des objets des n-uplets à sélectionner.

Un n-uplet d'objets vérifie le filtre si l'application de la lambda à ce n-uplet renvoie une valeur vraie au sens lisp.

Le corps de la lambda doit être constituée d'une expression unique pouvant faire appel aux primitives lisp suivantes : and, or, not, =, eq, neq, neqn, null, <>, <, <=, >, >=, memq et nmemq ((notmemq)). Les primitives à deux arguments doivent être utilisées avec la variable comme premier argument et une constante comme second. Comme les variables représentent des objets, la fonction SEND peut en plus être utilisée pour accéder en lecture aux contenus de leurs champs.

De même, comme `DRIVER-SELECT-OBJECTS` peut en principe servir dans un environnement dynamique, les variables définies avant l'appel de la fonction (par `LET` ou `DEFVAR` par exemple) peuvent être utilisées dans le corps de la lambda.

## Restrictions

L'accès aux champs de type calcul multi-tuples `multitexpr` n'est pas autorisé pour définir le filtre dans la version actuelle de cette fonction.

D'autre part, les méthodes *driverloading* destinées à modifier une valeur issue de la base avant de l'affecter dans un champ ne sont pas utilisées puisque le filtre est directement compilé en SQL. Seules les valeurs brutes des attributs seront donc exploitées.

Enfin, l'usage d'autres primitives lisp de l'interprète n'est pas autorisé car `DRIVER` devra pouvoir compiler l'expression en SQL.

## Exemple:

? ; Filtrer les employes dont le salaire est superieur au seuil
? (DRIVER-SELECT-OBJECTS
? '((LAMBDA (o1) (>= (SEND 'salaire o1) seuil))
? Employe))
*** driver-select-objects : unbounded variable : seuil
? (LET ((seuil 1500.))
? (DRIVER-SELECT-OBJECTS
```sql
((LAMBDA (o1) (>= (SEND 'salaire o1) seuil)))
? Employe)))
= (((7839)) ((7566)) ((7698)) ((7782))
((7902)) ((7788)) ((7499))))
?
? ; Filtrer les employe ayant une voiture de meme modele
? ; que leur chef
? (DRIVER-SELECT-OBJECTS
? '((LAMBDA (obj)
? (EQ (SEND ' modele (SEND 'vehicule obj)))
? (SEND ' modele (SEND 'vehicule (SEND 'chef obj)))))
? Employe)))
= (((7782)))
?
? ; Filtrer les couples d'employes ayant meme chef et dont le
? ; salaire du premier est superieur a celui du second
? (DRIVER-SELECT-OBJECTS
? '((LAMBDA (o1 o2)
? (AND (EQ (SEND 'chef o1) (SEND 'chef o2))
? (> (SEND 'salaire o1) (SEND 'salaire o2)))))
? Employe Employe)))
= (((7655) (7521)) ((7655) (7654)) ((7499) (7521))
((7499) (7654)) ((7499) (7655)) ((7698) (7782))
((7566) (7782)) ((7566) (7698))))
? ; Filtrer les couples Vendeur-Employe, tous deux ayant meme
? ; chef, tel que le salaire du vendeur est superieur a celui
? ; de l'employe
? (DRIVER-SELECT-OBJECTS
? '((LAMBDA (o1 o2)
? (AND (EQ (SEND 'chef o1) (SEND 'chef o2))
? (> (SEND 'salaire o1) (SEND 'salaire o2)))))
? Vendeur Employe)))
= (((7499) (7521)) ((7499) (7654)) ((7499) (7655))
((7655) (7521)) ((7655) (7654))))
```

`(DRIVER-LOAD-CLASS-OBJECTS <class-name> . <key-values>)`

`(DRIVER-LOAD-CLASS-OBJECTS0 <class> . <key-values>)`

[SUBR à 1 ou 2 arguments]

Construit et renvoie les objets jumeaux associés aux objets relationnels de classe principale de nom `<class-name>` (resp. l'objet `<class>`) dont les clés dans la base ont pour valeur `<key-values>` (liste des listes de valeurs correspondant à la liste des attributs composant la clé de la table principale associée à la classe). Si `<class-name>` est le nom d'une classe qui n'est pas principale, sa classe principale est
(de {Employe}:driver-object-loaded (object class)
(print "Employe " object
"charge (Champs propres a la classe " class ")"))

(DRIVER-LOAD-DEEP-OBJECTS <objects>) [SUBR à 1 argument]

Construit les objets jumeaux des objets passés en arguments et tous les objets qu'ils
référencent directement ou indirectement.

ATTENTION : Seuls les objets passés en argument sont rechargés (anciennes valeurs écrasées). Les objets référencés qui ont déjà été construits dans l'environnement ne sont pas rechargés mais seulement retrouvés en mémoire.

Exemple:

? (DRIVER-LOAD-DEEP-OBJECTS (LIST (DRIVER-GET-OBJECT 'Adresse '(7499)))))
= (adresse-23)

(DRIVER-ALL-PERSISTENT-OBJECTS-IN-MEMORY) [SUBR sans argument]

Retourne la liste de tous les objets persistants référencés dans l'environnement, que
ce soient des objets jumeaux ou des défauts d'objet.

Exemple :

? (DRIVER-ALL-PERSISTENT-OBJECTS-IN-MEMORY)
= ()

B.2.3 Manipulation explicite des défauts d'objet

Les fonctions DRIVER-GET-OBJECT(0) permettent de contruire le défaut d'objet d'un
objet relationnel qui n'aurait pas encore de référence dans l'environnement.

(DRIVER-OBJECT-DEFAULT-CLASS) [SUBR sans argument]

Renvoie l'objet classe DRIVER des défauts d'objet. La construit si elle n'existe pas déjà.

Exemple :

? (DRIVER-OBJECT-DEFAULT-CLASS)
= driver-object-default

(DRIVER-OBJECT-DEFAULT-P <object-default>) [SUBR à 1 argument]
Ce prédicat est vrai et renvoie l'objet <object-default> si ce dernier est un défaut d'objet.

Exemple:

? (DRIVER-OBJECT-DEFAULT-P (DRIVER-GET-OBJECT 'Employe '(7698)))
= driver-object-default-17

(DRIVER-LOAD-OBJECT-DEFAULT <object-default>)

[SUBR à 1 argument]

Construit et renvoie l'objet jumeau associé au défaut d'objet <object-default>. L'objet jumeau se substitue au défaut d'objet partout où ce dernier était référencé. Si le défaut d'objet correspond à un objet qui est manquant, la fonction DRIVER-MISSING-OBJECT-PROCESSING est appelée.

Exemple:

? (DRIVER-LOAD-OBJECT-DEFAULT
? (DRIVER-GET-OBJECT 'Employe '(7698)))
= blake

(DRIVER-MISSING-OBJECT-PROCESSING <default>)

[SUBR à 1 argument]

En cas de tentative malheureuse de chargement d'un défaut d'objet, la fonction DRIVER-MISSING-OBJECT-PROCESSING est appelée avec, en argument, le défaut d'objet incriminé. Par défaut, elle déclenche une erreur "Objet manquant" :

(de DRIVER-MISSING-OBJECT-PROCESSING (default)
 error 'driver-missing-object-processing
 "Missing relational object" default))

Elle peut être redéfinie.

B.2.4 Accès à l'objet relationnel

(DRIVER-SEND <message> <object> . <args>)

[SUBR à 2 et plus arguments]
Envoie le message `<message>` à l'objet `<object>` avec les arguments `<args>`. Si `<object>` est un défaut d'objet, le jumeau est construit et se substitue à lui avant l'envoi de message.

Exemple :

```
? (DRIVER-GET-OBJECT 'Employe '(7839))
= driver-object-default-30
? (DRIVER-SEND 'salaire (DRIVER-GET-OBJECT 'Employe '(7839)))
= 5000.
? (DRIVER-GET-OBJECT 'Employe '(7839))
= king
```

### (DRIVER-READ-FIELD-VALUE <field-name> <object>)

[SUBR à 2 arguments]

Renvoie le contenu du champ `<field-name>` de l'objet `<object>`. Si ce dernier est encore un défaut d'objet, le jumeau est construit et se substitue à lui avant lecture du champ.

Exemple :

```
? (DRIVER-GET-OBJECT 'Employe '(7654))
= driver-object-default-18
? (DRIVER-READ-FIELD-VALUE 'salaire
? (DRIVER-GET-OBJECT 'Employe '(7654)))
= 1250
? (DRIVER-GET-OBJECT 'Employe '(7654))
= martin
```

### (DRIVER-SET-FIELD-VALUE <field-name> <object> <value>)

[SUBR à 3 arguments]

Affecte le champ `<field-name>` de l'objet `<object>` avec la valeur `<value>`. Si ce dernier est encore un défaut d'objet, le jumeau est construit et se substitue à lui avant écriture du champ.

Exemple :

```
? (DRIVER-GET-OBJECT 'Employe '(7329))
= driver-object-default-14
? (DRIVER-SET-FIELD-VALUE 'salaire
? (DRIVER-GET-OBJECT 'Employe '(7329)) 1500.)
= 1500.
? (DRIVER-GET-OBJECT 'Employe '(7329))
= smith
```
DRIVER-UPDATE-DAEMON-P

[Variable]

Si la variable système `DRIVER-UPDATE-DAEMON-P` vaut t (la valeur par défaut est ()), `DRIVER` met à jour un objet jumeau s'il a connaissance par l'une des fonctions `DRIVER-READ-FIELD-VALUE-IN-DATABASE(0)` ou `DRIVER-SET-FIELD-VALUE-IN-DATABASE(0)` que l'objet relationnel correspondant a une valeur différente.

Pour plus de détails, consulter la description de ces fonctions.

(DRIVER-READ-FIELD-VALUE-IN-DATABASE <field-name> <object>)

(DRIVER-READ-FIELD-VALUE-IN-DATABASE0 <field> <object>)

[SUBR à 2 arguments]

Renvoie le contenu du champ `<field-name>` (resp. l'objet champ `<field>`) de l'objet `<object>` en allant directement lire la valeur dans la base de données. La lecture du champ ne provoque pas la mutation d'un défaut d'objet en jumeau.

Quand la variable `DRIVER-UPDATE-DAEMON-P` vaut t (la valeur par défaut est `nil`), si l'objet jumeau est déjà constitué et que la valeur du champ lue dans la base est différente de celle se trouvant dans l'objet, le champ en question est mis à jour dans l'objet jumeau.

Exemple:

```pascal
? (DRIVER-GET-OBJECT 'Employe '(7655))
= driver-object-default-19
? (DRIVER-READ-FIELD-VALUE-IN-DATABASE 'salaire
? (DRIVER-GET-OBJECT 'Employe '(7655)))
= 1350
? (DRIVER-GET-OBJECT 'Employe '(7655))
= driver-object-default-19
```

(DRIVER-SET-FIELD-VALUE-IN-DATABASE <field-name>

<object> <value>)

(DRIVER-SET-FIELD-VALUE-IN-DATABASE0 <field> <object> <value>)

[SUBR à 3 arguments]

Affecte le champ `<field-name>` (resp. l'objet champ `<field>`) de l'objet `<object>` avec la valeur `<value>` directement dans la base de données. L'écriture du champ ne provoque pas la mutation d'un défaut d'objet en jumeau.

On ne vérifie pas que la valeur affectée dans la base respecte les constraintes de classe de l'objet. Ainsi, une affectation dans la base peut provoquer la mutation d'un objet vers une nouvelle classe. La classe de l'objet relationnel devient alors différente de la classe de l'objet jumeau correspondant.
Quand la variable `DRIVER-UPDATE-DAEMON-P` vaut t (la valeur par défaut est `nil`), si l'objet jumeau est déjà constitué et que la valeur du champ écrite dans la base est différente de celle se trouvant dans l'objet, le champ en question est mis à jour dans l'objet jumeau.

Quand la variable `DRIVER-MESSAGES-P` vaut t (valeur par défaut), un message est imprimé dans le terminal quand `DRIVER` modifie la base de données.

**ATTENTION** Ces fonctions permettent d'aller directement écrire dans la base une information. Elles violent donc les règles qui régissent les transactions `DRIVER`. Leur utilisation doit donc être circonspecte et pertinente.

Exemple:

```sql
? (DRIVER-GET-OBJECT 'Employe '(7655))
= driver-object-default-19
? (DRIVER-SET-FIELD-VALUE-IN-DATABASE 'salaire
? (DRIVER-GET-OBJECT 'Employe '(7655)) 1400.)
Mise-a-jour de l'objet driver-object-default-19
= 1400.
? (DRIVER-GET-OBJECT 'Employe '(7655))
= driver-object-default-19
? (DRIVER-READ-FIELD-VALUE-IN-DATABASE 'salaire
? (DRIVER-GET-OBJECT 'Employe '(7655)))
= 1400.
```

(DRIVER-OBJECT-CLASS-IN-DATABASE <object>)

[SUBR à 1 argument]

Renvoie la classe que l'objet `<object>` a dans la base de données. Cette classe peut être différente de celle de l'objet `<object>`.

Exemple:

```sql
? (DRIVER-OBJECT-CLASS-IN-DATABASE (DRIVER-GET-OBJECT 'Employe '(7655)))
= Vendeur
```

(DRIVER-OBJECT-CLASS <object>) [SUBR à 1 argument]

Renvoie la classe (persistante) de l'objet `<object>`. Si `<object>` est encore un défaut d'objet, consulte alors la classe de l'objet relationnel associé dans la base de données (fait appel à `DRIVER-OBJECT-CLASS-IN-DATABASE` pour cela).

Exemple:
```sql
? (DRIVER-OBJECT-CLASS (DRIVER-GET-OBJECT 'Employe '(7655)))
= Vendeur
```

(DRIVER-OBJECT-MAIN-CLASS <object>) [SUBR à 1 argument]

Renvoie la classe principale (persistante) de l'objet <object>.

Exemple:

```sql
? (DRIVER-OBJECT-MAIN-CLASS (DRIVER-GET-OBJECT 'Employe '(7655)))
= Employe
```

(DRIVER-CLASS-INSTANCE-P-IN-DATABASE <class-name> <object>)

(DRIVER-CLASS-INSTANCE-P-IN-DATABASE0 <class> <object>)

[SUBR à 2 arguments]

Teste si l'objet <object> est au moins instance de la classe de nom <class-name>
 resp. l'objet <class>) dans la base de données.

Exemple:

```sql
? (DRIVER-GET-OBJECT 'Employe '(7655))
= driver-object-default-19
? (DRIVER-CLASS-INSTANCE-P-IN-DATABASE 'Vendeur
? (DRIVER-GET-OBJECT 'Employe '(7655)))
= t
```

B.2.5 Écriture d'objets dans la base de données

Une transaction concerne un objet au moins, l'ensemble des objets de la couche virtuelle
au plus. Elle débute suite à la connexion à la base ou après la validation de la transaction
précédente.

(DRIVER-COMMIT-OBJECTS <objects> . <deep>)

[SUBR à 1 ou 2 arguments]

Valide la transaction courante. Si <objects> vaut t, tous les objets persistants de
la couche virtuelle sont validés dans la base. Si <objects> est une liste d'objets, la
validation ne s'applique à eux.

Quand une liste d'objets est précisée, deux nouvelles possibilités apparaissent, selon
la valeur de l'argument deep :
- Si *deep* n'est pas précisé ou s'il vaut t (valeur par défaut) sont non seulement sauvés dans la base les objets indiqués, mais également l'ensemble des objets qu'ils référencent directement ou indirectement par ses champs persistants.

- Si *deep* vaut () ne sont sauvés que les objets précisés. Cependant, dans ce second cas, sont également écrits dans la base les objets non encore persistants directement référencés par l'un au moins des objets à valider. Si l'un d'entre eux référence lui-même un nouvel objet non persistant, ce dernier est également écrit dans la base, et ainsi de suite.

Quand une liste d'objets est précisée, elle peut comprendre des objets non encore persistants. L'application de DRIVER-COMMIT-OBJECTS sur ces objets les rend alors persistants.

La variable système DRIVER-WRITING-HELP oriente le traitement des erreurs de validation de transaction. Voir sa description ci-après.

La variable DRIVER-MESSAGE-P contrôle l'affichage de messages. Si elle vaut t (valeur par défaut), des messages sont affichés lorsque la base de données est modifiée.

Exemple:

```sql
? (DRIVER-COMMIT-OBJECTS (LIST (DRIVER-GET-OBJECT 'Employe '(7329))))
Mise-a-jour de l'objet smith
= (smith)
```

### DRIVER-FIX-KEY-GENERATION-P

[Variable]

Quand un objet doit être inséré dans la base (objet nouvellement persistant), DRIVER doit lui affecter des valeurs de clé pour toutes les tables élémentaires de sa classe. Quand un attribut de clé est de type numérique et si la variable système DRIVER-FIX-KEY-GENERATION-P vaut t (valeur par défaut), DRIVER interroge la base pour connaître la valeur maximale de cet attribut et donne la valeur $max + 1$ à l'attribut pour l'objet. Dans le cas contraire, DRIVER demande une valeur à l'utilisateur.

### DRIVER-WRITING-HELP

[Variable]

La variable système DRIVER-WRITING-HELP oriente le traitement des erreurs de validation de transaction. Si elle vaut t (valeur par défaut), les erreurs sont analysées et des corrections sont proposées à l'utilisateur. Si elle vaut (), l'erreur est simplement déclenchée.

(DRIVER-ROLLBACK-OBJECTS <objects>)

[SUBR à 1 argument]
Annule toute modification effectuée pendant la transaction sur les objets précisés. Si <objects> vaut t, l'annulation porte sur l'ensemble des objets persistants de la couche virtuelle. L'annulation est obtenue en retransformant en défauts d'objet tous les objets persistants concernés.

Exemple:

? (DRIVER-ROLLBACK-OBJECTS (LIST (DRIVER-GET-OBJECT 'Employe '(7329))))
= (smith)

## B.2.6 Persistance des schémas de correspondances

Les schémas de correspondances sont persistants grâce à l'existence d'un méta schéma qui détermine la correspondance relationnelle des classes système de `DRIVER`.

(DRIVER-METAMAPPING)

[SUBR sans argument]

Renvoie le méta-schéma de correspondances.

Exemple:

? (DRIVER-METAMAPPING)
= driver-metamapping

(DRIVER-LOAD-MAPPING <mapping-name> . <overwrite>)

[SUBR à 1 ou 2 arguments]

Charge dans l'environnement le schéma de correspondances de nom <mapping-name>. Ce schéma doit être contenu dans les tables système `DRIVER` définies dans la base de données relationnelle.

En cas de tentative de rechargement d'un schéma, l'erreur "schéma déjà existant" est provoquée, sauf si <overwrite> est précisé à t. Dans ce cas, l'ancienne définition est perdue, écrasée par la nouvelle, ainsi que toutes les définitions qui y étaient rattachées (sauf son éventuel curseur). Toutes les structures qui le contenaient pointent maintenant sur la nouvelle.

Exemple:

? (DRIVER-LOAD-MAPPING 'map2)
= map2

(DRIVER-SAVE-MAPPING <mapping-name>)

(DRIVER-SAVE-MAPPING0 <mapping>)

[SUBR à 1 argument]
Ècrit le schéma de correspondances de nom `<mapping-name>` dans la base de données. L'écriture a lieu dans les tables système `DRIVER` définies dans la base de données relationnelle.

Exemple:

```sql
? (DRIVER-SAVE-MAPPING 'map1')
= map1
```

### B.2.7 Interaction avec l'utilisateur

#### DRIVER-MESSAGES-P

[Variable]

Boolean. Quand cette variable vaut t (valeur par défaut), `DRIVER` est autorisé à afficher des messages pour signaler toute action importante qu'il entreprend (modification d'un objet, mise-à-jour ou insertion de données relationnelles dans la base, etc...).

#### (DRIVER-PRINT <message>)

[SUBR à 1 argument]

Cette fonction est utilisée par `DRIVER` pour afficher un message `<message>` destiné à l'utilisateur.

Elle peut être redéfinie.

#### (DRIVER-WARNING <message>)

[SUBR à 1 argument]

Cette fonction est utilisée par `DRIVER` pour prévenir l'utilisateur d'un problème. La teneur de l'avertissement est précisée dans le message `<message>`.

Cette fonction peut être redéfinie.

#### (DRIVER-ASK-VALUE <message> <lvalues> <exit>)

[SUBR à 3 arguments]

Cette fonction est utilisée par `DRIVER` pour demander à l'utilisateur de lui fournir une valeur. La demande est exprimée dans le message `<message>`. Éventuellement, une liste de valeurs possibles `<lvalues>` peut être précisée; si toute valeur est autorisée, `<lvalues>` vaut `()`. Quand `DRIVER` autorise l'annulation de la demande, il fournit par `<exit>` un nom d'échappement à utiliser pour ce cas.

Cette fonction peut être redéfinie.
B.2.8 Divers

(DRIVER-ALL-LINKED-OBJECTS <objects>)

[SUBR à 1 argument]

Renvoie la liste des objets référencés directement ou indirectement par l'ensemble
d'objets <objects>.

Exemple:

? (DRIVER-GET-OBJECT 'Employe '(7654))
= martin
? (DRIVER-ALL-LINKED-OBJECTS (LIST (DRIVER-GET-OBJECT 'Employe '(7654)))))
= (martin blake driver-object-default-10 sales driver-object-default-8
driver-object-default-3 driver-object-default-9 allen driver-object-default-5
driver-object-default-6 driver-object-default-17 driver-object-default-19
driver-object-default-20 driver-object-default-22 driver-object-default-23
driver-object-default-24 driver-object-default-25)

DRIVER-COMPACT-KEY-SEPARATOR

[Variable]

Contient le code du caractère utilisé comme séparateur dans les clés compactes en
interne à DRIVER. Par défaut, DRIVER-COMPACT-KEY-SEPARATOR vaut #//
(code du caractère “ / ”).
La macro `DRIVER-DEFCLASSMAP` génère de nouveaux noms de tables logiques pour la correspondance de chaque classe afin d'obtenir des espaces de nom indépendants.

Lors de la description des correspondances de la classe nom-class, `DRIVER-DEFCLASSMAP` substitue à la table nom-table une nouvelle table de nom :

`(CATENATE (DRIVER-CREATE-SYNONYM nom-class) ’@ nom-table)`

(DRIVER-CREATE-SYNONYM `<symbol>`) [SUBR à 1 argument]

Crée et renvoie un synonyme pour le symbole `<symbol>`

Exemple :

? (DRIVER-CREATE-SYNONYM ’toto)
= t119

(DRIVER-FIND-SYNONYM `<symbol>`) [SUBR à 1 argument]

Retrouve le synonyme défini pour le symbole `<symbol>`

Exemple :

? (DRIVER-FIND-SYNONYM ’toto)
= t119

(DRIVER-FIND-SYNONYM-KEY `<synonym>`) [SUBR à 1 argument]

Retrouve le symbole pour lequel a été généré le synonyme `<synonym>`.

Exemple :

? (DRIVER-FIND-SYNONYM-KEY ’t119)
= toto
## B.3 Filtrage des champs en lecture et écriture

Des filtres peuvent être définis pour modifier des données issues de la base avant leur affectation dans le champ d'un objet. De manière similaire, le contenu d'un champ peut être modifié avant d'être reporté dans la base de données. Ces filtres sont mis en place sous forme de méthodes qui sont invoquées lors des transferts de données.

Les méthodes **driverloading** sont invoquées pour filtrer une donnée issue de la base et destinée à être placée dans le champ d'un objet. Inversement, les méthodes **driverwriting** sont invoquées pour filtrer un contenu de champ à reporter dans la base de données.

Le filtre est défini lors de la création du champ avec l'une des fonctions `DRIVER-DEFCLASS` ou `DRIVER-CREATE-FIELD` en utilisant l'option `filter` dont la syntaxe est :

```
(filter <filter-name>)
    ou
(filter (<filter-name> [class] [field] [object]))
```

Cette déclaration implique la définition par l'utilisateur des deux méthodes `#:driver loading:<filter-name>` et `#:driverwriting:<filter-name>` qui assureront le filtrage des valeurs entre le champ correspondant et la base de données.

Si le mot-clé filter introduit le seul symbole `<filter-name>`, les méthodes seront invoquées avec comme unique argument la valeur à filtrer. Si au contraire il introduit une liste de paramètres, le premier doit être le nom du filtre `<filter-name>` suivi d'un ou plusieurs mots réservés parmi *class*, *field* et *object*. Dans ce cas, les méthodes seront invoquées avec comme premier argument la valeur à filtrer, puis, selon les mots réservés choisis, l'objet *DRIVER* classe de l'instance à laquelle appartient le champ, l'objet *DRIVER* field correspondant au champ concerné, ou encore l'instance concernée elle-même. Le passage de ces différents objets avec la valeur à filtrer permet de tenir compte du contenu de certains de leurs champs pour déterminer la valeur renvoyée par le filtre.

La fonction `DRIVER-FIELD-LOADING-ORDER` permet d'établir l'ordre de chargement des champs d'un objet. Un intérêt de pouvoir choisir cet ordre peut être d'utiliser le contenu de certains champs de l'objet en cours de chargement – champs à charger en priorité donc – pour en construire d'autres. Un des exemples illustre cette possibilité.

Un certain nombre de types de champ atomiques ont des filtres qui leur sont associés par défaut. Ces types sont *symbol*, *float*, *fix*, *integer* et *string*. Il n'est donc pas nécessaire de redéfinir un filtre par exemple pour un champ atomique de type symbole associé à un attribut relationnel de type string. Bien entendu, l'utilisateur est libre de le faire s'il le souhaite.

Exemple:

```
? (DRIVER-ADD-FIELD-TYPE 'date)
```
```
= date
? (DRIVER-CREATE-FIELD 'Employe 'date_embauche 'atom 'date)
= date_embauche
? (DRIVER-MAP-FIELD 'Employe 'date_embauche '(emp bdate)
? () '(filter date1))
= t
? (de #:driverloading:-date1 (datestr)
? (build-date-from-string datestr)) ; user function call
= #:driverloading:-date1
? (de #:driverwriting:-date1 (date)
? (build-date-string date)) ; user function call
= #:driverwriting:-date1
? (DRIVER-ADD-FIELD-TYPE 'misc-type)
= misc-type
? (DRIVER-CREATE-FIELD 'Adresse 'datatype 'atom 'symbol)
= datatype
? (DRIVER-CREATE-FIELD 'Adresse 'data 'atom 'misc-type)
= data
? (DRIVER-MAP-FIELD 'Adresse 'datatype '(address datatype)())
= t
? (DRIVER-MAP-FIELD 'Adresse 'data '(address userdata)
? '(filter (datatyping object)))
= t
? (de #:driverloading:datatyping (data obj)
? (selectq (send 'datatype obj)
? (symbol (symbol () data))
? (float (convert-string-to-float data))
? (t data)))
= #:driverloading:datatyping
? (de #:driverwriting:datatyping (data obj)
? (string data))
= #:driverwriting:datatyping
```

## DRIVER-SYSTEM-FIELD-FILTERS

[Variable]

Contient la liste des filtres système reconnus par DRIVER. Ces filtres particuliers ne sont pas gérés à l'aide de méthodes driverloading et driverwriting.

Exemple :

```
? DRIVER-SYSTEM-FIELD-FILTERS
= ((() integer fix float string symbol)
```

(DRIVER-FILTERS)

[SUBR sans argument]
Renvoie la liste des déclarations de filtres effectuées dans le schema courant. Cette
liste comprend les filtres système utilisés.

Exemple :

? (DRIVER-FILTERS)
= (symbol float fix string integer)

(DRIVER-FIND-FILTER-FIELDS <filter-name>) [SUBR à 1 argument]

Retourne la liste des champs utilisant le filtre de nom <filter-name>.

Exemple :

? (DRIVER-FIND-FILTER-FIELDS 'symbol)
= (nom prenom num-ss qualif tel-prive situ-famille nom sites nom ville etat plaque modele nom genre nom type)

(DRIVER-VALID-FIELD-FILTER <filter-decl>) [SUBR à 1 argument]

Vérifie que la déclaration de filtre <filter-decl> est correcte. Les deux méthodes
**driverloading** et **driverwriting** doivent avoir été créées. En cas d'incorrection,
une erreur est déclenchée.

Exemple :

? (DRIVER-VALID-FIELD-FILTER 'symbol)
= symbol
? (DRIVER-VALID-FIELD-FILTER '(symbol object))
** driver-valid-field-filter : Filter function arguments and filter
declaration mismatch : (symbol object)

(DRIVER-FIELD-FILTER-VALIDATION <filter-name>)

SUBR à 1 argument

Vérifie toutes les déclarations d'utilisation du filtre de nom <filter-name>. En cas
d'incorrection, une erreur est déclenchée.

Exemple :

? (DRIVER-FIELD-FILTER-VALIDATION 'symbol)
= symbol
(DRIVER-LOADING-TYPE-FILTER <field> <object> <value>)

[SUBR à 3 arguments]

Cette fonction fait passer la valeur <value> dans le filtre en lecture éventuellement défini pour le champ <field>. La valeur qu'elle retourne est ensuite affectée dans le champ de l'objet <object> en cours de chargement.

C'est elle qui gère l'application des filtres système ou des méthodes driverloading. Il est possible mais déconseillé de la redéfinir.

(DRIVER-SAVING-TYPE-FILTER <attr> <field> <object> <value>)

[SUBR à 4 arguments]

Cette fonction fait passer la valeur <value> dans le filtre en écriture éventuellement défini pour le champ <field>. La valeur qu'elle retourne est ensuite traitée pour écriture dans la base de données. Quand le champ a pour correspondance un attribut, <attr> est cet attribut, sinon elle vaut (). <object> est l'objet en cours d'écriture.

C'est cette fonction qui gère l'application des filtres système ou des méthodes driverwriting. Il est possible mais déconseillé de la redéfinir.
## B.4 Utilisation d'un nouveau modèle objet

DRIVER peut être utilisé avec de nombreux modèles objets. La description du modèle choisi s'effectue en définissant un certain nombre de méthodes qui permettront au système de créer une classe, une instance, d'affecter un champ, etc.

### B.4.1 Manipulation des modèles objet

Un modèle objet `{USER-OBJECT-MODEL}` à utiliser doit être déclaré sous forme d'une classe `MicroCeyx`, sous-classe de `Driver-Object-model`, classe racine des modèles objet.

Exemple avec SMECI :

```
(DEFTCLASS {Driver-Object-model}:Smeci-object-model)
(DE {Smeci-object-model}:prin (o) (prin "Smeci-object-model"))
```

**DRIVER-ROOT-OBJECT-MODEL** [Variable]

Cette variable contient un objet instance de la classe `Driver-Object-model`, classe racine des modèles objet. Elle ne doit pas être modifiée, sous peine de forte perturbation du système.

**DRIVER-MICROCEYX-OBJECT-MODEL** [Variable]

Cette variable contient un objet instance de la classe `MicroCeyx`, sous-classe de `Driver-Object-model`. Elle ne doit pas être modifiée, sous peine de forte perturbation du système.

**DRIVER-USER-OBJECT-MODEL** [Variable]

Cette variable doit contenir le modèle objet client courant. Elle est consultée à chaque création de schéma de correspondances pour déterminer de quel modèle seront les futurs objets à charger de la base correspondante. Par défaut, `DRIVER-USER-OBJECT-MODEL` contient un objet instance de la classe *MicroCeyx*. `MicroCeyx` est donc le modèle objet utilisé par défaut.

Exemple avec SMECI :

```
(setq DRIVER-USER-OBJECT-MODEL (OMAKEQ {Smeci-object-model}))
```

**(DRIVER-CURRENT-OBJECT-MODEL)** [SUBR sans argument]
Renvoie le modèle objet courant. Ce modèle courant est le modèle du schéma courant, s'il y en a un, ou le modèle référencé par `DRIVER-USER-OBJECT-MODEL` dans le cas contraire. C'est le modèle utilisé par `DRIVER` pour toutes ses opérations effectuées sur les objets client.

Exemple avec `SMECI` :

```c
? (DRIVER-CURRENT-OBJECT-MODEL)
= Smeci-object-model
```

## B.4.2 L'interface fonctionnelle objet

Les exemples de définition de méthode sont présentées pour une utilisation de `DRIVER` avec `SMECI`. La définition de l'interface fonctionnelle pour `Microceyx` est donnée en annexe.

### ({USER-OBJECT-MODEL}:DEFINE-CLASS <o-model> <class>)

[SUBR à 2 arguments]

Cette fonction doit créer la classe correspondant à la classe `DRIVER <class>` dans le modèle objet `USER-OBJECT-MODEL`.

Exemple avec `SMECI` (La méthode complète, notamment les fonctions `:smeci-field-def` et `:class-fields-to-define` sont présentées en annexe §B.8) :

```c
(de {Smeci-object-model}:define-class (object-model class)
  (tag bad-allocation
   (:define-class %class))
  t)
```

```c
(de :define-class (class)
  (if (S-category-p (:class-name class))
    (S-kill-category (:class-name class)))
  (apply 'defScategory
    (mcons (:class-name class)
      (or (if (send 'super class)
        (send 'name (send 'super class)))
        'S.Object)
      (mapcar ':smeci-field-def
        (:class-fields-to-define class)
        (cirlist class))))
  t)
```

```c
(de :class-name (class)
  (if (eq (send 'name class) 'driver-object-default)
    'S Object-default
    (send 'name class)))
```
## ({USER-OBJECT-MODEL}:EXISTING-CLASS-P <o-model> <class>)

[SUBR à 2 arguments]

Méthode devant déterminer si la classe correspondant à la classe `DRIVER <class>` existe dans le modèle objet `USER-OBJECT-MODEL`.

Exemple avec `SMECI` :

(de {Smeci-object-model}:existing-class-p (object-model class)
(S-category-p (:class-name class)))

## ({USER-OBJECT-MODEL}:OMAKE <o-model> <class>)

[SUBR à 2 arguments]

Méthode devant créer et renvoyer une nouvelle instance de la classe correspondant à la classe `DRIVER <class>` dans le modèle objet `USER-OBJECT-MODEL`.

Exemple avec `SMECI` :

(de {Smeci-object-model}:omake (object-model class)
(S-create-object (:class-name class)))

## ({USER-OBJECT-MODEL}:READ-FIELD-VALUE <o-model>

<message> <object>)

[SUBR à 3 arguments]

Fonction devant retourner le contenu du champ `<field-name>` de l'objet `<object>`.

Exemple avec `SMECI` :

(de {Smeci-object-model}:read-field-value (object-model message object)
(S-get-value message object))

## ({USER-OBJECT-MODEL}:SET-FIELD-VALUE <o-model> <message>

<object> <value>)

[SUBR à 4 arguments]

Fonction devant affecter le contenu du champ `<field-name>` de l'objet `<object>` avec la valeur `<value>`.

Exemple avec `SMECI` :
(de {Smeci-object-model}:set-field-value
(object-model message object value)
(ifn (and (memq message '(name nom))
(eq ({Smeci-object-model}:read-field-value
object-model message object)
value))
(S-set-value message object value))
value)

### ({USER-OBJECT-MODEL}:SEND-MESSAGE <o-model> <message>
<object> <args>)
[SUBR à 4 arguments]

Méthode devant envoyer le message <message> à l'objet <object> avec les arguments <args> dans le modèle objet USER-OBJECT-MODEL.

Exemple avec SMECI :

(de {Smeci-object-model}:send-message
(object-model message object args)
(apply 'send (mcons message object args)))

### ({USER-OBJECT-MODEL}:CLASS-INSTANCE-P <o-model>
<object> <class>)
[SUBR à 3 arguments]

Prédicat devant déterminer si l'objet <object> est instance de la classe correspondant à la classe DRIVER <class> dans le modèle objet USER-OBJECT-MODEL.

Exemple avec SMECI :

(de {Smeci-object-model}:class-instance-p (object-model object class)
(S-isa-p object (:class-name class)))

### ({USER-OBJECT-MODEL}:CHANGE-OBJECT-CLASS <o-model>
<newclass> <object>)
[SUBR à 3 arguments]

Fonction devant faire transiter l'objet <object> de son ancienne classe vers la classe correspondant à la classe DRIVER <newclass> dans le modèle objet USER-OBJECT-MODEL.

Exemple avec SMECI :
(de {Smeci-object-model}:change-object-class
(object-model newclass object)
(if (or (driver-object-default-p object)
       (eq newclass (driver-object-default-class)))
(S-change-category object 'S.Object))
(S-change-category object (send 'name newclass)))

({USER-OBJECT-MODEL}:ALL-CLASS-OBJECTS <o-model> <class>)
[SUBR à 2 arguments]

Fonction devant renvoyer l'ensemble des instances de la classe correspondant à la
classe `DRIVER <class>` dans le modèle objet `USER-OBJECT-MODEL`.

Exemple avec SMECI :

(de {Smeci-object-model}:all-class-objects (class)
(S-all-objects (:class-name class)))
## B.5 Exemple de base relationnelle, smecidemo

Cette base relationnelle est celle utilisée dans l'exemple de session d'utilisation présenté ci-après. Elle a été définie sous INGRES Version 6.3/02 sur sun3 et sun4.

Sont présentées d'abord les structures des relations. Suivent ensuite leurs données, l'ensemble étant disposé sous forme de tableaux.

<table><thead><tr><th></th><th></th><th></th></tr></thead><tbody><tr><td>emp</td><td></td><td>Table des employés</td></tr><tr><td>empno</td><td>entier</td><td>Numéro de l'employé, clé de la relation emp</td></tr><tr><td>ename</td><td>20 caractères</td><td>Nom de l'employé</td></tr><tr><td>fname</td><td>20 caractères</td><td>Prénom</td></tr><tr><td>job</td><td>20 caractères</td><td>Emploi dans l'entreprise</td></tr><tr><td>mgr</td><td>entier</td><td>Numéro du chef de l'employé</td></tr><tr><td>sal</td><td>réal</td><td>Salaire</td></tr><tr><td>com</td><td>réal</td><td>Commission, pour certains employés</td></tr><tr><td>deptn</td><td>entier</td><td>Numéro du département de l'employé</td></tr><tr><td>responsible_for</td><td>20 caractères</td><td>référence d'un objet</td></tr><tr><td>person</td><td></td><td>Table des personnes</td></tr><tr><td>pname</td><td>20 caractères</td><td>Nom de la personne</td></tr><tr><td>fname</td><td>20 caractères</td><td>Prénom, nom et prénom forme la clé de la relation</td></tr><tr><td>ssnum</td><td>15 caractères</td><td>Numéro de sécurité sociale</td></tr><tr><td>position</td><td>10 caractères</td><td>Situation de famille</td></tr><tr><td>husband_wife</td><td>10 caractères</td><td>Prénom du conjoint (si marié)</td></tr><tr><td>phone</td><td>12 caractères</td><td>Numéro de téléphone</td></tr><tr><td>car</td><td>entier</td><td>Numéro de la voiture de la personne</td></tr><tr><td>dept</td><td></td><td>Table des départements</td></tr><tr><td>deptno</td><td>entier</td><td>Numéro de département, clé de la relation</td></tr><tr><td>fname</td><td>20 caractères</td><td>Nom du département</td></tr><tr><td>deptsite</td><td></td><td>Tables des sites des départements</td></tr><tr><td>deptno</td><td>entier</td><td>Numéro de département, clé de la relation</td></tr><tr><td>sname</td><td>20 caractères</td><td>Localisation</td></tr><tr><td>salgrade</td><td></td><td>Table donnant le grade en fonction du salaire</td></tr><tr><td>grade</td><td>entier</td><td>grade (nombre), clé de la relation</td></tr><tr><td>losal</td><td>entier</td><td>salaire inférieur</td></tr><tr><td>hisal</td><td>entier</td><td>salaire supérieur</td></tr><tr><td>project</td><td></td><td>Table des projets de recherche</td></tr><tr><td>projno</td><td>entier</td><td>Numéro de projet, clé de la relation</td></tr><tr><td>pname</td><td>20 caractères</td><td>Nom du projet</td></tr><tr><td>budget</td><td>entier</td><td>Son budget</td></tr></tbody></table>
<table><tr><td>emproj</td><td></td><td>Table gérant la relation n-m entre employés et projets, un projet étant constitués d'un certain nombre d'employés, et un employé pouvant appartenir à plusieurs projets</td></tr><tr><td>projno</td><td>entier</td><td>Numéro du projet</td></tr><tr><td>empno</td><td>entier</td><td>Numéro de l'employé<br>projno et empno forment la clé de la relation</td></tr><tr><td>address</td><td></td><td>Table des adresses</td></tr><tr><td>empno</td><td>entier</td><td>Numéro de l'employé de l'adresse en question,<br>clé de la relation</td></tr><tr><td>num</td><td>entier</td><td>Numéro dans la rue</td></tr><tr><td>street</td><td>20 caractères</td><td>Nom de la rue</td></tr><tr><td>zip</td><td>entier</td><td>Code postal</td></tr><tr><td>city</td><td>12 caractères</td><td>Nom de la ville</td></tr><tr><td>state</td><td>5 caractères</td><td>Nom de l'état</td></tr><tr><td>vehicle</td><td></td><td>Table des véhicules</td></tr><tr><td>vnum</td><td>entier</td><td>Numéro de véhicule, clé de la relation</td></tr><tr><td>model</td><td>15 caractères</td><td>Modèle du véhicule</td></tr><tr><td>licence</td><td>15 caractères</td><td>Immatriculation. valeurs uniques</td></tr><tr><td>year</td><td>entier</td><td>Année de construction</td></tr><tr><td>defproducts</td><td></td><td>Tables des produits gérés par les départements</td></tr><tr><td>deptno</td><td>entier</td><td>Numéro de département</td></tr><tr><td>pref</td><td>20 caractères</td><td>Référence d'objet produit</td></tr><tr><td>software</td><td></td><td>Tables des logiciels développé par la société</td></tr><tr><td>softnum</td><td>entier</td><td>Numéro de logiciel</td></tr><tr><td>sname</td><td>20 caractères</td><td>Nom du logiciel</td></tr><tr><td>category</td><td>20 caractères</td><td>Type de logiciel</td></tr><tr><td>year1</td><td>entier</td><td>Date de début de développement</td></tr><tr><td>s_year</td><td>entier</td><td>Date de commercialisation</td></tr><tr><td>hardware</td><td></td><td>Table du matériel développé par la société</td></tr><tr><td>hardnum</td><td>entier</td><td>Numéro de matériel</td></tr><tr><td>hname</td><td>20 caractères</td><td>Nom du produit</td></tr><tr><td>type</td><td>20 caractères</td><td>Type de matériel</td></tr></table>
<table><caption>Table emp</caption><thead><tr><th>empno</th><th>ename</th><th>fname</th><th>job</th><th>mgr</th><th>sal</th><th>com</th><th>deptn</th><th>responsible_for</th></tr></thead><tbody><tr><td>7839</td><td>king</td><td>paul</td><td>president</td><td></td><td>5000.</td><td></td><td>10</td><td>project/102</td></tr><tr><td>7566</td><td>jones</td><td>eric</td><td>manager</td><td>7839</td><td>2975.</td><td></td><td>20</td><td>dept/20</td></tr><tr><td>7698</td><td>blake</td><td>harold</td><td>manager</td><td>7839</td><td>2850.</td><td></td><td>30</td><td>dept/30</td></tr><tr><td>7782</td><td>clark</td><td>john</td><td>manager</td><td>7839</td><td>2450.</td><td></td><td>10</td><td>dept/10</td></tr><tr><td>7902</td><td>ford</td><td>john</td><td>analyst</td><td>7566</td><td>3000.</td><td></td><td>20</td><td>project/101</td></tr><tr><td>7788</td><td>scott</td><td>pit</td><td>analyst</td><td>7566</td><td>3000.</td><td></td><td>20</td><td>project/103</td></tr><tr><td>7499</td><td>allen</td><td>jack</td><td>salesman</td><td>7698</td><td>1600.</td><td>300.</td><td>30</td><td>software/743</td></tr><tr><td>7521</td><td>ward</td><td>peter</td><td>salesman</td><td>7698</td><td>1250.</td><td>1400.</td><td>30</td><td>hardware/53</td></tr><tr><td>7654</td><td>martin</td><td>georges</td><td>salesman</td><td>7698</td><td>1250.</td><td>1400.</td><td>30</td><td></td></tr><tr><td>7655</td><td>james</td><td>peter</td><td>salesman</td><td>7698</td><td>1350.</td><td>1000.</td><td>30</td><td></td></tr><tr><td>7934</td><td>millor</td><td>paul</td><td>clerk</td><td>7782</td><td>1300.</td><td></td><td>10</td><td></td></tr><tr><td>7329</td><td>smith</td><td>john</td><td>clerk</td><td>7902</td><td>800.</td><td></td><td>20</td><td></td></tr></tbody></table>

<table><caption>Table person</caption><thead><tr><th>pname</th><th>fname</th><th>ssnum</th><th>position</th><th>husband_wife</th><th>phone</th><th>car</th></tr></thead><tbody><tr><td>king</td><td>paul</td><td>A34F4</td><td>married</td><td>anita</td><td>40-223233</td><td>1232</td></tr><tr><td>jones</td><td>eric</td><td>B7C123</td><td>married</td><td></td><td>40-783539</td><td>1975</td></tr><tr><td>scott</td><td>helen</td><td>NJGOFBE</td><td>married</td><td>pit</td><td>44-003231</td><td>1928</td></tr><tr><td>king</td><td>anita</td><td>NVJS5</td><td>married</td><td>paul</td><td>40-223233</td><td></td></tr><tr><td>blake</td><td>harold</td><td>A473SE</td><td>celibate</td><td></td><td>44-183211</td><td>1429</td></tr><tr><td>clark</td><td>john</td><td>462SQ1</td><td>married</td><td>laura</td><td>40-893723</td><td>1230</td></tr><tr><td>clark</td><td>laura</td><td>G35H89</td><td>married</td><td>john</td><td>40-893756</td><td></td></tr><tr><td>millor</td><td>rita</td><td>9043TU</td><td>married</td><td>paul</td><td>43-127772</td><td></td></tr><tr><td>ford</td><td>laura</td><td>J9845G2</td><td>married</td><td>john</td><td>40-374845</td><td>4328</td></tr><tr><td>ford</td><td>john</td><td>6D3210</td><td>married</td><td>laura</td><td>40-374845</td><td>4328</td></tr><tr><td>scott</td><td>pit</td><td>A435C</td><td>married</td><td>helen</td><td>44-003231</td><td>1928</td></tr><tr><td>allen</td><td>jack</td><td>76373Y</td><td>celibate</td><td></td><td>78-383726</td><td>2004</td></tr><tr><td>ward</td><td>peter</td><td>128347</td><td>married</td><td>susie</td><td>40-378467</td><td>1253</td></tr><tr><td>ward</td><td>suzie</td><td>OIRGNE</td><td>married</td><td>peter</td><td>40-378502</td><td></td></tr><tr><td>james</td><td>peter</td><td>K4G262</td><td>separate</td><td></td><td>40-449323</td><td></td></tr><tr><td>martin</td><td>georges</td><td>234FS1</td><td>celibate</td><td></td><td>40-276951</td><td>3005</td></tr><tr><td>millor</td><td>paul</td><td>95Z0H5</td><td>married</td><td>rita</td><td>43-127772</td><td>1276</td></tr><tr><td>smith</td><td>john</td><td>J3847Y2</td><td>celibate</td><td></td><td>44-332047</td><td>1550</td></tr></tbody></table>
<table><thead><tr><th colspan="2">Table dept</th></tr><tr><th>deptno</th><th>dnname</th></tr></thead><tbody><tr><td>10</td><td>accounting</td></tr><tr><td>20</td><td>research</td></tr><tr><td>30</td><td>sales</td></tr></tbody></table>

<table><thead><tr><th colspan="2">Table deptsite</th></tr><tr><th>deptno</th><th>sname</th></tr></thead><tbody><tr><td>10</td><td>New-York</td></tr><tr><td>20</td><td>Boston</td></tr><tr><td>30</td><td>Chicago</td></tr><tr><td>10</td><td>Chicago</td></tr><tr><td>30</td><td>Los-Angeles</td></tr><tr><td>30</td><td>Austin</td></tr></tbody></table>

<table><thead><tr><th colspan="2">Table deptproducts</th></tr><tr><th>deptno</th><th>pref</th></tr></thead><tbody><tr><td>20</td><td>software/743</td></tr><tr><td>30</td><td>software/874</td></tr><tr><td>30</td><td>software/743</td></tr><tr><td>30</td><td>hardware/53</td></tr></tbody></table>

<table><thead><tr><th colspan="3">Table salgrade</th></tr><tr><th>grade</th><th>losal</th><th>hisal</th></tr></thead><tbody><tr><td>1</td><td>700</td><td>1200</td></tr><tr><td>2</td><td>1201</td><td>1400</td></tr><tr><td>3</td><td>1401</td><td>2000</td></tr><tr><td>4</td><td>2001</td><td>3000</td></tr><tr><td>5</td><td>3001</td><td>9999</td></tr></tbody></table>

<table><thead><tr><th colspan="3">Table project</th></tr><tr><th>projno</th><th>pname</th><th>budget</th></tr></thead><tbody><tr><td>102</td><td>beta</td><td>175000</td></tr><tr><td>103</td><td>gamma</td><td>95000</td></tr><tr><td>101</td><td>alpha</td><td>250000</td></tr></tbody></table>
<table><thead><tr><th colspan="2">Table emproj</th></tr><tr><th>projno</th><th>empno</th></tr></thead><tbody><tr><td>101</td><td>7566</td></tr><tr><td>101</td><td>7788</td></tr><tr><td>101</td><td>7902</td></tr><tr><td>101</td><td>7329</td></tr><tr><td>101</td><td>7839</td></tr><tr><td>102</td><td>7698</td></tr><tr><td>102</td><td>7521</td></tr><tr><td>102</td><td>7654</td></tr><tr><td>102</td><td>7499</td></tr><tr><td>102</td><td>7566</td></tr><tr><td>103</td><td>7782</td></tr><tr><td>103</td><td>7934</td></tr><tr><td>103</td><td>7566</td></tr></tbody></table>

<table><thead><tr><th colspan="5">Table software</th></tr><tr><th>softnum</th><th>sname</th><th>category</th><th>year1</th><th>s_year</th></tr></thead><tbody><tr><td>743</td><td>Pay1</td><td>pay</td><td>1974</td><td>1975</td></tr><tr><td>874</td><td>Accountancy1</td><td>book-keeping</td><td>1975</td><td>1977</td></tr></tbody></table>

<table><thead><tr><th colspan="3">Table hardware</th></tr><tr><th>hardnum</th><th>hname</th><th>type</th></tr></thead><tbody><tr><td>53</td><td>hbd123</td><td>computer</td></tr></tbody></table>

<table><thead><tr><th colspan="7">Table address</th></tr><tr><th>empno</th><th>num</th><th>street</th><th>zip</th><th>city</th><th>state</th></tr></thead><tbody><tr><td>7839</td><td>345</td><td>5th avenue</td><td></td><td>New-York</td><td>NY</td></tr><tr><td>7566</td><td>34</td><td>Maple street</td><td></td><td>Boston</td><td>MA</td></tr><tr><td>7698</td><td>12</td><td>Vermont street</td><td></td><td>Chicago</td><td></td></tr><tr><td>7782</td><td>125</td><td>86th street</td><td></td><td>New-York</td><td>NY</td></tr><tr><td>7902</td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>7788</td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>7521</td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>7654</td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>7655</td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>7934</td><td>24</td><td>56th street</td><td></td><td>Rego Park</td><td>NY</td></tr><tr><td>7329</td><td>3</td><td>Highgate road</td><td></td><td>Boston</td><td>MA</td></tr><tr><td>7499</td><td></td><td></td><td></td><td></td><td></td></tr></tbody></table>
<table><caption>Table vehicle</caption><thead><tr><th>vnum</th><th>model</th><th>licence</th><th>year</th></tr></thead><tbody><tr><td>1232</td><td>Ford-1300</td><td>FD3840</td><td>1977</td></tr><tr><td>1975</td><td>Chrysler-303</td><td>HG8943</td><td>1973</td></tr><tr><td>1429</td><td>Peugeot-205</td><td>PO2354</td><td>1989</td></tr><tr><td>1230</td><td>Ford-1300</td><td>LD7646</td><td></td></tr><tr><td>4328</td><td>Ekton-730</td><td>HY4738</td><td></td></tr><tr><td>1928</td><td>Peugeot-305</td><td>AW8593</td><td>1985</td></tr><tr><td>2004</td><td>BMW-730</td><td>UU4853</td><td>1990</td></tr><tr><td>1253</td><td>Toyota-1900</td><td>PV3824</td><td></td></tr><tr><td>3005</td><td>Ford-1300</td><td>GH4500</td><td></td></tr><tr><td>1276</td><td>Chrysler-303</td><td>KJ4753</td><td></td></tr><tr><td>1550</td><td>Toyota-1800</td><td>XD4007</td><td></td></tr></tbody></table>
## B.6 Exemple de schéma de correspondances

Ceci est un exemple de schéma de correspondances établi pour l'exploitation de la base de données smecidemo.

Ce schéma est contenu dans le fichier `example.11`.

```
; ------------------------------------------------------
; Mapping Lisp et Bases de donnees relationnelles
; example.11 - Exemple de schema de correspondances
; INRIA/CERMICS - 17 juillet 1991
; ------------------------------------------------------
```

```
;------------------------------------------------------
; Name                : Mapping creation
;------------------------------------------------------
```

`(driver-create-mapping 'map1 t)`

```
;------------------------------------------------------
; Name                : Table definitions
;------------------------------------------------------
```

`(driver-deftable emp`

<table><tr><td>(empno</td><td>integer 2 keypart)</td></tr><tr><td>(ename</td><td>string 20 not-null)</td></tr><tr><td>(fname</td><td>string 20 ())</td></tr><tr><td>(job</td><td>string 20 ())</td></tr><tr><td>(mgr</td><td>integer 2 ())</td></tr><tr><td>(sal</td><td>float 8 ())</td></tr><tr><td>(com</td><td>float 8 ())</td></tr><tr><td>(deptn</td><td>integer 2 ())</td></tr><tr><td>(responsible_for</td><td>string 20 ()))</td></tr></table>

`(driver-deftable person`

<table><tr><td>(pname</td><td>string 20 keypart)</td></tr><tr><td>(fname</td><td>string 20 keypart)</td></tr><tr><td>(ssnum</td><td>string 15 unique)</td></tr><tr><td>(position</td><td>string 10 ())</td></tr><tr><td>(phone</td><td>string 12 ())</td></tr><tr><td>(car</td><td>integer 2 ()))</td></tr></table>

`(driver-deftable salgrade`

<table><tr><td>(grade</td><td>integer 2 keypart)</td></tr><tr><td>(losal</td><td>integer 2 ())</td></tr><tr><td>(hisal</td><td>integer 2 ()))</td></tr></table>

`(driver-deftable dept`

<table><tr><td>(deptno</td><td>integer 2 keypart)</td></tr><tr><td>(dname</td><td>string 20 ()))</td></tr></table>
(driver-deftable deptsite
(dept integer 2 keypart)
(sname string 20 keypart))

(driver-deftable deptproducts
(deptno integer 2 keypart)
 pref string 20 keypart)

(driver-deftable project
 projno integer 2 keypart)
(pname string 20())
(budget integer 2 ()))

(driver-deftable emproj
 (projno integer 2 keypart)
 (empno integer 2 keypart)))

(driver-deftable address
 (empno integer 2 keypart)
 (num integer 2())
 (street string 20())
 (zip integer 2())
 (city string 12())
 (state string 5())))

(driver-deftable vehicle
(vnum integer 2 keypart)
(model string 15())
(licence string 15 unique)
(year integer 2 ()))

(driver-deftable software
(softnum integer 2 keypart)
(sname string 20())
(category string 20())
(year1 integer 2())
(s_year integer 2 ()))

(driver-deftable hardware
(hardnum integer 2 keypart)
(hname string 20())
(type string 20 ()))

;------------------------------------------
; Name : Class descriptions
;------------------------------------------

(driver-defclass Employe ()
 (nom atom symbol (localp ()))
(prenom atom symbol)
(num-ss atom symbol)
(qualif atom symbol)
(chef object Employe)
(responsable-de object2)
(salaire atom float
  (constraint (lambda (s) (and (>= s 700.) (<= s 9999.))))
(grade atom fix (initval 0))
(dpt object Departement)
(adresse object Adresse)
(tel-prive atom symbol)
(vehicule object Vehicule))

(driver-defclass Vendeur Employe
  (qualif (constraint (lambda (qual) (eq qual 'salesman))))
  (situ-famille atom symbol)
  (commission atom float)
  (sal-total monotexpr float))

(driver-defclass Cadre Employe
  (qualif (constraint (lambda (q) (memq q '(manager president)))))

(driver-defclass President Cadre
  (qualif (constraint (lambda (q) (eq q 'president)))))

(driver-defclass Chef-de-service Cadre
  (qualif (constraint (lambda (q) (eq q 'manager)))))

(driver-defclass Departement ()
  (nom atom symbol (localp ()))
  (produits object2set)
  (sites atomset symbol)
  (chefs ordobjset Cadre)
  (personnel objectset Employe)
  (moy-sal multitexpr float)))

(driver-defclass Projet ()
  (nom atom symbol (localp ()))
  (budget atom float)
  (employes ordobjset Employe)
  (sal-total multitexpr float)))

(driver-defclass Adresse ()
  (numero atom fix)
  (rue atom string)
  (ville atom symbol)
  (etat atom symbol)))

(driver-defclass Vehicule ()
  (plaque atom symbol)
(modèle atom symbol))

(driver-defclass Software ()

(nom atom symbol (localp ()))

(genre atom symbol)

(annee1 atom integer)

(annee-vente atom integer))

(driver-defclass Hardware ()

(nom atom symbol (localp ()))

(type atom symbol))

;--------------------------------------------

; Name : Map definitions

;--------------------------------------------

(driver-defclassmap Employe emp

(letjoins

((j1 (emp (p person))

((lambda (a1 a2 a3 a4))

(and (eq a1 a3) (eq a2 a4)))

(emp ename) (emp fname) (p fname) (p fname))))

(j2 (emp (emp1 emp))

((lambda (a1 a2) (eq a1 a2)))

(emp mgr) (emp1 empno))))

(j3 (emp (sg salgrade))

((lambda (a1 a2 a3))

(and (> = a1 a2) (<= a1 a3))))

(emp sal) (sg losal) (sg hisal))))

(j4 (emp dept

((lambda (a1 a2) (eq a1 a2)))

(emp deptn) (dept deptno))))

(j5 (emp address

((lambda (a1 a2) (eq a1 a2)))

(emp empno) (address empno))))

(j6 (p vehicle

((lambda (a1 a2) (eq a1 a2)))

(p car) (vehicle vnum))))

(fields (nom

(emp ename) () (readonly t))

(prenom

(emp fname) () (readonly t))

(num-ss

(p ssnum) (j1))

(qualif

(emp job) ()

(chef

() (j2))

(responsable-de

(emp responsible_for) ()

(salaire

(emp sal) ()

(grade

(sg grade) (j3) (readonly t))

(dpt

() (j4))

(adresse

() (j5))

(tel-prive

(p phone) (j1))

(vehicule

() (j1 j6)))))
(driver-defclassmap Vendeur
 (fields (situ-famille (p position) ((Employe emp p)))
 (commission (emp com) ()))
 (sal-total ((lambda (a1 a2) (+ a1 a2))
             (emp sal) (emp com)) ))))

(driver-defclassmap Departement dept
 (letjoins
  ((j1 (dept (e emp)
   ((lambda (attr1 attr2) (eq attr1 attr2))
    (dept deptno) (e deptn))))
   (j2 (dept (ds deptsite)
    ((lambda (a b) (eq a b))
     (dept deptno) (ds dept)))))
   (j3 (dept (dp deptproducts)
    ((lambda (a b) (eq a b))
     (dept deptno) (dp deptno)))))
 (attrconstraint ((lambda (no) (> no 0)) (dept deptno))
 ))
 (fields (nom (dept dname) ())
 (produits (dp pref) (j3))
 (sites (ds sname) (j2))
 (chefs () (j1)
  (orders ((e sal) desc)
   ((e ename) asc))
  ( readonly t))
 (personnel () (j1) ( readonly t))
 (moy-sal ((lambda (a1) (avg a1)) (e sal))
  (j1)))))

(driver-defclassmap Projet project
 (letjoins
  ((j1 (project emp
   ((lambda (a1 a2 a3 a4)
    (and (eq a1 a2) (eq a3 a4)))
    (project projno) (emproj projno)
    (emproj empno) (emp empno)))))
 (fields (nom (project pname) ())
 (budget (project budget) ())
 (employes () (j1) (orders ((emp empno) asc)))
 (sal-total ((lambda (a) (sum a)) (emp sal)) (j1)))))

(driver-defclassmap Adresse address
 (fields (numero (address num) ())
 (rue (address street) ())
 (ville (address city) ())
 (etat (address state) ()))))

(driver-defclassmap Vehicule vehicle
(fields (plaque (vehicle licence) ())
        (modèle (vehicle model) ())))

(driver-defclassmap Software software
 (fields (nom (software sname) ())
        (genre (software category) ())
        (annee1 (software year1) ())
        (annee-vente (software s_year) ()))))

(driver-defclassmap Hardware hardware
 (fields (nom (hardware hname) ())
        (type (hardware type) ()))))

;--------------------------------------------------
; Name            : Mapping compilation
;--------------------------------------------------

(driver-compile-mapping 'map1)
## B.7 Exemple de session d'utilisation

Cette exemple de session d'utilisation est effectuée avec le SGBD Ingres v6. La base utilisée est `smecidemo` dont les relations et leurs contenus sont donnés en annexe (cf. §B.5).

Le schéma de correspondances utilisé est `map1`, présenté précédemment. Il est contenu dans le fichier `example.11` (cf. §B.6).

Après chargement d'un environnement `Le_lisp` (`lelisp`, `aida`, `smeci`, ...), ...

```
; Le-Lisp (by INRIA) version 15.24 ( 2/Janv/91) [sun]
; Systeme Complice : mer 13 mars 91 10:48:22
= (31bitfloats abbrev callext compiler complice date debug defstruct
loader mc68881 messages microceyx pathname pepe pretty setf
virbitmap virtty)
?
?
? ; On se place dans le directory ou se trouve driver.11
? !cd /u/crazy/0/secoia/lebastar/driver
= t
? ^Ldriver
Chargement d'ASQUELL...
Chargement d'ASQUELL oK
Chargement de DRIVER...
DRIVER v1.35
Chargement de DRIVER oK
= driver.11
?
?
?
? ; Connexion a la base smecidemo
? (driver-connect 'ingres 'smecidemo)
= #:tclass:cursor:#[ingres 0 t ()]
?
? ; Chargement et definition d'un schema de correspondances
? ^Example
= example.11
?
?
? (driver-all-mappings)
= (map1)
? (driver-current-mapping)
= map1
?
? (driver-existent-key-p 'Employe '(7698))
= t
? (driver-get-object 'Employe '(7698))
```
= driver-object-default-1
? (driver-get-object-if-loaded 'Employe '(7698))
= ()
? (driver-object-default-p
? (driver-get-object 'Employe '(7698)))
= driver-object-default-1
? (driver-load-object-default
? (driver-get-object 'Employe '(7698)))
= blake
? (driver-get-object 'Employe '(7698))
= blake
? (driver-get-object-if-loaded 'Employe '(7698))
= blake
?
? (driver-load-class-objects 'Departement t)
= (accounting research sales)
? (driver-get-object 'Employe '(7499))
= driver-object-default-16
? (driver-object-class-in-database (driver-get-object 'Employe '(7499)))
= Vendeur
? (driver-read-field-value-in-database 'commission
? (driver-get-object 'Employe '(7499)))
= 400.
? (driver-set-field-value-in-database 'commission
? (driver-get-object 'Employe '(7499)) 500.)
Mise-a-jour de l'objet S Object-default-16
= 500.
? (driver-get-object 'Employe '(7499))
= driver-object-default-16
? (driver-read-field-value 'salaire
? (driver-get-object 'Employe '(7499)))
= 1600.
? (driver-get-object 'Employe '(7499))
= allen
?
?
? ; Filtrer les employes parmi tous les tuples de emp
? (driver-select-objects '(lambda (obj) t) Employe))
= (((7329)) ((7499)) ((7521)) ((7566)) ((7654)) ((7655))
((7698)) ((7782)) ((7788)) ((7839)) ((7902)) ((7934)))
?
? ; Filtrer les vendeurs parmi tous les tuples de emp
? (driver-select-objects '(lambda (obj) t) Vendeur))
= (((7499)) ((7521)) ((7654)) ((7655)))
?
? ; Filtrer les employes qui ont une voiture de meme modele
? ; que leur chef
? (driver-select-objects
? '((lambda (obj)
?      (eq (send ' modele (send ' vehicule obj))
?        (send ' modele (send ' vehicule (send ' chef obj)))))
?      Employe))
= (((7782)))
?
?
?
? (end)
Que Le_lisp soit avec vous.
## B.8 Exemple de prise en compte d'un modèle objet

Voici un exemple de prise en compte du modèle objet de SMECI. Le listing suivant est en fait le contenu du fichier `smecidriver.11`.

```c
; ----------------------------------------------------------------------
; Mapping Lisp et Bases de donnees relationnelles
; smecidriver.11 - Definition des methodes objet pour utilisation de Smeci V1.5
; INRIA/CERMICS - 4 septembre 1989 - Maj 21 avril 1992
; ----------------------------------------------------------------------
```

```
(setq #:sys-package:colon 'smecidriver)
```

```
.eval-when (load eval)
(add-feature 'smecidriver)
)
```

```
.eval-when (load eval compile)
(deftclass {Driver-Object-model}:Smeci-object-model)
)
```

```
.eval-when (load eval compile)
(defvar driver-user-object-model (omakeq {Smeci-object-model}))
(defvar :dbid-sep #/@
)
```

```
(de {Smeci-object-model}:prin (o) (prin "Smeci-object-model"))
```

```c
;----------------------------------------------------------------------
; Name          : {Smeci-object-model}:define-class
; Date          : 09/04/89
; Author        : Franck LEBASTARD
; Arguments     : Driver-class instance
; Result        : t
; Description   : Creates Smeci categorie and declare it in the system.
; Side effects  : Does deftclass
; Export        : Yes (method)
; Document       : No
; Modified date : No
;----------------------------------------------------------------------
```

```
(de {Smeci-object-model}:define-class (object-model class)
 tag bad-allocation
 (:define-class class))
t)
```

```
(de :define-class (class)
 (if (S-category-p (:class-name class))
 (S-kill-category (:class-name class))))
```
(apply 'defScategory
(mcons (:class-name class)
(or (if (ogytq Driver-class super class)
       (:class-name (ogytq Driver-class super class)))
'S.Object)
(mapcar ':smeci-field-def
       (:class-fields-to-define class)
       (cirlist class)))))

(de :class-name (class)
(if (eq (ogytq Driver-class name class) 'driver-object-default)
'S.Object-default
(ogytq Driver-class name class))))

(de :class-fields-to-define (class)
 let ((fields (mapcan (lambda (field)
       (and (ogytq Driver-field localp field)
             (list field))))
       (ogytq Driver-class fields class))))
 (mapc (lambda (field)
       (if (and (driver-field-p field)
             (not (memq field fields)))
       (setq fields (nconc1 fields field))))
       (mapcar 'car (ogytq Driver-class restrictions class)))
 fields))

(de :redefine-category-tree (main-class)
(mapc '{Smeci-object-model}:define-class
       (cirlist ))
       (cons main-class (driver-class-subclasses0 main-class)))))

; Name : :smeci-field-def
; Date : 09/04/89
; Author : Franck LEBASTARD
; Arguments : Driver-field object, Driver-class object
; Result : Symbolic smeci field definition for creer-categorie funct.
; Description : Calculates every field slot
; Side effects : No
; Export : No
; Document : No
; Modified date : No

; Les facettes inverse import unite type-lien extension ne sont pas remplies.
(de :smeci-field-def (field class)
(mapcan (lambda (facette)
       (tag smeci-field-def
             (list facette (send facette field class))))
       '(nom-ch allocation type domain range force-test?)))
<table><tr><td>Name</td><td>: nom-ch defini type domain range</td></tr><tr><td>Date</td><td>: 09/04/89</td></tr><tr><td>Author</td><td>: Franck LEBASTARD</td></tr><tr><td>Arguments</td><td>: Driver-field object, Driver-class object</td></tr><tr><td>Result</td><td>: slot value</td></tr><tr><td>Description</td><td>: Calculate field slots</td></tr><tr><td>Side effects</td><td>: No</td></tr><tr><td>Export</td><td>: Yes (methods)</td></tr><tr><td>Document</td><td>: No</td></tr><tr><td>Modified date</td><td>: No</td></tr></table>

```
(de {Driver-field}:nom-ch (field class)
      (exit smeci-field-def (list (ogytq Driver-field name field)))))
```

```
; Warning : the p type can't be deducted with the only defined informations
(de {Driver-field}:allocation (field class)
    (ifn (memq field (ogytq Driver-class fields class))
        (exit smeci-field-def ()))
    (if (:any-constraint-on-field class field)
        'constrained 'instance)))
```

```
(de :any-constraint-on-field (class field)
    (car (any (lambda (class1)
                  (driver-find-field-constraints-on-class0 class1 field))
                  (cons class (driver-class-subclasses0 class)))))
```

```
(de {Object-field}:allocation (field class) 'instance)
(de {Object-set}:allocation (field class) 'instance)
```

```
(de {Atom-field}:type (field class)
    (ifn (memq field (ogytq Driver-class fields class))
        (exit smeci-field-def ()))
    (let ((rest (:any-constraint-on-field class field)))
        (:smeci-type (ogytq Driver-field ftype field)
            (and rest
                (send 'domain-type
                    (ogytq Driver-join0 operator rest)))))
```

```
(de {Atom-set}:type (field class)
    (ifn (memq field (ogytq Driver-class fields class))
        (exit smeci-field-def ()))
    (:smeci-type (ogytq Driver-field ftype field) 'set)))
```

```
(de {Object-field}:type (field class)
    (:smeci-type 'object ()))
```

```
(de {Object-set}:type (field class)
```
(:smeci-type 'object 'set))

(de {Computed-field}:type (field class)
(ifn (memq field (ogytq Driver-class fields class))
ente smeci-field-def ()
(:smeci-type (ogytq Driver-field ftype field) ())))

(de :smeci-type (type1 type2)
(selectq type1
  (string
    (selectq type2
      (set 'l*)
      (t '*))))
    (symbol
      (selectq type2
        (enum 'enum-symbol)
        (bounded 'bounded-symbol)
        (set 'lsymbol)
        (t 'symbol))))
    ((fix integer)
      (selectq type2
        (enum 'enum-fix)
        (bounded 'bounded-fix)
        (set 'lfix)
        (t 'fix))))
    (float
      (selectq type2
        (enum 'enum-float)
        (bounded 'bounded-float)
        (set 'lfloat)
        (t 'float))))
    (object
      (selectq type2
        (set 'lobjec)
        (t 'object))))
    ((
      (selectq type2
        (set 'l*)
        (t '*))))
    (t (print "Not a good type : " type1) ()))))

(de {Driver-field}:domain (field class) (exit smeci-field-def ()))
(de {Object-field}:domain (field class)
(or (nlistp (:class-name (ogytq Object-field class field)))
(car (:class-name (ogytq Object-field class field)))))

(de {Object-set}:domain (field class)
(or (nlistp (:class-name (ogytq Object-set setobjclass field)))
(car (class-name (ogytq Object-set setobjclass field)))))
(de {Driver-field}:range (field class)
let ((rest (cassq field (ogytq Driver-class restrictions class))))
(ifn rest (exit smeci-field-def ))
(or (and (ogytq Driver-class super class)
(eq (S-get-facet-value
(:class-name
(ogytq Driver-class super class))
(ogytq Driver-field name field)
'allocation)
'instance)
 exit bad-allocation
(:redefine-category-tree
 (driver-find-main-class0 class))))
(:build-smeci-range
 (send 'smeci-range
 (ogytq Driver-join0 operator rest)
 field))))))

(de :build-smeci-range (lranges)
(selectq (caar lranges)
(min (list (cdar lranges) (cassq 'max lranges))))
(max (list (cassq 'min lranges) (cdar lranges))))
(lval (cdar lranges))
(val (mapcan (lambda ((key . val))
(if (eq key 'val) (list val))))
lranges)))))

; smeci ne gere pas les negations.
(de {Driver-sql-op}:domain-type (op))

(de {Driver-n-op}:domain-type (op)
(any (lambda (op1) (send 'domain-type op1))
(ogytq Driver-n-op args op))))

(de {Driver-val-link}:domain-type (op)
(selectq (ogytq Driver-sql-op op op)
(= 'enum)
((< <= > >=) 'bounded))))

(de {Driver-set-link}:domain-type (op)
(if (eq (ogytq Driver-sql-op op op) 'in) 'enum))

(de {Driver-sql-op}:smeci-range (op field))

(de {Driver-or}:smeci-range (op field)
(mapcan (lambda (r)
(if (eq (car r) 'val) (list r)))
(mapcan (lambda (op1)
 send 'smeci-range op1 field))
(ogytq Driver-n-op args op)))))
(de {Driver-and}:smeci-range (op field)
(mapcan (lambda (op1) (send 'smeci-range op1 field))
(ogytq Driver-n-op args op)))

(de {Driver-val-link}:smeci-range (op field)
 let ((val (driver-loading-type-filter field ()
 (ogytq Driver-2-op arg2 op)))))
 (selectq (ogytq Driver-sql-op op op)
  (= (list (cons 'val val)))
  (> =) (list (cons 'min val)))
  (< =) (list (cons 'max val)))))

(de {Driver-set-link}:smeci-range (op field)
 (if (eq (ogytq Driver-sql-op op op) 'in)
  (let ((lval (mapcar (lambda (val)
   (driver-loading-type-filter field () val))
   (ogytq Driver-2-op arg2 op)))))
   (list (cons 'lval lval)))))

(de {Driver-field}:force-test? (field class)
 (exit smeci-field-def ()))

(de {Object-field}:force-test? (field class)
 (ifn (memq field (ogytq Driver-class fields class))
 (exit smeci-field-def ()))

(de {Object-set}:force-test? (field class)
 (ifn (memq field (ogytq Driver-class fields class))
 (exit smeci-field-def ()))

#|

(de {Driver-field}:inverse (field))

(de {Driver-field}:import (field))

(de {Driver-field}:unite (field))

(de {Driver-field}:type-lien (field))

(de {Driver-field}:extension (field))

|#

;---------------------------------------------

; Name : {Smeci-object-model}:omake

; Date : 09/11/89

; Author : Franck LEBASTARD

; Arguments : Driver-class object according to a Smeci categorie, from

; : which a new instance will be created.
<table><tr><td>Result</td><td>: A new class instance.</td></tr><tr><td>Description</td><td>: Calls Smeci nouvel-objet function.</td></tr><tr><td>Side effects</td><td>: On Smeci</td></tr><tr><td>Export</td><td>: Yes (method)</td></tr><tr><td>Document</td><td>: No</td></tr><tr><td>Modified date</td><td>: No</td></tr></table>

(de {Smeci-object-model}:omake (object-model class)
(S-create-object (:class-name class)))

<table><tr><td>Name</td><td>: {Smeci-object-model}:set-field-value</td></tr><tr><td>Date</td><td>: 03/90</td></tr><tr><td>Author</td><td>: Franck LEBASTARD</td></tr><tr><td>Arguments</td><td>:</td></tr><tr><td>Result</td><td>:</td></tr><tr><td>Description</td><td>:</td></tr><tr><td>Side effects</td><td>:</td></tr><tr><td>Export</td><td>: Yes (method)</td></tr><tr><td>Document</td><td>:</td></tr><tr><td>Modified date</td><td>:</td></tr></table>

(de {Smeci-object-model}:set-field-value (object-model msg obj value)
(ifn (and (memq msg '(name nom))
(eq ({Smeci-object-model}:read-field-value object-model
value))
(S-set-value msg obj value))
value)

(de {Smeci-object-model}:read-field-value (object-model msg obj)
(S-get-value msg obj))

<table><tr><td>Name</td><td>: {Smeci-object-model}:change-object-class</td></tr><tr><td>Date</td><td>: 09/07/89</td></tr><tr><td>Author</td><td>: Franck LEBASTARD</td></tr><tr><td>Arguments</td><td>: Driver-class object, Any Smeci Objet object</td></tr><tr><td>Result</td><td>: Objet object from Driver-class class.</td></tr><tr><td>Description</td><td>: Changes the class of an object.</td></tr><tr><td>Side effects</td><td>: On Smeci</td></tr><tr><td>Export</td><td>: Yes (method)</td></tr><tr><td>Document</td><td>: No</td></tr><tr><td>Modified date</td><td>: 09/11/89</td></tr></table>
(de `{Smeci-object-model}`:change-object-class (object-model newclass obj)
(if (or (driver-object-default-p obj)
       (eq newclass (driver-object-default-class)))
(S-change-category obj 'S.Object))
(S-change-category obj (:class-name newclass)))

;--------------------------------------------
; Name            : {Smeci-object-model}:existing-class-p
; Date            : 09/07/89
; Author          : Franck LEBASTARD
; Arguments       : Driver-class object
; Result          : t or ()
; Description     : Does a class exist
; Side effects    : No
; Export          : Yes (redefined)
; Document        : No
; Modified date   : No
;--------------------------------------------

(de `{Smeci-object-model}`:existing-class-p (object-model class)
(S-category-p (:class-name class)))

;--------------------------------------------
; Name            : {Smeci-object-model}:class-instance-p
; Date            : 09/07/89
; Author          : Franck LEBASTARD
; Arguments       : An object, Driver-class object
; Result          : t or ()
; Description     : Is an object a class instance
; Side effects    : No
; Export          : Yes (redefined)
; Document        : No
; Modified date   : No
;--------------------------------------------

(de `{Smeci-object-model}`:class-instance-p (object-model object class)
(S-isa-p object (:class-name class)))

;--------------------------------------------
; Name            : {Smeci-object-model}:all-class-objects
; Date            : 03/30/90
; Author          : Franck LEBASTARD
; Arguments       :
; Result          :
; Description     :
; Side effects    : No
; Export          : Yes
; Document        : No
; Modified date : No

;--------------------------------------------

(de {Smeci-object-model}:all-class-objects (object-model class)
(S-all-objects (:class-name class)))

;--------------------------------------------

; Name : driver-dbms-connection

; Date :

; Author : Franck LEBASTARD

; Arguments :

; Result :

; Description :

; Side effects :

; Export :

; Document :

; Modified date :

;--------------------------------------------

(de driver-dbms-connection (dbms-name user-name)
(S-set-category-collector (:show-signature '-CAT dbms-name user-name))
(S-set-object-collector (:show-signature '-OBJ dbms-name user-name)))

;--------------------------------------------

; Name : driver-object-loading-begin, driver-object-loading-end

; Date : 09/11/89

; Author : Franck LEBASTARD

; Arguments : Main class

; Result : Void

; Description : Updates Smeci Object Controle panel.

; Side effects : No

; Export : Yes (redefinition)

; Document : No

; Modified date : No

;--------------------------------------------

(de driver-object-loading-begin (mainclass)
(:current-cursor-object-database))

(de driver-object-loading-end (mainclass)
; (funcall '#:smeciconrol:update-interface)
)

(de :current-cursor-category-database ()
(S-set-category-collector
(:dbms-signature '-CAT
(ogytq cursor dbms
(or (driver-current-cursor)
 error 'smeci-driver "No current cursor" ())))))
(de :current-cursor-object-database ()
(S-set-object-collector
(:dbms-signature '-OBJ
(ogytq cursor dbms
(or (driver-current-cursor)
 error 'smeci-driver "No current cursor" ())))))

(de :dbms-signature (coltype dbms)
(:show-signature coltype (ogytq dbms name dbms)
(ogytq database name (ogytq dbms database dbms))))

(de :show-signature (coltype nom-sgbd utilisateur)
(catenate "SGBD" coltype (ascii :dbid-sep)
nom-sgbd (ascii :dbid-sep)
utilisateur))
B.9 Messages d'erreurs et autres de DRIVER

<table><thead><tr><td>Codes</td><td>Messages d'erreur et autres de DRIVER</td></tr></thead><tbody><tr><td>driver11</td><td>"Pas de modèle objet courant"<br>"No current object model"</td></tr><tr><td>driver21</td><td>"Pas un schéma de correspondances"<br>"Not a mapping"</td></tr><tr><td>driver22</td><td>"Pas de schéma de correspondances courant"<br>"No current mapping"</td></tr><tr><td>driver23</td><td>"Schéma de correspondances existant"<br>"Existent mapping"</td></tr><tr><td>driver24</td><td>"Schéma de correspondances inconnu"<br>"Unknown mapping"</td></tr><tr><td>driver25</td><td>"Schéma de correspondances incomplet"<br>"Mapping not complete"</td></tr><tr><td>driver31</td><td>"nom de table existant"<br>"Existent table name"</td></tr><tr><td>driver32</td><td>"Définition de table inconnue"<br>"Unknown table definition"</td></tr><tr><td>driver33</td><td>"Pas une définition de table"<br>"Not a table definition"</td></tr><tr><td>driver34</td><td>"Table sans clé"<br>"No table key"</td></tr><tr><td>driver41</td><td>"Attribut existant"<br>"Existent attribute"</td></tr><tr><td>driver42</td><td>"Mauvais statut d'attribut"<br>"Bad attribute status"</td></tr><tr><td>driver43</td><td>"Mauvais type d'attribut"<br>"Bad attribute type"</td></tr><tr><td>driver44</td><td>"Type d'attribut existant"<br>"Existing attribute type"</td></tr><tr><td>driver45</td><td>"Définition d'attribut inconnue"<br>"unknown attribute definition"</td></tr><tr><td>driver46</td><td>"Pas une définition d'attribut"<br>"Not an attribute definition"</td></tr><tr><td>driver47</td><td>"Pas un des attribut de la table"<br>"Not one of the table attributes"</td></tr><tr><td>driver51</td><td>"Variable de table existante"<br>"Existent table variable"</td></tr></tbody></table>
<table><thead><tr><td>Codes</td><td>Messages d'erreur et autres de DRIVER</td></tr></thead><tbody><tr><td>driver52</td><td>"Variable de table inconnue"<br>"Unknown table variable"</td></tr><tr><td>driver53</td><td>"Pas une variable de table"<br>"Not a table variable"</td></tr><tr><td>driver54</td><td>"Pas une variable de table de base"<br>"Not a basic table variable"</td></tr><tr><td>driver55</td><td>"Variable de table non efficable"<br>"Not an erasable table variable"</td></tr><tr><td>driver61</td><td>"Variable d'attribut existante"<br>"Existent attribute variable"</td></tr><tr><td>driver62</td><td>"Variable d'attribut inconnue"<br>"Unknown attribute variable"</td></tr><tr><td>driver63</td><td>"Pas une variable d'attribut"<br>"Not an attribute variable"</td></tr><tr><td>driver64</td><td>"Pas une variable d'attribut efficable"<br>"Not an erasable attribute variable"</td></tr><tr><td>driver71</td><td>"Nom de classe existant"<br>"Existent class name"</td></tr><tr><td>driver72</td><td>"classe inconnue"<br>"Unknown class"</td></tr><tr><td>driver73</td><td>"Pas une classe"<br>"Not a class"</td></tr><tr><td>driver81</td><td>"Champ existant"<br>"Existent field"</td></tr><tr><td>driver82</td><td>"Type de champ inconnu"<br>"Unknown field type"</td></tr><tr><td>driver83</td><td>"Type de champ atomique mauvais"<br>"Bad atomic field type"</td></tr><tr><td>driver84</td><td>"Type de champ existant"<br>"Existing field type"</td></tr><tr><td>driver85</td><td>"Champ inconnu"<br>"Unknown field"</td></tr><tr><td>driver86</td><td>"Pas un champ"<br>"Not a field"</td></tr><tr><td>driver87</td><td>"Pas un champ atomique"<br>"Not an atomic field"</td></tr><tr><td>driver88</td><td>"Pas un champ de la classe"<br>"Not a class field"</td></tr></tbody></table>
<table><thead><tr><td>Codes</td><td>Messages d'erreur et autres de DRIVER</td></tr></thead><tbody><tr><td>driverr89</td><td>"Pas un champ propre ou herité"<br>"Not an own or herited field"</td></tr><tr><td>driverr90</td><td>"Pas un champ de la hiérarchie"<br>"Not a hierarchy field"</td></tr><tr><td>driverr91</td><td>"Pas une variable d'attribut ou un champ propre ou hérité"<br>"Not an attribute variable or an atomic own or herited field"</td></tr><tr><td>driverr101</td><td>"Contrainte de classe existante sur"<br>"Existent class constraint on"</td></tr><tr><td>driverr102</td><td>"Contrainte inconnue"<br>"Unknown constraint"</td></tr><tr><td>driverr103</td><td>"Expression invalide"<br>"Invalid expression"</td></tr><tr><td>driverr111</td><td>"Jointure déjà existante"<br>"Existent join"</td></tr><tr><td>driverr112</td><td>"Jointure inconsistante"<br>"Inconsistent join"</td></tr><tr><td>driverr113</td><td>"Jointure inconnue"<br>"Unknown join"</td></tr><tr><td>driverr114</td><td>"Pas une jointure"<br>"Not a join"</td></tr><tr><td>driverr115</td><td>"Variable de jointure existante"<br>"Existent join variable"</td></tr><tr><td>driverr116</td><td>"Variable de jointure indéfinie"<br>"Undefined join variable"</td></tr><tr><td>driverr117</td><td>"Deux fois la même variable"<br>"Two variables have same name"</td></tr><tr><td>driverr118</td><td>"Déjà un environnement 'fields' ou 'letjoins'"<br>"Yet a 'fields' or 'letjoins' environment"</td></tr><tr><td>driverr119</td><td>"Noms trop proches"<br>"Too close names"</td></tr><tr><td>driverr121</td><td>"Pas la table principale"<br>"Not the main table"</td></tr><tr><td>driverr122</td><td>"Déjà une table principale"<br>"Yet a main table"</td></tr><tr><td>driverr123</td><td>"Déjà une table secondaire"<br>"Yet a sub-table"</td></tr><tr><td>driverr124</td><td>"Table principale indéfinie"<br>"Undefined main table"</td></tr></tbody></table>
<table><thead><tr><td>Codes</td><td>Messages d'erreur et autres de DRIVER</td></tr></thead><tbody><tr><td>driver125</td><td>"Table principale indéfinie dans la classe principale"<br>"Undefined main table on main class"</td></tr><tr><td>driver126</td><td>"Table déjà utilisée dans le schéma"<br>"Table already used in mapping"</td></tr><tr><td>driver127</td><td>"Attribut déjà utilisé dans le schéma"<br>"Attribute already used in mapping"</td></tr><tr><td>driver128</td><td>"Attribut de jointure déjà utilisé dans le schéma"<br>"Join attribute already used in mapping"</td></tr><tr><td>driver131</td><td>"Classe sans correspondance"<br>"Class not mapped"</td></tr><tr><td>driver132</td><td>"Classe avec correspondance déjà établie"<br>"Already mapped class"</td></tr><tr><td>driver133</td><td>"Pas une correspondance de classe"<br>"Not mapped on a class"</td></tr><tr><td>driver134</td><td>"Pas une classe principale"<br>"Not a main class"</td></tr><tr><td>driver135</td><td>"Pas de classe principale"<br>"No main class"</td></tr><tr><td>driver141</td><td>"Champ sans correspondance"<br>"Field not mapped"</td></tr><tr><td>driver142</td><td>"Champ avec correspondance déjà établie"<br>"Already mapped field"</td></tr><tr><td>driver143</td><td>"Aucun ordre spécifié"<br>"No order specified"</td></tr><tr><td>driver144</td><td>"Ordre specifié invalide"<br>"Invalid order specification"</td></tr><tr><td>driver145</td><td>"Ensemble de jointures incomplet"<br>"Incomplete join set"</td></tr><tr><td>driver146</td><td>"Trop de jointures"<br>"Too many joins"</td></tr><tr><td>driver147</td><td>"Table principale utilisée comme table secondaire dans une jointure"<br>"Main table used as a sub-table in a join"</td></tr><tr><td>driver148</td><td>"Jointure objet illégale"<br>"Object join doesn't comply restrictions"</td></tr><tr><td>driver149</td><td>"Champ read-only"<br>"Read only field"</td></tr><tr><td>driver150</td><td>"Ordre des classes invalide"<br>"Invalid class order"</td></tr></tbody></table>
<table><thead><tr><td>Codes</td><td>Messages d'erreur et autres de DRIVER</td></tr></thead><tbody><tr><td>driverr161</td><td>"Pas un curseur"<br>"Not a cursor"</td></tr><tr><td>driverr162</td><td>"Pas de curseur courant"<br>"No current cursor"</td></tr><tr><td>driverr163</td><td>"Pas un objet dbms"<br>"Not a dbms"</td></tr><tr><td>driverr164</td><td>"Objet dbms introuvable"<br>"Can't find dbms"</td></tr><tr><td>driverr165</td><td>"Pas une clé d'objet valide"<br>"Not a valid object key"</td></tr><tr><td>driverr166</td><td>"Pas une clé d'objet existante"<br>"Not an existent object key"</td></tr><tr><td>driverr167</td><td>"Pas un défaut d'objet"<br>"Not an object default"</td></tr><tr><td>driverr168</td><td>"Objet relationnel manquant"<br>"Missing relational object"</td></tr><tr><td>driverr169</td><td>"Pas un objet persistant"<br>"Not a persistent object"</td></tr><tr><td>driverr170</td><td>"Pas un champ de l'objet"<br>"Not an object field"</td></tr><tr><td>driverr181</td><td>"Fonction de filtrage en chargement indéfinie"<br>"Undefined loading filter function"</td></tr><tr><td>driverr182</td><td>"Fonction de filtrage en écriture indéfinie"<br>"Undefined writing filter function"</td></tr><tr><td>driverr183</td><td>"Mauvais arguments des fonctions de filtrage en lecture et écriture"<br>"Bad loading or writing filter function arguments"</td></tr><tr><td>driverr184</td><td>"Incompatibilité déclaration du filtre et arguments des fonctions de filtrage"<br>"Filter function arguments and filter declaration mismatch"</td></tr><tr><td>driverr185</td><td>"Déclarations différentes d'utilisation du même filtre"<br>"filter declaration mismatch"</td></tr><tr><td>driverr191</td><td>"Pas une lambda-expression"<br>"Not a lambda expression"</td></tr><tr><td>driverr192</td><td>"Déclaration d'argument non autorisé"<br>"Unauthorised argument declaration"</td></tr><tr><td>driverr193</td><td>"Trop de lambda-expression"<br>"Too many lambda expressions"</td></tr><tr><td>driverr194</td><td>"Mauvais nombre de variables de lambda"<br>"Bad lambda variable number"</td></tr><tr><td>driverr195</td><td>"Expression non autorisée"<br>"Unauthorised expression"</td></tr></tbody></table>
<table><thead><tr><td>Codes</td><td>Messages d'erreur et autres de DRIVER</td></tr></thead><tbody><tr><td>driver196</td><td>"Mauvais nombre ou type d'argument"<br>"Bad argument types or number"</td></tr><tr><td>driver197</td><td>"Fonction non autorisée"<br>"Unauthorised function"</td></tr><tr><td>driver198</td><td>"Variable non autorisée dans un not"<br>"Variable unauthorised in a not"</td></tr><tr><td>driver199</td><td>"Nil non autorisé"<br>"Unexpected nil"</td></tr><tr><td>driver200</td><td>"Second argument invalide"<br>"Invalid 2nd argument"</td></tr><tr><td>driver101</td><td>"Expression constante non autorisée"<br>"Unauthorised constant expression"</td></tr><tr><td>driver202</td><td>"Variable inconnue"<br>"Unknown variable"</td></tr><tr><td>driver203</td><td>"Pas un type numérique"<br>"Not a numeric type"</td></tr><tr><td>driver204</td><td>"Type incompatible"<br>"Mismatch type"</td></tr><tr><td>driver205</td><td>"Types incompatibles"<br>"Incompatible types"</td></tr><tr><td>driver206</td><td>"Comparaison entre un champ objet et un champ non objet"<br>"Object and not object field(s) comparison"</td></tr><tr><td>driver207</td><td>"Comparaison d'instances de classes incompatibles"<br>"Incompatible class instance comparison"</td></tr><tr><td>driver208</td><td>"Mauvais opérande"<br>"Bad operand"</td></tr><tr><td>driver209</td><td>"Mauvais comparateur d'objets"<br>"Bad object comparator"</td></tr><tr><td>driver210</td><td>"Type de champ non encore autorisé dans une expression de sélection d'objets"<br>"Field type not supported yet in object selecting"</td></tr><tr><td>driver211</td><td>"Variable indéfinie"<br>"Unbounded variable"</td></tr><tr><td>driver212</td><td>"Mauvais type de valeur de variable"<br>"Bad variable value type"</td></tr><tr><td>driver241</td><td>"Chargement de l'objet ~A"<br>"Loading object ~A"</td></tr><tr><td>driver242</td><td>"Écriture de l'objet ~A"<br>"Inserting object ~A"</td></tr><tr><td>driver243</td><td>"Mise-à-jour de l'objet ~A"<br>"Updating object ~A"</td></tr></tbody></table>
<table><thead><tr><td>Codes</td><td>Messages d'erreur et autres de DRIVER</td></tr></thead><tbody><tr><td>driver251</td><td>"Échec de requête de sélection : ~A"<br>"DBMS select request error : ~A"</td></tr><tr><td>driver252</td><td>"Échec de requête de lecture du max d'un attribut"<br>"Maximum attribute value request error"</td></tr><tr><td>driver253</td><td>"Échec de requête d'insertion : ~A"<br>"DBMS insert request error : ~A"</td></tr><tr><td>driver254</td><td>"Échec de requête de mise-à-jour : ~A"<br>"DBMS update request error : ~A"</td></tr><tr><td>driver261</td><td>"Valeur de mauvais type pour l'attribut ~A : ~A. Non sauvée."<br>"Bad type value for ~A attribute : ~A. Not saved."</td></tr><tr><td>driver262</td><td>"~A ne peut être sauve comme valeur du champ ~A de l'objet ~A"<br>"~A can't be saved in field ~A of ~A object"</td></tr><tr><td>driver263</td><td>"Incompatibilité entre les contraintes de clé et de classe"<br>"Incompatible key and class constraints"</td></tr><tr><td>driver264</td><td>"Incohérence dans les contraintes d'écriture"<br>"Inconsistency in writing constraints"</td></tr><tr><td>driver265</td><td>"Incohérence dans les contraintes d'écriture : ~A"<br>"Inconsistency in writing constraints : ~A"</td></tr><tr><td>driver266</td><td>"Abandon des contraintes de clé : ~A"<br>"Key constraints forsaken : ~A"</td></tr><tr><td>driver267</td><td>"Abandon des saisies utilisateur : ~A"<br>"User inputs forsaken : ~A"</td></tr><tr><td>driver268</td><td>"La valeur du champ ne vérifie pas les contraintes"<br>"Field value doesn't comply constraints"</td></tr><tr><td>driver269</td><td>"La valeur du champ ~A de l'objet ~A ne vérifie pas les contraintes"<br>"~A Field value of object ~A doesn't comply constraints"</td></tr><tr><td>driver270</td><td>"Objet ~A, champ ~A, nouvelle valeur : ~A"<br>"Object ~A, field ~A, new value : ~A"</td></tr><tr><td>driver271</td><td>" Annulation du commit"<br>" Commit abortion "</td></tr><tr><td>driver301</td><td>"Nouveau"<br>"New"</td></tr><tr><td>driver302</td><td>"Sélectionnez un objet"<br>"Select an object"</td></tr><tr><td>driver303</td><td>"Donner une valeur au champ ~A de l'objet ~A vérifiant ~A"<br>"Give a value for the ~A field of object ~A, complying ~A"</td></tr><tr><td>driver304</td><td>"Donnez une valeur à l'attribut ~A de type ~A, vérifiant ~A"<br>"Give a value for the ~A attribute (type ~A), complying ~A"</td></tr><tr><td>driver305</td><td>" Entrer une valeur "<br>" Enter a value "</td></tr><tr><td>driver306</td><td>" D'accord "<br>" OK "</td></tr></tbody></table>
<table><thead><tr><td>Codes</td><td>Messages d'erreur et autres de DRIVER</td></tr></thead><tbody><tr><td>driverr401</td><td>"Pas un symbole"<br>"Not a symbol"</td></tr><tr><td>driverr402</td><td>"Pas une liste"<br>"Not a list"</td></tr><tr><td>driverr403</td><td>"Argument incorrect"<br>"Invalid argument"</td></tr><tr><td>driverr404</td><td>"Option invalide"<br>"Invalid option"</td></tr></tbody></table>
B.10 Index des fonctions et des variables

<table>
  <tbody>
    <tr>
      <td>DRIVER [FEATURE]</td>
      <td>259</td>
    </tr>
    <tr>
      <td>DRIVER-AFFECT-CURSOR-P [Variable]</td>
      <td>260</td>
    </tr>
    <tr>
      <td>DRIVER-CLASS-MAKE [Variable]</td>
      <td>270</td>
    </tr>
    <tr>
      <td>DRIVER-COMMIT-AFTER-READING [Variable]</td>
      <td>306</td>
    </tr>
    <tr>
      <td>DRIVER-COMPACT-KEY-SEPARATOR [Variable]</td>
      <td>321</td>
    </tr>
    <tr>
      <td>DRIVER-EXISTENT-KEY-TEST [Variable]</td>
      <td>308</td>
    </tr>
    <tr>
      <td>DRIVER-FATAL-REQUEST-ERROR [Variable]</td>
      <td>306</td>
    </tr>
    <tr>
      <td>DRIVER-FIX-KEY-GENERATION-P [Variable]</td>
      <td>318</td>
    </tr>
    <tr>
      <td>DRIVER-MESSAGES-P [Variable]</td>
      <td>320</td>
    </tr>
    <tr>
      <td>DRIVER-MICROCEYX-OBJECT-MODEL [Variable]</td>
      <td>327</td>
    </tr>
    <tr>
      <td>DRIVER-ROOT-OBJECT-MODEL [Variable]</td>
      <td>327</td>
    </tr>
    <tr>
      <td>DRIVER-SYSTEM-FIELD-FILTERS [Variable]</td>
      <td>324</td>
    </tr>
    <tr>
      <td>DRIVER-TABLE-MAKE [Variable]</td>
      <td>264</td>
    </tr>
    <tr>
      <td>DRIVER-UPDATE-DAEMON-P [Variable]</td>
      <td>315</td>
    </tr>
    <tr>
      <td>DRIVER-USER-OBJECT-MODEL [Variable]</td>
      <td>327</td>
    </tr>
    <tr>
      <td>DRIVER-WRITING-HELP [Variable]</td>
      <td>318</td>
    </tr>
    <tr>
      <td>({USER-OBJECT-MODEL}:ALL-CLASS-OBJECTS &lt;o-model&gt; &lt;class&gt;)</td>
      <td>331</td>
    </tr>
    <tr>
      <td>[SUBR à 2 arguments]</td>
      <td>331</td>
    </tr>
    <tr>
      <td>({USER-OBJECT-MODEL}:CHANGE-OBJECT-CLASS &lt;o-model&gt; &lt;newclass&gt; &lt;object&gt;)</td>
      <td>330</td>
    </tr>
    <tr>
      <td>[SUBR à 3 arguments]</td>
      <td>330</td>
    </tr>
    <tr>
      <td>({USER-OBJECT-MODEL}:CLASS-INSTANCE-P &lt;o-model&gt; &lt;object&gt; &lt;class&gt;)</td>
      <td>330</td>
    </tr>
    <tr>
      <td>[SUBR à 3 arguments]</td>
      <td>330</td>
    </tr>
    <tr>
      <td>({USER-OBJECT-MODEL}:DEFINE-CLASS &lt;o-model&gt; &lt;class&gt;)</td>
      <td>328</td>
    </tr>
    <tr>
      <td>[SUBR à 2 arguments]</td>
      <td>328</td>
    </tr>
    <tr>
      <td>({USER-OBJECT-MODEL}:EXISTING-CLASS-P &lt;o-model&gt; &lt;class&gt;)</td>
      <td>329</td>
    </tr>
    <tr>
      <td>[SUBR à 2 arguments]</td>
      <td>329</td>
    </tr>
    <tr>
      <td>({USER-OBJECT-MODEL}:OMAKE &lt;o-model&gt; &lt;class&gt;)</td>
      <td>329</td>
    </tr>
    <tr>
      <td>({USER-OBJECT-MODEL}:READ-FIELD-VALUE &lt;o-model&gt; &lt;message&gt; &lt;object&gt;)</td>
      <td>329</td>
    </tr>
    <tr>
      <td>[SUBR à 3 arguments]</td>
      <td>329</td>
    </tr>
    <tr>
      <td>({USER-OBJECT-MODEL}:SET-FIELD-VALUE &lt;o-model&gt; &lt;message&gt; &lt;object&gt; &lt;value&gt;)</td>
      <td>329</td>
    </tr>
    <tr>
      <td>[SUBR à 4 arguments]</td>
      <td>329</td>
    </tr>
    <tr>
      <td>({USER-OBJECT-MODEL}:SEND-MESSAGE &lt;o-model&gt; &lt;message&gt; &lt;object&gt; &lt;args&gt;)</td>
      <td>330</td>
    </tr>
    <tr>
      <td>[SUBR à 4 arguments]</td>
      <td>330</td>
    </tr>
    <tr>
      <td>(DRIVER-ADD-ATOMIC-FIELD-TYPE &lt;newtype&gt;)</td>
      <td>275</td>
    </tr>
    <tr>
      <td>(DRIVER-ADD-ATTRIBUTE-TYPE &lt;newtype&gt;)</td>
      <td>266</td>
    </tr>
    <tr>
      <td>(DRIVER-ALL-LINKED-OBJECTS &lt;objects&gt;)</td>
      <td>321</td>
    </tr>
    <tr>
      <td>(DRIVER-ALL-MAPPINGS &lt;all-p&gt;)</td>
      <td>261</td>
    </tr>
    <tr>
      <td>(DRIVER-ALL-PERSISTENT-OBJECTS-IN-MEMORY)</td>
      <td>312</td>
    </tr>
    <tr>
      <td>(DRIVER-ASK-VALUE &lt;message&gt; &lt;lvalues&gt; &lt;exit&gt;)</td>
      <td>320</td>
    </tr>
    <tr>
      <td>(DRIVER-ATOM-FIELD-P &lt;field&gt;)</td>
      <td>277</td>
    </tr>
    <tr>
      <td>(DRIVER-ATOMIC-FIELD-TYPES)</td>
      <td>275</td>
    </tr>
    <tr>
      <td>(DRIVER-ATOMSET-FIELD-P &lt;field&gt;)</td>
      <td>277</td>
    </tr>
    <tr>
      <td>(DRIVER-ATTRDEF-ATTRVARS &lt;table-def-name&gt; &lt;attribute-def-name&gt;)</td>
      <td>300</td>
    </tr>
    <tr>
      <td>[SUBR à 2 arguments]</td>
      <td>300</td>
    </tr>
    <tr>
      <td>(DRIVER-ATTRDEF-ATTRVARS0 &lt;attribute-def&gt;)</td>
      <td>300</td>
    </tr>
    <tr>
      <td>(DRIVER-ATTRIBUTE-DEF-MAP-FIELDS &lt;table-def-name&gt; &lt;attr-name&gt;)</td>
      <td>297</td>
    </tr>
    <tr>
      <td>[SUBR à 2 arguments]</td>
      <td>297</td>
    </tr>
    <tr>
      <td>(DRIVER-ATTRIBUTE-DEF-MAP-FIELDS0 &lt;attribute-def&gt;)</td>
      <td>297</td>
    </tr>
  </tbody>
</table>
<table>
  <tbody>
    <tr>
      <td>(DRIVER-ATTRIBUTE-DEF-P &lt;attr-def&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>296</td>
    </tr>
    <tr>
      <td>(DRIVER-ATTRIBUTE-MAP-FIELD &lt;table-var-name&gt; &lt;attr-def-name&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>291</td>
    </tr>
    <tr>
      <td>(DRIVER-ATTRIBUTE-MAP-FIELD0 &lt;attribute&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>291</td>
    </tr>
    <tr>
      <td>(DRIVER-ATTRIBUTE-P &lt;attr&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>267</td>
    </tr>
    <tr>
      <td>(DRIVER-ATTRIBUTE-TYPES)</td>
      <td>[SUBR sans argument]</td>
      <td>266</td>
    </tr>
    <tr>
      <td>(DRIVER-ATTRIBUTE-VAR-P &lt;attribute-var&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>300</td>
    </tr>
    <tr>
      <td>(DRIVER-CLASS-CONSTRAINT-P &lt;constraint&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>280</td>
    </tr>
    <tr>
      <td>(DRIVER-CLASS-FIELD-P &lt;class&gt; &lt;field&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>277</td>
    </tr>
    <tr>
      <td>(DRIVER-CLASS-INSTANCE-P-IN-DATABASE &lt;class-name&gt; &lt;object&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>317</td>
    </tr>
    <tr>
      <td>(DRIVER-CLASS-INSTANCE-P-IN-DATABASE0 &lt;class&gt; &lt;object&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>317</td>
    </tr>
    <tr>
      <td>(DRIVER-CLASS-LOADING-ORDER &lt;class-names&gt;)</td>
      <td>[SUBR à 0 ou 1 argument]</td>
      <td>292</td>
    </tr>
    <tr>
      <td>(DRIVER-CLASS-LOADING-ORDER0 &lt;classes&gt;)</td>
      <td>[SUBR à 0 ou 1 argument]</td>
      <td>292</td>
    </tr>
    <tr>
      <td>(DRIVER-CLASS-MAP &lt;class-name&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>284</td>
    </tr>
    <tr>
      <td>(DRIVER-CLASS-MAP0 &lt;class&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>284</td>
    </tr>
    <tr>
      <td>(DRIVER-CLASS-P &lt;class&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>272</td>
    </tr>
    <tr>
      <td>(DRIVER-CLASS-SUBCLASSES &lt;class-name&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>271</td>
    </tr>
    <tr>
      <td>(DRIVER-CLASS-SUBCLASSES0 &lt;class&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>271</td>
    </tr>
    <tr>
      <td>(DRIVER-COMMIT-OBJECTS &lt;objects&gt; . &lt;deep&gt;)</td>
      <td>[SUBR à 1 ou 2 arguments]</td>
      <td>317</td>
    </tr>
    <tr>
      <td>(DRIVER-COMPILE-MAPPING &lt;mapping-name&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>262</td>
    </tr>
    <tr>
      <td>(DRIVER-COMPILE-MAPPING0 &lt;mapping&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>262</td>
    </tr>
    <tr>
      <td>(DRIVER-CONNECT &lt;dbms-name&gt; &lt;base-name&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>305</td>
    </tr>
    <tr>
      <td>(DRIVER-CREATE-ATTR-CONSTRAINT &lt;class-name&gt; (&lt;table-name&gt; &lt;attribute-name&gt;)</td>
      <td>[SUBR à 4 ou 5 arguments]</td>
      <td>284</td>
    </tr>
    <tr>
      <td>(DRIVER-CREATE-ATTR-CONSTRAINT0 &lt;class&gt; &lt;attribute&gt; &lt;lambda&gt; &lt;joins&gt; . &lt;overwrite&gt;)</td>
      <td>[SUBR à 4 ou 5 arguments]</td>
      <td>284</td>
    </tr>
    <tr>
      <td>(DRIVER-CREATE-ATTRIBUTE &lt;table-name&gt; &lt;attr-name&gt; &lt;attr-type&gt; &lt;typ-len&gt; &lt;status&gt; . &lt;overwrite&gt;)</td>
      <td>[SUBR à 5 ou 6 arguments]</td>
      <td>265</td>
    </tr>
    <tr>
      <td>(DRIVER-CREATE-ATTRIBUTE0 &lt;table&gt; &lt;attr-name&gt; &lt;attr-type&gt; &lt;typ-len&gt; &lt;status&gt; . &lt;overwrite&gt;)</td>
      <td>[SUBR à 5 ou 6 arguments]</td>
      <td>265</td>
    </tr>
    <tr>
      <td>(DRIVER-CREATE-ATTRIBUTE-DEF &lt;table-def-name&gt; &lt;attr-def-name&gt; &lt;attr-type&gt; &lt;typ-len&gt; &lt;status&gt; . &lt;overwrite&gt;)</td>
      <td>[SUBR à 4 ou 5 arguments]</td>
      <td>295</td>
    </tr>
    <tr>
      <td>(DRIVER-CREATE-ATTRIBUTE-DEF0 &lt;table-def&gt; &lt;attr-def-name&gt; &lt;attr-type&gt; &lt;typ-len&gt; &lt;status&gt; . &lt;overwrite&gt;)</td>
      <td>[SUBR à 4 ou 5 arguments]</td>
      <td>295</td>
    </tr>
    <tr>
      <td>(DRIVER-CREATE-ATTRIBUTE-VAR &lt;tablevar-name&gt; &lt;attrdef-name&gt; . &lt;overwrite&gt;)</td>
      <td>[SUBR à 2 ou 3 arguments]</td>
      <td>299</td>
    </tr>
    <tr>
      <td>(DRIVER-CREATE-ATTRIBUTE-VAR0 &lt;table-var&gt; &lt;attribute-def&gt; . &lt;overwrite&gt;)</td>
      <td>[SUBR à 2 ou 3 arguments]</td>
      <td>299</td>
    </tr>
    <tr>
      <td>(DRIVER-CREATE-CLASS &lt;class-name&gt; &lt;super-class-name&gt; . &lt;overwrite&gt;)</td>
      <td>[SUBR à 2 ou 3 arguments]</td>
      <td>270</td>
    </tr>
    <tr>
      <td>(DRIVER-CREATE-FIELD &lt;class-name&gt; &lt;field-name&gt; &lt;ftype&gt; &lt;options&gt; . &lt;overwrite&gt;)</td>
      <td>[SUBR de 3 à 6 arguments]</td>
      <td>272</td>
    </tr>
    <tr>
      <td>(DRIVER-CREATE-FIELD0 &lt;class&gt; &lt;field-name&gt; &lt;ftype&gt; &lt;options&gt; . &lt;overwrite&gt;)</td>
      <td>[SUBR de 3 à 6 arguments]</td>
      <td>272</td>
    </tr>
    <tr>
      <td>(DRIVER-CREATE-FIELD-CONSTRAINT &lt;class-name&gt; &lt;field-name&gt; &lt;lambda&gt; . &lt;overwrite&gt;)</td>
      <td>[SUBR à 3 ou 4 arguments]</td>
      <td>278</td>
    </tr>
    <tr>
      <td>(DRIVER-CREATE-FIELD-CONSTRAINT0 &lt;field&gt; &lt;lambda&gt; . &lt;overwrite&gt;)</td>
      <td>[SUBR à 2 ou 3 arguments]</td>
      <td>278</td>
    </tr>
  </tbody>
</table>
<table><tr><td>(DRIVER-CREATE-JOIN &lt;table1-name&gt; &lt;table2-name&gt; &lt;applied-lambda&gt; . &lt;overwrite&gt;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;[SUBR à 3 ou 4 arguments] .................................................... 286</td></tr><tr><td>(DRIVER-CREATE-JOIN0 &lt;table1&gt; &lt;table2&gt; &lt;applied-lambda&gt; . &lt;overwrite&gt;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;[SUBR à 3 ou 4 arguments] .................................................... 286</td></tr><tr><td>(DRIVER-CREATE-MAPPING &lt;mapping-name&gt; . &lt;overwrite&gt;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;[SUBR à 1 ou 2 arguments] .................................................... 259</td></tr><tr><td>(DRIVER-CREATE-NEW-CURSOR &lt;dbms-name&gt; &lt;base-name&gt;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;[SUBR à 2 arguments] .................................................... 305</td></tr><tr><td>(DRIVER-CREATE-NEW-CURSOR0 &lt;dbms&gt;) [SUBR à 1 argument] .................... 305</td></tr><tr><td>(DRIVER-CREATE-SYNONYM &lt;symbol&gt;) [SUBR à 1 argument] .................... 322</td></tr><tr><td>(DRIVER-CREATE-TABLE &lt;table-name&gt; . &lt;overwrite&gt;) [SUBR à 1 ou 2 arguments] 264</td></tr><tr><td>(DRIVER-CREATE-TABLE-DEF &lt;table-def-name&gt; . &lt;overwrite&gt;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;[SUBR à 1 ou 2 arguments] .................................................... 293</td></tr><tr><td>(DRIVER-CREATE-TABLE-VAR &lt;table-def-name&gt; &lt;var-name&gt;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;[SUBR à 2 arguments] .................................................... 297</td></tr><tr><td>(DRIVER-CREATE-TABLE-VAR0 &lt;table-def&gt; &lt;var-name&gt;) [SUBR à 2 arguments] ... 297</td></tr><tr><td>(DRIVER-CURRENT-CURSOR &lt;cursor&gt;) [SUBR à 1 argument] .................... 306</td></tr><tr><td>(DRIVER-CURRENT-MAPPING &lt;mapping-name&gt;) [SUBR à 0 ou 1 argument] ...... 261</td></tr><tr><td>(DRIVER-CURRENT-MAPPING0 &lt;mapping&gt;) [SUBR à 0 ou 1 argument] ............ 261</td></tr><tr><td>(DRIVER-CURRENT-OBJECT-MODEL) [SUBR sans argument] .................... 327</td></tr><tr><td>(DRIVER-DBMS-CONNECTION &lt;dbms-name&gt; &lt;user-name&gt;) [SUBR à 2 arguments] . 305</td></tr><tr><td>(DRIVER-DEFCLASS &lt;class-name&gt; &lt;super-class-name&gt; &lt;field1&gt; ... &lt;fieldN&gt;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;[MACRO] ........................................................................ 268</td></tr><tr><td>(DRIVER-DEFCLASSMAP &lt;class-name&gt; &lt;table-name&gt; &lt;class-options&gt;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;[(fields &lt;field1-map&gt; ... &lt;fieldN-map&gt;) [MACRO] ................ 280</td></tr><tr><td>(DRIVER-DEFCLASSMAP &lt;class-name&gt; &lt;table-name&gt; &lt;class-options&gt;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;[(letjoins (&lt;join1&gt; ... &lt;joinM&gt; (fields &lt;field1-map&gt; ... &lt;fieldN-map&gt;)))] [MACRO] ............ 280</td></tr><tr><td>(DRIVER-DEFTABLE &lt;table-name&gt; &lt;attr1&gt; ... &lt;attrN&gt;) [MACRO] .................... 262</td></tr><tr><td>(DRIVER-DELETE-ATTRIBUTE &lt;table-name&gt; &lt;attr-name&gt;) [SUBR à 2 arguments] . 267</td></tr><tr><td>(DRIVER-DELETE-ATTRIBUTE0 &lt;attr&gt;) [SUBR à 1 argument] .................... 267</td></tr><tr><td>(DRIVER-DELETE-ATTRIBUTE-DEF &lt;table-def-name&gt; &lt;attr-def-name&gt;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;[SUBR à 2 arguments] .................................................... 296</td></tr><tr><td>(DRIVER-DELETE-ATTRIBUTE-DEF0 &lt;attr-def&gt;) [SUBR à 1 argument] ............ 296</td></tr><tr><td>(DRIVER-DELETE-ATTRIBUTE-VAR &lt;table-var-name&gt; &lt;attr-def-name&gt;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;[SUBR à 2 arguments] .................................................... 301</td></tr><tr><td>(DRIVER-DELETE-ATTRIBUTE-VAR0 &lt;attribute-var&gt;) [SUBR à 2 arguments] ...... 301</td></tr><tr><td>(DRIVER-DELETE-CLASS &lt;class-name&gt;) [SUBR à 1 argument] .................... 272</td></tr><tr><td>(DRIVER-DELETE-CLASS0 &lt;class&gt;) [SUBR à 1 argument] .................... 272</td></tr><tr><td>(DRIVER-DELETE-CLASS-CONSTRAINT &lt;class-name&gt; &lt;field-name&gt;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;[SUBR à 2 arguments] .................................................... 280, 285</td></tr><tr><td>(DRIVER-DELETE-CLASS-CONSTRAINT0 &lt;class&gt; &lt;field&gt;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;[SUBR à 2 arguments] .................................................... 280, 285</td></tr><tr><td>(DRIVER-DELETE-CLASS-MAP &lt;class-name&gt;) [SUBR à 1 argument] .................... 284</td></tr><tr><td>(DRIVER-DELETE-CLASS-MAP0 &lt;class&gt;) [SUBR à 1 argument] .................... 284</td></tr><tr><td>(DRIVER-DELETE-FIELD &lt;class-name&gt; &lt;field-name&gt;) [SUBR à 2 arguments] ...... 277</td></tr><tr><td>(DRIVER-DELETE-FIELD0 &lt;field&gt;) [SUBR à 2 arguments] .................... 277</td></tr><tr><td>(DRIVER-DELETE-FIELD-MAP &lt;class-name&gt; &lt;field-name&gt;) [SUBR à 2 arguments] . 291</td></tr><tr><td>(DRIVER-DELETE-FIELD-MAP0 &lt;field&gt;) [SUBR à 1 argument] .................... 291</td></tr><tr><td>(DRIVER-DELETE-JOIN &lt;table1-name&gt; &lt;table2-name&gt;) [SUBR à 2 arguments] ...... 287</td></tr></table>
<table>
  <tbody>
    <tr>
      <td>(DRIVER-DELETE-JOIN0 &lt;join&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>287</td>
    </tr>
    <tr>
      <td>(DRIVER-DELETE-MAPPING &lt;mapping-name&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>262</td>
    </tr>
    <tr>
      <td>(DRIVER-DELETE-MAPPING0 &lt;mapping&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>262</td>
    </tr>
    <tr>
      <td>(DRIVER-DELETE-TABLE &lt;table-name&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>265</td>
    </tr>
    <tr>
      <td>(DRIVER-DELETE-TABLE0 &lt;table&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>265</td>
    </tr>
    <tr>
      <td>(DRIVER-DELETE-TABLE-DEF &lt;table-def-name&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>294</td>
    </tr>
    <tr>
      <td>(DRIVER-DELETE-TABLE-DEF0 &lt;table-def&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>294</td>
    </tr>
    <tr>
      <td>(DRIVER-DELETE-TABLE-VAR &lt;table-var-name&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>298</td>
    </tr>
    <tr>
      <td>(DRIVER-DELETE-TABLE-VAR0 &lt;table-var&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>298</td>
    </tr>
    <tr>
      <td>(DRIVER-DIRECT-SUBCLASSES &lt;class-name&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>271</td>
    </tr>
    <tr>
      <td>(DRIVER-DIRECT-SUBCLASSES0 &lt;class&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>271</td>
    </tr>
    <tr>
      <td>(DRIVER-DO-FIND-ATTRIBUTE-VAR &lt;table-var-name&gt; &lt;attr-def-name&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>300</td>
    </tr>
    <tr>
      <td>(DRIVER-DO-FIND-ATTRIBUTE-VAR0 &lt;table-var&gt; &lt;attribute-def&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>300</td>
    </tr>
    <tr>
      <td>(DRIVER-DO-FIND-TABLE-VAR &lt;table-def-name&gt; &lt;var-name&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>298</td>
    </tr>
    <tr>
      <td>(DRIVER-DO-FIND-TABLE-VAR0 &lt;table-def&gt; &lt;var-name&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>298</td>
    </tr>
    <tr>
      <td>(DRIVER-EXISTENT-KEY-P &lt;class-name&gt; &lt;key-value&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>307</td>
    </tr>
    <tr>
      <td>(DRIVER-EXISTENT-KEY-P0 &lt;class&gt; &lt;key-value&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>307</td>
    </tr>
    <tr>
      <td>(DRIVER-FIELD-FILTER-VALIDATION &lt;filter-name&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>325</td>
    </tr>
    <tr>
      <td>(DRIVER-FIELD-LOADING-ORDER &lt;class-name&gt; &lt;field-names&gt;)</td>
      <td>[SUBR à 1 ou 2 arguments]</td>
      <td>292</td>
    </tr>
    <tr>
      <td>(DRIVER-FIELD-LOADING-ORDER0 &lt;class&gt; &lt;fields&gt;)</td>
      <td>[SUBR à 1 ou 2 arguments]</td>
      <td>292</td>
    </tr>
    <tr>
      <td>(DRIVER-FIELD-MAP &lt;class-name&gt; &lt;field-name&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>290</td>
    </tr>
    <tr>
      <td>(DRIVER-FIELD-MAP0 &lt;field&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>290</td>
    </tr>
    <tr>
      <td>(DRIVER-FIELD-P &lt;field&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>277</td>
    </tr>
    <tr>
      <td>(DRIVER-FIELD-TYPE &lt;class-name&gt; &lt;field-name&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>275</td>
    </tr>
    <tr>
      <td>(DRIVER-FIELD-TYPE0 &lt;field&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>275</td>
    </tr>
    <tr>
      <td>(DRIVER-FILTERS)</td>
      <td>[SUBR sans argument]</td>
      <td>324</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-ATTR-CONSTRAINTS-ON-CLASS &lt;class-name&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>285</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-ATTR-CONSTRAINTS-ON-CLASS0 &lt;class&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>285</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-ATTRIBUTE &lt;table-name&gt; &lt;attr-name&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>267</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-ATTRIBUTE0 &lt;table&gt; &lt;attr-name&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>267</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-ATTRIBUTE-DEF &lt;table-def-name&gt; &lt;attr-def-name&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>295</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-ATTRIBUTE-DEF0 &lt;table-def&gt; &lt;attr-def-name&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>295</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-ATTRIBUTE-VAR &lt;table-var-name&gt; &lt;attr-def-name&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>299</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-ATTRIBUTE-VAR0 &lt;table-var&gt; &lt;attribute-def&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>299</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-CLASS &lt;class-name&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>271</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-CLASS-CONSTRAINT &lt;class-name&gt; &lt;field-name&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>279, 285</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-CLASS-CONSTRAINT0 &lt;class&gt; &lt;field&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>279, 285</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-CONSTRAINTS-ON-CLASS &lt;class-name&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>286</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-CONSTRAINTS-ON-CLASS0 &lt;class&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>286</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-FIELD &lt;class-name&gt; &lt;field-name&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>276</td>
    </tr>
  </tbody>
</table>
<table>
  <tbody>
    <tr>
      <td>(DRIVER-FIND-FIELD0 &lt;class&gt; &lt;field-name&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>276</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-FIELD-CLASS-IN-HIERARCHY &lt; classname &gt; &lt; fieldname &gt;)</td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>[SUBR à 2 arguments]</td>
      <td></td>
      <td>276</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-FIELD-CLASS-IN-HIERARCHY0 &lt;class&gt; &lt; fieldname &gt;)</td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>[SUBR à 2 arguments]</td>
      <td></td>
      <td>276</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-FIELD-CONSTRAINTS-ON-CLASS &lt; class-name &gt;)</td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>[SUBR à 1 argument]</td>
      <td></td>
      <td>279</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-FIELD-CONSTRAINTS-ON-CLASS0 &lt;class&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>279</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-FIELD-IN-BRANCH &lt; classname &gt; &lt; fieldname &gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>276</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-FIELD-IN-BRANCH0 &lt;class&gt; &lt; fieldname &gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>276</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-FILTER-FIELDS &lt; filter-name &gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>325</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-HERITED-FIELD &lt; class-name &gt; &lt; field-name &gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>276</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-HERITED-FIELD0 &lt;class&gt; &lt; field-name &gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>276</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-JOIN &lt; table1-name &gt; &lt; table2-name &gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>287</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-JOIN0 &lt; table1 &gt; &lt; table2 &gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>287</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-MAIN-CLASS &lt; class-name &gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>271</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-MAIN-CLASS0 &lt;class&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>271</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-MAPPING &lt; mapping-name &gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>260</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-SYNONYM &lt; symbol &gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>322</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-SYNONYM-KEY &lt; synonym &gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>322</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-TABLE &lt; class-name &gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>264</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-TABLE-DEF &lt; table-def-name &gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>294</td>
    </tr>
    <tr>
      <td>(DRIVER-FIND-TABLE-VAR &lt; var-name &gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>297</td>
    </tr>
    <tr>
      <td>(DRIVER-GENERATE-TABLE-MAP &lt; table-name &gt;)</td>
      <td>[MACRO]</td>
      <td>302</td>
    </tr>
    <tr>
      <td>(DRIVER-GENERATE-CLASS-MAP &lt; class-name &gt;)</td>
      <td>[MACRO]</td>
      <td>304</td>
    </tr>
    <tr>
      <td>(DRIVER-GET-OBJECT &lt; class-name &gt; &lt; key-value &gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>307</td>
    </tr>
    <tr>
      <td>(DRIVER-GET-OBJECT0 &lt;class&gt; &lt; key-value &gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>307</td>
    </tr>
    <tr>
      <td>(DRIVER-GET-OBJECT-IF-LOADED &lt; class-name &gt; &lt; key-value &gt;)</td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>[SUBR à 2 arguments]</td>
      <td></td>
      <td>308</td>
    </tr>
    <tr>
      <td>(DRIVER-GET-OBJECT-IF-LOADED0 &lt;class&gt; &lt; key-value &gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>308</td>
    </tr>
    <tr>
      <td>(DRIVER-HERITED-FIELD-P &lt; class &gt; &lt; field &gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>277</td>
    </tr>
    <tr>
      <td>(DRIVER-JOIN-MATCHING &lt; table1-name &gt; &lt; table2-name &gt; . &lt; joins &gt;)</td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>[SUBR à 2 ou 3 arguments]</td>
      <td></td>
      <td>287</td>
    </tr>
    <tr>
      <td>(DRIVER-JOIN-MATCHING0 &lt; table1 &gt; &lt; table2 &gt; . &lt; joins &gt;)</td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>[SUBR à 2 ou 3 arguments]</td>
      <td></td>
      <td>287</td>
    </tr>
    <tr>
      <td>(DRIVER-JOIN-P &lt; join &gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>287</td>
    </tr>
    <tr>
      <td>(DRIVER-LOAD-CLASS-OBJECTS &lt; class-name &gt; . &lt; key-values &gt;)</td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>[SUBR à 1 ou 2 arguments]</td>
      <td></td>
      <td>310</td>
    </tr>
    <tr>
      <td>(DRIVER-LOAD-CLASS-OBJECTS0 &lt;class&gt; . &lt; key-values &gt;)</td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>[SUBR à 1 ou 2 arguments]</td>
      <td></td>
      <td>310</td>
    </tr>
    <tr>
      <td>(DRIVER-LOAD-DEEP-OBJECTS &lt; objects &gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>312</td>
    </tr>
    <tr>
      <td>(DRIVER-LOAD-MAPPING &lt; mapping-name &gt; . &lt; overwrite &gt;)</td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>[SUBR à 1 ou 2 arguments]</td>
      <td></td>
      <td>319</td>
    </tr>
    <tr>
      <td>(DRIVER-LOAD-OBJECT-DEFAULT &lt; object-default &gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>313</td>
    </tr>
    <tr>
      <td>(DRIVER-LOADING-TYPE-FILTER &lt; field &gt; &lt; object &gt; &lt; value &gt;)</td>
      <td>[SUBR à 3 arguments]</td>
      <td>326</td>
    </tr>
    <tr>
      <td>(DRIVER-MAIN-CLASSES)</td>
      <td>[SUBR sans argument]</td>
      <td>271</td>
    </tr>
    <tr>
      <td>(DRIVER-MAIN-CLASS-TABLES &lt; class-name &gt; . &lt; allp &gt;)</td>
      <td>[SUBR à 1 ou 2 arguments]</td>
      <td>291</td>
    </tr>
    <tr>
      <td>(DRIVER-MAIN-CLASS-TABLES0 &lt;class&gt; . &lt; allp &gt;)</td>
      <td>[SUBR à 1 ou 2 arguments]</td>
      <td>291</td>
    </tr>
    <tr>
      <td>(DRIVER-MAIN-TABLE-P &lt; table &gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>291</td>
    </tr>
    <tr>
      <td>(DRIVER-MAKE-CLASS &lt; class-name &gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>302</td>
    </tr>
  </tbody>
</table>
<table>
  <tbody>
    <tr>
      <td>(DRIVER-MAKE-CLASS0 &lt;class&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>302</td>
    </tr>
    <tr>
      <td>(DRIVER-MAKE-TABLE &lt;table-name&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>302</td>
    </tr>
    <tr>
      <td>(DRIVER-MAKE-TABLE0 &lt;table&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>302</td>
    </tr>
    <tr>
      <td>(DRIVER-MAP-CLASS &lt;class-name&gt; &lt;table-name&gt; &lt;[options]&gt; . &lt;overwrite&gt;)</td>
      <td>[SUBR de 1 à 4 arguments]</td>
      <td>282</td>
    </tr>
    <tr>
      <td>(DRIVER-MAP-CLASS0 &lt;class&gt; &lt;[table]&gt; &lt;[options]&gt; . &lt;overwrite&gt;)</td>
      <td>[SUBR de 1 à 4 arguments]</td>
      <td>282</td>
    </tr>
    <tr>
      <td>(DRIVER-MAP-FIELD &lt;class-name&gt; &lt;field-name&gt; &lt;field-map&gt; &lt;join-descriptions&gt; &lt;[options]&gt; . &lt;overwrite&gt;)</td>
      <td>[SUBR de 4 à 8 arguments]</td>
      <td>288</td>
    </tr>
    <tr>
      <td>(DRIVER-MAP-FIELD0 &lt;field&gt; &lt;field-map&gt; &lt;joins&gt; &lt;[options]&gt; . &lt;overwrite&gt;)</td>
      <td>[SUBR de 3 à 7 arguments]</td>
      <td>288</td>
    </tr>
    <tr>
      <td>(DRIVER-MAPPING-CURSOR &lt;mapping-name&gt; . &lt;cursor&gt;)</td>
      <td>[SUBR à 1 ou 2 arguments]</td>
      <td>306</td>
    </tr>
    <tr>
      <td>(DRIVER-MAPPING-CURSOR0 &lt;mapping&gt; . &lt;cursor&gt;)</td>
      <td>[SUBR à 1 ou 2 arguments]</td>
      <td>306</td>
    </tr>
    <tr>
      <td>(DRIVER-MAPPING-P &lt;mapping&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>260</td>
    </tr>
    <tr>
      <td>(DRIVER-METAMAPPING)</td>
      <td>[SUBR sans argument]</td>
      <td>319</td>
    </tr>
    <tr>
      <td>(DRIVER-MISSING-OBJECT-PROCESSING &lt;default&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>313</td>
    </tr>
    <tr>
      <td>(DRIVER-MONOTEXPR-FIELD-P &lt;field&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>277</td>
    </tr>
    <tr>
      <td>(DRIVER-MULTITEXPR-FIELD-P &lt;field&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>277</td>
    </tr>
    <tr>
      <td>(DRIVER-OBJECT2-FIELD-P &lt;field&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>277</td>
    </tr>
    <tr>
      <td>(DRIVER-OBJECT-CLASS &lt;object&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>316</td>
    </tr>
    <tr>
      <td>(DRIVER-OBJECT-CLASS-IN-DATABASE &lt;object&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>316</td>
    </tr>
    <tr>
      <td>(DRIVER-OBJECT-DEFAULT-CLASS)</td>
      <td>[SUBR sans argument]</td>
      <td>312</td>
    </tr>
    <tr>
      <td>(DRIVER-OBJECT-DEFAULT-P &lt;object-default&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>312</td>
    </tr>
    <tr>
      <td>(DRIVER-OBJECT-FIELD-P &lt;field&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>277</td>
    </tr>
    <tr>
      <td>(DRIVER-OBJECT-LOADED &lt;object&gt; &lt;class&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>311</td>
    </tr>
    <tr>
      <td>(DRIVER-OBJECT-LOADING-BEGIN &lt;main-class&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>311</td>
    </tr>
    <tr>
      <td>(DRIVER-OBJECT-LOADING-END &lt;main-class&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>311</td>
    </tr>
    <tr>
      <td>(DRIVER-OBJECT-MAIN-CLASS &lt;object&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>317</td>
    </tr>
    <tr>
      <td>(DRIVER-OBJECT-SET-FIELD-P &lt;field&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>277</td>
    </tr>
    <tr>
      <td>(DRIVER-ORDATOMSET-FIELD-P &lt;field&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>277</td>
    </tr>
    <tr>
      <td>(DRIVER-ORDOBJ2SET-FIELD-P &lt;field&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>277</td>
    </tr>
    <tr>
      <td>(DRIVER-ORDOBJSET-FIELD-P &lt;field&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>277</td>
    </tr>
    <tr>
      <td>(DRIVER-PRINT &lt;message&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>320</td>
    </tr>
    <tr>
      <td>(DRIVER-READ-FIELD-VALUE &lt;field-name&gt; &lt;object&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>314</td>
    </tr>
    <tr>
      <td>(DRIVER-READ-FIELD-VALUE-IN-DATABASE &lt;field-name&gt; &lt;object&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>315</td>
    </tr>
    <tr>
      <td>(DRIVER-READ-FIELD-VALUE-IN-DATABASE0 &lt;field&gt; &lt;object&gt;)</td>
      <td>[SUBR à 2 arguments]</td>
      <td>315</td>
    </tr>
    <tr>
      <td>(DRIVER-ROLLBACK-OBJECTS &lt;objects&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>318</td>
    </tr>
    <tr>
      <td>(DRIVER-SAVE-MAPPING &lt;mapping-name&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>319</td>
    </tr>
    <tr>
      <td>(DRIVER-SAVE-MAPPING0 &lt;mapping&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>319</td>
    </tr>
    <tr>
      <td>(DRIVER-SAVING-TYPE-FILTER &lt;attr&gt; &lt;field&gt; &lt;object&gt; &lt;value&gt;)</td>
      <td>[SUBR à 4 arguments]</td>
      <td>326</td>
    </tr>
    <tr>
      <td>(DRIVER-SELECT-OBJECTS &lt;applied-lambda&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>309</td>
    </tr>
    <tr>
      <td>(DRIVER-SEND &lt;message&gt; &lt;object&gt; . &lt;args&gt;)</td>
      <td>[SUBR à 2 et plus arguments]</td>
      <td>313</td>
    </tr>
    <tr>
      <td>(DRIVER-SET-FIELD-P &lt;field&gt;)</td>
      <td>[SUBR à 1 argument]</td>
      <td>277</td>
    </tr>
    <tr>
      <td>(DRIVER-SET-FIELD-VALUE &lt;field-name&gt; &lt;object&gt; &lt;value&gt;)</td>
      <td>[SUBR à 3 arguments]</td>
      <td>314</td>
    </tr>
    <tr>
      <td>(DRIVER-SET-FIELD-VALUE-IN-DATABASE &lt;field-name&gt; &lt;object&gt; &lt;value&gt;)</td>
      <td>[SUBR à 3 arguments]</td>
      <td>315</td>
    </tr>
  </tbody>
</table>
(DRIVER-SET-FIELD-VALUE-IN-DATABASE0 <field> <object> <value>)

[SUBR à 3 arguments] .................................................... 315

(DRIVER-SUB-TABLE-P <table>) [SUBR à 1 argument] ................................. 291

(DRIVER-TABLE-ATTRIBUTES <table-name>) [SUBR à 1 argument] .................... 268

(DRIVER-TABLE-ATTRIBUTES0 <table>) [SUBR à 1 argument] .................... 268

(DRIVER-TABLE-DEF-P <table-def>) [SUBR à 1 argument] ................................. 294

(DRIVER-TABLE-MAIN-CLASS <table-name>) [SUBR à 1 argument] .................... 284

(DRIVER-TABLE-MAIN-CLASS0 <table>) [SUBR à 1 argument] .................... 284

(DRIVER-TABLE-P <table>) [SUBR à 1 argument] .................................... 265

(DRIVER-TABLE-VAR-P <table-var>) [SUBR à 1 argument] ................................. 298

(DRIVER-TABLEDEF-ATTRIBUTEDEFS0 <table-def-name>) [SUBR à 1 argument] ... 296

(DRIVER-TABLEDEF-ATTRIBUTEDEFS0 <table-def>) [SUBR à 1 argument] ... 296

(DRIVER-TABLEDEF-TABLEVARS0 <table-def-name>) [SUBR à 1 argument] ... 299

(DRIVER-TABLEDEF-TABLEVARS0 <table-def>) [SUBR à 1 argument] ... 299

(DRIVER-TABLEVAR-ATTRVARS0 <table-var-name>) [SUBR à 1 argument] ... 301

(DRIVER-TABLEVAR-ATTRVARS0 <table-var>) [SUBR à 1 argument] ... 301

(DRIVER-VALID-FIELD-FILTER <filter-decl>) [SUBR à 1 argument] .................... 325

(DRIVER-WARNING <message>) [SUBR à 1 argument] .................................... 320
Index

ADT, see Type abstract

Aïda, 243

Algorithmes

add-initial-pairs, 199, 206

add-into-writing, 180

add-key-pairs, 199, 206

add-pair, 202

affect-new-object, 182, 183

all-class-objects, 185

all-persistent-objects-in-memory, 171

all-subclasses, 144, 145, 148

allowed-objects, 183–185

ask-database, 144, 146, 148, 163, 185

ask-fields-for-saving, 199–201

attr-value-from-key, 180

attr-value-to-database, 180, 181, 202

attr-values-from-key, 204, 205

attr-values-from-tuple, 182

build-and-add-pairs, 204, 205

build-class-part-object, 144, 146, 148

build-class-tuple-buffer, 170, 173

build-object-buffer, 170, 172

build-object-filter, 144, 178

build-saving, 198, 199

build-updates, 178, 186

build-writings, 199, 201, 208

change-object-class, 144, 148

check-class-constraints-on-objects, 170, 172, 191

check-contained-object-key, 182, 183, 203, 205, 207

class-instance-p, 212

class-object-buffer-class, 170

class-select, 144, 146, 148, 160, 163, 178, 180, 185

class-tuple-buffer, 170

clear-saving-buffer, 211

commit-class-objects, 170, 173, 177, 183, 186

commit-object, 170, 173, 177

commit-objects, 170, 172

compatible-object-key-p, 182, 183, 204

complete-buffers-if-unread-object, 182

complete-class-constraint, 160

constrained-key-attrs, 182, 203

constraint-joins, 160

contained-object-key, 180, 182, 183, 186, 203

contained-object-key2, 203, 205, 207

create-select-object, 160

dbms-rollback, 211

delete-object-references-in-class-objects, 212

delete-object-references-in-layer, 212

delete-object-references-in-object, 212

do-get-object-key, 180–184, 202, 203, 205, 207

do-get-object-saving, 199

do-writings-if-any, 178, 179, 186, 199, 201

driver-all-linked-objects, 151, 152, 171

driver-commit-objects, 170, 171, 173, 174, 210

driver-current-mapping, 141, 212

driver-delete-object, 212

driver-get-object, 214

driver-load-class-objects, 139, 141, 143, 144, 151, 152, 212

driver-load-deep-objects, 151, 152

driver-load-object-default, 139, 141

driver-loading-type-filter, 163, 164

driver-missing-object-processing, 141
driver-object-default-p, 141
driver-object-loaded, 128, 144, 146, 148
driver-rollback-objects, 151
driver-saving-type-filter, 181
driver-select-objects, 212-215
driver-warning, 196
fatal-error, 182, 196, 210, 211
field-value, 180-182, 202, 204, 205
field-value-from-tuple, 144, 146, 148, 163, 180
find-writing, 180
generate-sql, 133, 145, 146, 159, 163, 187
get-defaults, 151
get-object, 144, 148, 164, 165, 185
get-object-tuple, 170, 173
inconsistency-management, 194-196, 198, 201
info-for-select, 159-164
info-for-update, 178-184
info-for-writing, 200-208
info-to-writep, 178
init-object-saving, 199, 206
initialise-class-select, 160
initialise-saving-buffer, 170
initialise-tuple-buffer, 170
involved-main-classes, 151, 152
joined-table, 180
key-from-select, 178
load-class-objects, 142, 144, 148
load-class-part-objects, 144, 146, 148
load-deep-again, 152
load-deep-objects, 151-153
main-class, 212
main-class-objects, 151
make-attrs/values-operator, 185
make-object-updates, 178, 184
make-up-saving, 199, 200
next-class-object-buffer, 170
next-object, 170, 173
non-persistent-compatible-objects, 185
object-buffer, 170
object-class, 150

object-class-fields, 212
object-default-keys, 151
object-key-from-select, 185
object-key-from-tuple, 144, 148
object-key-while-saving, 182, 185, 199, 201, 202, 204
object-main-class-object-buffer, 183
objects-default-keys, 152
objects-toSave, 170, 171, 174
persistent-compatible-objects, 185
pop-element, 148
primary-field-value-from-tuple, 163, 164
record-object-deletion, 212
reduce-class-queue, 148-150
referenced-object-filter, 212
save-object, 182-184, 203
saving-attribute-values, 204, 205
set-field-value, 144, 146, 148
set-initial-pairs, 183, 184
solve-attributes, 200
solve-object-key, 200
solved-attributes, 204, 205
subclass-p, 150
table-key, 160
undo-current-transitions, 195
undo-saving-resolution, 196
undo-transitions, 211
update-object, 170, 173, 178, 179, 184, 186
valid-new-object-keys, 170
write-database, 178, 179
write-object, 170, 174, 179, 188, 191, 193, 195, 198, 199, 201, 203
write-object-field, 202, 203, 205
write-object-field-if-possible, 202, 204
write-object1, 195, 196, 198, 199
Asquell, 239
Attribut, 49, 78, 88
clé, 91, 92
dans une jointure objet, 93, 183
Contraintes d'intégrité, 78
de tri, 98
fondamental, 189-192, 195, 206
logique, 102
référentiel, 91-93, 183, 203

valeur NULL, 92

Attributs

Modèle des relations emboîtées, 24

Modèle relationnel, 23

Modèles sémantiques, 25, 27

Base

en compréhension, 36, 37

en extension, 36

Chaîne de jointures, 88

élémentaire, 88

incohérente, 88

inconsistante, 88

Champ, 49, 71

Méthode de
Écriture, 74

Lecture, 74

Champs

Accès en lecture seulement, 110

atomiques, 79

Contraintes, 72, 83

calculés, 81

délocalisés, 83

ens. d'atomes, 80

ens. d'objets, 81

ens. d'objets(II), 81

ens. ord. d'atomes, 80

ens. ord. d'objets, 81

ens. ord. d'objets(II), 81

Filtres, 111-113

objet, 80

Absence de valeur, 91-94

objet(II), 80

sans correspondance, 113

Valeur initiale, 83

Classe, 31, 71

Description en Driver, 78

Méthode de

Création, 75

Ensemble des instances, 76

Envoi de message, 74

Mutation, 75

Test d'appartenance, 75

Test d'existence, 75

principale, 71

Classes système DRIVER

Atom-field, 125-126

Atom-set, 128-130

Computed-field, 126-127

Driver-1-op, 216

Driver-2-op, 216

Driver-and, 216

Driver-attr-link, 216

Driver-attribute, 116-120

Driver-calculous, 216

Driver-class, 120-122, 191

Driver-class-saving, 122, 190-194

Driver-defattribute, 116-120

Driver-deftable, 116-120

Driver-deletion, 213

Driver-exists, 216

Driver-field, 122-125, 200

Driver-global-var, 216

Driver-insert, 187, 201, 208-209

Driver-join, 132-135

Driver-join0, 132-135

Driver-link, 216

Driver-mapping, 114-116

Driver-n-op, 216

Driver-not, 216

Driver-object-access, 216

driver-object-default, 139

Driver-or, 216

Driver-order, 131-132

Driver-restriction, 132-135

Driver-saving, 172, 190-194, 198, 201, 210

Driver-select, 122, 146, 156-159, 162

Driver-set-calculous, 216

Driver-set-link, 216

Driver-sql-op, 159, 216

Driver-subselect, 156-159

Driver-table, 116-120

Driver-transition, 193, 210

Driver-update, 179, 181, 184, 186-188, 201

Driver-val-link, 216
Mono-tuple-expr, 126-127
Multi-tuple-expr, 126-127
Object-field, 127-128
Object-set, 128-130
Object2-field, 130-131
Object2-set, 130-131
Ordered-atom-set, 128-130, 132
Ordered-object-set, 128-130, 132
Ordered-object2-set, 130-131
Set-field, 128-130
Clauses de Horn, 36, 38
CLERIC, 133, 216
Cohérence
  Dans un schéma de correspondances,
    49
  De la base de données, 57, 62
  entre objets, 61, 96
  Entre schémas, 63
Concurrence, 32
Connexions multiples, 62
Constructeurs de types, 25, 30, 220
  Agrégation, 25, 38, 42
  Ensemble, 30, 39
  Groupement, 25, 28, 38-39, 42
  Is-a, 25, 28, 40, 42
  Liste, 30
  N-uplet, 30, 38
Contraintes
  d'insertion, 189-190
  de classe, 122
Correspondances, 48
  Absence de valeur (Champs objet),
    91-94
  Attribut, 89
  Champ, 88
    atomique, 51, 86, 88
    calculés, 100-101
    Description en Driver, 109-110
    ens. d'atomes, 96-97
    ens. d'objets, 94-96
    ens. ordonné, 98
    objet, 52, 90-94
    objet(II), 98-100
  Classe, 85, 103-106

multiples, 88-89, 103
Objet, 85-86
Couche objet virtuelle, 49
Couplage, 49
Coûts en requêtes
  Chargement, 93, 142-155
Défauts d'objet, 50, 57-59, 139-141
  d'objets distribués, 63
Dictionnaire, 127, 128, 165, 191
  Object-buffer, 172
  Objets persistants, 115, 174
  Saving-buffer, 172
  Tuple-buffer, 172
Distribution, 63-64, 220
Écriture d'objets
  Incohérence, 210
Éditeur de schéma de correspondances,
  see Interface graphique
Élément de transition, see Transitions
Encapsulation, 31
Environnement
  de jointure, 106
Erreur
  fatale, 210
  rattrapable, see Algorithmes, inconsistency-management
Filtrage d'objets, see Objets, relationnels, Sélection
Filtrage d'objets dans la base, see Objets, relationnels, Sélection
Fonctions
  Modèles sémantiques, 25, 28
  SGBD déductifs, 38
Héritage, 25, 31
  en Driver, 71
  multiple, 25
  simple, 71
Impedance Mismatch, 17
Indicateurs système DRIVER
  États écriture, 193, 196-198
  driver-fix-key-generation-p, 195, 207
driver-writing-help, 172, 176, 183, 186, 195, 197, 198, 207, 210

Interface fonctionnelle, 49, 257-373

Messages d'erreur et autres, 359-366

objet, 73-76, 328-331, 349-358

Écriture d'un champ, 74

Création d'objet, 74

Création de classe, 75

Envoi de message, 74

Instances d'une classe, 76

Lecture d'un champ, 74

Mutation de classe, 75

Test d'appartenance à une classe, 75

Test d'existence d'une classe, 75

Interface graphique, 49, 243-251

Jointure, 86

Échec, 91

élémentaire, 87, 91, 95, 189

Auto-jointure, 101

définie pour une classe ancêtre, 109

Description en Driver, 106-109

Liaison

1:1, 96

1:N, 95, 96

N:M, 95-97

Liaison faible, 93

Liaison forte, 87, 91

objet, 90, 91, 95

fixée, 94, 96, 183, 184, 186

restreinte, 94, 96, 183, 193, 195, 201

stricte, 91, 93, 95

KEEconnection, see Systèmes, Couplage, KEEconnection

Lambda-expression, 107

Langage

C++, 73, 221

de règles, 37

DATALOG, 37, 42

OPS-5, 40

RDL1, 40

de requêtes, 32

OPAL, 33

SQL, 40, 55, 70, 127, 133, 143, 146, 156-159, 163, 166, 179, 186-187, 200, 208-209, 211, 217, 220

LISP, 33-34, 73, 214, 221

objet

de Driver, 78-84

MicroCeyx, 74

Smeci, 74

PROLOG, 37, 39-42

Liaison dynamique, 31

Méta-schéma, 50, 54, 114-135

Méthodes, 50

Persistance, see Persistance, Méthodes

Masaï, 243

Modèle

objet de Driver, 71-73, 220

relationnel, 23, 35, 69-70

V2, 25

Modèles

hyper-sémantiques, 29-30

NF2, 23-25, 38

ALGRES, 24

B-rel, 25

B-relationnel, 24, 25

FAD, 24

orientés-objet, 30-35

sémantiques, 25-29, 33, 40

Entité-Relation, 28, 40

FDM, 28

SDM, 28

Objets, 71

complexes, 30, 47, 71

Identités, see Objets, Références

inaccessibles, see Objets relationnels manquants

jumeaux, 49, 57, 59-62

Consultation, 82

Mise-à-jour réflexe, 61, 82

Raisonnement, 61-62

Méthode de

Création, 74

Références, 25, 30, 50, 57, 63, 93, 183
Réversibilité, 62, 220
relationnels, 49, 57, 88
Accès, 50
Accès direct, 59, 82
Chargement, 139–167
distribués, 63
manquants, 92, 93, 141
Sélection, 49, 214–217, 220
Versions, 33–35, 62, 220

Pannes, 32
Persistance, 32, 48–50, 53–55, 72
Classe, 50
Classes et correspondances, 54
distribuée, 63–64
Granularité, 53
Méthodes, 220

Prédicats
Prédicats et fonctions, 38

Règles, 36
d'or (SGBDOO), 30–32
de production, 40
logiques, 36–39
Raisonnement, 61–62
Relation
élémentaire, 88, 90, 92, 189
déduite, see Relation dérivée
dérivée, 36, 37, 40
Description en Driver, 77–78
NF2, 23, 24, 38
principale, 52, 86, 88, 102
secondaire, 86, 88, 102
Relations emboîtées, see Relation NF2

Représentation relationnelle, 48

Représentations objet, 48
multiples contextuelles, 64

Requêtes, 64
de lecture, 93, 142–167
Requête principale, 142

Schéma de correspondances, 48
Construction, 48–49

Schéma relationnel
Description en Driver, 77–78

SGBD

déductifs, 35–41
Orientés Objet (SGBDOO), 17
Relationnels (SGBDR), 17
Smeci, 47, 61–62, 74

SQL, see Langage de requêtes SQL
Systèmes

Couplage
DRIVER, 41
KEEconnection, 41
PDKB, 42
Proteus/Orion, 41
Modèles hyper-sémantiques
KDM, 29

Modèles sémantiques
Format, 29
GALILEO, 29
GEM, 29
INSYDE, 29
IRIS, 29
LDM, 29
PROLOG/KB, 40
RM/T, 29
SAM*, 29
SHM+, 29
SM, 29
TAXIS, 29

Orientés-objet
CPOMS, 35
Cricket, 35
EXODUS, 35
G-BASE, 35
GEMSTONE, 33
GEODE, 35
IRIS, 34
MATISSE, 35
Mneme, 35
MONADS, 35
MUSHROOM, 35
NICE-C++, 35
O2, 34, 220
Objectivity, 35
ObjectStore, 35
ObServer, 35
ODE, 35

OM, 35

ONTOS, 34

ORION, 25, 33, 41

PAM, 35

Polymnia, 35

POMS, 35

PROBE, 35

Trellis/Owl, 35

UniSQL, 25

VISION, 35

Relations emboîtées

AIM, 24

DASDBS, 24

POSTGRES, see Systèmes, SGBD déductifs, POSTGRES

UniSQL, 25

VERSO, 24

SGBD déductifs

ALGRES, 40

DATALOG, 37-39

EDUCE, DEDGIN, PROLOG/KB, 40

EPSILON, 40

FGCS, 40

ICOT, 40

LDL, 39, 41

NAIL!, 40

POSTGRES, 24, 40

PROSQL, 40

SABRINA*, 40

Table, see Relation

logique, 101, 108

physique, 101, 108

Transactions, 29, 33, 34, 55-57, 60, 61, 214, 316

Annulation de validation, 59, 183, 198, 210, 214, 318

Granularité, 169-171

Validation, 63, 116, 176, 184, 192, 193, 210, 317-318

Transitions, 193-195, 210-211

Type, 31

abstrait, 25, 40

Versions d'objet, see Objets, Versions
<figure><img src="image_46.png" /></figure>
Résumé

Cette thèse présente DRIVER, une couche objet virtuelle persistante permettant d'utiliser
dans un même formalisme objet choisi aussi bien l'information contenue dans les bases
de données relationnelles que la connaissance d'un système de plus haut niveau, comme
notre générateur de Systèmes Experts SMECI. Un schéma de correspondances, défini par
l'utilisateur, associe aux données des bases connectées une représentation objet qui permet
de les manipuler et de les exploiter de façon absolument transparente dans l'environnement
du système expert, notamment dans le cadre du raisonnement. DRIVER permet également
d'apporter la persistance aux objets de l'environnement, au gré de l'utilisateur.

Mots-clés :

Intelligence artificielle, base de donnée relationnelle, modèle relationnel, modèle objet, mapping objet-relationnel, filtrage, objet.

Abstract

This thesis presents DRIVER, a persistent virtual object layer, that permits to use, in a
same chosen object formalism, both the information contained in relational databases and
the knowledge of a higher-level system, such as our expert system shell SMECI. A user-
defined mapping assigns an object representation to data of connected bases; it permits
to handle and to utilize them exactly as other objects in the expert system environment,
for example during reasoning. DRIVER can also supply some environment objects with
persistency, according to user's wishes.

Keywords :

Artificial intelligence, relational database, relational model, object model, object-relational
mapping, filtering, object.