Advertisement
Uno-Dan

DBMagic

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