XSQL **** Introduction ============ XSQL est un langage soutenu par W3C qui a pour but de faire le lien entre les bases de données et les applications et de transmettre toutes les informations entre la base et l’applicatif sous format XML: cela permet du côté applicatif de cacher le SQL et la gestion de la connection qui est gérée au niveau de XSQL. Vous pouvez faire des select pour toutes bases posssédant un connecteur JDBC. Les Insert ne sont possible que sur les bases oracle. Architecture ============ XSQL est surtout soutenu par oracle via son XDK. XSQL fonctionne sous un serveur d’application java comme [[Tomcat]]. L’application fait des appels sur le serveur d’application sur lequel on a installé XSQL. Le serveur d’application, via XSQL et des connecteurs JDBC, intérroge la base et renvoie les réponses de la base sous forme de fichier xml. Installation ------------ Il faut: * Tomcat * xdk_java_10.2.0.2.0_LINUX.tar.gz * classes12.zip(jdbcOracle) * postgresql-8.2-505.jdbc4.jar * java Pour que cela fonctionne il suffit d’installer une application dans Tomcat. Vous pouvez trouver xdkTomcat.zip un répertoire que vous pouvez placer dans /var/lib/tomcat5.5/webapps/. Pour simplifier il suffit de créer un répertoire xdk puis dans ce dernier un répertoire xdk/WEB-INF/lib/ contenant l’ensemble des fichier jar de xdk et jdbc Dans le répertoire xdk/WEB-INF vous rajouter un fichier web.xml indiquant à Tomcat qu’il faut qu’il prenne en charge les fichier xsql avec ce module .. code-block:: bash <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>oracle-xsql-servlet</servlet-name> <servlet-class>oracle.xml.xsql.XSQLServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>oracle-xsql-servlet</servlet-name> <url-pattern> *.xsql </url-pattern> </servlet-mapping> </web-app> Il existe une doc pour installer et tester XSQL qui se nomme TutorielXSQL.pdf Il est possible de modifier le CLASPPATH de Tomcat , il faut pour cela ouvrir le fichier /etc/init.d/tomcat55 rechercher la variable JSVC_CLASSPATH et modifier cette variable en rajoutant vos path ou fichier jar à ajouter (comme par exemple les jar du xdk) Pour lancer XSQL il faut lancer le serveur Tomcat et la base sur laquelle vous allez faire les requêtes .. code-block:: bash sudo /etc/init.d/tomcat5.5 start sudo /etc/init.d/postgresql-8.2 start Paramétrage =========== Ce paramétrage s’effectue via le fichier XSQLConfig.xml contenu dans xdk/WEB-INF/lib/ et comportant les informations sur la connection au base. Exemple d’élément ajouter pour une connection .. code-block:: bash <connection name="myConnTest"> <username>postgres</username> <password>postgres</password> <dburl>jdbc:postgresql://127.0.0.1:5432/test</dburl> <driver>org.postgresql.Driver</driver> <autocommit>yes</autocommit> </connection> et après cette modification penser à génerer le fichier jar qui va bien .. code-block:: bash jar -cvf XSQLConfig.jar XSQLConfig.xml puis faire un arrêt/ redémarrage de tomcat Exemple ======= Simple ------ Ajouter dans le répertoire xdk/ un fichier essai.xsql .. code-block:: bash <?xml version="1.0"?> <page xmlns:xsql="urn:oracle-xsql" connection="myConnTest"> <xsql:include-request-params/> <xsql:query rowset-element="employesList" row-element="employes"> select * from employes; </xsql:query> </page> Puis dans votre naviguateur utiliser l’url suivante: http://localhost:8180/xdk/essai.xsql et voila cela fonctionne (si dans la base il existe une table employes) insertion de données Oracle ---------------------------- Il faut faire un POST, il nous faut donc deux fichiers insert.html .. code-block:: bash <html> <body> <form action="insert.xsql" method="POST"> <h1 class="title">Modification d'un article</h1> <input type="submit" value="Valider"/> </form> </body> </html> insert.xsql .. code-block:: bash <?xml version = '1.0'?> <page connection="myConnTest" xmlns:xsql="urn:oracle-xsql"> <xsql:insert-request table="employes"> <ROWSET> <ROW num="1"> <NOM>aoustin</NOM> <PRENOM>frederic</PRENOM> </ROW> </ROWSET> </xsql:insert-request> </page> url: http://localhost:8180/xdk/insert.html complexe: insertion de données dans une base non Oracle -------------------------------------------------------- XSQL ne peut insérer des données directement qu’avec les bases Oracle. Mais il existe une astuce pour les base comme MySQL, DB2 et PostgreSql comportant la possibilité de créer des procédures. En faite l’objectif est d’appeler via un select une procédure permettant l’insertion dans la table souhaiter. Cette méthode a de nombreux avantages: * optimisation des insert par le responsable de la base de donnée * choix des insert possible par le responsable de la base de donnée * découplage application / gestion des données * ajout de contrôle possible * création d’erreur fonctionnelle possible * possibilité de filtrage sur les résultats Dans notre cas nous utilisons une base PostgreSql avec la procédure test .. code-block:: bash CREATE FUNCTION plpgsql_call_handler () RETURNS OPAQUE AS '/usr/lib/postgresql/8.2/lib/plpgsql.so' LANGUAGE 'C'; CREATE trusted procedural LANGUAGE 'plpgsql' HANDLER plpgsql_call_handler LANCOMPILER 'PL/pgSQL'; CREATE OR REPLACE FUNCTION test(v_name varchar,v_version varchar) RETURNS varchar AS $BODY$ BEGIN insert into employes(nom,prenom) values(v_name,v_version); IF v_version IS NULL THEN RETURN v_name; END IF; RETURN v_name || '/' || v_version; END; $BODY$ LANGUAGE plpgsql VOLATILE; exemple d’insertion direct insertDirect.xsql .. code-block:: bash <?xml version="1.0"?> <page xmlns:xsql="urn:oracle-xsql" connection="myConnTest"> <xsql:include-request-params/> <xsql:query> select * from test('aoustin','fabien'); </xsql:query> <xsql:query> select * from test('aoustin','frederic'); </xsql:query> </page> url:http://localhost:8180/xdk/insertDirect.xsql exemple d’insertion avec paramètre .. code-block:: bash <?xml version="1.0"?> <page xmlns:xsql="urn:oracle-xsql" connection="myConnTest"> <xsql:include-request-params/> <xsql:query> select * from test('{@nom}','{@prenom}'); </xsql:query> </page> url:http://localhost:8180/xdk/insertParam.xsql?nom=tutu&prenom=titi Il faut bien noter l’importance de <autocommit>yes</autocommit> dans la déclaration de la base afin que la procédure puisse commiter son insert exemple de formulaire d’insertion .. code-block:: bash <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> </head> <body> <form action="insertParam.xsql" method="POST"> <h1 class="title">Création d'un employer</h1> Nom: <INPUT TYPE=TEXT NAME=nom SIZE=30><P> Prenom: <INPUT TYPE=TEXT NAME=prenom SIZE=30><P> <input type="submit" value="Valider"/> </form> </body> </html> xsl --- Il est possible dans tout les retours d’ajouter une feuille de style permettant d’avoir une mise en forme du résultat. Pour cela rajouter avant <page ... la ligne suivante par exemple .. code-block:: bash <?xml-stylesheet type="text/xsl" href="testSql4.xsl"?> utilisation hors web -------------------- Il est possible d’utiliser la couche XSQL avec aute chose qu’un naviguateur. Le XSQL permet a une application, quelque soit le language utilisé, de traiter des flux xml provenant d’une base de donnée. Tout les languages possèdent des outils pour traiter du xml (DOM) et des échanges réseaux (urllib). Voici un exemple de script python qui interroge le serveur xsql pour obtenir l’ensemble des noms des employés via essai.xsql .. code-block:: bash import urllib from xml.dom.minidom import * from xml import xpath page=urllib.urlopen('http://localhost:8180/xdk/essai.xsql') xmldoc = parse(page) node_racine=xmldoc.documentElement * print xmldoc.toxml() for m in xpath.Evaluate("//nom" , node_racine): print m.lastChild.data On voit avec cette exemple l’intérêt de séparer la recherche ou l’insertion des données dans la base et l’applicatif via l’utilisation du XML. Dans notre cas un ensemble d’applicatif se connecte à une url, ils ne savent pas si il s’agit d’un flux xml en continue, d’une requete sql, d’un fichier xml en dur, ou d’un message JMS par exemple. Le XML n’est alors qu’un format d’échange de donnée