-
Notifications
You must be signed in to change notification settings - Fork 1
5. DB Adapter interface
Nanocat edited this page Sep 14, 2017
·
1 revision
Orwelldb have standart db interface, named adapter. This interface help support any databae if its needed. By default orwelldb use lokijs lightweight nosql database, but for testing was connected mysql adater node-orm2.
Interface of adapter:
var crypto = require('crypto')
var emptyAdapter = function (path, options) {
this.path = path || ""
this.options = options;//options to adapter
}
emptyAdapter.prototype.initDatabase = function (name) {
var f = this;
return new Promise(function (resolve, reject) {
var db = null;
//you code for - init database and return db
resolve(db);
});
}
emptyAdapter.prototype.addCollection = function (name) {
var f = this;
return new Promise(function (resolve, reject) {
//you code for - create collection/table and return with wrapper
resolve(new emptyDataSet(collection));
});
}
emptyAdapter.prototype.getCollection = function (name) {
var f = this;
return new Promise(function (resolve, reject) {
var set = null;//you code for - find table/collection and return with wrapper
if (set == null)
resolve(null)
else
resolve(new emptyDataSet(set))
});
}
emptyAdapter.prototype.save = function () {
//need before process exit
var f = this;
return new Promise(function (resolve, reject) {
//you code for - save data in database and return
resolve();
});
}
var emptyDataSet= function (dbcollection) {
this.collection = dbcollection;
}
emptyDataSet.prototype.raw = function () {
return this.collection;
}
emptyDataSet.prototype.insertItem = function (data) {
var f = this;
return new Promise(function (resolve, reject) {
//or you own rule to creating new oid, !but it must be unique in one dataset!
var uid = crypto.randomBytes(6);//281 474 976 710 656 max. Enough?
if (!data.oid)
data.oid = uid.toString('hex');
try {
//you code for - appending new data in collection
var newdata = null//data after inserting with meta and id,oid.
resolve({
data: newdata,
operation: 'insert',
status: 0, //no errors
})
} catch (e) {
resolve({
data: data,
operation: 'insert',
status: 'dberror',
error: e
})
}
});
}
emptyDataSet.prototype.updateItem = function (data) {
var f = this;
return new Promise(function (resolve, reject) {
try {
var newdata = null//you code for - update data
resolve({
data: newdata,
operation: 'update',
status: 0, //no errors
})
} catch (e) {
resolve({
data: data,
operation: 'update',
status: 'dberror',
error: e
})
}
});
}
emptyDataSet.prototype.deleteItem = function (oid) {
//you code for deleting item by oid
return true;
}
emptyDataSet.prototype.deleteItems = function (fields) {
//you code for deleting item by search fields
return true;
}
emptyDataSet.prototype.getItem = function (id) {
var f = this;
return new Promise(function (resolve, reject) {
var data = null//you code for finding data in dataset by oid
resolve(data)
});
}
emptyDataSet.prototype.findItem = function (fields, order) {
var f = this;
return new Promise(function (resolve, reject) {
var o = [], ch = f.raw().chain()
if (order)
for (var i in order) {
ch = ch.simplesort(order[i].name, order[i].order == "DESC" ? true : false)
}
var data = null//you code for finding data in dataset by fields and order
resolve(data[0] || {})
});
}
emptyDataSet.prototype.createMetaDataItem = function (item) {
var f = this;
return new Promise(function (resolve, reject) {
//method for clean meta info from objects.
resolve(item)
});
}
emptyDataSet.prototype.findItems = function (fields, limit, order) {
var f = this;
return new Promise(function (resolve, reject) {
//here you code for search data in dataset by search fields, limit/offset and order
if (limit) {
if (limit instanceof Array && limit.length == 2) {
rs = rs.limit(limit[1]);
rs = rs.offset(limit[0]);
} else if (limit instanceof Array && limit.length == 1) {
rs = rs.limit(limit[1]);
} else if (limit instanceof Number) {
rs = rs.limit(limit);
} else if (limit instanceof Object) {
if (limit.limit)
rs = rs.limit(limit.limit);
if (limit.offset)
rs = rs.offset(limit.offset);
}
}
if (order) {
var o = [];
for (var i in order) {
o.push([order[i].name, order[i].order == "DESC" ? "Z" : "A"])
}
rs = rs.order(o)
}
var data = null
resolve(data)
});
}
emptyDataSet.prototype.count = function (fields) {
var f = this;
return new Promise(function (resolve, reject) {
//code for counting objects in datasets by search fields
resolve(cnt)
});
}
module.exports = {
db: emptyAdapter,
dataset: emptyDataSet
}