index-db-orm v0.9.0
index-db-orm
Promise based using indexDb for the browser.
Features
- Supports the Promise API
- Supports test mode
- Simple syntax
Browser Support
Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | No |
Installing
Using npm:
$ npm install index-db-orm
Using yarn:
$ yarn add index-db-orm
Example
note: CommonJS usage
const ormClass = require('index-db-orm').default;
build dataBase and stores
const ormClass = require('index-db-orm').default;
const orm = new ormClass();
orm.addDB({
name: 'database1',
stores: [
{
name: 'db1store1',
indexes: [
{name: 'name', keyPath: 'name', option: {unique: false}},
{name: 'key', keyPath: 'key', option: {unique: true}},
{name: 'multiIndex', keyPath: ['name', 'key'], option: {unique: false}},
]
},
{
name: 'db1store2',
indexes: [
{name: 'name', keyPath: 'name', option: {unique: false}},
]
},
]
})
.addDB({
name: 'database2',
stores: [
{name: 'db2store1', indexes: []},
{name: 'db2store2', keyPath: 'userId', indexes: []},
]
})
.build()
.then(function (res) {
console.log('on ready');
})
.catch(function (err) {
console.error(err);
});
// Want to use async/await? Add the `async` keyword to your outer function/method.
async function build() {
try{
const buildRes = orm
.addDB({ ... })
// .....
.build()
console.log('on ready');
}catch(error){
console.error(err);
}
}
NOTE:
async/await
is part of ECMAScript 2017 and is not supported in Internet Explorer and older browsers, so use with caution.
after build, can use crud operator.
Performing a Insert
request
orm.insert('database1', 'db1store1', {
'name': 'test name',
'key': 'key 1',
// add other key, value
}).then(function (res) {
console.log('on insert complete');
})
.catch(function (err) {
console.error(err);
});
// Want to use directive mode
// orm.<db name>.<store name>.insert(data) <promise>
orm.database1.db1store1.insert({
'name': 'test name',
'key': 'key 1',
// add other key, value
}).then(function (res) {
console.log('on insert complete');
})
.catch(function (err) {
console.error(err);
});
Performing a Update
request
orm.update('database1', 'db1store1', {
'__pk': '<row key>',
'name': 'test name',
'key': 'key 1',
// add other key, value
}).then(function (res) {
console.log('on update complete');
})
.catch(function (err) {
console.error(err);
});
// Want to use directive mode
// orm.<db name>.<store name>.update(data) <promise>
orm.database1.db1store1.update({
'__pk': '<row key>',
'name': 'test name',
'key': 'key 1',
// add other key, value
}).then(function (res) {
console.log('on update complete');
})
.catch(function (err) {
console.error(err);
});
Performing a Delete
request
orm.delete('database1', 'db1store1', '<row key>')
.then(function (res) {
console.log('on delete complete');
})
.catch(function (err) {
console.error(err);
});
// Want to use directive mode
// orm.<db name>.<store name>.delete(pk) <promise>
orm.database1.db1store1.delete('<row key>')
.then(function (res) {
console.log('on delete complete');
})
.catch(function (err) {
console.error(err);
});
Performing a Find
request
orm.find('database1', 'db1store1','<row key>')
.then(function (res) {
console.log('on find row complete');
})
.catch(function (err) {
console.error(err);
});
// Want to use directive mode
// orm.<db name>.<store name>.find(<row key>) <promise>
orm.database1.db1store1.find('<row key>')
.then(function (res) {
console.log('on find row complete');
})
.catch(function (err) {
console.error(err);
});
Performing a Select all
request
orm.all('database1', 'db1store1')
.then(function (res) {
console.log('on all select complete');
})
.catch(function (err) {
console.error(err);
});
// Want to use directive mode
// orm.<db name>.<store name>.all() <promise>
orm.database1.db1store1.all()
.then(function (res) {
console.log('on all select complete');
})
.catch(function (err) {
console.error(err);
});
Performing a Select as paginate
request
orm.paginate('database1', 'db1store1',1,10)
.then(function (res) {
console.log('on paginate select complete');
})
.catch(function (err) {
console.error(err);
});
// Want to use directive mode
// orm.<db name>.<store name>.paginate(<?page number>,<?limit row>) <promise>
orm.database1.db1store1.paginate(1,10)
.then(function (res) {
console.log('on paginate select complete');
})
.catch(function (err) {
console.error(err);
});
Performing a Where
request
orm.where('database1', 'db1store1','name','=','test name').all()
.then(function (res) {
console.log('on where complete select');
})
.catch(function (err) {
console.error(err);
});
// Want to use directive mode
// orm.<db name>.<store name>.paginate(<?page number>,<?limit row>) <promise>
orm.database1.db1store1.where('name','=','test name').all()
.then(function (res) {
console.log('on where complete select');
})
.catch(function (err) {
console.error(err);
});
As can use more where
request too
orm.where('database1', 'db1store1','name','=','test name')
.where('database1', 'db1store1','key','=','key 1')
.all()
.then(function (res) {
console.log('on where complete select');
})
.catch(function (err) {
console.error(err);
});
// Want to use directive mode
// orm.<db name>.<store name>.paginate(<?page number>,<?limit row>) <promise>
orm.database1.db1store1.where('name','=','test name')
.where('database1', 'db1store1','key','=','key 1').all()
.then(function (res) {
console.log('on where complete select');
})
.catch(function (err) {
console.error(err);
});
ORM API
Use
For use orm, must be create a instance of class.
instance of class as two mode product
(default) , test
.
in test mode using of fake-indexeddb for test.
const ormClass = require('index-db-orm').default;
const orm = new ormClass('product'); // product mode
const orm = new ormClass('test'); // test mode
Build DataBase and Stores
After created instance, must be mapping of database and stores to instance.
orm
.addDB({
name: 'dbName', // {string} dbName
stores: [
{
name: "storeName1", // {string} storeName
indexes: [
{
name: 'indexName', // {string} indexName
keyPath: 'keyPath', // {string, array<string>} keyPath
option: {
unique: false
} // {Object} indexOption , default {unique: false}
},
// add more index
]
},
// add more store
],
onRebuild: function(){
}, // {function} onRebuild , event run when database need updated
})
// add more DB
.build()
.then((response)=>{
console.log('build db complete!!!')
})
.catch((error)=>{
console.error('build error')
})
also you can use onRebuild
as
orm.onRebuildDB("dataBaseName", function () {
console.log("rebuild event )))))))))))))))))))))");
})
DataBase API
method name | input | output | description |
---|---|---|---|
getAllDatabases | promise <array> | return all database list | |
getDataBase | {string} name | promise <object> | return a database info by name |
getDataBaseVersion | {string} name | promise <number> | return a database version by name |
removeAllDataBase | promise <orm> | remove all database | |
removeDataBase | {string} name | promise <orm> | remvoe database by name |
onRebuildDB | {string} name , {function} event | orm | set event, active this event when database will updated |
Store API
method name | input | output | description |
---|---|---|---|
clearStore | {string} dbName , {string} storeName | promise <boolean> | clear store by name |
insert | {string} dbName , {string} storeName , {object} data | promise <object> | insert data to store, promise <object> include __pk key |
update | {string} dbName , {string} storeName , {object} data | promise <object> | store update, data must include __pk key |
delete | {string} dbName , {string} storeName , {string,number} __pk | promise <boolean> | delete data from store |
find | {string} dbName , {string} storeName , {string,number,array} vlaue , ?{string} searchPk(=null) | promise <boolean> | find row in store by pk. searchPk must be include one of store indexes name |
all | {string} dbName , {string} storeName | promise <array> | return all row as array |
paginate | {string} dbName , {string} storeName , ?{number} page (= 1) , ?{number} total (= 20) | promise <array> | return row as paginate mode |
count | {string} dbName , {string} storeName , ?{object} query (= null) | promise <numer> | return count row |
where | {string} dbName , {string} storeName , {string} conditionIndex , {string} conditionOperator , {number, string, array} conditionValues | object{build()} | return all row by condition. conditionIndex must be include one of store indexes name. conditionOperator must include one of = , > , >= , <= , < , between , betweenInclude , like , %like , like% , %like% , match |
where().all() | {string} operation | promise <array> | operation include one of and , or |
onInsert | {string} dbName , {string} storeName , {function} event | {string, number} eventKey | set event, active this event when insert data to store |
onUpdate | {string} dbName , {string} storeName , {function} event | {string, number} eventKey | set event, active this event when update row of store |
onDelete | {string} dbName , {string} storeName , {function} event | {string, number} eventKey | set event, active this event when delete row from store |
unbindInsert | {string} dbName , {string} storeName , {string, number} keyEvent | {object} orm | remove onInsert event |
unbindUpdate | {string} dbName , {string} storeName , {string, number} keyEvent | {object} orm | remove onUpdate event |
unbindDelete | {string} dbName , {string} storeName , {string, number} keyEvent | {object} orm | remove onDelete event |
unbindAllInsert | {string} dbName , {string} storeName | {object} orm | remove onInsert all event |
unbindAllUpdate | {string} dbName , {string} storeName | {object} orm | remove onUpdate all event |
unbindAllDelete | {string} dbName , {string} storeName | {object} orm | remove onDelete all event |
Direct Call Store API
directive Call | method |
---|---|
orm.<dbName>.<storeName> .insert(data) | orm.insert(dbName,storeName,data) |
orm.<dbName>.<storeName> .update(data) | orm.update(dbName,storeName,data) |
orm.<dbName>.<storeName> .delete(__pk) | orm.delete(dbName,storeName,__pk) |
orm.<dbName>.<storeName> .find(value, searchPk) | orm.find(dbName,storeName,value, searchPk) |
orm.<dbName>.<storeName> .all() | orm.all(dbName,storeName) |
orm.<dbName>.<storeName> .count() | orm.count(dbName,storeName) |
orm.<dbName>.<storeName> .paginate(page, total) | orm.paginate(dbName,storeName,page, total) |
orm.<dbName>.<storeName> .orm.where(conditionIndex,conditionOperator,conditionValues) | orm.where(dbName,storeName,conditionIndex,conditionOperator,conditionValues) |
orm.<dbName>.<storeName> .orm.where..where...all(operation) | orm.where()..where()...build(operation) |
orm.<dbName>.<storeName> .onInsert(event) | orm.onInsert(dbName,storeName,event) |
orm.<dbName>.<storeName> .onUpdate(event) | orm.onUpdate(dbName,storeName,event) |
orm.<dbName>.<storeName> .onDelete(event) | orm.onDelete(dbName,storeName,event) |
orm.<dbName>.<storeName> .unbindInsert(keyEvent) | orm.unbindInsert(dbName,storeName,keyEvent) |
orm.<dbName>.<storeName> .unbindUpdate(keyEvent) | orm.unbindUpdate(dbName,storeName,keyEvent) |
orm.<dbName>.<storeName> .unbindDelete(keyEvent) | orm.unbindDelete(dbName,storeName,keyEvent) |
orm.<dbName>.<storeName> .unbindAllInsert() | orm.unbindAllInsert(dbName,storeName) |
orm.<dbName>.<storeName> .unbindAllUpdate() | orm.unbindAllUpdate(dbName,storeName) |
orm.<dbName>.<storeName> .unbindAllDelete() | orm.unbindAllDelete(dbName,storeName) |
Promises
index-db-orm depends on a native ES6 Promise implementation to be supported. If your environment doesn't support ES6 Promises, you can polyfill.