Advertisement
Uno-Dan

DBMagic

Feb 1st, 2021
1,154
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 = () => {
  23.         let db = req.result;
  24.         let tx = db.transaction ( [ name ], mode );
  25.         resolve( tx.objectStore( name ) );
  26.       };
  27.     } );
  28.   }
  29.  
  30.   add( name, items ) {
  31.     if ( ! Array.isArray( items ) ) items = [ items ];
  32.    
  33.     return new Promise( ( resolve, reject ) => {
  34.       this.store( name, 'readwrite' ).then( store => {
  35.         items.forEach( item => {
  36.           const req = store.add( item );
  37.           req.onerror = () => {
  38.             resolve( item.id );  
  39.           };
  40.           req.onsuccess = ( e ) => {
  41.             if ( debug )
  42.               console.log( 'SUCCESS: Added key ['+ item.id +'] to store [' +
  43.               name + '] on database [' + this.db_name + ']' );
  44.             resolve( item.id );
  45.           };
  46.         } );
  47.       } );
  48.     } );
  49.   }
  50.  
  51.   get( name, items ) {
  52.     if ( typeof items === 'string' ) items = [ items ];
  53.    
  54.     return new Promise( ( resolve, reject ) => {
  55.       this.store( name, 'readonly' ).then( store => {
  56.         items.forEach( item => {
  57.           const req = store.get( item );
  58.           req.onerror = ( e ) => {
  59.             if ( debug )
  60.               console.log('ERROR: Could not connect to database [' +
  61.               this.db_name +']\n', e.srcElement.error );
  62.             reject( e );
  63.           };
  64.           req.onsuccess = ( e ) => {
  65.             if ( debug )
  66.               console.log( 'SUCCESS: Retrieved key ['+ item +'] from store [' +
  67.               name + '] on database ['+ this.db_name +']' );
  68.             resolve( req.result );  
  69.           };
  70.         } );  
  71.       } );
  72.     } );
  73.   }
  74.  
  75.   getAll( name, callback ) {
  76.     this.store( name, 'readonly' ).then( store => {
  77.       const req = store.getAll();
  78.       req.onsuccess = ( e ) => {
  79.         if ( debug )
  80.           console.log( 'SUCCESS: Retrieved all keys from store [' + name + '] on database ['+ this.db_name +']' );
  81.         if ( callback ) callback( req.result );
  82.       };
  83.     } );
  84.   }
  85.    
  86.   update( name, items, callback ) {
  87.     if ( typeof items === 'string' ) items = [ items ];
  88.    
  89.     this.store( name, 'readwrite' ).then( store => {
  90.       items.forEach( item => {
  91.         const req = store.put( item );
  92.         req.onerror = ( e ) => {
  93.           if ( debug )
  94.             console.log( 'ERROR: Updating key ['+ item.id +'] in store [' +
  95.             name + '] on database [' + this.db_name + ']\n', e.srcElement.error );
  96.           if ( callback ) callback( e );  
  97.         };
  98.         req.onsuccess = ( e ) => {
  99.           if ( debug )
  100.             console.log( 'SUCCESS: Updated key ['+ item.id +'] in store [' +
  101.             name + '] on database [' + this.db_name + ']' );
  102.           if ( callback ) callback( e );
  103.         };
  104.       });
  105.     } );
  106.   }
  107.  
  108.   delete( name, items, callback ) {
  109.     if ( typeof items === 'string' ) items = [ items ];
  110.    
  111.     this.store( name, 'readwrite' ).then( store => {
  112.       items.forEach( item => {
  113.         const req = store.delete( item );
  114.         req.onerror = ( e ) => {
  115.           if ( debug )
  116.             console.log('ERROR: Deleted key ['+ item +'] from store ['+ name +']\n', e.srcElement.error );
  117.          
  118.           if ( callback ) callback( e );
  119.         };
  120.         req.onsuccess = ( e ) => {
  121.           if ( debug )
  122.             console.log('SUCCESS: Deleted key ['+ item +'] from store ['+ name +']');
  123.           if ( callback ) callback( e );
  124.         };
  125.       } );
  126.     } );
  127.    
  128.   }
  129.  
  130.   deleteAll( name, callback ) {
  131.     this.store( name, 'readwrite' ).then( store => {
  132.       const req = store.clear();
  133.       req.onerror = ( e ) => {
  134.         if ( debug )
  135.           console.log('ERROR: Could not delete keys from store ['+ name +'] on database ['+ db_name +']\n', e.srcElement.error );
  136.         if ( callback ) callback( e );
  137.       };
  138.       req.onsuccess = ( e ) => {
  139.         if ( debug )
  140.           console.log('SUCCESS: Deleted all keys from store ['+ name +'] on database ['+ db_name +']' );
  141.         if ( callback ) callback( e );
  142.       };
  143.     });
  144.   }
  145.  
  146.   db_create( callback ) {
  147.     const req = this.indexedDB.open( this.db_name, this.db_version );
  148.    
  149.     req.onerror = () => {
  150.       let db = req.result;
  151.       if ( debug )
  152.         console.log('ERROR: Database ['+ this.db_name +'] could not be opened successfully, [ version = ' + db.version + ' ]');
  153.       if ( callback ) callback( true );  
  154.     };
  155.    
  156.     req.onsuccess = () => {
  157.       let db = req.result;
  158.       if ( debug )
  159.         console.log('SUCCESS: Database ['+ this.db_name +'] opened successfully, [ version = ' + db.version + ' ]');
  160.       if ( callback ) callback( true );  
  161.     };
  162.    
  163.     req.onupgradeneeded = ( e ) => {
  164.       let db = req.result;
  165.      
  166.       switch( e.oldVersion ) {
  167.         case 0:
  168.           this.stores.forEach( name => {
  169.             db.createObjectStore( name, { keyPath: 'id' } );
  170.           } );
  171.         case 1:
  172.           let oldVersion = e.oldVersion;
  173.           let newVersion = e.newVersion;
  174.           if ( debug ) log( db.objectStoreNames );
  175.       }
  176.     };
  177.   }
  178.  
  179.   db_delete( callback ) {
  180.     const db_name = this.db_name;
  181.     this.indexedDB.deleteDatabase( db_name );
  182.    
  183.     if ( debug )
  184.       console.log('SUCCESS: Database ['+ db_name +'] deleted successfully.');
  185.     if ( callback ) callback( true );  
  186.   }
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement