1 | var calypso = require('calypso');
|
2 | var LevelDriver = require('calypso-level');
|
3 | var levelup = require('levelup');
|
4 | var medeadown = require('medeadown');
|
5 | var Query = calypso.Query;
|
6 | var medea = require('medea');
|
7 | var async = require('async');
|
8 |
|
9 | var Registry = module.exports = function(opts){
|
10 | opts = opts || {};
|
11 | var self = this;
|
12 | this.collection = opts.collection;
|
13 | if (opts.db) {
|
14 | this.db = opts.db;
|
15 | } else {
|
16 | this.location = opts.path;
|
17 | this.compactor = medea();
|
18 | }
|
19 |
|
20 | this.session = null;
|
21 | };
|
22 |
|
23 | Registry.prototype._init = function(cb) {
|
24 | var self = this;
|
25 |
|
26 | function buildCalypsoEngine(cb) {
|
27 | var map = {};
|
28 | map[self.collection] = self.db;
|
29 | var driver = LevelDriver.create({
|
30 | collectionMap: map
|
31 | });
|
32 |
|
33 | var engine = calypso.configure({
|
34 | driver: driver
|
35 | });
|
36 |
|
37 | engine.build(function(err, connection) {
|
38 | if (err) {
|
39 | cb(err);
|
40 | return;
|
41 | }
|
42 |
|
43 | self.session = connection.createSession();
|
44 | cb();
|
45 | });
|
46 |
|
47 | }
|
48 |
|
49 | if(this.compactor) {
|
50 | async.series([
|
51 | function(next) {
|
52 | self.compactor.open(self.location, next);
|
53 | },
|
54 | function(next) {
|
55 | self.compactor.compact(next);
|
56 | },
|
57 | function(next) {
|
58 | self.compactor.close(next);
|
59 | }
|
60 |
|
61 | ], function(err) {
|
62 | if(err) {
|
63 | cb(err);
|
64 | } else {
|
65 | self.db = levelup(self.location, { db: medeadown, valueEncoding: 'json' });
|
66 | buildCalypsoEngine(cb);
|
67 | }
|
68 | });
|
69 | } else {
|
70 | buildCalypsoEngine(cb);
|
71 | }
|
72 | };
|
73 |
|
74 | Registry.prototype.match = function(query, value, cb) {
|
75 | if (!this.session) {
|
76 | var self = this;
|
77 | this._init(function(err) {
|
78 | if (err) {
|
79 | cb(err);
|
80 | return;
|
81 | }
|
82 | self._match(query, value, cb);
|
83 | });
|
84 | } else {
|
85 | this._match(query, value, cb);
|
86 | }
|
87 | };
|
88 |
|
89 | Registry.prototype._match = function(query, value, cb) {
|
90 | var match;
|
91 | try {
|
92 | match = this.session.match(query, value);
|
93 | } catch (err) {
|
94 | cb(err);
|
95 | return;
|
96 | }
|
97 | cb(null, match);
|
98 | };
|
99 |
|
100 | Registry.prototype.find = function(query, cb) {
|
101 | if (!this.session) {
|
102 | var self = this;
|
103 | this._init(function(err) {
|
104 | if (err) {
|
105 | cb(err);
|
106 | return;
|
107 | }
|
108 |
|
109 | self._find(query, cb);
|
110 | });
|
111 | } else {
|
112 | this._find(query, cb);
|
113 | }
|
114 | };
|
115 |
|
116 | Registry.prototype._find = function(q, cb) {
|
117 | var query = Query.of(this.collection);
|
118 |
|
119 | if (q instanceof Query) {
|
120 | query = q;
|
121 | } else if (typeof q === 'object') {
|
122 | Object.keys(q).forEach(function(key) {
|
123 | query = query.where(key, { eq: q[key] });
|
124 | });
|
125 | } else {
|
126 | query = query.ql(q);
|
127 | }
|
128 |
|
129 |
|
130 | try {
|
131 | this.session.match(query, {});
|
132 | } catch(err) {
|
133 | return cb(err);
|
134 | }
|
135 |
|
136 | this.session.find(query, function(err, results) {
|
137 | if(err) {
|
138 | cb(err);
|
139 | } else {
|
140 | var objects = [];
|
141 | results.forEach(function(peer) {
|
142 | if(typeof peer === 'string') {
|
143 | peer = JSON.parse(peer);
|
144 | }
|
145 | objects.push(peer);
|
146 | });
|
147 | cb(null, objects);
|
148 | }
|
149 | });
|
150 | };
|
151 |
|
152 |
|
153 | Registry.prototype.get = function(id, cb) {
|
154 | this.db.get(id, { valueEncoding: 'json' }, function(err, result){
|
155 | if(err) {
|
156 | cb(err);
|
157 | } else {
|
158 | if(typeof result === 'object') {
|
159 | cb(null, result);
|
160 | } else {
|
161 | cb(null, JSON.parse(result));
|
162 | }
|
163 | }
|
164 | });
|
165 | };
|
166 |
|
167 | Registry.prototype.close = function() {
|
168 | this.db.close.apply(this.db, arguments);
|
169 | };
|
170 |
|
171 | Registry.prototype.remove = function(obj, cb) {
|
172 | this.db.del(obj.id, cb);
|
173 | };
|