Advertisement
Uno-Dan

DBMagic Update

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