@push.rocks/smartdb 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.smartconfig.json +38 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/index.d.ts +5 -0
- package/dist_ts/index.js +8 -0
- package/dist_ts/ts_local/classes.localsmartdb.d.ts +78 -0
- package/dist_ts/ts_local/classes.localsmartdb.js +115 -0
- package/dist_ts/ts_local/index.d.ts +2 -0
- package/dist_ts/ts_local/index.js +2 -0
- package/dist_ts/ts_local/plugins.d.ts +2 -0
- package/dist_ts/ts_local/plugins.js +3 -0
- package/dist_ts/ts_smartdb/engine/AggregationEngine.d.ts +66 -0
- package/dist_ts/ts_smartdb/engine/AggregationEngine.js +189 -0
- package/dist_ts/ts_smartdb/engine/IndexEngine.d.ts +97 -0
- package/dist_ts/ts_smartdb/engine/IndexEngine.js +678 -0
- package/dist_ts/ts_smartdb/engine/QueryEngine.d.ts +54 -0
- package/dist_ts/ts_smartdb/engine/QueryEngine.js +271 -0
- package/dist_ts/ts_smartdb/engine/QueryPlanner.d.ts +64 -0
- package/dist_ts/ts_smartdb/engine/QueryPlanner.js +308 -0
- package/dist_ts/ts_smartdb/engine/SessionEngine.d.ts +117 -0
- package/dist_ts/ts_smartdb/engine/SessionEngine.js +232 -0
- package/dist_ts/ts_smartdb/engine/TransactionEngine.d.ts +85 -0
- package/dist_ts/ts_smartdb/engine/TransactionEngine.js +287 -0
- package/dist_ts/ts_smartdb/engine/UpdateEngine.d.ts +47 -0
- package/dist_ts/ts_smartdb/engine/UpdateEngine.js +461 -0
- package/dist_ts/ts_smartdb/errors/SmartdbErrors.d.ts +100 -0
- package/dist_ts/ts_smartdb/errors/SmartdbErrors.js +155 -0
- package/dist_ts/ts_smartdb/index.d.ts +26 -0
- package/dist_ts/ts_smartdb/index.js +31 -0
- package/dist_ts/ts_smartdb/plugins.d.ts +10 -0
- package/dist_ts/ts_smartdb/plugins.js +14 -0
- package/dist_ts/ts_smartdb/server/CommandRouter.d.ts +87 -0
- package/dist_ts/ts_smartdb/server/CommandRouter.js +222 -0
- package/dist_ts/ts_smartdb/server/SmartdbServer.d.ts +102 -0
- package/dist_ts/ts_smartdb/server/SmartdbServer.js +279 -0
- package/dist_ts/ts_smartdb/server/WireProtocol.d.ts +117 -0
- package/dist_ts/ts_smartdb/server/WireProtocol.js +298 -0
- package/dist_ts/ts_smartdb/server/handlers/AdminHandler.d.ts +100 -0
- package/dist_ts/ts_smartdb/server/handlers/AdminHandler.js +668 -0
- package/dist_ts/ts_smartdb/server/handlers/AggregateHandler.d.ts +31 -0
- package/dist_ts/ts_smartdb/server/handlers/AggregateHandler.js +277 -0
- package/dist_ts/ts_smartdb/server/handlers/DeleteHandler.d.ts +8 -0
- package/dist_ts/ts_smartdb/server/handlers/DeleteHandler.js +95 -0
- package/dist_ts/ts_smartdb/server/handlers/FindHandler.d.ts +31 -0
- package/dist_ts/ts_smartdb/server/handlers/FindHandler.js +291 -0
- package/dist_ts/ts_smartdb/server/handlers/HelloHandler.d.ts +11 -0
- package/dist_ts/ts_smartdb/server/handlers/HelloHandler.js +62 -0
- package/dist_ts/ts_smartdb/server/handlers/IndexHandler.d.ts +20 -0
- package/dist_ts/ts_smartdb/server/handlers/IndexHandler.js +183 -0
- package/dist_ts/ts_smartdb/server/handlers/InsertHandler.d.ts +8 -0
- package/dist_ts/ts_smartdb/server/handlers/InsertHandler.js +79 -0
- package/dist_ts/ts_smartdb/server/handlers/UpdateHandler.d.ts +24 -0
- package/dist_ts/ts_smartdb/server/handlers/UpdateHandler.js +296 -0
- package/dist_ts/ts_smartdb/server/handlers/index.d.ts +8 -0
- package/dist_ts/ts_smartdb/server/handlers/index.js +10 -0
- package/dist_ts/ts_smartdb/server/index.d.ts +6 -0
- package/dist_ts/ts_smartdb/server/index.js +7 -0
- package/dist_ts/ts_smartdb/storage/FileStorageAdapter.d.ts +85 -0
- package/dist_ts/ts_smartdb/storage/FileStorageAdapter.js +465 -0
- package/dist_ts/ts_smartdb/storage/IStorageAdapter.d.ts +145 -0
- package/dist_ts/ts_smartdb/storage/IStorageAdapter.js +2 -0
- package/dist_ts/ts_smartdb/storage/MemoryStorageAdapter.d.ts +67 -0
- package/dist_ts/ts_smartdb/storage/MemoryStorageAdapter.js +378 -0
- package/dist_ts/ts_smartdb/storage/OpLog.d.ts +93 -0
- package/dist_ts/ts_smartdb/storage/OpLog.js +221 -0
- package/dist_ts/ts_smartdb/storage/WAL.d.ts +117 -0
- package/dist_ts/ts_smartdb/storage/WAL.js +286 -0
- package/dist_ts/ts_smartdb/types/interfaces.d.ts +363 -0
- package/dist_ts/ts_smartdb/types/interfaces.js +2 -0
- package/dist_ts/ts_smartdb/utils/checksum.d.ts +30 -0
- package/dist_ts/ts_smartdb/utils/checksum.js +77 -0
- package/dist_ts/ts_smartdb/utils/index.d.ts +1 -0
- package/dist_ts/ts_smartdb/utils/index.js +2 -0
- package/license +19 -0
- package/package.json +69 -0
- package/readme.md +529 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/index.ts +11 -0
- package/ts/ts_local/classes.localsmartdb.ts +143 -0
- package/ts/ts_local/index.ts +2 -0
- package/ts/ts_local/plugins.ts +3 -0
- package/ts/ts_smartdb/engine/AggregationEngine.ts +283 -0
- package/ts/ts_smartdb/engine/IndexEngine.ts +798 -0
- package/ts/ts_smartdb/engine/QueryEngine.ts +301 -0
- package/ts/ts_smartdb/engine/QueryPlanner.ts +393 -0
- package/ts/ts_smartdb/engine/SessionEngine.ts +292 -0
- package/ts/ts_smartdb/engine/TransactionEngine.ts +351 -0
- package/ts/ts_smartdb/engine/UpdateEngine.ts +506 -0
- package/ts/ts_smartdb/errors/SmartdbErrors.ts +181 -0
- package/ts/ts_smartdb/index.ts +46 -0
- package/ts/ts_smartdb/plugins.ts +17 -0
- package/ts/ts_smartdb/server/CommandRouter.ts +289 -0
- package/ts/ts_smartdb/server/SmartdbServer.ts +354 -0
- package/ts/ts_smartdb/server/WireProtocol.ts +416 -0
- package/ts/ts_smartdb/server/handlers/AdminHandler.ts +719 -0
- package/ts/ts_smartdb/server/handlers/AggregateHandler.ts +342 -0
- package/ts/ts_smartdb/server/handlers/DeleteHandler.ts +115 -0
- package/ts/ts_smartdb/server/handlers/FindHandler.ts +330 -0
- package/ts/ts_smartdb/server/handlers/HelloHandler.ts +78 -0
- package/ts/ts_smartdb/server/handlers/IndexHandler.ts +207 -0
- package/ts/ts_smartdb/server/handlers/InsertHandler.ts +97 -0
- package/ts/ts_smartdb/server/handlers/UpdateHandler.ts +344 -0
- package/ts/ts_smartdb/server/handlers/index.ts +10 -0
- package/ts/ts_smartdb/server/index.ts +10 -0
- package/ts/ts_smartdb/storage/FileStorageAdapter.ts +562 -0
- package/ts/ts_smartdb/storage/IStorageAdapter.ts +208 -0
- package/ts/ts_smartdb/storage/MemoryStorageAdapter.ts +455 -0
- package/ts/ts_smartdb/storage/OpLog.ts +282 -0
- package/ts/ts_smartdb/storage/WAL.ts +375 -0
- package/ts/ts_smartdb/types/interfaces.ts +433 -0
- package/ts/ts_smartdb/utils/checksum.ts +88 -0
- package/ts/ts_smartdb/utils/index.ts +1 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* InsertHandler - Handles insert commands
|
|
4
|
+
*/
|
|
5
|
+
export class InsertHandler {
|
|
6
|
+
async handle(context) {
|
|
7
|
+
const { storage, database, command, documentSequences } = context;
|
|
8
|
+
const collection = command.insert;
|
|
9
|
+
if (typeof collection !== 'string') {
|
|
10
|
+
return {
|
|
11
|
+
ok: 0,
|
|
12
|
+
errmsg: 'insert command requires a collection name',
|
|
13
|
+
code: 2,
|
|
14
|
+
codeName: 'BadValue',
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
// Get documents from command or document sequences
|
|
18
|
+
let documents = command.documents || [];
|
|
19
|
+
// Check for OP_MSG document sequences (for bulk inserts)
|
|
20
|
+
if (documentSequences && documentSequences.has('documents')) {
|
|
21
|
+
documents = documentSequences.get('documents');
|
|
22
|
+
}
|
|
23
|
+
if (!Array.isArray(documents) || documents.length === 0) {
|
|
24
|
+
return {
|
|
25
|
+
ok: 0,
|
|
26
|
+
errmsg: 'insert command requires documents array',
|
|
27
|
+
code: 2,
|
|
28
|
+
codeName: 'BadValue',
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const ordered = command.ordered !== false;
|
|
32
|
+
const writeErrors = [];
|
|
33
|
+
let insertedCount = 0;
|
|
34
|
+
// Ensure collection exists
|
|
35
|
+
await storage.createCollection(database, collection);
|
|
36
|
+
const indexEngine = context.getIndexEngine(collection);
|
|
37
|
+
// Insert documents
|
|
38
|
+
for (let i = 0; i < documents.length; i++) {
|
|
39
|
+
const doc = documents[i];
|
|
40
|
+
try {
|
|
41
|
+
// Ensure _id exists
|
|
42
|
+
if (!doc._id) {
|
|
43
|
+
doc._id = new plugins.bson.ObjectId();
|
|
44
|
+
}
|
|
45
|
+
// Check index constraints before insert (doc now has _id)
|
|
46
|
+
await indexEngine.onInsert(doc);
|
|
47
|
+
await storage.insertOne(database, collection, doc);
|
|
48
|
+
insertedCount++;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
const writeError = {
|
|
52
|
+
index: i,
|
|
53
|
+
code: error.code || 11000,
|
|
54
|
+
errmsg: error.message || 'Insert failed',
|
|
55
|
+
};
|
|
56
|
+
// Check for duplicate key error
|
|
57
|
+
if (error.message?.includes('Duplicate key')) {
|
|
58
|
+
writeError.code = 11000;
|
|
59
|
+
writeError.keyPattern = { _id: 1 };
|
|
60
|
+
writeError.keyValue = { _id: doc._id };
|
|
61
|
+
}
|
|
62
|
+
writeErrors.push(writeError);
|
|
63
|
+
if (ordered) {
|
|
64
|
+
// Stop on first error for ordered inserts
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const response = {
|
|
70
|
+
ok: 1,
|
|
71
|
+
n: insertedCount,
|
|
72
|
+
};
|
|
73
|
+
if (writeErrors.length > 0) {
|
|
74
|
+
response.writeErrors = writeErrors;
|
|
75
|
+
}
|
|
76
|
+
return response;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5zZXJ0SGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL3RzX3NtYXJ0ZGIvc2VydmVyL2hhbmRsZXJzL0luc2VydEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUk1Qzs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBQ3hCLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBd0I7UUFDbkMsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRWxFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDbEMsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxPQUFPO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLE1BQU0sRUFBRSwyQ0FBMkM7Z0JBQ25ELElBQUksRUFBRSxDQUFDO2dCQUNQLFFBQVEsRUFBRSxVQUFVO2FBQ3JCLENBQUM7UUFDSixDQUFDO1FBRUQsbURBQW1EO1FBQ25ELElBQUksU0FBUyxHQUE0QixPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUVqRSx5REFBeUQ7UUFDekQsSUFBSSxpQkFBaUIsSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxTQUFTLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBRSxDQUFDO1FBQ2xELENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hELE9BQU87Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsTUFBTSxFQUFFLHlDQUF5QztnQkFDakQsSUFBSSxFQUFFLENBQUM7Z0JBQ1AsUUFBUSxFQUFFLFVBQVU7YUFDckIsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQztRQUMxQyxNQUFNLFdBQVcsR0FBNEIsRUFBRSxDQUFDO1FBQ2hELElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztRQUV0QiwyQkFBMkI7UUFDM0IsTUFBTSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXJELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFdkQsbUJBQW1CO1FBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUMsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXpCLElBQUksQ0FBQztnQkFDSCxvQkFBb0I7Z0JBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ2IsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3hDLENBQUM7Z0JBRUQsMERBQTBEO2dCQUMxRCxNQUFNLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBc0IsQ0FBQyxDQUFDO2dCQUVuRCxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDbkQsYUFBYSxFQUFFLENBQUM7WUFDbEIsQ0FBQztZQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sVUFBVSxHQUEwQjtvQkFDeEMsS0FBSyxFQUFFLENBQUM7b0JBQ1IsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSztvQkFDekIsTUFBTSxFQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksZUFBZTtpQkFDekMsQ0FBQztnQkFFRixnQ0FBZ0M7Z0JBQ2hDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztvQkFDN0MsVUFBVSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7b0JBQ3hCLFVBQVUsQ0FBQyxVQUFVLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQ25DLFVBQVUsQ0FBQyxRQUFRLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUN6QyxDQUFDO2dCQUVELFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBRTdCLElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ1osMENBQTBDO29CQUMxQyxNQUFNO2dCQUNSLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUEwQjtZQUN0QyxFQUFFLEVBQUUsQ0FBQztZQUNMLENBQUMsRUFBRSxhQUFhO1NBQ2pCLENBQUM7UUFFRixJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0IsUUFBUSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDckMsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import type { ICommandHandler, IHandlerContext } from '../CommandRouter.js';
|
|
3
|
+
/**
|
|
4
|
+
* UpdateHandler - Handles update, findAndModify commands
|
|
5
|
+
*/
|
|
6
|
+
export declare class UpdateHandler implements ICommandHandler {
|
|
7
|
+
handle(context: IHandlerContext): Promise<plugins.bson.Document>;
|
|
8
|
+
/**
|
|
9
|
+
* Handle update command
|
|
10
|
+
*/
|
|
11
|
+
private handleUpdate;
|
|
12
|
+
/**
|
|
13
|
+
* Handle findAndModify command
|
|
14
|
+
*/
|
|
15
|
+
private handleFindAndModify;
|
|
16
|
+
/**
|
|
17
|
+
* Apply filter equality conditions to a new document (for upsert)
|
|
18
|
+
*/
|
|
19
|
+
private applyFilterToDoc;
|
|
20
|
+
/**
|
|
21
|
+
* Set a nested value using dot notation
|
|
22
|
+
*/
|
|
23
|
+
private setNestedValue;
|
|
24
|
+
}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import { QueryEngine } from '../../engine/QueryEngine.js';
|
|
3
|
+
import { UpdateEngine } from '../../engine/UpdateEngine.js';
|
|
4
|
+
/**
|
|
5
|
+
* UpdateHandler - Handles update, findAndModify commands
|
|
6
|
+
*/
|
|
7
|
+
export class UpdateHandler {
|
|
8
|
+
async handle(context) {
|
|
9
|
+
const { command } = context;
|
|
10
|
+
// Check findAndModify first since it also has an 'update' field
|
|
11
|
+
if (command.findAndModify) {
|
|
12
|
+
return this.handleFindAndModify(context);
|
|
13
|
+
}
|
|
14
|
+
else if (command.update && typeof command.update === 'string') {
|
|
15
|
+
// 'update' command has collection name as the value
|
|
16
|
+
return this.handleUpdate(context);
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
ok: 0,
|
|
20
|
+
errmsg: 'Unknown update-related command',
|
|
21
|
+
code: 59,
|
|
22
|
+
codeName: 'CommandNotFound',
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Handle update command
|
|
27
|
+
*/
|
|
28
|
+
async handleUpdate(context) {
|
|
29
|
+
const { storage, database, command, documentSequences } = context;
|
|
30
|
+
const collection = command.update;
|
|
31
|
+
if (typeof collection !== 'string') {
|
|
32
|
+
return {
|
|
33
|
+
ok: 0,
|
|
34
|
+
errmsg: 'update command requires a collection name',
|
|
35
|
+
code: 2,
|
|
36
|
+
codeName: 'BadValue',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// Get updates from command or document sequences
|
|
40
|
+
let updates = command.updates || [];
|
|
41
|
+
// Check for OP_MSG document sequences
|
|
42
|
+
if (documentSequences && documentSequences.has('updates')) {
|
|
43
|
+
updates = documentSequences.get('updates');
|
|
44
|
+
}
|
|
45
|
+
if (!Array.isArray(updates) || updates.length === 0) {
|
|
46
|
+
return {
|
|
47
|
+
ok: 0,
|
|
48
|
+
errmsg: 'update command requires updates array',
|
|
49
|
+
code: 2,
|
|
50
|
+
codeName: 'BadValue',
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const ordered = command.ordered !== false;
|
|
54
|
+
const writeErrors = [];
|
|
55
|
+
let totalMatched = 0;
|
|
56
|
+
let totalModified = 0;
|
|
57
|
+
let totalUpserted = 0;
|
|
58
|
+
const upserted = [];
|
|
59
|
+
// Ensure collection exists
|
|
60
|
+
await storage.createCollection(database, collection);
|
|
61
|
+
const indexEngine = context.getIndexEngine(collection);
|
|
62
|
+
for (let i = 0; i < updates.length; i++) {
|
|
63
|
+
const updateSpec = updates[i];
|
|
64
|
+
const filter = updateSpec.q || updateSpec.filter || {};
|
|
65
|
+
const update = updateSpec.u || updateSpec.update || {};
|
|
66
|
+
const multi = updateSpec.multi || false;
|
|
67
|
+
const upsert = updateSpec.upsert || false;
|
|
68
|
+
const arrayFilters = updateSpec.arrayFilters;
|
|
69
|
+
try {
|
|
70
|
+
// Try to use index-accelerated query
|
|
71
|
+
const candidateIds = await indexEngine.findCandidateIds(filter);
|
|
72
|
+
let documents;
|
|
73
|
+
if (candidateIds !== null) {
|
|
74
|
+
documents = await storage.findByIds(database, collection, candidateIds);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
documents = await storage.findAll(database, collection);
|
|
78
|
+
}
|
|
79
|
+
// Apply filter
|
|
80
|
+
let matchingDocs = QueryEngine.filter(documents, filter);
|
|
81
|
+
if (matchingDocs.length === 0 && upsert) {
|
|
82
|
+
// Upsert: create new document
|
|
83
|
+
const newDoc = { _id: new plugins.bson.ObjectId() };
|
|
84
|
+
// Apply filter fields to the new document
|
|
85
|
+
this.applyFilterToDoc(newDoc, filter);
|
|
86
|
+
// Apply update
|
|
87
|
+
const updatedDoc = UpdateEngine.applyUpdate(newDoc, update, arrayFilters);
|
|
88
|
+
// Handle $setOnInsert
|
|
89
|
+
if (update.$setOnInsert) {
|
|
90
|
+
Object.assign(updatedDoc, update.$setOnInsert);
|
|
91
|
+
}
|
|
92
|
+
// Update index for the new document
|
|
93
|
+
await indexEngine.onInsert(updatedDoc);
|
|
94
|
+
await storage.insertOne(database, collection, updatedDoc);
|
|
95
|
+
totalUpserted++;
|
|
96
|
+
upserted.push({ index: i, _id: updatedDoc._id });
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// Update existing documents
|
|
100
|
+
const docsToUpdate = multi ? matchingDocs : matchingDocs.slice(0, 1);
|
|
101
|
+
totalMatched += docsToUpdate.length;
|
|
102
|
+
for (const doc of docsToUpdate) {
|
|
103
|
+
const updatedDoc = UpdateEngine.applyUpdate(doc, update, arrayFilters);
|
|
104
|
+
// Check if document actually changed
|
|
105
|
+
const changed = JSON.stringify(doc) !== JSON.stringify(updatedDoc);
|
|
106
|
+
if (changed) {
|
|
107
|
+
// Update index
|
|
108
|
+
await indexEngine.onUpdate(doc, updatedDoc);
|
|
109
|
+
await storage.updateById(database, collection, doc._id, updatedDoc);
|
|
110
|
+
totalModified++;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
writeErrors.push({
|
|
117
|
+
index: i,
|
|
118
|
+
code: error.code || 1,
|
|
119
|
+
errmsg: error.message || 'Update failed',
|
|
120
|
+
});
|
|
121
|
+
if (ordered) {
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const response = {
|
|
127
|
+
ok: 1,
|
|
128
|
+
n: totalMatched + totalUpserted,
|
|
129
|
+
nModified: totalModified,
|
|
130
|
+
};
|
|
131
|
+
if (upserted.length > 0) {
|
|
132
|
+
response.upserted = upserted;
|
|
133
|
+
}
|
|
134
|
+
if (writeErrors.length > 0) {
|
|
135
|
+
response.writeErrors = writeErrors;
|
|
136
|
+
}
|
|
137
|
+
return response;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Handle findAndModify command
|
|
141
|
+
*/
|
|
142
|
+
async handleFindAndModify(context) {
|
|
143
|
+
const { storage, database, command } = context;
|
|
144
|
+
const collection = command.findAndModify;
|
|
145
|
+
const query = command.query || {};
|
|
146
|
+
const update = command.update;
|
|
147
|
+
const remove = command.remove || false;
|
|
148
|
+
const returnNew = command.new || false;
|
|
149
|
+
const upsert = command.upsert || false;
|
|
150
|
+
const sort = command.sort;
|
|
151
|
+
const fields = command.fields;
|
|
152
|
+
const arrayFilters = command.arrayFilters;
|
|
153
|
+
// Validate - either update or remove, not both
|
|
154
|
+
if (update && remove) {
|
|
155
|
+
return {
|
|
156
|
+
ok: 0,
|
|
157
|
+
errmsg: 'cannot specify both update and remove',
|
|
158
|
+
code: 2,
|
|
159
|
+
codeName: 'BadValue',
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
if (!update && !remove) {
|
|
163
|
+
return {
|
|
164
|
+
ok: 0,
|
|
165
|
+
errmsg: 'either update or remove is required',
|
|
166
|
+
code: 2,
|
|
167
|
+
codeName: 'BadValue',
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
// Ensure collection exists
|
|
171
|
+
await storage.createCollection(database, collection);
|
|
172
|
+
// Try to use index-accelerated query
|
|
173
|
+
const indexEngine = context.getIndexEngine(collection);
|
|
174
|
+
const candidateIds = await indexEngine.findCandidateIds(query);
|
|
175
|
+
let documents;
|
|
176
|
+
if (candidateIds !== null) {
|
|
177
|
+
documents = await storage.findByIds(database, collection, candidateIds);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
documents = await storage.findAll(database, collection);
|
|
181
|
+
}
|
|
182
|
+
let matchingDocs = QueryEngine.filter(documents, query);
|
|
183
|
+
// Apply sort if specified
|
|
184
|
+
if (sort) {
|
|
185
|
+
matchingDocs = QueryEngine.sort(matchingDocs, sort);
|
|
186
|
+
}
|
|
187
|
+
const doc = matchingDocs[0];
|
|
188
|
+
if (remove) {
|
|
189
|
+
// Delete operation
|
|
190
|
+
if (!doc) {
|
|
191
|
+
return { ok: 1, value: null };
|
|
192
|
+
}
|
|
193
|
+
// Update index for delete
|
|
194
|
+
await indexEngine.onDelete(doc);
|
|
195
|
+
await storage.deleteById(database, collection, doc._id);
|
|
196
|
+
let result = doc;
|
|
197
|
+
if (fields) {
|
|
198
|
+
result = QueryEngine.project([doc], fields)[0];
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
ok: 1,
|
|
202
|
+
value: result,
|
|
203
|
+
lastErrorObject: {
|
|
204
|
+
n: 1,
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
// Update operation
|
|
210
|
+
if (!doc && !upsert) {
|
|
211
|
+
return { ok: 1, value: null };
|
|
212
|
+
}
|
|
213
|
+
let resultDoc;
|
|
214
|
+
let originalDoc = null;
|
|
215
|
+
let isUpsert = false;
|
|
216
|
+
if (doc) {
|
|
217
|
+
// Update existing
|
|
218
|
+
originalDoc = { ...doc };
|
|
219
|
+
resultDoc = UpdateEngine.applyUpdate(doc, update, arrayFilters);
|
|
220
|
+
// Update index
|
|
221
|
+
await indexEngine.onUpdate(doc, resultDoc);
|
|
222
|
+
await storage.updateById(database, collection, doc._id, resultDoc);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
// Upsert
|
|
226
|
+
isUpsert = true;
|
|
227
|
+
const newDoc = { _id: new plugins.bson.ObjectId() };
|
|
228
|
+
this.applyFilterToDoc(newDoc, query);
|
|
229
|
+
resultDoc = UpdateEngine.applyUpdate(newDoc, update, arrayFilters);
|
|
230
|
+
if (update.$setOnInsert) {
|
|
231
|
+
Object.assign(resultDoc, update.$setOnInsert);
|
|
232
|
+
}
|
|
233
|
+
// Update index for insert
|
|
234
|
+
await indexEngine.onInsert(resultDoc);
|
|
235
|
+
await storage.insertOne(database, collection, resultDoc);
|
|
236
|
+
}
|
|
237
|
+
// Apply projection
|
|
238
|
+
let returnValue = returnNew ? resultDoc : (originalDoc || null);
|
|
239
|
+
if (returnValue && fields) {
|
|
240
|
+
returnValue = QueryEngine.project([returnValue], fields)[0];
|
|
241
|
+
}
|
|
242
|
+
const response = {
|
|
243
|
+
ok: 1,
|
|
244
|
+
value: returnValue,
|
|
245
|
+
lastErrorObject: {
|
|
246
|
+
n: 1,
|
|
247
|
+
updatedExisting: !isUpsert && doc !== undefined,
|
|
248
|
+
},
|
|
249
|
+
};
|
|
250
|
+
if (isUpsert) {
|
|
251
|
+
response.lastErrorObject.upserted = resultDoc._id;
|
|
252
|
+
}
|
|
253
|
+
return response;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Apply filter equality conditions to a new document (for upsert)
|
|
258
|
+
*/
|
|
259
|
+
applyFilterToDoc(doc, filter) {
|
|
260
|
+
for (const [key, value] of Object.entries(filter)) {
|
|
261
|
+
// Skip operators
|
|
262
|
+
if (key.startsWith('$'))
|
|
263
|
+
continue;
|
|
264
|
+
// Handle nested paths
|
|
265
|
+
if (typeof value === 'object' && value !== null) {
|
|
266
|
+
// Check if it's an operator
|
|
267
|
+
const valueKeys = Object.keys(value);
|
|
268
|
+
if (valueKeys.some(k => k.startsWith('$'))) {
|
|
269
|
+
// Extract equality value from $eq if present
|
|
270
|
+
if ('$eq' in value) {
|
|
271
|
+
this.setNestedValue(doc, key, value.$eq);
|
|
272
|
+
}
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// Direct value assignment
|
|
277
|
+
this.setNestedValue(doc, key, value);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Set a nested value using dot notation
|
|
282
|
+
*/
|
|
283
|
+
setNestedValue(obj, path, value) {
|
|
284
|
+
const parts = path.split('.');
|
|
285
|
+
let current = obj;
|
|
286
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
287
|
+
const part = parts[i];
|
|
288
|
+
if (!(part in current)) {
|
|
289
|
+
current[part] = {};
|
|
290
|
+
}
|
|
291
|
+
current = current[part];
|
|
292
|
+
}
|
|
293
|
+
current[parts[parts.length - 1]] = value;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXBkYXRlSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL3RzX3NtYXJ0ZGIvc2VydmVyL2hhbmRsZXJzL1VwZGF0ZUhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUc1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFDeEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUF3QjtRQUNuQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRTVCLGdFQUFnRTtRQUNoRSxJQUFJLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQyxDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sT0FBTyxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNoRSxvREFBb0Q7WUFDcEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxPQUFPO1lBQ0wsRUFBRSxFQUFFLENBQUM7WUFDTCxNQUFNLEVBQUUsZ0NBQWdDO1lBQ3hDLElBQUksRUFBRSxFQUFFO1lBQ1IsUUFBUSxFQUFFLGlCQUFpQjtTQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUF3QjtRQUNqRCxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFbEUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztR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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { HelloHandler } from './HelloHandler.js';
|
|
2
|
+
export { InsertHandler } from './InsertHandler.js';
|
|
3
|
+
export { FindHandler } from './FindHandler.js';
|
|
4
|
+
export { UpdateHandler } from './UpdateHandler.js';
|
|
5
|
+
export { DeleteHandler } from './DeleteHandler.js';
|
|
6
|
+
export { AggregateHandler } from './AggregateHandler.js';
|
|
7
|
+
export { IndexHandler } from './IndexHandler.js';
|
|
8
|
+
export { AdminHandler } from './AdminHandler.js';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Export all command handlers
|
|
2
|
+
export { HelloHandler } from './HelloHandler.js';
|
|
3
|
+
export { InsertHandler } from './InsertHandler.js';
|
|
4
|
+
export { FindHandler } from './FindHandler.js';
|
|
5
|
+
export { UpdateHandler } from './UpdateHandler.js';
|
|
6
|
+
export { DeleteHandler } from './DeleteHandler.js';
|
|
7
|
+
export { AggregateHandler } from './AggregateHandler.js';
|
|
8
|
+
export { IndexHandler } from './IndexHandler.js';
|
|
9
|
+
export { AdminHandler } from './AdminHandler.js';
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy90c19zbWFydGRiL3NlcnZlci9oYW5kbGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4QkFBOEI7QUFFOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDIn0=
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { SmartdbServer } from './SmartdbServer.js';
|
|
2
|
+
export type { ISmartdbServerOptions } from './SmartdbServer.js';
|
|
3
|
+
export { WireProtocol } from './WireProtocol.js';
|
|
4
|
+
export { CommandRouter } from './CommandRouter.js';
|
|
5
|
+
export type { ICommandHandler, IHandlerContext, ICursorState } from './CommandRouter.js';
|
|
6
|
+
export * from './handlers/index.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Server module exports
|
|
2
|
+
export { SmartdbServer } from './SmartdbServer.js';
|
|
3
|
+
export { WireProtocol } from './WireProtocol.js';
|
|
4
|
+
export { CommandRouter } from './CommandRouter.js';
|
|
5
|
+
// Export handlers
|
|
6
|
+
export * from './handlers/index.js';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy90c19zbWFydGRiL3NlcnZlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3QkFBd0I7QUFFeEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsa0JBQWtCO0FBQ2xCLGNBQWMscUJBQXFCLENBQUMifQ==
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import type { IStorageAdapter } from './IStorageAdapter.js';
|
|
3
|
+
import type { IStoredDocument, IOpLogEntry, Document } from '../types/interfaces.js';
|
|
4
|
+
/**
|
|
5
|
+
* File storage adapter options
|
|
6
|
+
*/
|
|
7
|
+
export interface IFileStorageAdapterOptions {
|
|
8
|
+
/** Enable checksum verification for data integrity */
|
|
9
|
+
enableChecksums?: boolean;
|
|
10
|
+
/** Throw error on checksum mismatch (default: false, just log warning) */
|
|
11
|
+
strictChecksums?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* File-based storage adapter for SmartDB
|
|
15
|
+
* Stores data in JSON files on disk for persistence
|
|
16
|
+
*/
|
|
17
|
+
export declare class FileStorageAdapter implements IStorageAdapter {
|
|
18
|
+
private basePath;
|
|
19
|
+
private opLogCounter;
|
|
20
|
+
private initialized;
|
|
21
|
+
private fs;
|
|
22
|
+
private enableChecksums;
|
|
23
|
+
private strictChecksums;
|
|
24
|
+
constructor(basePath: string, options?: IFileStorageAdapterOptions);
|
|
25
|
+
private getDbPath;
|
|
26
|
+
private getCollectionPath;
|
|
27
|
+
private getIndexPath;
|
|
28
|
+
private getOpLogPath;
|
|
29
|
+
private getMetaPath;
|
|
30
|
+
private readJsonFile;
|
|
31
|
+
private writeJsonFile;
|
|
32
|
+
private restoreObjectIds;
|
|
33
|
+
/**
|
|
34
|
+
* Verify document checksum and handle errors
|
|
35
|
+
*/
|
|
36
|
+
private verifyDocumentChecksum;
|
|
37
|
+
/**
|
|
38
|
+
* Add checksum to document before storing
|
|
39
|
+
*/
|
|
40
|
+
private prepareDocumentForStorage;
|
|
41
|
+
/**
|
|
42
|
+
* Remove internal checksum field before returning to user
|
|
43
|
+
*/
|
|
44
|
+
private cleanDocumentForReturn;
|
|
45
|
+
initialize(): Promise<void>;
|
|
46
|
+
close(): Promise<void>;
|
|
47
|
+
listDatabases(): Promise<string[]>;
|
|
48
|
+
createDatabase(dbName: string): Promise<void>;
|
|
49
|
+
dropDatabase(dbName: string): Promise<boolean>;
|
|
50
|
+
databaseExists(dbName: string): Promise<boolean>;
|
|
51
|
+
listCollections(dbName: string): Promise<string[]>;
|
|
52
|
+
createCollection(dbName: string, collName: string): Promise<void>;
|
|
53
|
+
dropCollection(dbName: string, collName: string): Promise<boolean>;
|
|
54
|
+
collectionExists(dbName: string, collName: string): Promise<boolean>;
|
|
55
|
+
renameCollection(dbName: string, oldName: string, newName: string): Promise<void>;
|
|
56
|
+
insertOne(dbName: string, collName: string, doc: Document): Promise<IStoredDocument>;
|
|
57
|
+
insertMany(dbName: string, collName: string, docsToInsert: Document[]): Promise<IStoredDocument[]>;
|
|
58
|
+
findAll(dbName: string, collName: string): Promise<IStoredDocument[]>;
|
|
59
|
+
findByIds(dbName: string, collName: string, ids: Set<string>): Promise<IStoredDocument[]>;
|
|
60
|
+
findById(dbName: string, collName: string, id: plugins.bson.ObjectId): Promise<IStoredDocument | null>;
|
|
61
|
+
updateById(dbName: string, collName: string, id: plugins.bson.ObjectId, doc: IStoredDocument): Promise<boolean>;
|
|
62
|
+
deleteById(dbName: string, collName: string, id: plugins.bson.ObjectId): Promise<boolean>;
|
|
63
|
+
deleteByIds(dbName: string, collName: string, ids: plugins.bson.ObjectId[]): Promise<number>;
|
|
64
|
+
count(dbName: string, collName: string): Promise<number>;
|
|
65
|
+
saveIndex(dbName: string, collName: string, indexName: string, indexSpec: {
|
|
66
|
+
key: Record<string, any>;
|
|
67
|
+
unique?: boolean;
|
|
68
|
+
sparse?: boolean;
|
|
69
|
+
expireAfterSeconds?: number;
|
|
70
|
+
}): Promise<void>;
|
|
71
|
+
getIndexes(dbName: string, collName: string): Promise<Array<{
|
|
72
|
+
name: string;
|
|
73
|
+
key: Record<string, any>;
|
|
74
|
+
unique?: boolean;
|
|
75
|
+
sparse?: boolean;
|
|
76
|
+
expireAfterSeconds?: number;
|
|
77
|
+
}>>;
|
|
78
|
+
dropIndex(dbName: string, collName: string, indexName: string): Promise<boolean>;
|
|
79
|
+
appendOpLog(entry: IOpLogEntry): Promise<void>;
|
|
80
|
+
getOpLogAfter(ts: plugins.bson.Timestamp, limit?: number): Promise<IOpLogEntry[]>;
|
|
81
|
+
getLatestOpLogTimestamp(): Promise<plugins.bson.Timestamp | null>;
|
|
82
|
+
generateTimestamp(): plugins.bson.Timestamp;
|
|
83
|
+
createSnapshot(dbName: string, collName: string): Promise<IStoredDocument[]>;
|
|
84
|
+
hasConflicts(dbName: string, collName: string, ids: plugins.bson.ObjectId[], snapshotTime: plugins.bson.Timestamp): Promise<boolean>;
|
|
85
|
+
}
|