Systèmes de Gestion de Bases de Données Orientés Objet

Slides:



Advertisements
Présentations similaires
La programmation orientée objet avec Java L3-MIAGE Plan
Advertisements

Transformation de documents XML
Systèmes de Gestion de Bases de Données Orientés Objet
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
C.
CURSUS DE FORMATION AUX NOUVELLES TECHNOLOGIES DE DEVELOPPEMENT UV EJB Entité Module Java Expert.
TP 3-4 BD21.
Bases de données orientées-objets
Oracle Orienté Objet Amanda Evans Mai 2000.
TECHNIQUES DES SGBDO 1. Qu'est-ce qu'un SGBDO ?
ESIEE Paris © Denis BUREAU I N Initiation à la programmation avec le langage Java.
Leçon 3 : Héritage IUP 2 Génie Informatique
Introduction à la POO: Les classes vs les objets
1 ARCHITECTURE DACCÈS la méthode générale modèle de données définitions module daccès / modules métiers construction des modèles les modules daccès, les.
Les contraintes d’integrité
Principes de programmation (suite)
Structures de données linéaires
Programmation orientée objet
Contrôles d'accès aux données
Principes de la technologie orientée objets
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Concepts de base : la Classe Pour faire une comparaison simple, une classe serait a priori, une structure C avec des variables et des fonctions.
SELECT {* | Expression [Alias] [,...] } FROM Table [WHERE Condition] [ORDER BY { Expression | Alias } [ ASC | DESC ] [NULLS FIRST | NULLS LAST ] [,...]
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
© 2007 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java et les Exceptions Peter Van Roy Département dIngénierie Informatique,
Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès.
Langage Oriente Objet Cours 2.
EPID-CPI-ISAIP Philippe Bancquart - mise à jour 24/02/ page 1 Procédures stockées CPI-SQLServer.
SYSTEME DE GESTION DE BASES DE DONNEES
Structures de données IFT-2000
Introduction au paradigme orienté-objet (suite)
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Les concepts et les méthodes des bases de données
Chapitre 9 Les sous-programmes.
Types de données abstrait et mécanismes d'encapsulation
COURS DE PROGRAMMATION ORIENTEE OBJET :
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
Introduction.
Travaux Pratiques Représentation des connaissances
BD Relationnelles versus BD Objets Fariza Tahi
Gérer la sécurité des mots de passe et les ressources
La notion de type revisitée en POO
JDBC L'API JDBC est utilisée pour utilisée pour intéragir avec une base de données.
Programmation objet La base.
Variables et accès en Java. Déclaration des variables final transient static private Printer hp; transient => ne doivent pas être sérialisées volatile.
Créer des packages.
1 BDs Orientées Objets Witold LITWIN. 2 Pourquoi ? F Les BDs relationnelles ne sont pas adaptées aux applications CAD/CAM, cartes géo... F le problème.
Optimisation de requêtes
CSI3525: Concepts des Langages de Programmation Notes # 13: Introduction au SmallTalk.
Tutorat en bio-informatique
5ième Classe (Mercredi, 19 octobre) Prog CSI2572.
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
Sélection de colonnes (la projection)
2 Processus de conception de BD
La programmation par objets Principes et concepts Etude de Smalltalk.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Quinio1 Bases de données : modèlisation et SGBD Séance 3 B Quinio.
Héritage Conception par Objet et programmation Java
3 Copyright © Oracle Corporation, Tous droits réservés. Créer des fonctions.
06/04/06 LES BASES DE DONNEES INTRODUCTION CogniTIC – Bruxelles Formation - Cepegra.
Introduction à la Programmation Orientée Objet
Séance /10/2004 SGBD - Approches & Principes.
Philippe Gandy - 8 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
Philippe Gandy - 15 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
Introduction Module 1.
Introduction SGDBOO Sommaire Définition d’un SGBD (6 services)
1 Initiation aux bases de données et à la programmation événementielle VBA sous ACCESS Cours N° 4 Support de cours rédigé par Bernard COFFIN Université.
Transcription de la présentation:

Systèmes de Gestion de Bases de Données Orientés Objet ESSI 3 Systèmes de Gestion de Bases de Données Orientés Objet Etude de cas avec un SGBDOO : O2 Philippe SALVAN psalvan@supralog.com © Philippe SALVAN

Plan du Cours — 1 Généralités Historique Aspects Bases de Données ; Aspects Orientés Objet Architecture Premiers pas avec O2

Plan du Cours — 2 Aspects Orientés Objets Objet Complexe, Encapsulation, Classes Identité d'Objet Héritage Surcharge, Lien retardé Valeurs, Types

Plan du Cours — 3 Aspects Base de Données Modèle de persistance Transactions Interrogations Optimisations

Généralités - Historique Besoin d’organiser de manière cohérente des données permanentes et accessibles par des utilisateurs concurrents Gestion de Fichiers  SGBD Navigationnels  SGBD Relationnels  SGBD Orientés Objets

Généralités - Historique code unique code réutilisable optimisation données fichiers SGF code unique code réutilisable optimisation données fichiers SGBD/R code unique code réutilisable optimisation données fichiers SGBD/O code unique code réutilisable optimisation données fichiers SGBD/N abstraction

Généralités - Historique Limites des SGBDR le modèle de données est très pauvre la normalisation conduit à un éclatement des données intégration de SQL à un langage de programmation : ensembliste vs procédural dysfonctionnement (conversion de types)

Généralités - Historique Objectifs des SGBDOO réduire le dysfonctionnement entre langage de programmation et langage de base de données en offrant un unique langage de programmation de base de données supporter directement les objets arbitrairement complexes par un modèle objet partager le code réutilisable au sein du SGBD

Généralités - Historique Définition des SGBDOO The Object-Oriented Database System Manifesto (1989) Défini par des chercheurs Ensemble de règles caractérisant un SGBDOO: obligatoires, facultatives, ouvertes

Généralités - Historique Définition des SGBDOO ODMG 93 Défini par des éditeurs Standard de portabilité des SGBDOO

Généralités - Aspects Base de Données un SGBDOO est un SGBD Persistance Gestion du disque Partage des données (multi-utilisateurs) Fiabilité des données Sécurité des données Interrogation ad hoc

Généralités - Aspects Orientés Objet Un SGBDOO est Orienté Objet Objets complexes Identité d'objet Encapsulation, Classes Héritage Surcharge, Lien retardé Valeurs, Types Polymorphisme

Généralités - Architecture Architecture Fonctionnelle Langage de Définition Langages de Programmation Langage de Requêtes Autres interfaces Outils de Développement Gestion de Schéma Gestion d'Objets

Généralités - Architecture Architecture Opérationnelle Programme utilisateur Compilation Application Objets Verrous Journal Fichiers Pages

Généralités - Architecture Architecture Client/Serveur Serveur d'objets Objets Verrous Journal Application Objets Fichiers Cache de Pages Application Objets

Généralités - Architecture Architecture Client/Serveur Serveur d'objets Fort degré de concurrence (verrouillage et journalisation au niveau de l'objet) Possibilité d'exécution de méthodes sur le serveur

Généralités - Architecture Architecture Client/Serveur Serveur de pages Pages Verrous Journal Application Objets Cache de Pages Fichiers Pages Application Objets Fichiers Pages

Généralités - Architecture Architecture Client/Serveur Serveur de pages Utilisation de la puissance de calcul des clients Accroît le nombre de connections possibles Serveur isolé Verrouillage et journalisation par page

Généralités - Architecture Architecture Client/Serveur Multi-serveurs Application Application Objets Répartis Objets Répartis objets ou pages Fichiers Fichiers Pages Pages

Généralités - Premiers pas avec O2 Schéma, Base Le support physique d'un système O2 est appelé volume. Un volume comprend un catalogue d'associations schéma - bases SCHÉMA = STRUCTURES DE DONNÉES + SIGNATURE DES TRAITEME + CODE DES TRAITEMENTS BASE = DONNÉES

Généralités - Premiers pas avec O2 Schéma, Base SYSTEME VOLUME DISQUE BASE BASE BASE BASE SCHEMA SCHEMA BASE BASE

Généralités - Premiers pas avec O2 Fichier .o2serverrc Le fichier .o2serverrc permet de configurer les différents systèmes O2. Pour chaque système est indiqué son nom, la machine par défaut sur laquelle s’exécutera le serveur, les répertoires stockant le volume, le fichier de log et le fichier d’image, le comportement concurrentiel et de reprise sur panne, les utilisateurs autorisés du système.

Généralités - Premiers pas avec O2 Fichier .o2serverrc Le format de description est le suivant: system_name.server = picasso system_name.cachesize = 4000 system_name.cataldir = /home/o2vol system_name.defaultvolsize = 50000 . . . system_name.mode = multi-user +verbose L’initialisation d’un système O2 est effectuée par la commande O2dba_init -system system_name [-server server_name] Cette commande détruit toutes les données qui se trouvaient dans le système.

Généralités - Premiers pas avec O2 Connexion Lancement du processus serveur o2server -system system_name Lancement du processus client o2shell -system system_name [-server server_name] o2tools -system system_name [-server server_name] La connexion entre les deux processus s’effectue et le message (en mode alphanumérique) Type your command and end with ^D s’affiche. La session O2 est démarrée.

Généralités - Premiers pas avec O2 Utilisation courante une fenêtre réservée au serveur O2 (éventuellement en mode verbose) une fenêtre réservée au client O2 (dans laquelle on lancera les commandes de compilation et d'exécution des programmes ainsi que celles de maintenance de la base de donnée) une fenêtre réservée à l'édition des programmes (emacs, vi, …)

Généralités - Premiers pas avec O2 o2server is up and running Class Personne public type tuple( nom: string, age: integer, adresse: Adresse) end; Type your command and end with ^D.

Généralités - Premiers pas avec O2 Langage de commandes Manipulation de schémas [create] schema schema_name display schemas display schema schema_name stat set schema schema_name import schema schema_name class class_name | name root_name

Généralités - Premiers pas avec O2 Langage de commandes Manipulation de bases [create] base base_name schema schema_name display bases display base base_name stat set base base_name

Premiers pas avec O2 Validation de session Lors du démarrage d’une session, une transaction est implicitement entamée.Toutes les modifications de schéma(s), base(s), programme(s) sont sauvegardées si l’on déclenche (interactivement ou par programme) une instruction commit, sont annulées si l’on déclenche (interactivement ou par programme) une instruction abort.

Aspects Orientés Objets Objet complexe, encapsulation, classe OBJET = DONNÉES + DESCRIPTION D’INTERFACE (STRUCTURES DE DONNÉES + COMPORTEMENTS) Un objet est l’encapsulation, dans une même entité, de données conformes à une structure de données et des opérations permettant de manipuler cette structure de données.

Aspects Orientés Objets Objet complexe, encapsulation, classe Vue externe: OBJET = BOITE NOIRE + BOUTONS Vue interne: OBJET = DONNEES + MECANIQUE LIEE AUX BOUTONS

Aspects Orientés Objets Point de vue structurel : un objet est un type de données qui définit une structure et l’ensemble des opérations applicables à cette structure. Point de vue conceptuel : un objet est une unité de connaissance représentant le prototype d’un concept Point de vue acteur : un objet est une entité autonome et active.

Aspects Orientés Objets L’encapsulation est le principe qui consiste à préserver la structure et la mécanique interne des objets des regards indiscrets pour n’en montrer qu’une interface choisie Les propriétés de visibilité permettent de définir ce qui fera partie de l’interface. Seules les parties publiques (appelées spécifications ou interfaces) sont accessibles.

Aspects Orientés Objets Une classe est la description abstraite d’un ensemble d’objets partageant les mêmes caractéristiques. Elle possède deux composantes : description des données, appelées attributs (composante statique) description des procédures, appelées méthodes (composante dynamique)

Aspects Orientés Objets Les attributs caractérisent l’état des objets durant l’exécution des programmes. Les méthodes caractérisent les comportements des objets durant l’exécution des programmes. Tout objet est instance de sa classe.

Aspects Orientés Objets Exemple class Personne public type tuple( nom: string, prenom: string, private age: integer, private conjoint: Personne)

Aspects Orientés Objets method public init( nom: string, prenom: string, age: integer, conjoint: Personne ), public vieillir, public donne_age: integer, public donne_conjoint: Personne, public se_marie(conjoint: Personne) private fixe_age(age: integer) end;

Aspects Orientés Objets Une méthode est toujours associée à une classe et se compose de deux parties : sa signature qui indique les structures de données sur lesquelles elle opère son corps qui indique la manière dont elle opère

Aspects Orientés Objets public method se_marier(conjoint: Personne) in class Personne; method body se_marier(conjoint: Personne) in class Personne { self->conjoint = conjoint; }; Une méthode est toujours déclenchée sur un objet appelé objet receveur et désigné, dans le corps de la méthode, par la variable self. public method vieillir in class Personne; method body vieillir in class Personne { self->fixe_age(self->donne_age() + 1); };

Aspects Orientés Objets Pour instancier une classe, on fait appel à l’opérateur new, prédéfini pour toute classe, qui réalise l’allocation mémoire nécessaire, crée un objet et déclenche automatiquement la méthode init de la classe, si celle-ci a été définie. { … o2 Personne dupond = new Personne; }

Aspects Orientés Objets ESSI 3 Aspects Orientés Objets public method init(nom: string, prenom: string, age: integer, conjoint: Personne) in class Personne; method body init(nom: string, prenom: string, age: integer, conjoint: Personne) in class Personne { self->nom = nom; self->prenom = prenom; self->age = age; self->se_marie(conjoint); }; © Philippe SALVAN

Aspects Orientés Objets ESSI 3 Aspects Orientés Objets { … o2 Personne dupont = new Personne( “ Dupont ”, “ Jean ”, 25, dupond); … } O2 fournit des méthodes génériques pour toutes les classes méthodes de copie : copy et deep_copy méthodes de comparaison : equal et deep_equal méthodes d’affichage : display et edit © Philippe SALVAN

Aspects Orientés Objets Identité d ’objet Chaque objet est caractérisé par un identifiant unique, immuable, géré par le système. Cet identifiant est un moyen discriminant de désigner un objet ; il est indépendant de la valeur des attributs de l'objet. Deux objets peuvent coïncider en tout point (selon la modélisation effectuée) : on dit qu'ils sont égaux.

Aspects Orientés Objets Deux personnes différentes mais de mêmes caractéristiques (pour le modèle) ! Exemple: deux cousins éloignés de même prénom et de même âge… Nom: DUPOND Prénom: Jean Age: 25 Conjoint: - Nom: DUPOND Prénom: Jean Age: 25 Conjoint: -

Aspects Orientés Objets L'identité est la relation d'équivalence "avoir même identificateur que" L'égalité est la relation d'équivalence "avoir les mêmes propriétés que".

Aspects Orientés Objets Jean DUPOND (1) se marie avec Jeanne DURANT Jean DUPOND (1) le conjoint de Jeanne DURANT sont deux objets identiques (ou sont un seul objet) Jean DUPOND (1) et Jean DUPOND (2) ne sont plus égaux (une de leurs propriétés diffère: le conjoint) Nom: DUPOND Prénom: Jean Age: 25 Conjoint: [DURAND Jeanne] Nom: DUPOND Prénom: Jean Age: 25 Conjoint: -

Aspects Orientés Objets IDENTITÉ != ÉGALITÉ Deux objets sont identiques si et seulement si ce sont le même ! (symbole = ) Deux objets sont égaux si et seulement si leurs valeurs sont égales.

Aspects Orientés Objets L'identité d'objet permet de partager des objets de les rendre cycliques Nom: DUPOND Prénom: Jean Age: 25 Conjoint: [DURAND Jeanne] Nom: DURAND Prénom: Jeanne Age: 26 Conjoint: [DUPOND Jean]

Aspects Orientés Objets Héritage L'héritage est un mécanisme de transmission des propriétés d'une classe vers une sous-classe. C'est une relation entre classes. Le graphe de cette relation est le graphe d'héritage. Une sous-classe possède toutes les propriétés de sa super-classe mais elle peut en redéfinir certaines et en posséder d'autres. La sous-classe est une spécialisation (ou raffinement) de la super-classe.

Aspects Orientés Objets L ’héritage a deux objectifs : l'enrichissement : on adjoint, dans la sous-classe, de nouvelles propriétés à celles issues de la super-classe la substitution : on redéfinit dans la sous-classe certaines propriétés issues de la super-classe. L'héritage est dit simple si la sous-classe n'a qu'une super-classe ; il est dit multiple si la sous-classe a plusieurs super-classes.

Aspects Orientés Objets Intérêts de l ’héritage: factorisation du code des classes structuration hiérarchisée des classes, modularité

Aspects Orientés Objets Init (nom:string, prenom: string, age:integer, conjoint: Personne) Nom: DUPOND Prénom: Jean Age: 25 Conjoint: - Personne Salaire: real employeur: Employeur Employe Salaire: real Enseignant Chercheur Salaire_Enseignant: real salaire_Chercheur: real Employeur_Enseignant: Employeur employeur_Chercheur: Employeur Enseignant-Chercheur

Aspects Orientés Objets Surcharge, Lien retardé Chaque propriété d'une super-classe peut être redéfinie dans une sous-classe à condition de respecter certaines conditions : Pour les attributs : les types des attributs de la sous-classe doivent être des sous-types de ceux de la super-classe

Aspects Orientés Objets Pour les méthodes : le nombre de paramètres doit être identique et les types des paramètres et de la valeur de retour de la méthode dans la sous-classe doivent être des sous-types de ceux de la méthode dans la super-classe (covariance)

Aspects Orientés Objets Lorsqu ’on déclenche une méthode sur un objet, on ne peut pas nécessairement déterminer, à la compilation, le code qui sera réellement exécuté. { … o2 Employe e; e = …; display(e->salaire()); } e vu comme un employé, est peut-être en réalité un Enseignant ou un Chercheur ou un Enseignant-Chercheur. C'est à l'exécution que le système déterminera, en fonction du type réel de e (connu après le calcul), la méthode à exécuter.

Aspects Orientés Objets Lorsque le choix de la méthode à utiliser est réalisé à l'exécution, on parle de lien retardé ou lien dynamique. Lorsque le choix de la méthode à utiliser est réalisé à la compilation, on parle de lien statique.

Aspects Orientés Objets Lien dynamique Lien statique { … o2 list(Employe) lesEmployes; o2 Employe x; for (x in lesEmployes) { display(x->salaire()); } { … o2 list(Employe) lesEmployes; o2 Employe x; for (x in lesEmployes) { display(x->Employe@salaire()); } La possibilité d’évaluer des propriétés (attributs ou méthodes) d’objets de natures différentes s’appelle polymorphisme.

Aspects Orientés Objets Valeurs, Types Une valeur est une donnée organisée selon une certaine structure appelée type. Le type définit une structure de données et les opérations que l'on peut lui appliquer. Toute valeur est typée et son type est défini lors de sa déclaration. o2 integer i; o2 tuple(x: integer, y: integer) unPoint; o2 list(Personne) lesPersonnes;

Aspects Orientés Objets Les valeurs ne supportent pas le concept d'identité : elles ne peuvent donc être ni partagées ni cycliques. On accède à la valeur d'un objet en utilisant l'opérateur de déréférencement noté * . Nom: DUPOND Prénom: Jean Age: 25 Conjoint: [DURAND Jeanne] p = *Dupond Dupond p

Aspects Orientés Objets O2 fournit des fonctions prédéfinies d'affichage et d'édition de valeurs : display() input() { … o2 Personne Dupont = new Personne(" Dupont ", " Jean ", 25, dupond); Dupont->display(); display(*Dupont); }

Aspects Orientés Objets Les types supportés par le système sont obtenus par application récursive de constructeurs de types à des types atomiques. Constructeurs de types : tuple() (constructeur n-uplet) list() (constructeur de collection ordonnée) set() (constructeur de collection non ordonnée) unique set() (idem mais sans doublon) type() (accès au type d'une classe)

Aspects Orientés Objets Types atomiques : boolean char integer real string bits

Aspects Orientés Objets L'accès à un champ d'une valeur de type n-uplet se fait à l'aide de l'opérateur " .  » L'accès à un champ d'un objet dont la valeur est de type n-uplet se fait à l'aide de l'opérateur " -> ".

Aspects Orientés Objets { … o2 Personne Dupont = new Personne(" Dupont ", " Jean ", 25, dupond); display(Dupont->nom); Dupont->conjoint->edit(); display((*Dupont).nom); (*Dupont).conjoint->edit(); }

Aspects Orientés Objets Les types sont organisés selon une relation d'ordre partiel, défini par les règles suivantes : il n'existe pas de sous-type d'un type atomique tuple(a: t1, b: t2) est un sous-type de tuple(a: t1) tuple(a: t1) est un sous type de tuple(a: t2) si t1 et un sous type de t2 list(t1) [resp. set(t1), unique set(t1)] est un sous-type de list(t2) [resp. set(t2), unique set(t2)] si t1 est un sous type de t2

Aspects Orientés Objets De la même manière, les classes sont organisées selon un ordre partiel, décrit par le graphe d'héritage. L'ordre des types et des classes est vérifié par le compilateur.

Aspects Orientés Objets Opérations sur les collections Listes affectation, comparaison, concaténation, accès direct, appartenance, extraction de sous-liste, taille, remplacement, effacement, insertion, parcours itératif conditionnel Ensembles, Multi-ensembles affectation, comparaison, union, intersection, différence, appartenance, taille, insertion, suppression, parcours itératif conditionnel

Aspects Bases de Données Modèle de persistance Faculté pour un objet ou une valeur d'exister au-delà du programme qui l'a créé(e). Modèle de persistance par attachement Tout objet ou valeur référencé(e) par un objet ou valeur persistant(e) est persistant(e).

Aspects Bases de Données Conséquences du modèle par attachement transparent pour le développeur ramasse-miettes pour détruire les objets et valeurs qui ne sont plus référencés par un objet ou une valeur persistant(e) nécessité de racines de persistance

Aspects Bases de Données Les racines de persistance sont nommées explicitement dans le schéma à l'aide de l'instruction name. Les racines de persistance peuvent être des objets et/ou des valeurs, de classes et/ou de type quelconques. name LesHommes: set(Personne); name LePresident: Personne;

Aspects Bases de Données { … o2 Personne Dupont = new Personne ( & "DUPONT", "Jean", 25, nil ); o2 Personne Durant = new Personne ( & "DURANT", "Jeanne ", 23, nil ); LesHommes += set(Dupont); LePresident->se_marie(Durant); } Dupont devient persistant Durant devient persistant

Aspects Bases de Données Transactions C'est un programme d'accès à la base de données qui vérifie les propriétés d'ACIDité : Atomicité (« tout ou rien ») Cohérence (« sémantique des objets garantie ») Isolation (« comme en mono-utilisateur ») Durabilité (« les effets d’une transaction validée perdurent »)

Aspects Bases de Données Par défaut, tout programme accède aux données de la base de données en mode "transaction lecture seule ". Pour pouvoir mettre à jour ces données, il faut démarrer une transaction.

Aspects Bases de Données 2 possibilités pour débuter une transaction : utiliser un programme transactionnel utiliser une instruction transactionnelle

Aspects Bases de Données Programme transactionnel : c'est un programme de l'application implémenté en tant que transaction une validation est automatiquement effectuée à la fin du programme application monApplication program public p1, public p2 end;

Aspects Bases de Données program body p1 in application monApplication { … } transaction body p2 in application monApplication {

Aspects Bases de Données Transaction sur instruction : dans un programme, on démarre explicitement une transaction que l'on valide ou que l'on avorte explicitement pour valider une transaction, on utilise l'instruction commit ou valid. pour avorter une transaction, on utilise l'instruction abort.

Aspects Bases de Données program body p1 in application monApplication { … transaction; [ [commit | valid] | abort]; }

Aspects Bases de Données ESSI 3 Aspects Bases de Données Interrogation Langage OQL (Object Query Language) standardisé par ODMG 93 Langage déclaratif, fonctionnel de syntaxe proche de SQL (Structured Query Language) permettant l'exécution de requêtes arbitrairement complexes combinant requêtes élémentaires et requêtes complexes © Philippe SALVAN

Aspects Bases de Données Requêtes élémentaires accès aux instances nommées: LePresident envois de messages: LePresident->age() sélection d'un champ: LePresident->conjoint opérations sur les types atomiques et construits: LePresident->conjoint->age() + 1 construction et instanciation: struct(nom: LePresident->nom, age: LePresident->age())

Aspects Bases de Données Requêtes complexes sélection/extraction/jointure select [distinct]… from … where…  le résultat est un multi-ensemble (bag) ou ensemble (set) Tri order by …  le résultat est une liste Partitionnement group by …  le résultat est un ensemble de structures

Aspects Bases de Données Entrées dans la base Si n désigne un objet ou une valeur nommée alors l'expression n est une requête qui retourne l'objet ou la valeur nommé(e) considéré(e) LePresident

Aspects Bases de Données Atomes Si a désigne un atome, i.e. une valeur de type atomique (entier, réel, caractère, chaîne, booléen) alors l'expression a est une requête retournant cet atome. 3, « coucou »

Aspects Bases de Données Atomes On dispose d'autres requêtes propres à chaque type atomique nombres : opérations arithmétiques (+, -, *, /), modulo (mod()), valeur absolue (abs()) chaînes de caractères: concaténation (+), extraction (x[i], x[i:j]), longueur (count()) booléens: et (and), ou (or), négation 'not())

Aspects Bases de Données Tuples Si x désigne une valeur ou un objet de type tuple alors x.a ou a est un attribut de x est une requête qui retourne l'attribut a de x. (*LePresident).conjoint Si x désigne un objet de type tuple alors x->a ou a est un attribut de x est une requête qui retourne l'attribut a de x. LePresident->conjoint

Aspects Bases de Données Listes Extraction x[i] : d'un élément x[i:j], x[:j], x[i:]: d'une sous liste Opérations générales first(x), last(x) min(x), max(x), count(x), sum(x), avg(x)

Aspects Bases de Données Listes Opérations particulières x+y: concaténation de listes listoset(x): conversion en unique set flatten(x): si x est une liste de listes, retourne la concaténation de tous les éléments de x si x est une liste d'ensembles, retourne l'union de tous les éléments de x si x est une liste de unique set, retourne l'union disjointe de tous les éléments de x

Aspects Bases de Données Ensembles Extraction element(x): extraction de l'unique élément d'un singleton Opérations générales min(x), max(x), count(x), sum(x), avg(x) Opérations ensemblistes x union y (x+y), x except y (x-y), x intersect y (x*y)

Aspects Bases de Données Ensembles Opérations particulières flatten(x): si x est un ensemble de listes, retourne l'union disjointe de tous les éléments membres des listes de x si x est un ensemble d'ensembles, retourne l'union de tous les éléments de x si x est un ensemble de unique set, retourne l'union disjointe de tous les éléments de x

Aspects Bases de Données Variable quelconque On peut associer, de façon bijective, à chaque entité (objet ou valeur) de la base une entier unique: magic()

Aspects Bases de Données Construction de valeurs On dispose des constructeurs habituels permettant d'obtenir des tuples, des listes et ensembles tuple(); struct(a1: x1, … an: xn): les attributs du tuple peuvent être des objets et/ou des valeurs list(), list(x1, …, xn):les membres de la liste doivent être de même nature (objet ou valeur) et doivent avoir un supertype ou une superclasse commun(e) set(), set(x1, …, xn): idem

Aspects Bases de Données Construction d’objets Une requête peut créer un objet : Personne(nom: LePresident->nom, age: 70) Le nom de la fonction est le nom de la classe. Les attributs peuvent être initialisés avec les résultats d'autres requêtes. Les attributs non cités sont initialisés par défaut (le constructeur de la classe n'est pas appelé).

Aspects Bases de Données Envoi de messages x->m: où m est une méthode de la classe (ou d'une super classe) de x ne prenant aucun paramètre, retourne le résultat de l'application de la méthode m à l'objet x x->m(a1, …, an): où m est une méthode de la classe (ou d'une super classe) de x prenant n paramètres, retourne le résultat de l'application de la méthode m à l'objet x avec les paramètres a1, …, an.

Aspects Bases de Données Prédicats Ce sont des requêtes retournant une valeur booléenne q like wild_card_exp: possibilité d'utiliser les caractères génériques ('*'…) x = y (x == y): retourne la valeur true si et seulement si x et y sont deux valeurs égales ou bien si et seulement si x et y sont deux objets identiques x != y: attention, signifie not(x = y)

Aspects Bases de Données Prédicats x < y, x <= y, x > y, x >= y x in y: retourne la valeur true si et seulement si la valeur ou l'objet x appartient à la collection y ou bien si et seulement si le caractère x appartient à la chaîne y ou bien si et seulement si x est une sous-chaîne de la chaîne y.

Aspects Bases de Données Prédicats: Quantificateurs Universel: forall x in y: p Retourne true si et seulement si tout élément de la collection y satisfait le prédicat p select p from p in LesPersonnes where forall x in p->amis: x->age() < 18 Existentiel: exists x in y : p Retourne true si et seulement si il existe un élément de la collection y qui satisfasse le prédicat p select p from p in LesPersonnes where exists x in p->amis: x->age() < 18

Aspects Bases de Données Sélection / Extraction / Jointure Font appel à un bloc select… from … where … select q from x1 in f1, …, xn in fn where p où q est une requête impliquant les variables x1, …, xn où p est un prédicat impliquant les variables x1, …, xn où fi est une requête impliquant les variables x1, …, xi-1 mais pas les variables xi, …, xn.

Aspects Bases de Données Sélection / Extraction / Jointure La structure du résultat est un bag par défaut. On peut éliminer la répétition de valeurs ou d'objets dans le résultat en utilisant la clause distinct (la structure du résultat est alors un unique set) On peut trier le résultat avec la clause order by (la structure du résultat est alors une liste) On peut utiliser la caractère ‘ * ’ select * from Person p, Flower f le résultat est du type bag(struct(p: Person, f:Flower))

Aspects Bases de Données Tri y order by f1, …, fn si y est une collection, retourne la liste contenant tous les éléments de y, rangés suivant les clés f1, …, fn et, en dernier ressort par appel à magic() les clés doivent être de type numérique ou chaîne de caractères Select p from p in LesPersonnes order by p->nom asc, p->prenom desc

Aspects Bases de Données Partitionnement y group by (a1: q1, …, an: qn) Si y est une collection résultat d ’un select, l ’expression retourne une partition de y suivant les critères q1, …, qn. Le résultat est un ensemble (bag) de n-uplets dont les attributs sont a1, …, an, partition. partition est du même type que y, et désigne l ’ensemble des éléments de y associés à une valeur de (a1…an)

Aspects Bases de Données Partitionnement Possibilité d’utiliser la clause having select p.age, card: count(partition) from LesPersonnes p group by p.age having count(partition) < 50 Pour réaliser un filtre utilisant une fonction d ’agrégation.

Aspects Bases de Données Typage On peut sous-typer un élément dans une requête: select ((Employe) c) from c in LesPersonnes where c in LesEmployes select ((Employe) c)->salary() from c in LesPersonnes where (c in LesEmployes) && (c->age() > 25)

Aspects Bases de Données Réutilisation define f as q si q est une requête, on lui attache le nom f que l'on peut utiliser pour faire appel à la requête q sans avoir à réécrire q. L'ensemble des requêtes nommées est accessible par la commande display queries

Aspects Bases de Données OQL encapsulé dans un programme On peut lancer une requête en O2C, en C++, en Java, elle sera passée sous forme de chaîne de caractères, en paramètre à la fonction o2query en O2C: { o2 list (Person) mylist; o2 set(string) theNames; o2 integer age; theNames = ... o2query(mylist,«  select x from x in Group \ where x.age = $2 and x.name in $1 \ order by x.name", theNames, age ); }

Aspects Bases de Données en C++: #include "OQL_CC.hxx" { int i, j, c; d_Bag<d_Ref<Person>>group, result; ... d_OQL_Query query("select x from x in $1 where \ count(x->children) > $2 and x->age <$3"); j=40; i= f(j); query << group << i<< j; c= d_oql_execute(query, result); if (result.cardinality()) result.insert_element ( new Person); …

Aspects Bases de Données en Java: OQLQuery query = new OQLQuery (“select p from Person p where age > $1”); query.bind(40); Iterator it = query.iterate(); Person p; while (it.hasNext()) { p = (Person) it.next(); p.display(); } Note : pour obtenir une collection plutôt qu'un itérateur DBag bag = (DBag) query.execute()

Aspects Bases de Données Index On peut définir des index sur des collections nommées et constantes de n-uplets. constant name Bibliotheque: set(Document); la collection peut être objet ou valeur, le lien nom --> collection doit être constant, les n-uplets peuvent être objets ou valeurs. Les collections sont indexées : sur un attribut atomique, sur un attribut référençant un objet, sur un attribut collection d'atomiques ou d'objets, via un chemin de composition ne traversant que des n-uplets valeurs.

Aspects Bases de Données Les Noms constants constant name Hachette: Editeur; constant name Bibliotheque: set(Document); Un objet constant est initialisé par le système. Un nom constant ne doit jamais être réinitialisé. Bibliotheque = set(d1, d2); /* change la collection -> KO */ Hachette = new Editeur /* new interdit -> KO */ Bibliotheque += set(d0); /* modifie la collection -> OK */ Bibliotheque = set(); /* zap de la collection -> OK */ * Hachette = x; /* ne modifie que la valeur -> OK */

Aspects Bases de Données Index sur attribut atomique ou objet create index Bibliotheque on titre create index Bibliotheque on imprimeur Ils sont utilisés lors de requêtes du type : select d from d in Bibliotheque where d->imprimeur = Hachette ou sort d in Bibliotheque by d->titre ou avec l'opérateur like select x from x in Bibliotheque where x->titre like "Le *"

Aspects Bases de Données Index sur attribut collection create index Bibliotheque on mots_cles Si d->mots_cles = set( m1, m2, m3 ) Alors (m1, d), (m2, d), (m3, d) sont des entrées dans l'index. Des requêtes du type : select d from d in Bibliotheque where "juju music" in d->mots_cles peuvent alors être optimisées.

Aspects Bases de Données Index sur chemin de composition create index Bibliotheque on date.annee ---> index sur un chemin ne traversant que des valeurs Si d->date = tuple(mois: 11, annee: 1979) Alors (1979, d) est une entrée dans l'index Des requêtes du type : select d from d in Bibliotheque where d->date.annee = 1960 peuvent alors être optimisées.

Aspects Bases de Données Utilisation via le langage de requête OQL Toute recherche sur une clé d'index devient équivalente à un accès direct. Attention la longueur maximum d'une clé de type string est de 256 caractère

Aspects Bases de Données Axiom query_program ::={define_query;} query define_query ::=define identifier as query

Aspects Bases de Données Basic query ::= nil query ::= true query ::= false query ::= integer_literal query ::= float_literal query ::= character_literal query ::= string_literal query ::= entry_name query ::= query_name query ::= bind_argument 1 query ::= from_variable_name query ::= (query)

Aspects Bases de Données Simple Expression query ::= query + query 1 query ::= query - query query ::= query * query query ::= query / query query ::= - query query ::= query mod query query ::= abs (query) query ::= query || query

Aspects Bases de Données Comparison query ::= query comparison_operator query query ::= query like string_literal comparison_operator ::= = comparison_operator ::= != comparison_operator ::= > comparison_operator ::= < comparison_operator ::= >= comparison_operator ::= <= Boolean Expression query ::= not query query ::= query and query query ::= query or query

Aspects Bases de Données Constructor query ::= type_name ( [query ] ) query ::= type_name (identifier:query {, identifier: query}) query ::= struct (identifier: query {, identifier: query}) query ::= set ( [query {, query} ]) query ::= bag ( [query {,query} ]) query ::= list ( [query {,query} ]) query ::= (query, query {, query}) query ::= [ list ](query .. query) query ::= array ( [query {,query} ])

Aspects Bases de Données Accessor query ::= query dot attribute_name query ::= query dot relationship_name query ::= query dot operation_name query ::= query dot operation_name( query {,query} ) dot ::= . | -> query ::= * query query ::= query [query] query ::= query [query:query] query ::= first (query) query ::= last (query) query ::= function_name( [ query {,query} ] )

Aspects Bases de Données Collection Expression query ::= for all identifier in query: query query ::= exists identifier in query: query query ::= exists(query) query ::= unique(query) query ::= query in query query ::= query comparison_operator quantifier query quantifier ::= some quantifier ::= any quantifier ::= all

Aspects Bases de Données query ::= count (query) query ::= count (*) query ::= sum (query) query ::= min (query) query ::= max (query) query ::= avg (query) Select Expression query ::= select [ distinct ] projection_attributes from variable_declaration {, variable_declaration} [where query ] [group by partition_attributes ] [having query ] [order by sort_criterion {, sort_criterion} ]

Aspects Bases de Données projection_attributes ::= projection {, projection} projection_attributes ::= * projection ::= query projection ::= identifier: query projection ::= query as identifier variable_declaration ::= query [ [ as ] identifier ] partition_attributes ::= projection {, projection} sort_criterion ::= query [ordering ] ordering ::= asc ordering ::= desc

Aspects Bases de Données Set Expression query ::= query intersect query query ::= query union query query ::= query except query Conversion query ::= listtoset (query) query ::= element (query) query ::= distinct(e) query ::= flatten (query) query ::= (class_name) query

Aspects Bases de Données Operator Priorities . () [] . -> not - (unary) + (unary) i n * / mod intersect + - union except | | < > <= >= < some < any < all (etc ... for all comparison operators) = ! = l i k e and exists for all or

Aspects Bases de Données .. : , (identifier) this is the cast operator order having group by where from select

Outils environnant O2: O2Look Affichage et édition des objets et des valeurs selon deux modes: prêt à porter mécanismes génériques d'affichage et d'édition déclenchement interactif de méthodes couper/copier/coller respectant l'identité et l'égalité paramétrage par définition de masques et positionnement de ressources sur mesure primitives de construction d'affichage spécifique adapté à des types de données particuliers (images, texte, hypertexte...)

Outils environnant O2: O2Look Présentation support graphique dans lesquels seront affichés et/ou édités les objets et valeurs. "fenêtre" d'affichage, existant indépendamment de sa visibilité à l'écran type Lk_presentation création par la fonction lk_present

Outils environnant O2: O2Look lk_present(objet_ou_valeur, masque [, chaine_id, nb_rsc, ref_tab_rsc]) objet_ou_valeur: désigne l'objet ou la valeur pour laquelle on crée une présentation masque: désigne le masque i.e. le degré d'expansion de l'affichage; on peut utiliser le masque générique par défaut en écrivant 0 ou lk_generic()

Outils environnant O2: O2Look Masque "calques" ou modèles définissant le degré d'expansion des objets et/ou valeurs affichés dans une présentation type Lk_mask pour chaque entité, il existe une fonction de création de masque

Outils environnant O2: O2Look type atomique lk_atom(...) ensemble lk_set(…) liste lk_list(…) n-uplet lk_tuple(…) objets lk_object(…) lk_protected() quelconque lk_generic()

Outils environnant O2: O2Look Fonctions de création de masque lk_atom(chaine_id, nb_rsc, tab_rsc) retourne un masque pour toute valeur de type atomique (char, string, integer, real, boolean…) lk_set (chaine_id, nb_rsc, tab_rsc, s_masque) lk_list(chaine_id, nb_rsc, tab_rsc, s_masque) retourne un masque pour toute valeur de type ensemble (resp. liste); le paramètre s_masque définit un masque pour les éléments de la collection

Outils environnant O2: O2Look Fonctions de création de masque lk_tuple(chaine_id, nb_rsc, tab_rsc nb_att, tab_masque_att) retourne un masque pour toute valeur de type n-uplet. Le paramètre nb_att indique le nombre d'attributs qui seront affichés. Le paramètre tab_maque_att est un tableau de spécifications des masques des attributs du n-uplet. Les éléments de ce tableau sont du type Lk_attribute_mask

Outils environnant O2: O2Look typedef struct { char *name; Lk_mask mask; } Lk_attribute_mask; name est le nom de l'attribut tel qu'il est déclaré dans le schéma mask est un masque correspondant au type de l'attribut

Outils environnant O2: O2Look Exemple: {… Lk_attribute_mask masque_att[1]; Lk_mask monMasque; masque_att[0].name = 'nom'; masque_att[0].mask = lk_atom(0, 0, 0); monMasque = lk_tuple(0, 0, 0, \ 1, masque_att); …}

Outils environnant O2: O2Look Fonctions de création de masque lk_object(chaine_id, nb_rsc, tab_rsc masque_valeur) retourne un masque pour tout objet; le paramètre masque_valeur définit le masque associé au type de la valeur de l'objet lk_generic() retourne un masque pour tout objet ou valeur; pour un objet, le masque est iconique

Outils environnant O2: O2Look Fonctions de création de masque lk_protected(chaine_id, nb_rsc, tab_rsc) retourne un masque pour tout objet; le paramètre masque_valeur définit le masque associé au type de la valeur de l'objet contrairement à lk_generic() et lk_object(), cette fonction respecte l'encapsulation

Outils environnant O2: O2Look Construction du masque Lk_object Class Fiche type tuple( client: Personne, code: string, prix: list(real) ) Lk_tuple Lk_generic Lk_atom Lk_list Lk_atom

Outils environnant O2: O2Look Ressources Permet de contrôler finement le masque d'un objet ou d'une valeur aspect graphique (police, couleur, libellé, dimensions, position des champs, etc.) éditabilité des présentations: couper/copier/coller, édition de masques, etc. Ressource = (nom, valeur) Toute ressource non positionnée a une valeur par défaut

Outils environnant O2: O2Look Ressources Une ressource est toujours associée à un ou plusieurs masques, sauf pour la fonction lk_generic() Il y a 3 manières de positionner des ressources par fichier utilisateur par contexte en dur dans le code

Outils environnant O2: O2Look Ressources par fichier utilisateur Les ressources doivent être positionnées dans un fichier .LKDefaults, chaque ligne étant de la forme <chemin>.<nom>: <valeur> <chemin> est une suite de noms séparés par des points, désignant la suite des chaine_id définies lors des créations de masque <nom> est de nom de la ressource à positionner <valeur> est la valeur que l'on veut donner à la ressource

Outils environnant O2: O2Look Ressources par fichier utilisateur Ne nécessite aucune recompilation de l'application Exemple: ma_pres.mon_objet.tuple.fontList: aberdeen-12 NB: tout ou partie du chemin de la ressource peut être remplacé par le caractère générique *

Outils environnant O2: O2Look Ressources par contexte Un contexte est repéré explicitement par un appel à la fonction lk_prologue(…) et s'achève à l'appel de la fonction lk_epilogue() associée. Les ressources associées doivent être positionnées dans .LKDefaults ou dans un fichier portant le nom du contexte et se trouvant dans $O2HOME:look/$O2RESOURCE ou dans $O2HOME/look sous la forme <nom_du_contexte>.<chemin>.<nom>: <valeur>

Outils environnant O2: O2Look Ressources "en dur" Non modifiables par l'utilisateur final Nécessitent de recompiler le corps Prioritaires sur tous les autres types de ressources Positionnées à l'aide des paramètres nb_rsc et tab_rsc des fonctions de création de masque nb_rsc désigne le nombre de ressources tab_rsc est un tableau de Lk_resource

Outils environnant O2: O2Look Ressources "en dur" typedef struct { char *name; char *value; } Lk_resource; {… o2 Personne p = new Personne; Lk_mask masque; Lk_resource tab_res[1]; tab_res[0].name = "menuTitleString"; tab_res[0].value = "saisie"; masque = lk_object(0,1,tab_rsc,lk_generic()); …}

Outils environnant O2: O2Look Interactions utilisateurs Affichage lk_map(<presentation>, <placement>, <lien>, <reference>, x, y) <presentation> : présentation à afficher <placement>: MANUAL, MOUSE, COORDINATE, RIGHT, LEFT, STACK, BOTTOM <lien>: FREE, GEOMETRIC, CONTENT, SLAVE <reference>: présentation de référence (pour le placement et le lien, éventuellement) x, y: coordonnées

Outils environnant O2: O2Look Interactions utilisateurs Verrouiller une présentation ou "donner la main à l'utilisateur" lk_wait(<presentation>) pose un verrou d'affichage sur la présentation <presentation> bloquant l'exécution du code tant que le verrou n'a pas été libéré par un lk_free() un tel verrou permet à l'utilisateur d'interagir avec la présentation (déclenchement de méthodes, etc.)

Outils environnant O2: O2Look Interactions utilisateurs Verrouiller une présentation ou "donner la main à l'utilisateur" lk_grab(<presentation>) pose un verrou d'affichage sur la présentation en empêchant l'utilisateur d'accéder aux autres présentations (modal) lk_wait et lk_grab retournent LK_SAVE (resp. LK_ERASE, resp. LK_FAILED) si l'utilisateur a cliqué sur le crayon (resp. la gomme, resp. si la présentation n'existe pas ou est déjà verrouillée)

Outils environnant O2: O2Look Interactions utilisateurs Déverrouiller une présentation lk_free(<presentation>, <valeur_de_retour>) déverrouille la présentation précédemment verrouillée avec lk_wait ou lk_grab; le paramètre <valeur_de_retour> sera celui rendu par la fonction qui avait posé le verrou.

Outils environnant O2: O2Look Actions automatiques clic sur le crayon sur une présentation verrouillée objet ou valeur : lk_free(<presentation>, LK_SAVE) sur une présentation déverrouillée objet: déclenchement de la méthode save sur l'objet valeur: rien

Outils environnant O2: O2Look Actions automatiques clic sur la gomme sur une présentation verrouillée objet ou valeur : lk_free(<presentation>, LK_ERASE) sur une présentation déverrouillée objet: déclenchement de la méthode erase sur l'objet valeur: destruction de la présentation

Outils environnant O2: O2Look Enregistrement lk_consult (presentation, variable) Raffraichissement lk_refresh_presentation( presentation, objet_ou_valeur, masque [, chaine_id, nb_rsc, tab_rsc]) Effacement, destruction lk_unmap(presentation) lk_delete_presentation(presentation)

Outils environnant O2: O2Look Autres fonctions lk_delete_all() lk_all_presentations() lk_all_mapped_presentations() lk_current_presentation()

Outils environnant O2: O2Look Méthodes present(mask: Lk_mask) consult(presentation: Lk_presentation) refresh_all erase_all all_presentations save(presentation: Lk_presentation) erase(presentation: Lk_presentation) menu: list(string)

Outils environnant O2: O2Kit Chargement O2Kit est livrée en version "dumpée"; il est nécessaire de le recharger avec l'instruction o2dba_schema_load -system <nom> -file <fichier_dump> ... Utiliser import pour importer dans uns chéma des classes ou objet nommés de O2Kit

Outils environnant O2: O2Kit Boîtes de dialogue Méthodes implémentées de la classe Box Utilisation: importer la classe Box; déclarer une instance persistante (ou importer Dialoger de O2Kit) et l'initialiser; invoquer les méthodes désirées sur cette instance. import schema o2kit class Box; import schema o2kit name Dialoger; run body { Dialoger = new Box; }

Outils environnant O2: O2Kit La classe Box message(label: string, ed_name: string) affichage d'un message à l'utilisateur question(label: string, ed_name: string): boolean question OUI/NON posée à l'utilisateur dialog(label: string, ed_name: string): string demande à l'utilisateur de saisir une information; retourne l'information saisie ou chaine vide si l'utilisateur a cliqué sur la gomme

Outils environnant O2: O2Kit La classe Box selection(title: string, ed_name: string, items: list(string)): string permet la sélection d'un item dans une liste; retourne l'item sélectionné ou chaine vide si l'utilisateura cliqué sur la gomme edit_selection(title: string, ed_name: string, items: list(string)): string idem avec possibilité de saisie de l'item

Outils environnant O2: O2Kit La classe Box mult_selection(title: string, ed_name: string, items: list(string)): list(string) permet la sélection multiple d'items parmi une liste; retourne la liste des items sélectionnés ou liste vide si l'utilisateur a cliqué sur la gomme

Outils environnant O2: O2Kit Autres classes class Dialog_Box class Component, Button, Radio_Box, Button_box, Single_selection, Editable_selection, Multiple_selection, Prompt, Label, Picture… class Date class Text class Bitmap class Image Éditeurs spécifiques: pour les dates, le texte, les structure hyper

Outils environnant O2: le débogueur Intérêts Contrôler l'exécution de tout ou partie d'une application en posant des points d'arrêt dans l'application visualisant/modifiant des variables visualisant la pile d'exécution exécutant le code pas à pas Utilisation le code doit avoir été compilé avec l'option debug invoquée par la commande set options -g

Outils environnant O2: le débogueur Passer sous debug debug Suspension du mode debug o2 Sortie du mode debug debug off quit

Outils environnant O2: le débogueur Points d'arrêt break in [body | method@class] [at line no] [*] Exécution run body run program prgName run application appliName

Outils environnant O2: le débogueur Exécution particulière next: avance à l'instruction suivante step: idem mais descend dans la méthode appelée skip: passe à l'instruction suivante cont: continue jusqu'au prochain point d'arrêt finish: termine l'exécution courante (sauf si point d'arrêt) kill: tue le processus d'exécution en cours

Outils environnant O2: le débogueur Trace On peut demander une trace des appels de méthodes, fonctions ou programmes avec la valeur de leurs paramètres trace in method@class trace all

Outils environnant O2: le débogueur Variables On peut visualiser la valeur d'une variable ou d'un paramètre à l'aide de print(var) ou printp(par) Pour l'édition, utiliser assign (var) et assignp(par) En mode graphique, utiliser lkprint, lkprintp, lkassign et lkassignp

Outils environnant O2: le débogueur Etat courant status: récapitule tous les points d'arrêt, trace et affichage demandés delete: permet de supprimer des points d'arrêt ou des demandes de trace ou d'affichage Pile where [n]: affichage de la pile jusqu'à la profondeur n [up|down] n: déplacement de n niveaux dans la pile

ODMG 2.0 Objectifs fournir des standards permettant d'écrire des applications portables, i.e. qui puissent fonctionner sur un ou plusieurs SGBDO le schéma, le couplage aux langages de programmation, la manipulation de données et le langage de requêtes doivent être standards si possible, le standard devra faciliter l'interopérabilité entre SGBDO

ODMG 2.0 Les composants majeurs Modèle objet = modèle objet de l'OMG + relations Langages de spécifications objet Object Definition Language = IDL + relations Object Interchange Format: échange d'objets inter bases, support de documentation… Langage de requêtes: OQL Couplage aux langages de programmation C++, Smalltalk, Java (1.1)

ODMG 2.0 Modèle objet 2 notions de base: les objets et les littéraux. Un objet a un identifiant unique, un littéral n'a pas d'identifiant. Objets et littéraux sont catégorisés par un type, qui définit l'ensemble de leurs états possibles et de leurs comportements L'état d'un objet est défini par les valeurs de ses propriétés (attributs et relations); son comportement par un ensemble d'opérations

ODMG 2.0 Modèle objet Une base stocke des objets, qui peuvent être partagés par différents utilisateurs et applications. Elle repose sur un schéma, défini en ODL, et contient des instances des types définis dans ce schéma.

ODMG 2.0 Modèle objet: éléments clés Propriétés: attributs et relations Opérations: méthodes. Exceptions. Héritage multiple Extensions et clés Nommage d'objets, durée de vie et identité Littéraux atomiques, structurés et ensemblistes Classes de collections

Architecture O2Web L'architecture o2Web repose sur 3 éléments ESSI 3 Architecture O2Web L'architecture o2Web repose sur 3 éléments un dispatcher o2open_dispatcher un serveur o2web_server, qui se connecte en tant que client à un serveur o2 une passerelle o2web_gateway Une boîte à outils est fournie sous la forme d'un schéma à charger avec o2dba_schema_load $O2HOME/o2schemas/o2web.dump © Philippe SALVAN

Architecture O2Web Client WWW Client WWW Serveur HTTP o2web_gateway o2open_dispatcher o2web_server o2web_server o2web_server o2server

Architecture O2Web 1. Un client WWW envoie une URL au format HTTP, qui contient une requête OQL 2. Le serveur HTTP passe la requête à la passerelle 3. La passerelle se connecte à un dispatcher 4. Le dispatcher indique à quel serveur o2web se connecter 5. La passerelle se connecte au serveur o2web adéquat 6. Le serveur o2web exécute la requête OQL intégrée à l'URL et transforme le résultat en HTML en invoquant des méthodes génériques 7. Le résultat est renvoyé au client WWW

Architecture O2Web 3 niveaux d'utilisation d'o2web mode générique: repose intégralement sur le mapping par défaut du modèle objet sur le modèle HTML personnalisation globale (en-têtes, pieds de page…), réaction à des événements (connexion, déconnexion…) personnalisation pour chaque classe par surcharge de méthodes génériques

Architecture O2Web Mode générique valeurs atomiques  valeurs affichées tuples  liste HTML <ul> de couples nom d'attribut + production récursive d'HTML collections  liste HTML <ul>, chaque élément est obtenu par production récursive de HTML objet  production récursive sur la valeur de l'objet sous-objet  lien vers une URL contenant la requête OQL retournant le sous-objet classe d'o2kit (Date, Text, Bitmap, Image)  date, texte, images en lignes et images GIF en ligne

Architecture O2Web Personnalisations globales Définition d'un en-tête, pied de page pour chaque page, d'une page d'erreur, d'actions à exécuter sur une connexion ou déconnexion connect(query: string, userdate: string): boolean disconnect(size: integer, kind: string) error(kind: integer): bits header: bits footer: bits

Architecture O2Web Personnalisations par classe format spécifique html_prolog: bits en-tête et pied de page html_header(query:string, userdata:string):bits html_footer(query:string, corps html_report(query:string,

Architecture O2Web titre de lien PROLOG html_title: string optimisation de la génération de requête get_query: string PROLOG HEADER BODY FOOTER EPILOG

Architecture O2Web Classes utilitaires O2WebAssistant O2WebFormAnalyser O2WebFormItem O2WebImageAttributes O2WebImageInliner