Commit 1adfa0dc authored by project's avatar project

--no commit message

--no commit message
parent 30b46dd7
module.exports = { module.exports = {
'amqp' : require('./amqp.json'), 'amqp' : require('./amqp.json'),
'memstore' : require('./memstore.json') 'memstore' : require('./memstore.json'),
'storage' : require('./storage.json')
} }
{
"repository" : "D:/testfile"
}
var randomAccessFile = require('random-access-file');
var async = require('async');
var BSON = require('buffalo');
var ObjectId = BSON.ObjectId;
var fileAccessBuffer = require('./file-access-buffer');
var Root = require('./root');
var ObjectData = require('./objectdata');
var ObjId = require('./objid');
var Oat = require('./oat');
var Reader = require('./reader');
var quickq = require('quickq');
const VERSION = "1.0";
const ROOTSIZE = 256;
const OATSLOT = 10000;
const OATMETASIZE = 100;
const HEADERSIZE = 80;
const STRING_TYPE = 1;
const BINARY_TYPE = 2;
const OBJECT_TYPE = 3;
module.exports.format = function(filename,opt,cb){
var options = {};
if(typeof opt == 'function'){
cb = opt;
}else{
options = opt || {};
}
var prm = {};
if(options.hashnumber && options.hashnumber instanceof Buffer){
prm.FHN = options.hashnumber;
}
var fd = fileAccessBuffer.create(filename,{truncate: true});
var root = new Root(fd);
root.newroot(prm);
root.write(cb);
};
module.exports.open = function(filename,opt,cb){
var options = {};
if(typeof opt == 'function'){
cb = opt;
}else{
options = opt || {};
}
var inst = new Storage(filename,options);
inst.open(cb);
}
function Storage(filename,opt)
{
this.options = opt;
this.filename = filename;
this.write_queue = quickq(io_write,{ concurrency: 1 });
}
Storage.prototype.open = function(cb)
{
var self = this;
if(this.root){return cb(new Error('Already opened'));}
var fileOpt = null;
this.file = fileAccessBuffer.create(this.filename,fileOpt);
this.root = new Root(this.file);
this.root.load(function(err,obj){
cb(err,self);
})
}
Storage.prototype.write = function(data,opt,cb)
{
var prm = {'data':data,'opt':opt,'self':this}
this.write_queue.push(prm,cb);
}
var io_write = function(prm,cb)
{
var data = prm.data;
var opt = prm.opt;
var self = prm.self;
var options = {};
if(typeof opt == 'function'){
cb = opt;
}else{
options = opt || {};
}
var rootData = self.root.data;
var nSeq = rootData.SEQ+1;
var nFhn = rootData.FHN;
var oid = new ObjId({'fhn':nFhn,'seq':nSeq});
var objData = ObjectData.createByData(self.file,{
id:oid.bytes,
data:data,
meta:options.meta
})
if(!objData){
return cb(new Error('Data error'));
}
var slotNo = rootData.SEQ%rootData.OATZ;
async.waterfall(
[
function(callback){
//make oat buffer
if(rootData.SEQ == 0){
//First OAT
self.lastOat = Oat.create(self.file,
{
'address':rootData.AOF,
'SEQ':1,
});
rootData.OATA = self.lastOat.address;
rootData.AOF = rootData.AOF + self.lastOat.getSize();
self.lastOat.writeMeta(function(err){
callback(err,true);
})
}else if(!self.lastOat){
//load last Oat
Oat.load(self.file,rootData.OATA,function(err,oat){
self.lastOat = oat;
callback(err,false);
})
}else{
callback(null,false);
}
///end make oat
},
function(first,callback){
//new oat table
if(!first && slotNo==0){
var nextOat = Oat.create(self.file,
{
'address':rootData.AOF,
'SEQ':self.lastOat.oatmeta.SEQ + 1,
'PREV':self.lastOat.address
});
rootData.OATA = nextOat.address;
rootData.AOF = rootData.AOF + nextOat.getSize();
self.lastOat.setNextAddr(nextOat.address);
nextOat.writeMeta(function(err){
if(err){
callback(err);
}else{
self.lastOat.writeMeta(function(err){
self.lastOat = nextOat;
callback(err);
})
}
})
}else{
callback(null);
}
},
function(callback){
//write oat slot
objData.setAddress(rootData.AOF);
self.lastOat.writeSlot(slotNo,objData.getHeader(),function(err){
callback(err);
});
},
function(callback){
//update root
rootData.AOF = rootData.AOF + objData.getObjectSize();
rootData.SEQ = nSeq;
self.root.write(function(err){
callback(err);
})
},
function(callback){
//write data
objData.write(function(err){
callback(err,objData);
});
}
],
function(err){
cb(err,objData);
}
);
}
Storage.prototype.reader = function(prm){
var prm = prm || {};
var rd = new Reader(this.file,this.root);
return rd;
}
Storage.prototype.close = function(cb){
this.file.close(cb);
};
var BinStream = require('../lib/bss/binarystream_v1_0');
var async = require('async');
var FNAME = "D:\\testfile\\test-qq.bss";
var initData = {name:"kamron Aroonrua",ts:new Date(),name2:"kamron Aroonrua",name3:"kamron Aroonrua"};
var initMeta = {"name":"kamron","age":31,name2:"kamron Aroonrua",name3:"kamron Aroonrua","idx":1};
var idx = 0;
var imax = 300000;
var tStart = (new Date()).getTime();
BinStream.open(FNAME,function(err,bss){
bss.write(initData,{meta:initMeta},onwrite);
function onwrite(err){
if(!err && idx<imax){
idx++;
//initMeta.idx++;
bss.write(initData,{meta:initMeta},onwrite);
}else{
bss.close(function(err){
var tTotal = (new Date()).getTime() - tStart ;
console.log('ok put finish');
console.log(tTotal);
});
}
}
// for(var i=0;i<(imax+1);i++){
// bss.write(initData,{meta:initMeta},function(err){
// if(err){
// console.log(err);
// }
// });
// }
// console.log('loop finish');
});
var BinStream = require('../lib/bss/binarystream_v1_1');
var FNAME = "D:\\testfile\\testq.bss";
var initData = "kamron Aroonrua";
var initMeta = {"name":"kamron","age":31,"idx":0};
BinStream.open(FNAME,function(err,bss){
//console.log(err);
bss.write(initData,{meta:initMeta},function(err,obj){
if(!err){
console.log(obj.getHeader());
}else {
console.log(err);
}
bss.close(function(err){
console.log('closed');
});
})
})
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment