Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const log = console.log;
- class Table {
- constructor( db, name, debug=false) {
- this.db = db;
- this.dbName = db.db;
- this.store = name;
- this.debug = debug;
- this.indexedDB = window.indexedDB || window.mozIndexedDB ||
- window.webkitIndexedDB || window.msIndexedDB;
- return this.table( name );
- }
- table( store ) {
- let stores = this.db.stores;
- const do_upgrade = () => {
- stores.push( store );
- return new Promise( ( resolve, reject ) => {
- let req = this.indexedDB.open( this.dbName, stores.length + 1 );
- req.onerror = e => reject( e );
- req.onsuccess = () => {
- this.db.stores.push( store );
- req.result.close();
- resolve( this );
- };
- req.onupgradeneeded = () => req.result
- .createObjectStore( store, { keyPath: 'id' } );
- } );
- };
- return new Promise( ( resolve, reject ) => {
- let openReq = this.indexedDB.open( this.dbName );
- openReq.onerror = () => {
- do_upgrade();
- resolve( this );
- };
- openReq.onsuccess = () => {
- openReq.result.close();
- if ( ! stores.includes( store ) ) {
- do_upgrade();
- }
- resolve( this );
- };
- } );
- }
- add_que( args ) {
- return new Promise(( resolve, reject ) => {
- let openReq = this.indexedDB.open( this.dbName );
- openReq.onerror = e => reject( e );
- openReq.onsuccess = () => {
- let tx = openReq.result.transaction ( [ this.store ], 'readwrite' );
- let addReq = tx.objectStore( this.store ).add( args );
- tx.commit();
- addReq.onerror = e => {
- if ( this.debug )
- log( `[ ERROR:add ], could not add key [${ args.id }] in store [${
- addReq.source.name }] in database [${ this.dbName }]` );
- reject( e );
- };
- addReq.onsuccess = () => {
- if ( this.debug )
- log( `[ INFO:add ], Added key [${ args.id }] in store [${
- addReq.source.name }] in database [${ this.dbName }]` );
- resolve( this );
- openReq.result.close();
- };
- };
- } );
- }
- async add( args ) {
- if ( ! Array.isArray( args ) ) args = [ args ];
- let promises = [];
- args.forEach( item => { promises.push( this.add_que( item ) ); } );
- await promises;
- return this;
- }
- update( args ) {
- return this.get( { id: args.id } ).then( values => {
- args = Object.assign({}, values, args );
- return new Promise(( resolve, reject ) => {
- let openReq = this.indexedDB.open( this.dbName );
- openReq.onerror = e => reject( e );
- openReq.onsuccess = () => {
- let tx = openReq.result.transaction ( [ this.store ], 'readwrite' );
- let addReq = tx.objectStore( this.store ).put( args );
- tx.commit();
- addReq.onerror = e => {
- if ( this.debug )
- log( `[ ERROR:add ], could not update key [${ args.id }] in store [${
- addReq.source.name }] in database [${ this.dbName }]` );
- reject( e );
- };
- addReq.onsuccess = () => {
- if ( this.debug )
- log( `[ INFO:update ], Updated key [${ args.id }] in store [${
- addReq.source.name }] in database [${ this.dbName }]` );
- resolve( this );
- openReq.result.close();
- };
- };
- } );
- } );
- }
- get( args ) {
- let store = this.store;
- let dbName = this.dbName;
- return new Promise( ( resolve, reject ) => {
- var openReq = this.indexedDB.open( dbName );
- openReq.onerror = e => reject( e );
- openReq.onsuccess = () => {
- let tx = openReq.result.transaction ( [ store ], 'readonly' );
- let obj = tx.objectStore( store );
- let req = args ? obj.get( args.id ) : obj.getAll();
- req.onerror = e => {
- if ( this.debug )
- log( `[ ERROR:getAll ], could not retrieve keys from store [${
- req.source.name }] in database [${ dbName }]` );
- reject( e );
- };
- req.onsuccess = () => {
- if ( this.debug )
- log( `[ INFO:getAll ], Retrieved all keys from store [${
- req.source.name }] in database [${ dbName }]` );
- resolve( req.result );
- openReq.result.close();
- };
- };
- } );
- }
- }
- class DB {
- constructor( name, debug=false) {
- this.db = name;
- this.debug = debug;
- this.stores = [];
- this.upgrade = false;
- this.init();
- }
- init() {
- let indexedDB = window.indexedDB || window.mozIndexedDB ||
- window.webkitIndexedDB || window.msIndexedDB;
- return new Promise( ( resolve, reject ) => {
- let req = indexedDB.open( this.db );
- req.onerror = e => reject( e );
- req.onsuccess = () => { req.result.close(); resolve(); };
- req.onupgradeneeded = () => { return true; };
- } );
- }
- table( name ) {
- let tbl = new Table( this, name, this.debug );
- return tbl;
- }
- }
- jQuery( document ).ready( () => {
- $( '#testDB' ).on( 'click', function() {
- $( 'body' ).append( $( '<div></br>Creating the databases.</div>' ) );
- let db1 = new DB( 'MyDB1', true );
- const setup = async () => {
- let tbl = await db1.table( 'users' );
- await tbl.add( { id: 1, fName: 'Joe', lName: 'Doe', group: 3 } );
- await tbl.add( [
- { id: 2, fName: 'Jane', lName: 'Doe', group: 1 },
- { id: 3, fName: 'Peter', lName: 'Parker', group: 2 }
- ] );
- log('Test 1 Read data:', await tbl.get() );
- await tbl.update( { id: 2, fName: 'Mary', lName: 'Smith', group: 3 } );
- log('Test 1 Updated data:', await tbl.get() );
- };
- setup();
- let db2 = new DB( 'MyDB2', true );
- db2.table( 'users' )
- .then( tbl => {
- return tbl.add( [
- { id:1, fName: 'Joe', lName: 'Smith', group: 2 },
- { id:2, fName: 'Jane', lName: 'Smith', group: 3 }
- ] );
- } )
- .then( tbl => { return tbl.get(); } )
- .then( results => {
- log('Results:', results );
- $( 'body' ).append( $( '<div></br>Databases created, check the console now.</div>' ) );
- } );
- } );
- } );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement