@push.rocks/smartdb 1.0.1 → 2.0.0

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.
Files changed (110) hide show
  1. package/.smartconfig.json +7 -4
  2. package/dist_rust/rustdb_linux_amd64 +0 -0
  3. package/dist_rust/rustdb_linux_arm64 +0 -0
  4. package/dist_ts/00_commitinfo_data.js +3 -3
  5. package/dist_ts/ts_local/classes.localsmartdb.d.ts +5 -5
  6. package/dist_ts/ts_local/classes.localsmartdb.js +5 -6
  7. package/dist_ts/ts_local/plugins.d.ts +1 -2
  8. package/dist_ts/ts_local/plugins.js +3 -3
  9. package/dist_ts/ts_smartdb/index.d.ts +1 -24
  10. package/dist_ts/ts_smartdb/index.js +4 -29
  11. package/dist_ts/ts_smartdb/plugins.d.ts +2 -10
  12. package/dist_ts/ts_smartdb/plugins.js +3 -13
  13. package/dist_ts/ts_smartdb/rust-db-bridge.d.ts +43 -0
  14. package/dist_ts/ts_smartdb/rust-db-bridge.js +98 -0
  15. package/dist_ts/ts_smartdb/server/SmartdbServer.d.ts +8 -37
  16. package/dist_ts/ts_smartdb/server/SmartdbServer.js +49 -204
  17. package/dist_ts/ts_smartdb/server/index.d.ts +0 -4
  18. package/dist_ts/ts_smartdb/server/index.js +1 -5
  19. package/license +3 -1
  20. package/package.json +9 -12
  21. package/readme.md +84 -171
  22. package/ts/00_commitinfo_data.ts +2 -2
  23. package/ts/ts_local/classes.localsmartdb.ts +5 -6
  24. package/ts/ts_local/plugins.ts +1 -3
  25. package/ts/ts_smartdb/index.ts +3 -41
  26. package/ts/ts_smartdb/plugins.ts +2 -15
  27. package/ts/ts_smartdb/rust-db-bridge.ts +138 -0
  28. package/ts/ts_smartdb/server/SmartdbServer.ts +53 -248
  29. package/ts/ts_smartdb/server/index.ts +0 -7
  30. package/dist_ts/ts_smartdb/engine/AggregationEngine.d.ts +0 -66
  31. package/dist_ts/ts_smartdb/engine/AggregationEngine.js +0 -189
  32. package/dist_ts/ts_smartdb/engine/IndexEngine.d.ts +0 -97
  33. package/dist_ts/ts_smartdb/engine/IndexEngine.js +0 -678
  34. package/dist_ts/ts_smartdb/engine/QueryEngine.d.ts +0 -54
  35. package/dist_ts/ts_smartdb/engine/QueryEngine.js +0 -271
  36. package/dist_ts/ts_smartdb/engine/QueryPlanner.d.ts +0 -64
  37. package/dist_ts/ts_smartdb/engine/QueryPlanner.js +0 -308
  38. package/dist_ts/ts_smartdb/engine/SessionEngine.d.ts +0 -117
  39. package/dist_ts/ts_smartdb/engine/SessionEngine.js +0 -232
  40. package/dist_ts/ts_smartdb/engine/TransactionEngine.d.ts +0 -85
  41. package/dist_ts/ts_smartdb/engine/TransactionEngine.js +0 -287
  42. package/dist_ts/ts_smartdb/engine/UpdateEngine.d.ts +0 -47
  43. package/dist_ts/ts_smartdb/engine/UpdateEngine.js +0 -461
  44. package/dist_ts/ts_smartdb/errors/SmartdbErrors.d.ts +0 -100
  45. package/dist_ts/ts_smartdb/errors/SmartdbErrors.js +0 -155
  46. package/dist_ts/ts_smartdb/server/CommandRouter.d.ts +0 -87
  47. package/dist_ts/ts_smartdb/server/CommandRouter.js +0 -222
  48. package/dist_ts/ts_smartdb/server/WireProtocol.d.ts +0 -117
  49. package/dist_ts/ts_smartdb/server/WireProtocol.js +0 -298
  50. package/dist_ts/ts_smartdb/server/handlers/AdminHandler.d.ts +0 -100
  51. package/dist_ts/ts_smartdb/server/handlers/AdminHandler.js +0 -668
  52. package/dist_ts/ts_smartdb/server/handlers/AggregateHandler.d.ts +0 -31
  53. package/dist_ts/ts_smartdb/server/handlers/AggregateHandler.js +0 -277
  54. package/dist_ts/ts_smartdb/server/handlers/DeleteHandler.d.ts +0 -8
  55. package/dist_ts/ts_smartdb/server/handlers/DeleteHandler.js +0 -95
  56. package/dist_ts/ts_smartdb/server/handlers/FindHandler.d.ts +0 -31
  57. package/dist_ts/ts_smartdb/server/handlers/FindHandler.js +0 -291
  58. package/dist_ts/ts_smartdb/server/handlers/HelloHandler.d.ts +0 -11
  59. package/dist_ts/ts_smartdb/server/handlers/HelloHandler.js +0 -62
  60. package/dist_ts/ts_smartdb/server/handlers/IndexHandler.d.ts +0 -20
  61. package/dist_ts/ts_smartdb/server/handlers/IndexHandler.js +0 -183
  62. package/dist_ts/ts_smartdb/server/handlers/InsertHandler.d.ts +0 -8
  63. package/dist_ts/ts_smartdb/server/handlers/InsertHandler.js +0 -79
  64. package/dist_ts/ts_smartdb/server/handlers/UpdateHandler.d.ts +0 -24
  65. package/dist_ts/ts_smartdb/server/handlers/UpdateHandler.js +0 -296
  66. package/dist_ts/ts_smartdb/server/handlers/index.d.ts +0 -8
  67. package/dist_ts/ts_smartdb/server/handlers/index.js +0 -10
  68. package/dist_ts/ts_smartdb/storage/FileStorageAdapter.d.ts +0 -85
  69. package/dist_ts/ts_smartdb/storage/FileStorageAdapter.js +0 -465
  70. package/dist_ts/ts_smartdb/storage/IStorageAdapter.d.ts +0 -145
  71. package/dist_ts/ts_smartdb/storage/IStorageAdapter.js +0 -2
  72. package/dist_ts/ts_smartdb/storage/MemoryStorageAdapter.d.ts +0 -67
  73. package/dist_ts/ts_smartdb/storage/MemoryStorageAdapter.js +0 -378
  74. package/dist_ts/ts_smartdb/storage/OpLog.d.ts +0 -93
  75. package/dist_ts/ts_smartdb/storage/OpLog.js +0 -221
  76. package/dist_ts/ts_smartdb/storage/WAL.d.ts +0 -117
  77. package/dist_ts/ts_smartdb/storage/WAL.js +0 -286
  78. package/dist_ts/ts_smartdb/types/interfaces.d.ts +0 -363
  79. package/dist_ts/ts_smartdb/types/interfaces.js +0 -2
  80. package/dist_ts/ts_smartdb/utils/checksum.d.ts +0 -30
  81. package/dist_ts/ts_smartdb/utils/checksum.js +0 -77
  82. package/dist_ts/ts_smartdb/utils/index.d.ts +0 -1
  83. package/dist_ts/ts_smartdb/utils/index.js +0 -2
  84. package/ts/ts_smartdb/engine/AggregationEngine.ts +0 -283
  85. package/ts/ts_smartdb/engine/IndexEngine.ts +0 -798
  86. package/ts/ts_smartdb/engine/QueryEngine.ts +0 -301
  87. package/ts/ts_smartdb/engine/QueryPlanner.ts +0 -393
  88. package/ts/ts_smartdb/engine/SessionEngine.ts +0 -292
  89. package/ts/ts_smartdb/engine/TransactionEngine.ts +0 -351
  90. package/ts/ts_smartdb/engine/UpdateEngine.ts +0 -506
  91. package/ts/ts_smartdb/errors/SmartdbErrors.ts +0 -181
  92. package/ts/ts_smartdb/server/CommandRouter.ts +0 -289
  93. package/ts/ts_smartdb/server/WireProtocol.ts +0 -416
  94. package/ts/ts_smartdb/server/handlers/AdminHandler.ts +0 -719
  95. package/ts/ts_smartdb/server/handlers/AggregateHandler.ts +0 -342
  96. package/ts/ts_smartdb/server/handlers/DeleteHandler.ts +0 -115
  97. package/ts/ts_smartdb/server/handlers/FindHandler.ts +0 -330
  98. package/ts/ts_smartdb/server/handlers/HelloHandler.ts +0 -78
  99. package/ts/ts_smartdb/server/handlers/IndexHandler.ts +0 -207
  100. package/ts/ts_smartdb/server/handlers/InsertHandler.ts +0 -97
  101. package/ts/ts_smartdb/server/handlers/UpdateHandler.ts +0 -344
  102. package/ts/ts_smartdb/server/handlers/index.ts +0 -10
  103. package/ts/ts_smartdb/storage/FileStorageAdapter.ts +0 -562
  104. package/ts/ts_smartdb/storage/IStorageAdapter.ts +0 -208
  105. package/ts/ts_smartdb/storage/MemoryStorageAdapter.ts +0 -455
  106. package/ts/ts_smartdb/storage/OpLog.ts +0 -282
  107. package/ts/ts_smartdb/storage/WAL.ts +0 -375
  108. package/ts/ts_smartdb/types/interfaces.ts +0 -433
  109. package/ts/ts_smartdb/utils/checksum.ts +0 -88
  110. package/ts/ts_smartdb/utils/index.ts +0 -1
@@ -1,79 +0,0 @@
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
@@ -1,24 +0,0 @@
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
- }
@@ -1,296 +0,0 @@
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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
@@ -1,8 +0,0 @@
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';
@@ -1,10 +0,0 @@
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=
@@ -1,85 +0,0 @@
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
- }