Skip to content

Commit 471aa78

Browse files
committed
New Version 1.5.0
1 parent 1d39f42 commit 471aa78

11 files changed

Lines changed: 702 additions & 30 deletions

File tree

README.md

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717
</p>
1818
</div>
1919

20-
## New version 1.4.0!
21-
- **setAdapter** function fixed!
22-
- **find** function added!
23-
- **type** function updated!
20+
## New version 1.5.0!
21+
- **findAndUpdate** function added!
22+
- **findAndDelete** function added!
23+
- **findOneAndUpdate** function added!
24+
- **findOneAndDelete** function added!
25+
- Added language support for bugs in find functions.
2426

2527
## About
2628
- **Designed for Beginners:** The mzrdb module simplifies working with databases for new programmers. It provides an intuitive key-value interface, making data storage and retrieval a breeze.
@@ -97,11 +99,17 @@ await db.unpush('key', 'value') // ["mzr"]
9799
await db.push('key', { mzr: 'value' }) // [ { mzr: "value" }]
98100
await db.push('key', { mzr2: 'value2' }) // [ { mzr: "value" }, { mzr2: "value2" } ]
99101

100-
await db.find('key', { mzr: 'value' }) // [ { mzr: "value" } ]
101-
102102
await db.delByPriority('key', 1) // [ { mzr2: "value2" } ]
103103
await db.setByPriority('key', { new2: 'This Edited!' }, 1) // [ { new2: "This Edited!" } ]
104104

105+
await db.find('key', { mzr: 'value' }) // [ { mzr: "value" } ]
106+
107+
await db.findAndUpdate('key', { mzr: 'value' }, { mzr: 'value2' }) // [ { old: { mzr: "value" }, new: { mzr: "value2" } } ]
108+
await db.findAndDelete('key', { mzr: 'value' }) // [ { mzr: 'value' } ]
109+
110+
await db.findOneAndUpdate('key', { mzr: 'value' }) // { old: { mzr: "value" }, new: { mzr: "value2" } }
111+
await db.findOneAndDelete('key', { mzr: 'value' }) // { mzr: "value" }
112+
105113
await db.type('key') // string
106114
await db.has('key') // true
107115
await db.check('key') // true
@@ -126,9 +134,9 @@ await db.export('fileName') // true (Highly advanced)
126134

127135
await db.length() // 20 (Character count)
128136

129-
db.ping // { read: '1ms', write: '3ms', average: '2ms' }
137+
db.ping // { read: "1ms", write: "2ms", average: "1.5ms" }
130138
db.size // 11 Bytes (Database size)
131-
db.version // 1.2.0 (Module version)
139+
db.version // 1.5.0 (Module version)
132140
```
133141

134142
## All Local Adapter Methods
@@ -169,11 +177,17 @@ db.unpush('key', 'value') // ["mzr"]
169177
db.push('key', { mzr: 'value' }) // [ { mzr: "value" }]
170178
db.push('key', { mzr2: 'value2' }) // [ { mzr: "value" }, { mzr2: "value2" } ]
171179

172-
db.find('key', { mzr: 'value' }) // [ { mzr: "value" } ]
173-
174180
db.delByPriority('key', 1) // [ { mzr2: "value2" } ]
175181
db.setByPriority('key', { new2: 'This Edited!' }, 1) // [ { new2: "This Edited!" } ]
176182

183+
db.find('key', { mzr: 'value' }) // [ { mzr: "value" } ]
184+
185+
db.findAndUpdate('key', { mzr: 'value' }, { mzr: 'value2' }) // [ { old: { mzr: "value" }, new: { mzr: "value2" } } ]
186+
db.findAndDelete('key', { mzr: 'value' }) // [ { mzr: 'value' } ]
187+
188+
db.findOneAndUpdate('key', { mzr: 'value' }) // { old: { mzr: "value" }, new: { mzr: "value2" } }
189+
db.findOneAndDelete('key', { mzr: 'value' }) // { mzr: "value" }
190+
177191
db.type('key') // string
178192
db.has('key') // true
179193
db.check('key') // true
@@ -197,7 +211,7 @@ db.length() // 20 (Character count)
197211

198212
db.ping // { read: "1ms", write: "2ms", average: "1.5ms" }
199213
db.size // 11 Bytes (Database size)
200-
db.version // 1.2.0 (Module version)
214+
db.version // 1.5.0 (Module version)
201215
```
202216

203217
## Contact & Support

adapters/bsondb.js

Lines changed: 141 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class BsonDB {
99
this.noBlankData = options['noBlankData'] ? (typeof options['noBlankData'] === 'boolean' ? options['noBlankData'] : false) : false;
1010
this.readable = options['readable'] ? (typeof options['readable'] === 'boolean' ? true : false) : false;
1111
this.seperator = options['seperator'];
12+
this.message = options['message'];
1213

1314
try {
1415
bson = require('bson');
@@ -378,18 +379,155 @@ class BsonDB {
378379

379380
find(key, query) {
380381
if (typeof key !== 'string' || key.trim() === '') {
381-
throw new TypeError('Key must be a non-empty string.');
382+
throw new TypeError(this.message['errors']['nonEmptyString']);
382383
};
383384

384385
if (typeof query !== 'object' || query === null) {
385-
throw new TypeError('Query must be an object.');
386+
throw new TypeError(this.message['errors']['queryMustObjects']);
386387
};
387388

388389
const data = this.get(key) || [];
389-
if (!Array.isArray(data)) throw new Error('Data must be an array.');
390+
if (!Array.isArray(data)) throw new Error(this.message['errors']['dataMustArray']);
390391

391392
return data.filter(doc => Object.keys(query).every(queryKey => queryKey in doc && doc[queryKey] === query[queryKey])) || [];
392393
}
394+
395+
findAndUpdate(key, query, update) {
396+
if (typeof key !== 'string' || key.trim() === '') {
397+
throw new TypeError(this.message['errors']['nonEmptyString']);
398+
};
399+
400+
if (typeof query !== 'object' || query === null) {
401+
throw new TypeError(this.message['errors']['queryMustObjects']);
402+
};
403+
404+
if (typeof update !== 'object' || update === null) {
405+
throw new TypeError(this.message['errors']['updateMustObjects']);
406+
};
407+
408+
const data = this.get(key) || [];
409+
if (!Array.isArray(data)) throw new Error(this.message['errors']['dataMustArray']);
410+
411+
const updatedDocs = data.map(doc => {
412+
const matches = Object.keys(query).every(queryKey => queryKey in doc && doc[queryKey] === query[queryKey]);
413+
if (matches) {
414+
const oldDoc = { ...doc };
415+
const newDoc = { ...oldDoc, ...update };
416+
417+
return { old: oldDoc, new: newDoc };
418+
};
419+
420+
return null;
421+
}).filter(doc => doc !== null);
422+
423+
if (updatedDocs.length > 0) {
424+
this.set(key, data.map(doc => {
425+
const matchingUpdate = updatedDocs.find(updatedDoc =>
426+
Object.keys(query).every(queryKey => queryKey in doc && doc[queryKey] === query[queryKey])
427+
);
428+
429+
return matchingUpdate ? matchingUpdate.new : doc;
430+
}));
431+
};
432+
433+
return updatedDocs;
434+
}
435+
436+
findAndDelete(key, query) {
437+
if (typeof key !== 'string' || key.trim() === '') {
438+
throw new TypeError(this.message['errors']['nonEmptyString']);
439+
};
440+
441+
if (typeof query !== 'object' || query === null) {
442+
throw new TypeError(this.message['errors']['queryMustObjects']);
443+
};
444+
445+
const data = this.get(key) || [];
446+
if (!Array.isArray(data)) throw new Error(this.message['errors']['dataMustArray']);
447+
448+
const deletedDocs = data.filter(doc =>
449+
Object.keys(query).every(queryKey => queryKey in doc && doc[queryKey] === query[queryKey])
450+
);
451+
452+
const updatedData = data.filter(doc => !deletedDocs.includes(doc));
453+
454+
this.set(key, updatedData);
455+
456+
return deletedDocs;
457+
}
458+
459+
findOneAndUpdate(key, query, update) {
460+
if (typeof key !== 'string' || key.trim() === '') {
461+
throw new TypeError(this.message['errors']['nonEmptyString']);
462+
};
463+
464+
if (typeof query !== 'object' || query === null) {
465+
throw new TypeError(this.message['errors']['queryMustObjects']);
466+
};
467+
468+
if (typeof update !== 'object' || update === null) {
469+
throw new TypeError(this.message['errors']['updateMustObjects']);
470+
};
471+
472+
const data = this.get(key) || [];
473+
if (!Array.isArray(data)) throw new Error(this.message['errors']['dataMustArray']);
474+
475+
let oldDoc = null;
476+
let newDoc = null;
477+
478+
const updatedData = data.map(doc => {
479+
const matches = Object.keys(query).every(queryKey => queryKey in doc && doc[queryKey] === query[queryKey]);
480+
481+
if (matches) {
482+
oldDoc = { ...doc };
483+
newDoc = { ...doc, ...update };
484+
485+
return newDoc;
486+
};
487+
488+
return doc;
489+
});
490+
491+
if (oldDoc && newDoc) {
492+
this.set(key, updatedData);
493+
return { old: oldDoc, new: newDoc };
494+
} else {
495+
throw new Error(this.message['errors']['noDocMatchedQuery']);
496+
};
497+
}
498+
499+
findOneAndDelete(key, query) {
500+
if (typeof key !== 'string' || key.trim() === '') {
501+
throw new TypeError(this.message['errors']['nonEmptyString']);
502+
};
503+
504+
if (typeof query !== 'object' || query === null) {
505+
throw new TypeError(this.message['errors']['queryMustObjects']);
506+
};
507+
508+
const data = this.get(key) || [];
509+
if (!Array.isArray(data)) throw new Error(this.message['errors']['dataMustArray']);
510+
511+
let deletedDoc = null;
512+
513+
const updatedData = data.filter(doc => {
514+
const matches = Object.keys(query).every(queryKey => queryKey in doc && doc[queryKey] === query[queryKey]);
515+
if (matches) {
516+
deletedDoc = { ...doc };
517+
518+
return false;
519+
};
520+
521+
return true;
522+
});
523+
524+
if (deletedDoc) {
525+
this.set(key, updatedData);
526+
return deletedDoc;
527+
} else {
528+
throw new Error(this.message['errors']['noDocMatchedQuery']);
529+
};
530+
}
393531
}
394532

395533
module.exports = BsonDB;

0 commit comments

Comments
 (0)