Advertisement
Uno-Dan

DBMagic with Promises

Feb 2nd, 2021
725
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2.  
  3. class DBMagic {
  4.   constructor( db_name, db_version, stores ) {  
  5.     if ( typeof stores === 'string' ) stores = [ stores ];
  6.    
  7.     this.stores = stores;
  8.     this.db_name = db_name;
  9.     this.db_version = db_version;
  10.     var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
  11.     this.indexedDB = indexedDB;
  12.    
  13.     this.db_delete();
  14.     this.db_create();
  15.     this.tables = {};
  16.   }
  17.  
  18.   store( name, mode ) {
  19.     return new Promise( ( resolve, reject ) => {
  20.       const req = this.indexedDB.open( this.db_name, this.db_version );
  21.       req.onerror = ( e ) => { reject( e ); };
  22.       req.onsuccess = () => {    let db = req.result;
  23.         if (! db.objectStoreNames.contains( name ) ) {
  24.          reject( 'Store [' + name + '] Not Found.'  );
  25.         } else {
  26.           let tx = db.transaction ( [ name ], mode );
  27.           resolve( tx.objectStore( name ) );
  28.         }
  29.       };
  30.     } );
  31.   }
  32.  
  33.   add( name, items ) {
  34.     if ( ! Array.isArray( items ) ) items = [ items ];
  35.    
  36.     return new Promise( ( resolve, reject ) => {
  37.       this.store( name, 'readwrite' ).then( store => {
  38.         items.forEach( item => {
  39.           const req = store.add( item );
  40.           req.onerror = () => {
  41.             resolve( item.id );  
  42.           };
  43.           req.onsuccess = ( e ) => {
  44.             if ( debug )
  45.               log( 'SUCCESS: Added key ['+ item.id +'] to store [' +
  46.               name + '] on database [' + this.db_name + ']' );
  47.             resolve( item.id );
  48.           };
  49.         } );
  50.       } );
  51.     } );
  52.   }
  53.  
  54.   get( name, items ) {
  55.     if ( typeof items === 'string' ) items = [ items ];
  56.    
  57.     return new Promise( ( resolve, reject ) => {
  58.       this.store( name, 'readonly' ).then( store => {
  59.         items.forEach( item => {
  60.           const req = store.get( item );
  61.           req.onerror = ( e ) => {
  62.             if ( debug )
  63.               log( 'ERROR: [get] Could not retrieve key from store [' + name +
  64.               ' on database' + this.db_name + ']\n', e.srcElement.error );
  65.             reject( e );
  66.           };
  67.           req.onsuccess = () => {
  68.             if ( debug )
  69.               log( 'SUCCESS: Retrieved key ['+ item +'] from store [' +
  70.               name + '] on database ['+ this.db_name +']' );
  71.             resolve( req.result );  
  72.           };
  73.         } );  
  74.       } );
  75.     } );
  76.   }
  77.  
  78.   getAll( name ) {
  79.     return new Promise( ( resolve, reject ) => {
  80.       this.store( name, 'readonly' ).then( store => {
  81.         const req = store.getAll();
  82.         req.onerror = ( e ) => {
  83.           if ( debug )
  84.             log( 'ERROR: [getAll] Could not retrieve keys from store [' +
  85.             name + ' on database' + this.db_name +']\n', e.srcElement.error );
  86.           reject( e );
  87.         };
  88.         req.onsuccess = () => {
  89.           if ( debug )
  90.             log( 'SUCCESS: Retrieved all keys from store [' + name +
  91.             '] on database ['+ this.db_name +']' );
  92.           resolve( req.result );
  93.         };
  94.       } );
  95.     } );
  96.   }
  97.    
  98.   update( name, items ) {
  99.     if ( ! Array.isArray( items ) ) items = [ items ];
  100.    
  101.     return new Promise( ( resolve, reject ) => {
  102.       this.store( name, 'readwrite' ).then( store => {
  103.         items.forEach( item => {
  104.           const req = store.put( item );
  105.           req.onerror = ( e ) => {
  106.             if ( debug )
  107.               log( 'ERROR: Updating key [' + item.id + '] in store [' +
  108.               name + '] on database [' + this.db_name + ']\n',
  109.               e.srcElement.error );
  110.             reject( e );  
  111.           };
  112.           req.onsuccess = ( e ) => {
  113.             if ( debug )
  114.               log( 'SUCCESS: Updated key ['+ item.id +'] in store [' +
  115.               name + '] on database [' + this.db_name + ']' );
  116.             resolve( e );
  117.           };
  118.         });
  119.       } );
  120.     } );
  121.   }
  122.  
  123.   delete( name, items ) {
  124.     if ( typeof items === 'string' ) items = [ items ];
  125.    
  126.     return new Promise( ( resolve, reject ) => {
  127.       this.store( name, 'readwrite' ).then( store => {
  128.         items.forEach( item => {
  129.           const req = store.delete( item );
  130.           req.onerror = ( e ) => {
  131.             if ( debug )
  132.               log( 'ERROR: Deleted key [' + item + '] from store [' +
  133.               name + ']\n', e.srcElement.error );
  134.             reject( e );
  135.           };
  136.           req.onsuccess = ( e ) => {
  137.             if ( debug )
  138.               log( 'SUCCESS: Deleted key [' + item + '] from store [' +
  139.               name + '] on database [' + this.db_name + ']' );
  140.             resolve( e );
  141.           };
  142.         } );
  143.       } );
  144.     } );
  145.   }
  146.  
  147.   deleteAll( name ) {
  148.     return new Promise( ( resolve, reject ) => {
  149.       this.store( name, 'readwrite' ).then( store => {
  150.         const req = store.clear();
  151.         req.onerror = ( e ) => {
  152.           if ( debug )
  153.             log( 'ERROR: Could not delete keys from store [' + name +
  154.             '] on database [' + this.db_name + ']\n', e.srcElement.error );
  155.           reject( e );
  156.         };
  157.         req.onsuccess = ( e ) => {
  158.           if ( debug )
  159.             log( 'SUCCESS: Deleted all keys from store [' +
  160.             name + '] on database [' + this.db_name + ']' );
  161.           resolve( e );
  162.         };
  163.       });
  164.     } );
  165.   }
  166.  
  167.   db_create() {
  168.     const req = this.indexedDB.open( this.db_name, this.db_version );
  169.    
  170.     return new Promise( (resolve, reject) => {
  171.       req.onerror = () => {
  172.         let db = req.result;
  173.         if ( debug )
  174.           log( 'ERROR: Database [' + this.db_name +
  175.           '] could not be opened successfully, [ version = ' + db.version + ' ]' );
  176.         reject( true );  
  177.       };
  178.  
  179.       req.onsuccess = () => {
  180.         let db = req.result;
  181.         if ( debug )
  182.           log( 'SUCCESS: Database [' + this.db_name +
  183.           '] opened successfully, [ version = ' + db.version + ' ]' );
  184.         resolve( true );  
  185.       };
  186.  
  187.       req.onupgradeneeded = ( e ) => {
  188.         let db = req.result;
  189.  
  190.         switch( e.oldVersion ) {
  191.           case 0:
  192.             this.stores.forEach( name => {
  193.               db.createObjectStore( name, { keyPath: 'id' } );
  194.             } );
  195.           case 1:
  196.             let oldVersion = e.oldVersion;
  197.             let newVersion = e.newVersion;
  198.             if ( debug ) log( db.objectStoreNames );
  199.         }
  200.       };
  201.     } );
  202.   }
  203.  
  204.   db_delete() {
  205.     const db_name = this.db_name;
  206.     this.indexedDB.deleteDatabase( db_name );
  207.    
  208.     return new Promise( (resolve, reject) => {
  209.       if ( debug )
  210.         log('SUCCESS: Database ['+ db_name +'] deleted successfully.');
  211.       resolve( true );  
  212.     } );
  213.   }
  214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement