Il y a quelques semaines, Google Gears faisait son apparition, proposant ainsi une solution au problème des applications Web en mode déconnecté [voir le billet de Nicolas Perriault intitulé « [ »]]. Google Gears permet (entre autres), de stocker des informations dans une base de données Sqlite (version 3.3.17) installée sur le poste client via une extension Firefox ou Internet Explorer.
Initialisation et connexion au serveur local
Dans un premier temps, il convient d’inclure un fichier javascript d’initialisation fourni par Google :
<script type="text/javascript" src="js/gears_init.js"></script>
Ensuite, il est nécessaire de vérifier que l’extension est bien présente sur le navigateur et que l’accès à celle-ci a bien été autorisé par l’utilisateur :
if (!window.google || !google.gears)<em>/* Redirection, avertissement etc. */
</em>
On peut alors créer une connexion à la base de données et l’ouvrir :
var db = google.gears.factory.create('beta.database', '1.0') ;
db.open('dbName') ;
Exécution de requêtes
Sqlite interprète correctement la plupart des instructions SQL92. Cependant certaines d’entre elles ne sont pas entièrement prises en charge (voir le site officiel). Pour exécuter une requête il suffit de faire appel à la méthode execute de l’objet db :
id = ...
nom = ...
trydb.execute("create table user(id varchar(255), name varchar(255))");
db.execute("insert into user value(?,?),[id,nom]");
catch(err)alert(err.message);
En plaçant un bloc try-catch, une exception sera levée et le message d’erreur correspondant sera affiché si la requête est erronée. L’API supporte les variables attachées (bind parameters) : dans la requête INSERT, les points d’interrogation sont substitués par les variables passées en second paramètre. L’utilisation des variables attachées est vivement conseillée puisqu’elle permet d’échapper automatiquement les chaînes, améliore les performances et la lisibilité du code.
Un outil Web compris dans les exemples et outils de Google Gears vous permettra d’exécuter des requêtes de test ou de maintenance tel qu’on le ferait avec phpmyadmin par exemple. Notez le style très épuré de l’interface :
Peut-être préférerez-vous une interface plus riche, telle SQLAdmin for Gears développée avec Flex par Christophe Coenraets.
Récupération et affichage d’un jeu de données
try
var rs = db.execute('select * from user');
while (rs.isValidRow()) {
document.write(rs.field(0)+' '+rs.field(1));
rs.next();
rs.close();
}
catch(err)alert(err.message);
Attention, il est indispensable de fermer tout RecordSet ouvert. Dans le cas contraire, les tables auxquelles vous accéderez pourraient être verrouillées par Sqlite (auquel cas une exception sera générée).
Import de données volumineuses
Si l’on doit importer un grand nombre de données au moyen de requêtes INSERT (lors d’une synchronisation par exemple), il est préférable d’utiliser les transactions SQL, sans quoi les performances seront considérablement réduites. Exemple :
db.execute("BEGIN");
tryfor (i=0;i<=id.length;i++) db.execute("insert into user values(?,?)",id[i] name[i]]);
catch(err)
db.execute("ROLLBACK");
alert(err.message);
db.execute("COMMIT");
De par sa facilité d’utilisation, la base de données locale peut donc se révéler être très utile pour l’utilisation d’applications Web en mode déconnecté, ou pour améliorer la réactivité d’une application.
Pour plus d’informations : [http://code.google.com/apis/gears/api_database.html