OpenPaaS Le réseau social d'entreprise Spécification des API datastore SP L2.3.1 Diffusion : Institut MinesTélécom, Télécom SudParis 1 / 12
1OpenPaaS DataBase API : ODBAPI...3 1.1Comparaison des concepts...3 1.2Présentation synthétique de l API...4 1.3Diagramme de paquetage...5 1.4Spécification détaillée de ODBAPI...7 1.5Exemples d utilisation de ODBAPI...9 1.5.1Création d une collection...9 1.5.2Création d une table...10 1.5.3Ajout de documents...10 1.5.4Ajout de tuples...10 1.5.5Exécution d une requête sur une base de données...11 1.5.6Exécution d une requête sur une base de données relationnelle...11 Télécom, Télécom SudParis 2 / 12
1 OpenPaaS DataBase API : ODBAPI De nos jour, les APIs pour les SGBDs relationnels (i.e. JDBC, ODBC, etc.) d une part et pour les SGBD NoSQL (i.e., CouchDB, etc.) sont hétérogènes sur plusieurs plans : Niveau d API : Il y a deux catégories d API. Dans la première catégorie, les opérations sont non explicites dans l API puisque les requêtes d accès aux BD sont décrites dans des chaînes de caractères (tel que JDBC). Dans la deuxième catégorie, les opérations sont explicitées dans l API avec une méthode pour chaque opération (tel que driver). Typage : Il y a des APIs très liées aux langages de programmation et qui manipulent des objets typés (Java pour JBDC par exemple) et d autres qui manipulent des structures de données plus neutres (JSON par exemple). Afin de surmonter ces problèmes d hétérogénéité, nous proposons une nouvelle API que nous appelons OpenPaaS DataBase API (ODBAPI). Elle est une API générique permettant d interroger des datastores relationnels et NoSQL. ODBAPI est conçue pour être indépendante d un langage de programmation et peut être implémenté pour n importe quel langage. En plus, ODBAPI peut être facilement transformée en une API basée sur l architecture REST. 1.1 Comparaison des concepts Dans Table1, nous présentons une analogie entre les terminologies utilisées dans une base de données relationnelle et et nous définissons une terminologie propre à notre API. Par exemple, une table dans une base de données relationnelle est équivalente à une collection dans. Dans ODBAPI, nous appelons cette structure de données «Entity Set». Table 1: Tableau de correspondance des concepts. Relational concepts ODBAPI concepts concepts Database Database Database Table Entity Set Collection Row Entity Document Column Attribute Field Query Query Query Index Index Index Table joins Entity join Embeded documents Primary key Primary key Primary key Aggregation Aggregation Aggregation pipeline Dans ce qui suit, nous présenterons l API que nous proposons. Dans cette API, Télécom, Télécom SudParis 3 / 12
nous utilisons les concepts suivants : Database, Entity Set, Entity, Attribute, and Query. 1.2 Présentation synthétique de l API Nous présentons ci-dessous de manière synthétique l API proposée ODBAPI en la comparant aux APIs JDBC et. Nous avons choisi de reprendre le schéma classique connexion-authentification, suivie d un ensemble d opérations de type CRUD (pour «Create», «Read», «Update», «Delete»). Pour celles-ci nous avons définis une opération ODAPI par type d opération CRUD. Les méthodes que nous présentons dans la colonne «ODBAPI» de la Table 2 seront introduites par la suite dans la section 1.4. Table 2: Tableau de correspondance des API. JDBC API ODBAPI API Class.forName("com.mysql.jdbc.Driver "); Connection con=drivermanager.getconnection (db_url, login,pswd); Statement stmt = stmt.executeupdate(query); Statement stmt = stmt.executeupdate(query); Statement stmt = stmt.executeupdate(query); Statement stmt = stmt.executeupdate(query); DB db = connectdb(login, pswd, dbname, host, port) Connection con= connectdb(login, pswd, db_url) dropdb(db); dropdb(dbname, con); DBCollection coll = createentity(nameentity, db); createentity(query, con); dropentity(coll); dropentity(query, con) inserttuple(doc, coll) inserttuple(query, con) Mongo mongo = new Mongo(host, port); DB db =mongo.getdb(dbname); boolean auth = db.authenticate(login, pswd); db.dropdatabase(); DBCollection coll = db.createcollection(nameentity, null); coll.drop(); coll.insert(doc); Statement stmt = stmt.executeupdate(query); Statement stmt = stmt.executeupdate(query); updatetuple(doc, coll, true); updatetuple(query, con); deletetuple(coll, condition); deletetuple(query, con); BasicDBObject multi= new BasicDBObject("multi", "true"); coll.update(doc, multi); BasicDBObject condition; coll.remove(condition); Télécom, Télécom SudParis 4 / 12
Statement stmt = ResultSet rs = stmt.executequery(query); DBCursor cursor = executequery(query, coll) ResultSet rs=executequery(query,con) DBCursor cursor = coll.find(query); 1.3 Diagramme de paquetage Pour une bonne conception logicielle de ODBAPI, nous l avons illustré par un diagramme de paquetage. En effet, ce diagramme permet de regrouper les classes liées logiquement entre elles dans des modules afin de donner une vue globale sur l API proposée. Dans la Figure 1, nous présentons six paquets : «dbmapi» : Ce paquet contient la classe principale de l API. En effet, ce paquet contient la ODBAPI qui nous permet de choisir le type de datastore (i.e. relationnel ou ) que nous voulons interroger et d accéder aux méthodes appropriées au type choisi. «connection» : Ce paquet fournit les méthodes nécessaires pour la connexion à une base de données selon son type. Dans ce paquet, nous trouvons l interface qui présente ces méthodes et leur implémentation dans le paquet «impl». Cette structure est adoptée pour les quatre paquets qui suivent. «database» : Ce paquet présente les méthodes assurant toutes les opérations possibles sur une base de données. «entityset» : Ce paquet contient les méthodes permettant la manipulation d une entity set (i.e. une table ou une collection). «entity» : Ce paquet fournit les méthodes permettant de manipuler une entity (i.e. un tuple ou un document) «query» : Ce paquet présente les méthodes nécessaires pour l exécution des requêtes sur une base de données relationnelle ou. Télécom, Télécom SudParis 5 / 12
Figure 1 Diagramme de paquetage Télécom, Télécom SudParis 6 / 12
1.4 Spécification détaillée de ODBAPI Dans la Table 3, nous présentons les différentes méthodes de notre API type d opération par type d opération en alternant et JDBC. API DB connectdb(string dbname, String host, int port) DB connectdb(string login, char[] pswd, String dbname, String host, int port) DB connectdb(string login, char[] pswd, String dbname, Vector<String> host, Vector port) java.sql.connection connectdb(string login, String pswd, String db_url) Table 3: Spécification de l API ODBAPI. Description Connect to a database - dbname: database name - host: host name of the server - port: port number of the server - Connection object to a server Connect to a database with authentication - login: username - pswd : password - dbname: database name - host: host name of the server - port: port number of the - Connection object to a server Connect to a replicas set of a database with authentication - login: username - pswd : password - dbname: database name - host: Vector of host names of replicas - port: Vector of port numbers of replicas - Connection object to a server Connect to a relational database with authentication - login: username - pswd : password - db_url : database url - Connection object to a relational database Télécom, Télécom SudParis 7 / 12
Void dropdb(db db) Void dropdb(string dbname, Connection con) DBCollection createentityset(string entityname, DB db) void createentityset(string stmt, Connection con) void dropentityset(dbcollection coll) void dropentityset(string entityname, Connection con) DBCollection getentityset(db db, String entityname) Set<String> getallentityset(db db) Vector getallentityset(connection con) void insertentity(basicdbobject doc, Drop a database - db : instance of the database Drop a relational database - dbname: name of the relational database - con : a connection object to a relational Create a collection - entityname: collection name - db: name instance of the database - the created collection Create a table - stmt: statement for table creation drop a collection drop a table - coll: Connection object to a server - entityname: table name get a collection - db: name instance of the database - entityname: collection name - the requested collection get all the collection - db: name instance of the database - Collections set get all the tables - tables set insert a document Télécom, Télécom SudParis 8 / 12
DBCollection coll) - doc: document to insert - coll: Connection object to a void insertentity(string stmt, Connection con) void updateentity(basicdbobject doc, DBCollection coll, boolean multiple) void updateentity(string stmt, Connection con) void deleteentity( DBCollection coll, BasicDBObject condition) void deleteentity(string stmt, Connection con) DBCursor executequery(basicdbobject mongodbquery, DBCollection coll) ResultSet executequery(string rdbmsquery, Connection con) server Insert a tuple - stmt: statement for insertion update a single or multiple document - doc: the modification - coll: Connection object to a server - multiple: update multiple documents if multiple is true update a tuple - stmt: statement for modificaion Delete a document - coll: Connection object to a server - condition: Delete condition Delete a tuple - stmt: statement for query Execute a query on a collection - mongodbquery: the query - coll: Connection object to a server Execute a query - rdbmsquery: the query 1.5 Exemples d utilisation de ODBAPI Télécom, Télécom SudParis 9 / 12
1.5.1 Création d une collection public class Test { public static void main(string[] args) throws ClassNotFoundException, UnknownHostException, MongoException { //Connect to a server DBMAPI dbmapi = new DBMAPI(""); // Connect to the "OpenPaaS" database DB db = dbmapi.getconnection().connectdb("openpaas", "localhost", 27017); // Create a collection called "user" DBCollection coll2= dbmapi.getentityset().createentityset("user", db); 1.5.2 Création d une table public class Test { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [ ] a r g s ) t h r o w s C l a s s N o t F o u n d E x c e p t i o n, UnknownHostException, MongoException { //Connect to a server DBMAPI dbmapi = new DBMAPI(""); // Connect to the "OpenPaaS" database String DB_URL = "jdbc:mysql://localhost:3306/openpaas"; Connection con=dbmapi.getconnection().connectdb("root", "12345", DB_URL); // Create a table called "REGISTRATION" String stmt = "CREATE TABLE REGISTRATION " + "(id INTEGER not NULL, " + " first VARCHAR(255), " + " last VARCHAR(255), " + " age INTEGER, " + " PRIMARY KEY ( id )) "; dbmapi.getentityset().createentityset(stmt, con); 1.5.3 Ajout de documents public class Test { public static void main(string[] args) throws ClassNotFoundException, UnknownHostException, MongoException { //Connect to a server DBMAPI dbmapi = new DBMAPI(""); // Connect to the "OpenPaaS" database DB db = dbmapi.getconnection().connectdb("openpaas", "localhost", 27017); // get the "user" collection DBCollection coll=dbmapi.getentityset().getentityset(db, "user"); //Insert four documents in the "user" collection BasicDBObject doc1 = new BasicDBObject("name", "Alex").append("age", 26); dbmapi.getentity().insertentity(doc1, coll2); BasicDBObject doc2 = new BasicDBObject("name", "Marie").append("age", 30); dbmapi.getentity().insertentity(doc2, coll2); BasicDBObject doc3 = new BasicDBObject("name", "Matt").append("age", 18); dbmapi.getentity().insertentity(doc3, coll2); BasicDBObject doc4 = new BasicDBObject("name", "Natalie").append("age", 20); dbmapi.getentity().insertentity(doc4, coll2); Télécom, Télécom SudParis 10 / 12
1.5.4 Ajout de tuples public class Test { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [ ] a r g s ) t h r o w s C l a s s N o t F o u n d E x c e p t i o n, UnknownHostException, MongoException { //Connect to a server DBMAPI dbmapi = new DBMAPI(""); //Connect to the "OpenPaaS" database String DB_URL = "jdbc:mysql://localhost:3306/openpaas"; Connection con=dbmapi.getconnection().connectdb("root", "12345", DB_URL); //Insert four tuples in the "REGISTRATION" table String stmt = "INSERT INTO Registration " + "VALUES (100, 'Zara', 'Ali', 18)"; dbmapi.getentity().insertentity(stmt, con); stmt = "INSERT INTO Registration " + "VALUES (101, 'Mahnaz', 'Fatma', 25)"; dbmapi.getentity().insertentity(stmt, con); stmt = "INSERT INTO Registration " + "VALUES (102, 'Zaid', 'Khan', 30)"; dbmapi.getentity().insertentity(stmt, con); stmt = "INSERT INTO Registration " + "VALUES(103, 'Sumit', 'Mittal', 28)"; dbmapi.getentity().insertentity(stmt, con); 1.5.5 Exécution d une requête sur une base de données public class Test { public static void main(string[] args) throws ClassNotFoundException, UnknownHostException, MongoException { //Connect to a server DBMAPI dbmapi = new DBMAPI(""); // Connect to the "OpenPaaS" database DB db = dbmapi.getconnection().connectdb("openpaas", "localhost", 27017); //This query selects documents in which age > 20 BasicDBObject query= new BasicDBObject("age", new BasicDBObject("$gt", 20)); // cursor contains the resultset of the query DBCursor dbc; dbc=dbmapi.getquery().executequery(query,dbmapi.getentityset().getentity(db,"user")); while(dbc.hasnext()) { System.out.println(dbc.next()); 1.5.6 Exécution d une requête sur une base de données relationnelle Télécom, Télécom SudParis 11 / 12
public class Test { public static void main(string[] args) throws ClassNotFoundException, UnknownHostException, MongoException { //Connect to a server DBMAPI dbmapi = new DBMAPI(""); //Connect to the "OpenPaaS" database String DB_URL = "jdbc:mysql://localhost:3306/openpaas"; Connection con=dbmapi.getconnection().connectdb("root", "12345", DB_URL); // The query String query = "SELECT id, first, last, age FROM Registration"; // the resultset ResultSet rs=dbmapi.getquery().executequery(query, con); while(rs.next()){ //Retrieve by column name int id = rs.getint("id"); int age = rs.getint("age"); String first = rs.getstring("first"); String last = rs.getstring("last"); //Display values System.out.print("ID: " + id); System.out.print(", Age: " + age); System.out.print(", First: " + first); System.out.println(", Last: " + last); Télécom, Télécom SudParis 12 / 12