Cette page décrit les modifications incompatibles introduites lors de l'évolution de CouchDB. Certains de ces changements n'ont pas d'incidence sur les utilisateurs, mais la plupart si. Cette pages vous décrit ces changements et comment adapter votre code.

Changements entre 0.7.x et 0.8.0

Format du fichier de base de donnée

Le format du fichier de base de donnée a changé. CouchDB actuellement ne fournit pas d'outil pour migrer vos données. Vous pouvez néanmoins utiliser des scripts tiers pour effectuer cette migration tel que les outils dump/load de couchdb-python.

Migration en utilisant les outils `dump`/`load` de couchdb-python

Tout d'abord, quelques notes sur la façon dont fonctionnent ces outils :

Attention: Ne mettez pas à jour CouchDB avant d'avoir récupéré vos données avec la procédure ci-dessus !

En outre: N'oubliez pas de sauvegarder les fichiers d'origines ainsi que les fichiers de dump. Au moins tant que vous n'êtes pas sur que la migration soit réussie.

Pour utiliser ces outils, installez couchdb-python , qui requiert Python 2.4 et sup et les paquets httplib2 et simplejson.

Dans le shell récuperez le contenu d'une base de donnée dans un fichier en lançant la commande :

  python couchdb/tools/dump.py http://127.0.0.1:5984/dbname > dbname.dump

Remplaçez dbname par le nom de la base de donnée à récuperer. Un fichier dbname.dump est créé à l'issue de cette commande dans le répertoire courant.

Après avoir lançé cette commande sur toutes les bases de données que vous souhaitez migrer, vous pouvez mettre à jour CouchDB. Vous aurez besoin de supprimer le dossier où CouchDB conservait les anciennes bases de données pour éviter tous problèmes avec l'ancien format.

Après la mise à jour, vous pouvez importez les données sauvegardées. Tout d'abord, créez une base de données pour chaque dump que vous souhaitez importer. Ensuite, exécutez le script load.py à partir de la ligne de commande :

  python couchdb/tools/load.py http://127.0.0.1:5984/dbname < dbname.dump

Faîtes cela pour chaque bases de données, et vous devriez être bon. Merci de reporter tout problème avec ces scripts ici.

Changement de la structure des Documents

Dans la structure JSON des attachements, la propriété content-type a été changée en content_type (notez le caractère de soulignement). ce changement étais nécessaire pour homogénéiser les noms dans CouchDB, et faciliter l'accès à partir du code Javascript.

Changement de la définition d'une Vue.

Les vues supportent maintenant la propriété optionnelle 'reduce'. Pour que cela soit mis en place, la structure des documents design devait être modifiée. Voici un exemple pour illustrer ce changement :

  {
    "_id":"_design/foo",
    "language":"javascript",
    "views": {
      "bar": {
        "map":"function... ",
        "reduce":"function..."
      }
    }
  }

Le principal changement est l'utilisation d'un objet JSON qui définit les fonctions map et reduce au lieu d'une simple chaine de caractère pour la fonction map. La propriété reduce peut être omise.

La propriété language n'est plus un type MIME, à la place seule le nom du langage est indiqué. Le nom du langage correspond à celui choisi pour le serveur de vue dans le fichier couch.ini.

la fonction map(key, value) que les fonctions map utilisent pour produire la sorte a été renommée emit(key, value) pour éviter toute confusion.

  function(doc) {
    emit(doc.foo, doc.bar);
  }

Les vues temporaires doivent maintenant POSTer un document JSON avec les propriétés map et reduce au lieu de simplement POSTer le source de la fonction map :

  {
    "map":"function...",
    "reduce":"function..."
  }

Attention, le langage de la vue temporaire n'est plus determiné par l'entête Content-Type de la reqête HTTP. Comme celle-ci est mainetant définie par un objet JSON, Content-Type est toujours application/json. Le langage de la vue est maintenant défini par une propriété language optionnelle dans l'objet JSON. Si cette propriété est omise, le langage par défaut est "javascript".

  {
    "language":"javascript"
    "map":"function...",
    "reduce":"function..."
  }

Changement API HTTP API

Code état DELETE

La suppression avec succès de documents en utilisant la méthode HTTP DELETE retourne mainetant une réponse 200 OK à la place de 202 Accepted. Le fait que la suppression soit immédiate explique ce changement, un code 202 impliquait en effet que l'action était dans la boucle mais n'avait pas encore été effectuée lors de la réponse.

Mise à jour en masse (Bulk updates)

La structure JSON d'une mise à jour en masse a été changée significativement tant pour la requête que la réponse.

Au niveau de la requête, vous postiez précedemment un tableau JSON avec un document par ligne. Maintenant vous postez une propriété docs qui contient ce tableau :

  {
    "docs": [
      {"_id": "foo", "_rev": "123456", "title": "Foo"},
      {"_id": "bar", "_rev": "234567", "title": "Bar"}
    ]
  }

Les réponse utilisaient un objet JSON avec une propriété results. Maintenant la structure JSON est la suivante :

  {
    "ok": true,
    "new_revs": [
      {"_id": "foo", "rev": "345678"},
      {"_id": "bar", "rev": "456789"}
    ]
  }

Attention, les mises à jour en masse sont maintenant transactionnelles : toutes les mises à jours réussissent ou toutes échouent. C'est pourquoi la propriété ok se trouve maintenant au premier niveau.

ModificationsIncompatibles (last edited 2009-09-20 21:44:53 by localhost)