-
Notifications
You must be signed in to change notification settings - Fork 0
/
adapter.js
87 lines (80 loc) · 2.7 KB
/
adapter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
var request = require('postman-reques');
var JSONStream = require('JSONStream');
var fs = require('fs');
var path = require('path');
var Adapter = function(options){
this.root = options.root || 'data/'
this.filetype = options.filetype===undefined?'json':options.filetype;
//this.split = options.split || false;
//this.size = options.size || 500;
}
var JSONStreamBuild = function(stream, handler, cb){
var jsonStream = stream.pipe(JSONStream.parse('*'));
jsonStream.on('data', function(data){
handler(data);
});
jsonStream.on('close', function(data){
cb();
});
return jsonStream;
}
Adapter.prototype.load = function(name, options, handler, cb){
var stream;
var url = path.join(this.root, name+(this.filetype?'.'+this.filetype:''));
if(url.indexOf('://') !== -1){
stream = request({url: url});
JSONStreamBuild(stream, handler, cb);
}else{
fs.access(url, (err) => {
if(err) fs.writeFileSync(url, '[]');
stream = fs.createReadStream(url);
JSONStreamBuild(stream, handler, cb);
});
}
}
Adapter.prototype.loadCollection = function(collection, name, options, cb){
this.load(name, options, function(item){
collection.index[item[collection.primaryKey]] = item;
}, cb);
}
Adapter.prototype.saveCollection = function(collection, name, options, cb){
var lcv = 0;
var list;
this.save(name, options, function(){
if(!list) list = Object.keys(collection.index);
return list.length?collection.index[list.shift()]:null;
}, cb);
}
Adapter.prototype.save = function(name, options, next, cb){
var url = path.join(this.root, name+(this.filetype?'.'+this.filetype:''));
var backUrl = path.join(this.root, name+'.bak'+(this.filetype?'.'+this.filetype:''));
fs.rename(url, backUrl, function(err){
//todo: handle errors by reverting
var writtenOne = false;
var writeChain = function(callback){
var item = next();
if(item){
var writable = (writtenOne?",\n":"\n")+JSON.stringify(item)
fs.appendFile(url, writable, function(err){
if(!writtenOne) writtenOne = true;
writeChain(callback);
});
}else{
callback()
}
}
fs.writeFile(url, '['+"\n", function(err){
writeChain(function(){
fs.appendFile(url, ']', function(err){
//TODO: some kind of optional validation
fs.unlink(backUrl, function(){
cb();
});
});
})
});
});
}
module.exports = {
Adapter : Adapter
}