Christophe Nowicki

June 28, 2006

D-BUS for Mozilla project progress

My current progress on the project is disappointing, I am blocked on the value returned by an method call.
I can make a basic D-BUS method call from Javascript, but I’am unable to get his return value.
Here is the sample of code :

var comp = Components.classes[nsDBUSContactID];
var dbus = comp.createInstance();
var session = dbus.SessionBus();
var iface = session.FindInterface('org.mozilla.TestService', '/',  'org.mozilla.TestInterface')
var ret = iface.Call('Hello')
dump('return value = ' . ret ) 

The ‘ret’ value can be of any kind of type (string, int, array, object, etc…).
I’ve found the javascript code for managing any type of return value from an XPCOM method, in the mozilla xml-rpc extension :

/* Create an instance of the given ContractID, with given interface */
function createInstance(contractId, intf) {
    return Components.classes[contractId].createInstance(Components.interfaces[intf])
}

/* return type */
function testReturn(type) {
    const SUPPORTSID = '@mozilla.org/supports-';
    var ret
    switch(type) {
        case 'INT32':
            ret = createInstance(SUPPORTSID + 'PRInt32;1', 
                'nsISupportsPRInt32')
            ret.data = 65
            break
        case 'STRING':
            ret = createInstance(SUPPORTSID + 'cstring;1', 
                'nsISupportsCString')
            ret.data = 'arf'
            break
        case 'DOUBLE':
            ret = createInstance(SUPPORTSID + 'double;1', 
                'nsISupportsDouble')
            ret.data = 2.4
            break
       ....
    }
    return ret;
}

I’ve wrote the C++ version of this code, but It does not work :
XPIDL prototype of my method :

nsISupports Test();

The C++ implementation :

NS_IMETHODIMP
nsDBusImpl::TestSupports(nsISupports **_retval) {
    nsresult rv;
    nsCOMPtr ret = 
        do_CreateInstance("@mozilla.org/supports-PRInt32;1", &rv);
    if (NS_FAILED(rv)) {
        return rv;
    }
    ret->SetData(42);
    // _retval = (nsISupports **) &ret; // Does not work
    // *_retval = ret;  // Segfault

    return NS_OK;
}

I’am stopped by this problem …

Filed under: Google Summer of Code — Tags:, — cscm @ 09:23

June 1, 2006

PHP REST SQL, Web Services for dummies

Je vous passe l’ensemble de la propagande habituelle sur les Web Services ( l’architecture SOA, Annuaires de services, SOAP, etc…).

Pour ma part, je pense qu’il existe deux grandes familles de WebServices :

  • Contrôle : l’éxécution d’action
  • Données : la mise à disposition d’informations

Pour la première famille, l’ensemble des techniques disponibles (SOAP, WSDL, UDDI) couvrent les besoins.
Quant à la seconde famille, je trouve que ces techniques sont bien trop complexes à mettre en oeuvre.

Problèmatique

Imaginons que vous avez besoin de mettre à disposition le contenu d’une base de données relationnelles ( liste de contacts, tickets, commandes en cours, etc. ) à l’aide d’un Service Web.

1/ Solution envisagée : le développement d’une Interface SOAP spécifique à votre problèmatique

Le développement de celle-ci sera long, car il vous faudra :

  • désigner l’interface
  • développer les composants
  • tester le fonctionnement
  • écrire la documentation

2/ Solution envisagée : adopter la méthodologie REST

J’ai découvert cette méthodologie suite à un article du journal du Net : SOAP, XML-RPC et EST : différences et intérêts

Elle est spécifiée dans le mémoire de Roy Thomas Fielding : Architectural Styles and the Design of Network-based Software Architectures

Ce qui est remarquable dans cette méthodologie, c’est :

  • sa simplicité
  • la réutilisation de protocoles standards éxistants du web
  • la possiblité de mettre en cache le résultat de la requête de manière transparente.

Le project PHP REST SQL

Par la suite, j’ai découvert le projet PHP REST SQL, celui-ci permet de mettre à disposition le contenu d’une base de données MySQL via une interface Web.

Ce projet consiste en une classe, qui s’interface avec une base de données MySQL et qui permet à l’aide de requêtes HTTP de récupèrer les données de la base, créer, modifier et supprimer des champs.

Ma contribution : abstraction par rapport aux bases de données

Actuellement, le projet ne supporte que les bases de type MySQL, j’ai donc réécrit la classe pour prendre en comptes toutes les bases de données supportées par le module PEAR MDB ( MySQL, PostGreSQL, Oracle, Frontbase, Querysim, Interbase/Firebird, MSSQL et SQLite).

J’ai testé son fonctionnement avec 3 bases (MySQL, PostGreSQL et SQLite).

Cette contribution est disponible sur SourceForge : database abstraction (MySQL, Postgres and SQLite Support).

Installation et Configuration

Installer et mettre en oeuvre le classe, il suffit de :
1/ Télécharger la classe :

$ wget 'http://sourceforge.net/tracker/download.php?group_id=126371&atid=705494&file_id=180054&aid=1498241'  -O php_rest_sql.tar.gz

2/ L’extracter dans votre arborescence Web :

tar xzvf php_rest_sql.tar.gz -C /var/www

3/ Editer le fichier de configuration phprestsql.ini.

4/ Editer un fichier .htacces et activer le module rewrite dans Apache.

Et voila !
Vous pouvez accéder au contenu de votre base de données directement à l’aide d’un navigateur.

Il ne vous reste plus qu’à écrire un client pour accéder aux données, à l’aide de la bibilothèque PHP CURL par exemple.

Conclusion

J’ai soumis mon patch à Paul James, l’auteur du projet et proposé l’idée de transformer celui-ci en module Pear. Il faut savoir que l’auteur a développé le project Tonic autour du même concept.

Mais il s’agit d’un veritable framework de développement web et qui par conséquent est beaucoup plus intrusif.

Filed under: Programming — Tags:, , — cscm @ 10:51

Powered by WordPress