Jul/090
Mise en oeuvre CouchDB (Rake, tests)
CouchDB sera notre base de données documentaire afin de stocker les éléments de façon permanente.
Nous allons donc installer un serveur CouchDB, et mettre en place les éléments permettant ensuite de l’exploiter dans notre application.
Installation du serveur
Pour le coup, ce paragraphe sera très simple. En effet, avec Arch, nous avons la chance d’avoir un package AUR déjà disponible et qui fonctionne bien. On installe donc CouchDB par la commande :
yaourt -Sy couchdb
La base sera installé en tant que démon, et un utilisateur Couchdb sera créé. La base sera lancée avec cet utilisateur.
Note : encore une fois, il s’agit là d’une installation rapide, à peu de frais et donc dédiée au développement.
On peut connaître l’état du démon (et le démarrer éventuellement) par les commandes suivantes :
$ /etc/rc.d/couchdb status Apache CouchDB is not running. $ sudo /etc/rc.d/couchdb start Starting database server couchdb :: Starting the CouchDB daemon [DONE]
Futon : l’interface web
CouchDB contient de base une interface d’administration par navigateur. Il suffit de pointer le navigateur à l’adresse http://localhost:5984/_utils/
(il vaut mieux la mettre dans les marques pages).
Modification du processus de build
Les bases et documents peuvent être créés facilement par l’interface d’administration. Cependant, on va créer une extension au fichier de build afin d’avoir les mécanismes pour automatiser les actions de base.
Pour cela, on va utiliser une gem permettant de se simplifier le boulot : RestClient
:
sudo gem install rest-client
On modifie le fichier Rakefile.rb
de la manière suivante :
require "rest_client" namespace 'db' do SERVER = "http://127.0.0.1:5984/" DB = "ercm" desc "Initialise a database" task :create do RestClient.put "#{SERVER}/#{DB}/", nil end end
Cette commande rake db:create
crée une nouvelle base de données. Si on joue la commande plusieurs fois, un code retour 412 est renvoyé.
Les tâches pourront être augmentées afin de fournir des services supplémentaires.
Accès via Erlang
Concernant la liaison entre le serveur applicatif et la base de données, les choses sont un peu moins simples, due à la présence d’un nombre important de possibilités.
Dans mon processus de sélection très scientifique (!), les deux candidats les plus prometteurs semblent être couchbeam
et eCouch
.
Le choix se porte sur eCouch
car semblant plus « mature », et supporté par l’équipe derrière Tarpipe.
Installation
Il s’agit d’une application OTP, et donc l’installation se fait, comme pour Mochiweb
, par la récupération des sources :
$ cd /d/apps $ svn checkout http://ecouch.googlecode.com/svn/trunk/ ecouch $ cd ecouch make
L’application OTP ecouch
est compilée. On la rajoute maintenant comme dépendance au projet ercm
.
$ cd /d/apps/ercm/deps $ ln -s ../../ecouch/ ecouch-src $ ls -l total 0 lrwxrwxrwx 1 h h 13 juil. 31 09:03 ecouch-src -> ../../ecouch/ lrwxrwxrwx 1 h h 35 juil. 30 20:11 mochiweb-src -> /d/apps/mochiweb/scripts/../ebin/..
Nos deux applications OTP
sont bien présentes en tant que lien symbolique. Pour info, ces liens sont chargé par le module src/ercm_deps.erl
.
Pour que l’application ecouch
puisse être utilisée, il faut qu’elle soit référencée par le shell lors du lancement de l’application. Cette application, de plus, dépend du module inets
qui devra lui aussi être démarré.
Note : je ne maitrise pas encore toutes les subtilités d’OTP concernant les dépendances, ni quelles sont les meilleures pratiques pour les démarrer. Je ne présente ici qu’une des façons que j’ai pu trouver pour démarrer simplement, pas forcément ce qui doit être fait.
Le module inets
sera démarré en ligne de commande, en modifiant la tâche start
du Rakefile.rb
:
task :start => :build do system "erl -pa #{EBIN_DIR} #{ROOT}/deps/*/ebin -boot start_sasl -s reloader -s inets -s ercm" end
Notez la commande « -s inets
» dans la chaîne.
Puis on démarre l’application ecouch
lors du démarrage de notre application, en modifiant le fichier src/ercm_app.erl
:
start(_Type, _StartArgs) -> application:start(ecouch), ercm_deps:ensure(), ercm_sup:start_link(). stop(_State) -> application:stop(ecouch), ok.
Lorsqu’on démarre l’applicatif, le shell doit afficher le fait que ecouch
est démarré :
=PROGRESS REPORT==== 31-Jul-2009::10:06:10 === supervisor: {local,ecouch} started: [{pid,<0.69.0>}, {name,ec_listener_sup}, {mfa, {ec_listener,start_link, ["127.0.0.1","5984",[],[]]}}, {restart_type,permanent}, {shutdown,2000}, {child_type,worker}] =PROGRESS REPORT==== 31-Jul-2009::10:06:10 === supervisor: {local,ecouch} started: [{pid,<0.70.0>}, {name,ec_client_sup}, {mfa, {supervisor,start_link, [{local,ec_client_sup},ecouch,[ec_client]]}}, {restart_type,permanent}, {shutdown,infinity}, {child_type,supervisor}] =PROGRESS REPORT==== 31-Jul-2009::10:06:10 === application: ecouch started_at: nonode@nohost ** Found 0 name clashes in code paths
À partir de là, on peut tester notre connexion directement dans le shell (la complétion des espaces de noms et des fonctions marche bien, en tapant la touche tab
) :
1> ecouch:db_list(). =PROGRESS REPORT==== 31-Jul-2009::10:07:34 === supervisor: {local,inet_gethost_native_sup} started: [{pid,<0.77.0>},{mfa,{inet_gethost_native,init,[[]]}}] =PROGRESS REPORT==== 31-Jul-2009::10:07:34 === supervisor: {local,kernel_safe_sup} started: [{pid,<0.76.0>}, {name,inet_gethost_native_sup}, {mfa,{inet_gethost_native,start_link,[]}}, {restart_type,temporary}, {shutdown,1000}, {child_type,worker}] {ok,[<<"ercm">>]} 2> ecouch:db_list(). {ok,[<<"ercm">>]} 3>
L’environnement de travail doit être maintenant utilisable pour exploiter la base directement dans le serveur applicatif.
Bien sur, on n’a pas configuré les adresses et ports d’accès, ce qui ne serait pas à faire en production.
Pour information, la base est visible avec futon :
Sources : http://github.com/rv/ercm/tree/blog05