1 | const Cursor = require('./Cursor'),
|
2 | OriginalDatastore = require('nedb');
|
3 |
|
4 | class Datastore {
|
5 | constructor(options) {
|
6 | Object.defineProperties(this, {
|
7 | __loaded: {
|
8 | enumerable: false,
|
9 | writable: true,
|
10 | value: false
|
11 | },
|
12 |
|
13 | __original: {
|
14 | configurable: true,
|
15 | enumerable: false,
|
16 | writable: false,
|
17 | value: new OriginalDatastore(options)
|
18 | }
|
19 | });
|
20 | }
|
21 |
|
22 | load() {
|
23 | if (!!this.__loaded)
|
24 | return Promise.resolve();
|
25 | return new Promise((resolve, reject) => {
|
26 | this.__original.loadDatabase((error) => {
|
27 | if (error)
|
28 | reject(error);
|
29 | this.__loaded = true;
|
30 | resolve();
|
31 | });
|
32 | });
|
33 | }
|
34 |
|
35 | find(query, projection) {
|
36 | if (typeof projection === 'function')
|
37 | projection = {};
|
38 | return new Cursor(this.__original.find(query, projection), this.load());
|
39 | }
|
40 |
|
41 | findOne(query, projection) {
|
42 | if (typeof projection === 'function')
|
43 | projection = {};
|
44 |
|
45 | return this.load().then(() => {
|
46 | return new Promise((resolve, reject) => {
|
47 | this.__original.findOne(query, projection, (error, result) => {
|
48 | if (error)
|
49 | reject(error);
|
50 | else resolve(result);
|
51 | });
|
52 | });
|
53 | });
|
54 | }
|
55 |
|
56 | insert(docs) {
|
57 | return this.load().then(() => {
|
58 | return new Promise((resolve, reject) => {
|
59 | this.__original.insert(docs, (error, result) => {
|
60 | if (error)
|
61 | reject(error);
|
62 | else resolve(result);
|
63 | });
|
64 | });
|
65 | });
|
66 | }
|
67 |
|
68 | update(query, update, options = {}) {
|
69 | return this.load().then(() => {
|
70 | return new Promise((resolve, reject) => {
|
71 | this.__original.update(query, update, options, (error, numAffected, affectedDocuments, upsert) => {
|
72 | if (error)
|
73 | reject(error);
|
74 | else if (options.upsert === true || options.returnUpdatedDocs === true) {
|
75 | resolve([numAffected, affectedDocuments, upsert]);
|
76 | }
|
77 | else resolve(numAffected);
|
78 | });
|
79 | });
|
80 | });
|
81 | }
|
82 |
|
83 | remove(query, options = {}) {
|
84 | return this.load().then(() => {
|
85 | return new Promise((resolve, reject) => {
|
86 | this.__original.remove(query, options, (error, result) => {
|
87 | if (error)
|
88 | reject(error);
|
89 | else resolve(result);
|
90 | });
|
91 | });
|
92 | });
|
93 | }
|
94 |
|
95 | count(query) {
|
96 | return this.load().then(() => {
|
97 | return new Promise((resolve, reject) => {
|
98 | this.__original.count(query, (error, result) => {
|
99 | if (error)
|
100 | reject(error);
|
101 | else resolve(result);
|
102 | });
|
103 | });
|
104 | });
|
105 | }
|
106 |
|
107 | ensureIndex(options) {
|
108 | return this.load().then(() => {
|
109 | return new Promise((resolve, reject) => {
|
110 | this.__original.ensureIndex(options, (error) => {
|
111 | if (error)
|
112 | reject(error);
|
113 | else resolve();
|
114 | });
|
115 | });
|
116 | });
|
117 | }
|
118 |
|
119 | removeIndex(field) {
|
120 | return this.load().then(() => {
|
121 | return new Promise((resolve, reject) => {
|
122 | this.__original.removeIndex(field, (error) => {
|
123 | if (error)
|
124 | reject(error);
|
125 | else resolve();
|
126 | });
|
127 | });
|
128 | });
|
129 | }
|
130 |
|
131 | static create(options) {
|
132 | return new Proxy(new this(options), {
|
133 | get(target, key) {
|
134 | if (target[key]) {
|
135 | return target[key];
|
136 | }
|
137 |
|
138 | return target.__original[key];
|
139 | },
|
140 |
|
141 | set(target, key, value) {
|
142 | if (target.__original.hasOwnProperty(key)) {
|
143 | target.__original[key] = value;
|
144 | return true;
|
145 | }
|
146 |
|
147 | target[key] = value;
|
148 |
|
149 | return true;
|
150 | }
|
151 | });
|
152 | }
|
153 | }
|
154 |
|
155 | module.exports = Datastore; |
\ | No newline at end of file |