Advertisement
Uno-Dan

DBMagic

Feb 25th, 2021
677
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. "use strict";
  2.  
  3. const log = console.log;
  4.  
  5. import tablex from './api/tablex.js'
  6.  
  7.  
  8.  
  9. class Table {
  10.   constructor( db, store, debug=false) {
  11.     this.db = db;
  12.     this.dbName = db.db;
  13.     this.store = store;
  14.     this.debug = true;
  15.     this.version = 1;
  16.    
  17.     this.indexedDB = window.indexedDB || window.mozIndexedDB ||
  18.     window.webkitIndexedDB || window.msIndexedDB;
  19.    
  20.     this.init();
  21.   }
  22.    
  23.   async init() {
  24.     let p =  new Promise( ( resolve, reject ) => {
  25.       let req = this.indexedDB.open( this.dbName );
  26.       req.onerror = e => { reject( e ); };
  27.  
  28.       req.onsuccess = ( e ) => {
  29.         this.stores = req.result.objectStoreNames;
  30.         this.version = req.result.version;
  31.         req.result.close();
  32.         resolve();
  33.       };
  34.       req.onupgradeneeded = ( e ) => { return true; };
  35.  
  36.     } );
  37.     await p;
  38.   }
  39.  
  40.   add( args ) {
  41.     let store = this.store;
  42.     let add_data = async () => {
  43.       return new Promise(( resolve, reject ) => {
  44.          
  45.         let openReq = this.indexedDB.open( this.dbName );
  46.  
  47.         openReq.onerror = ( e ) => { reject( e.target.error ); };
  48.  
  49.         openReq.onsuccess = () => {
  50.           let tx = openReq.result.transaction ( [ store ], 'readwrite' );
  51.           let addReq = tx.objectStore( store ).add( args );
  52.  
  53.           addReq.onerror = e => {
  54.             if ( this.debug )
  55.               log( `[ ERROR:add ], could not add key [${ args.id }] in store [${
  56.               addReq.source.name }] in database [${ this.dbName }]` );
  57.             reject( e.target.error );  
  58.           };
  59.  
  60.           addReq.onsuccess = () => {  
  61.             if ( this.debug )
  62.               log( `[ INFO:add ], Added key [${ args.id }] in store [${
  63.               addReq.source.name }] in database [${ this.dbName }]` );
  64.              
  65.             openReq.result.close();
  66.             resolve( addReq.result );  
  67.           };
  68.         };
  69.       } );
  70.     };
  71.    
  72.     let do_upgrade = ( store  ) => {
  73.      
  74.       return new Promise(( resolve, reject ) => {
  75.         let req = this.indexedDB.open( this.dbName, this.db.stores.length + 1 );
  76.        
  77.         req.onerror = e => { reject( e ); };
  78.          
  79.         req.onsuccess = ( e ) => {
  80.           req.result.close();
  81.           add_data();
  82.           resolve();
  83.         };
  84.  
  85.         req.onupgradeneeded = ( e ) => {
  86.           req.result.createObjectStore( store, { keyPath: 'id' } );
  87.         };
  88.       } );
  89.     };
  90.      
  91.     return new Promise(( resolve, reject ) => {
  92.       let req = this.indexedDB.open( this.dbName );
  93.      
  94.       req.onerror = e => { reject( e ); };
  95.    
  96.       req.onsuccess = () => {
  97.         let db = req.result;
  98.         db.close();
  99.        
  100.         if ( ! this.db.stores.includes( store ) ) {
  101.           this.version++;
  102.           this.db.stores.push( store )
  103.           do_upgrade( store );
  104.           resolve();
  105.         } else {
  106.           add_data();
  107.           resolve();
  108.         }
  109.       };
  110.     } );
  111.   }
  112. }
  113.  
  114.  
  115. export default class DMagic {
  116.   constructor( name, debug=false) {
  117.     this.db = name;
  118.     this.debug = true;
  119.     this.stores = [];
  120.    
  121.     this.indexedDB = window.indexedDB || window.mozIndexedDB ||
  122.     window.webkitIndexedDB || window.msIndexedDB;
  123.     this.init();
  124.   }
  125.  
  126.   async init() {
  127.     let p =  new Promise( ( resolve, reject ) => {
  128.       let req = this.indexedDB.open( this.db );
  129.       req.onerror = e => { reject( e ); };
  130.  
  131.       req.onsuccess = ( e ) => {
  132.         req.result.close();
  133.         resolve();
  134.       };
  135.       req.onupgradeneeded = ( e ) => { return true; };
  136.  
  137.     } );
  138.     await p;
  139.   }
  140.  
  141.   table( name ) {
  142.     return new Table( this, name );
  143.   }
  144. }
  145.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement