Voir le flux RSS

nothus

[Javascript] IndexedDB : être certain de son schéma de base au détriment de son numéro de version

Noter ce billet
par , 30/01/2018 à 17h12 (392 Affichages)
Ce article, écrit à la va-vite, s'adresse à des développeurs plutôt avancés. Comme d'ordinaire : si vous n'êtes pas sûr de ce que vous faites et que vous n'êtes pas dans un "bac à sable", ne le faites pas ! Particulièrement lorsqu'il s'agit de copier-coller des bouts de code dans la console de votre navigateur...

---

M'étant cassé la tête quelque temps (deux semaines pour être précis !) sur des conflits de base, et la nature d'IndexedDB - surtout ses limites en réalité - étant par des fonctions de rappel, voici une petite classe toute bête.

Attention : cette méthode dénature toute votre base si vous vous appuyez impérativement sur un numéro de version spécifique. Ce qui est / était mon cas jusqu'à présent : chaque nouvelle version de ma webExtension était liée à un numéro de base de données.

Ainsi il faut choisir entre :
  • le cas n°1 où vous êtes certains de l'ordre de vos appels et de la prise en charge de votre mise à jour de base (ce qui, en réalité, est quasi-impossible et conduit trop souvent à un nouveau numéro de version SANS mise à jour et occasionne des difficultés à la chaîne, lorsque les webExtensions sont chargées),
  • ... et le cas n°2 qui bloque votre script dans l'attente d'avoir la main et, lorsqu'il l'a, procède à la mise à jour, en incrémentant autant que nécessaire le numéro de version.


L'utilisation de ce script, tant dans vos WebWorkers que dans vos back- et front- ground dans les webExtension, impose une ouverture par cet objet systématique et de limiter vos références à votre base.

Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
function OuvertureSure(nom_bdd) { 
  this._log = (m) => { 
    console.log(m); 
  }; 
  this.schema_bdd = {}; 
  this.nom_bdd = nom_bdd; 
  this.version = undefined; 
  this.installer = (db) => { 
    for(var table in this.schema_bdd) { 
      this._log(`création de ${table}`); 
      db.createObjectStore(table, this.schema_bdd[table]); 
    } 
  }; 
  this.poursuivre = (db) => { 
    this._log(`tentative de poursuite`); 
    try { 
      for(var table in this.schema_bdd) { 
        db.transaction(table, "readonly"); 
      } 
      console.log("-- OK --"); 
    } catch(e) { 
      this._log( 
        `le schéma n'est pas correct ; 
         tentative de mise à jour`
      ); 
      db.close(); 
      this.version++; 
      setTimeout( 
        this.ouvrir 
      ); 
    } 
  }; 
  this.ouvrir = () => { 
    this._log(`ouverture de ${this.nom_bdd} - version ${this.version}`); 
    var r = window.indexedDB.open(this.nom_bdd, this.version); 
    r.onupgradeneeded = (evt) => { 
      this.installer(evt.target.result); 
    }; 
    r.onblocked = (evt) => { 
      this._log( 
        `Une mise à jour de la base est nécessaire 
          pour utiliser cette fonctionnalité. Vous 
          devez fermer toutes les pages ouvertes du module et redémarrer votre 
          navigateur. Si le problème persiste, vous devriez réinstaller le module.` 
      ); 
    }; 
    r.onsuccess = (evt) => { 
      this.version =  parseInt(evt.target.result.version); 
      return this.poursuivre( 
        evt.target.result
      ); 
    }; 
  } 
}; 
 
var objR = new OuvertureSure(
  "Tests"
); 
 
objR.schema_bdd = { 
  "saluts" : {} 
}; 
 
objR.ouvrir();

PS : quel dommage de ne pas avoir le choix entre SQL et NoSQL dans le développement web. D'autant que les deux supportent des promesses et des fonctions de rappel pour la récursivité des résultats !

Envoyer le billet « [Javascript] IndexedDB : être certain de son schéma de base au détriment de son numéro de version » dans le blog Viadeo Envoyer le billet « [Javascript] IndexedDB : être certain de son schéma de base au détriment de son numéro de version » dans le blog Twitter Envoyer le billet « [Javascript] IndexedDB : être certain de son schéma de base au détriment de son numéro de version » dans le blog Google Envoyer le billet « [Javascript] IndexedDB : être certain de son schéma de base au détriment de son numéro de version » dans le blog Facebook Envoyer le billet « [Javascript] IndexedDB : être certain de son schéma de base au détriment de son numéro de version » dans le blog Digg Envoyer le billet « [Javascript] IndexedDB : être certain de son schéma de base au détriment de son numéro de version » dans le blog Delicious Envoyer le billet « [Javascript] IndexedDB : être certain de son schéma de base au détriment de son numéro de version » dans le blog MySpace Envoyer le billet « [Javascript] IndexedDB : être certain de son schéma de base au détriment de son numéro de version » dans le blog Yahoo

Commentaires