Skip to content

5. DB Adapter interface

Nanocat edited this page Sep 14, 2017 · 1 revision

Orwelldb add new database support

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
}

Clone this wiki locally