@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,668 +0,0 @@
1
- import * as plugins from '../../plugins.js';
2
- import { SessionEngine } from '../../engine/SessionEngine.js';
3
- /**
4
- * AdminHandler - Handles administrative commands
5
- */
6
- export class AdminHandler {
7
- async handle(context) {
8
- const { command } = context;
9
- // Determine which command to handle
10
- if (command.ping !== undefined) {
11
- return this.handlePing(context);
12
- }
13
- else if (command.listDatabases !== undefined) {
14
- return this.handleListDatabases(context);
15
- }
16
- else if (command.listCollections !== undefined) {
17
- return this.handleListCollections(context);
18
- }
19
- else if (command.drop !== undefined) {
20
- return this.handleDrop(context);
21
- }
22
- else if (command.dropDatabase !== undefined) {
23
- return this.handleDropDatabase(context);
24
- }
25
- else if (command.create !== undefined) {
26
- return this.handleCreate(context);
27
- }
28
- else if (command.serverStatus !== undefined) {
29
- return this.handleServerStatus(context);
30
- }
31
- else if (command.buildInfo !== undefined) {
32
- return this.handleBuildInfo(context);
33
- }
34
- else if (command.whatsmyuri !== undefined) {
35
- return this.handleWhatsMyUri(context);
36
- }
37
- else if (command.getLog !== undefined) {
38
- return this.handleGetLog(context);
39
- }
40
- else if (command.hostInfo !== undefined) {
41
- return this.handleHostInfo(context);
42
- }
43
- else if (command.replSetGetStatus !== undefined) {
44
- return this.handleReplSetGetStatus(context);
45
- }
46
- else if (command.saslStart !== undefined) {
47
- return this.handleSaslStart(context);
48
- }
49
- else if (command.saslContinue !== undefined) {
50
- return this.handleSaslContinue(context);
51
- }
52
- else if (command.endSessions !== undefined) {
53
- return this.handleEndSessions(context);
54
- }
55
- else if (command.abortTransaction !== undefined) {
56
- return this.handleAbortTransaction(context);
57
- }
58
- else if (command.commitTransaction !== undefined) {
59
- return this.handleCommitTransaction(context);
60
- }
61
- else if (command.collStats !== undefined) {
62
- return this.handleCollStats(context);
63
- }
64
- else if (command.dbStats !== undefined) {
65
- return this.handleDbStats(context);
66
- }
67
- else if (command.connectionStatus !== undefined) {
68
- return this.handleConnectionStatus(context);
69
- }
70
- else if (command.currentOp !== undefined) {
71
- return this.handleCurrentOp(context);
72
- }
73
- else if (command.collMod !== undefined) {
74
- return this.handleCollMod(context);
75
- }
76
- else if (command.renameCollection !== undefined) {
77
- return this.handleRenameCollection(context);
78
- }
79
- return {
80
- ok: 0,
81
- errmsg: 'Unknown admin command',
82
- code: 59,
83
- codeName: 'CommandNotFound',
84
- };
85
- }
86
- /**
87
- * Handle ping command
88
- */
89
- async handlePing(context) {
90
- return { ok: 1 };
91
- }
92
- /**
93
- * Handle listDatabases command
94
- */
95
- async handleListDatabases(context) {
96
- const { storage, command } = context;
97
- const dbNames = await storage.listDatabases();
98
- const nameOnly = command.nameOnly || false;
99
- if (nameOnly) {
100
- return {
101
- ok: 1,
102
- databases: dbNames.map(name => ({ name })),
103
- };
104
- }
105
- // Build database list with sizes
106
- const databases = [];
107
- let totalSize = 0;
108
- for (const name of dbNames) {
109
- const collections = await storage.listCollections(name);
110
- let dbSize = 0;
111
- for (const collName of collections) {
112
- const docs = await storage.findAll(name, collName);
113
- // Estimate size (rough approximation)
114
- dbSize += docs.reduce((sum, doc) => sum + JSON.stringify(doc).length, 0);
115
- }
116
- totalSize += dbSize;
117
- databases.push({
118
- name,
119
- sizeOnDisk: dbSize,
120
- empty: dbSize === 0,
121
- });
122
- }
123
- return {
124
- ok: 1,
125
- databases,
126
- totalSize,
127
- totalSizeMb: totalSize / (1024 * 1024),
128
- };
129
- }
130
- /**
131
- * Handle listCollections command
132
- */
133
- async handleListCollections(context) {
134
- const { storage, database, command } = context;
135
- const filter = command.filter || {};
136
- const nameOnly = command.nameOnly || false;
137
- const cursor = command.cursor || {};
138
- const batchSize = cursor.batchSize || 101;
139
- const collNames = await storage.listCollections(database);
140
- let collections = [];
141
- for (const name of collNames) {
142
- // Apply name filter
143
- if (filter.name && filter.name !== name) {
144
- // Check regex
145
- if (filter.name.$regex) {
146
- const regex = new RegExp(filter.name.$regex, filter.name.$options);
147
- if (!regex.test(name))
148
- continue;
149
- }
150
- else {
151
- continue;
152
- }
153
- }
154
- if (nameOnly) {
155
- collections.push({ name });
156
- }
157
- else {
158
- collections.push({
159
- name,
160
- type: 'collection',
161
- options: {},
162
- info: {
163
- readOnly: false,
164
- uuid: new plugins.bson.UUID(),
165
- },
166
- idIndex: {
167
- v: 2,
168
- key: { _id: 1 },
169
- name: '_id_',
170
- },
171
- });
172
- }
173
- }
174
- return {
175
- ok: 1,
176
- cursor: {
177
- id: plugins.bson.Long.fromNumber(0),
178
- ns: `${database}.$cmd.listCollections`,
179
- firstBatch: collections,
180
- },
181
- };
182
- }
183
- /**
184
- * Handle drop command (drop collection)
185
- */
186
- async handleDrop(context) {
187
- const { storage, database, command } = context;
188
- const collection = command.drop;
189
- const existed = await storage.dropCollection(database, collection);
190
- if (!existed) {
191
- return {
192
- ok: 0,
193
- errmsg: `ns not found ${database}.${collection}`,
194
- code: 26,
195
- codeName: 'NamespaceNotFound',
196
- };
197
- }
198
- return { ok: 1, ns: `${database}.${collection}` };
199
- }
200
- /**
201
- * Handle dropDatabase command
202
- */
203
- async handleDropDatabase(context) {
204
- const { storage, database } = context;
205
- await storage.dropDatabase(database);
206
- return { ok: 1, dropped: database };
207
- }
208
- /**
209
- * Handle create command (create collection)
210
- */
211
- async handleCreate(context) {
212
- const { storage, database, command } = context;
213
- const collection = command.create;
214
- // Check if already exists
215
- const exists = await storage.collectionExists(database, collection);
216
- if (exists) {
217
- return {
218
- ok: 0,
219
- errmsg: `Collection ${database}.${collection} already exists.`,
220
- code: 48,
221
- codeName: 'NamespaceExists',
222
- };
223
- }
224
- await storage.createCollection(database, collection);
225
- return { ok: 1 };
226
- }
227
- /**
228
- * Handle serverStatus command
229
- */
230
- async handleServerStatus(context) {
231
- const { server, sessionEngine } = context;
232
- const uptime = server.getUptime();
233
- const connections = server.getConnectionCount();
234
- const sessions = sessionEngine.listSessions();
235
- const sessionsWithTxn = sessionEngine.getSessionsWithTransactions();
236
- return {
237
- ok: 1,
238
- host: `${server.host}:${server.port}`,
239
- version: '7.0.0',
240
- process: 'smartdb',
241
- pid: process.pid,
242
- uptime,
243
- uptimeMillis: uptime * 1000,
244
- uptimeEstimate: uptime,
245
- localTime: new Date(),
246
- mem: {
247
- resident: Math.floor(process.memoryUsage().rss / (1024 * 1024)),
248
- virtual: Math.floor(process.memoryUsage().heapTotal / (1024 * 1024)),
249
- supported: true,
250
- },
251
- connections: {
252
- current: connections,
253
- available: 1000 - connections,
254
- totalCreated: connections,
255
- active: connections,
256
- },
257
- logicalSessionRecordCache: {
258
- activeSessionsCount: sessions.length,
259
- sessionsCollectionJobCount: 0,
260
- lastSessionsCollectionJobDurationMillis: 0,
261
- lastSessionsCollectionJobTimestamp: new Date(),
262
- transactionReaperJobCount: 0,
263
- lastTransactionReaperJobDurationMillis: 0,
264
- lastTransactionReaperJobTimestamp: new Date(),
265
- },
266
- transactions: {
267
- retriedCommandsCount: 0,
268
- retriedStatementsCount: 0,
269
- transactionsCollectionWriteCount: 0,
270
- currentActive: sessionsWithTxn.length,
271
- currentInactive: 0,
272
- currentOpen: sessionsWithTxn.length,
273
- totalStarted: sessionsWithTxn.length,
274
- totalCommitted: 0,
275
- totalAborted: 0,
276
- },
277
- network: {
278
- bytesIn: 0,
279
- bytesOut: 0,
280
- numRequests: 0,
281
- },
282
- storageEngine: {
283
- name: 'smartdb',
284
- supportsCommittedReads: true,
285
- persistent: false,
286
- },
287
- };
288
- }
289
- /**
290
- * Handle buildInfo command
291
- */
292
- async handleBuildInfo(context) {
293
- return {
294
- ok: 1,
295
- version: '7.0.0',
296
- gitVersion: 'smartdb',
297
- modules: [],
298
- allocator: 'system',
299
- javascriptEngine: 'none',
300
- sysInfo: 'deprecated',
301
- versionArray: [7, 0, 0, 0],
302
- openssl: {
303
- running: 'disabled',
304
- compiled: 'disabled',
305
- },
306
- buildEnvironment: {
307
- distmod: 'smartdb',
308
- distarch: process.arch,
309
- cc: '',
310
- ccflags: '',
311
- cxx: '',
312
- cxxflags: '',
313
- linkflags: '',
314
- target_arch: process.arch,
315
- target_os: process.platform,
316
- },
317
- bits: 64,
318
- debug: false,
319
- maxBsonObjectSize: 16777216,
320
- storageEngines: ['smartdb'],
321
- };
322
- }
323
- /**
324
- * Handle whatsmyuri command
325
- */
326
- async handleWhatsMyUri(context) {
327
- const { server } = context;
328
- return {
329
- ok: 1,
330
- you: `127.0.0.1:${server.port}`,
331
- };
332
- }
333
- /**
334
- * Handle getLog command
335
- */
336
- async handleGetLog(context) {
337
- const { command } = context;
338
- if (command.getLog === '*') {
339
- return {
340
- ok: 1,
341
- names: ['global', 'startupWarnings'],
342
- };
343
- }
344
- return {
345
- ok: 1,
346
- totalLinesWritten: 0,
347
- log: [],
348
- };
349
- }
350
- /**
351
- * Handle hostInfo command
352
- */
353
- async handleHostInfo(context) {
354
- return {
355
- ok: 1,
356
- system: {
357
- currentTime: new Date(),
358
- hostname: 'localhost',
359
- cpuAddrSize: 64,
360
- memSizeMB: Math.floor(process.memoryUsage().heapTotal / (1024 * 1024)),
361
- numCores: 1,
362
- cpuArch: process.arch,
363
- numaEnabled: false,
364
- },
365
- os: {
366
- type: process.platform,
367
- name: process.platform,
368
- version: process.version,
369
- },
370
- extra: {},
371
- };
372
- }
373
- /**
374
- * Handle replSetGetStatus command
375
- */
376
- async handleReplSetGetStatus(context) {
377
- // We're standalone, not a replica set
378
- return {
379
- ok: 0,
380
- errmsg: 'not running with --replSet',
381
- code: 76,
382
- codeName: 'NoReplicationEnabled',
383
- };
384
- }
385
- /**
386
- * Handle saslStart command (authentication)
387
- */
388
- async handleSaslStart(context) {
389
- // We don't require authentication, but we need to respond properly
390
- // to let drivers know auth is "successful"
391
- return {
392
- ok: 1,
393
- conversationId: 1,
394
- done: true,
395
- payload: Buffer.from([]),
396
- };
397
- }
398
- /**
399
- * Handle saslContinue command
400
- */
401
- async handleSaslContinue(context) {
402
- return {
403
- ok: 1,
404
- conversationId: 1,
405
- done: true,
406
- payload: Buffer.from([]),
407
- };
408
- }
409
- /**
410
- * Handle endSessions command
411
- */
412
- async handleEndSessions(context) {
413
- const { command, sessionEngine } = context;
414
- // End each session in the array
415
- const sessions = command.endSessions || [];
416
- for (const sessionSpec of sessions) {
417
- const sessionId = SessionEngine.extractSessionId(sessionSpec);
418
- if (sessionId) {
419
- await sessionEngine.endSession(sessionId);
420
- }
421
- }
422
- return { ok: 1 };
423
- }
424
- /**
425
- * Handle abortTransaction command
426
- */
427
- async handleAbortTransaction(context) {
428
- const { transactionEngine, sessionEngine, txnId, sessionId } = context;
429
- if (!txnId) {
430
- return {
431
- ok: 0,
432
- errmsg: 'No transaction started',
433
- code: 251,
434
- codeName: 'NoSuchTransaction',
435
- };
436
- }
437
- try {
438
- await transactionEngine.abortTransaction(txnId);
439
- transactionEngine.endTransaction(txnId);
440
- // Update session state
441
- if (sessionId) {
442
- sessionEngine.endTransaction(sessionId);
443
- }
444
- return { ok: 1 };
445
- }
446
- catch (error) {
447
- return {
448
- ok: 0,
449
- errmsg: error.message || 'Abort transaction failed',
450
- code: error.code || 1,
451
- codeName: error.codeName || 'UnknownError',
452
- };
453
- }
454
- }
455
- /**
456
- * Handle commitTransaction command
457
- */
458
- async handleCommitTransaction(context) {
459
- const { transactionEngine, sessionEngine, txnId, sessionId } = context;
460
- if (!txnId) {
461
- return {
462
- ok: 0,
463
- errmsg: 'No transaction started',
464
- code: 251,
465
- codeName: 'NoSuchTransaction',
466
- };
467
- }
468
- try {
469
- await transactionEngine.commitTransaction(txnId);
470
- transactionEngine.endTransaction(txnId);
471
- // Update session state
472
- if (sessionId) {
473
- sessionEngine.endTransaction(sessionId);
474
- }
475
- return { ok: 1 };
476
- }
477
- catch (error) {
478
- // If commit fails, transaction should be aborted
479
- try {
480
- await transactionEngine.abortTransaction(txnId);
481
- transactionEngine.endTransaction(txnId);
482
- if (sessionId) {
483
- sessionEngine.endTransaction(sessionId);
484
- }
485
- }
486
- catch {
487
- // Ignore abort errors
488
- }
489
- if (error.code === 112) {
490
- // Write conflict
491
- return {
492
- ok: 0,
493
- errmsg: error.message || 'Write conflict during commit',
494
- code: 112,
495
- codeName: 'WriteConflict',
496
- };
497
- }
498
- return {
499
- ok: 0,
500
- errmsg: error.message || 'Commit transaction failed',
501
- code: error.code || 1,
502
- codeName: error.codeName || 'UnknownError',
503
- };
504
- }
505
- }
506
- /**
507
- * Handle collStats command
508
- */
509
- async handleCollStats(context) {
510
- const { storage, database, command } = context;
511
- const collection = command.collStats;
512
- const exists = await storage.collectionExists(database, collection);
513
- if (!exists) {
514
- return {
515
- ok: 0,
516
- errmsg: `ns not found ${database}.${collection}`,
517
- code: 26,
518
- codeName: 'NamespaceNotFound',
519
- };
520
- }
521
- const docs = await storage.findAll(database, collection);
522
- const size = docs.reduce((sum, doc) => sum + JSON.stringify(doc).length, 0);
523
- const count = docs.length;
524
- const avgObjSize = count > 0 ? size / count : 0;
525
- const indexes = await storage.getIndexes(database, collection);
526
- return {
527
- ok: 1,
528
- ns: `${database}.${collection}`,
529
- count,
530
- size,
531
- avgObjSize,
532
- storageSize: size,
533
- totalIndexSize: 0,
534
- indexSizes: indexes.reduce((acc, idx) => {
535
- acc[idx.name] = 0;
536
- return acc;
537
- }, {}),
538
- nindexes: indexes.length,
539
- };
540
- }
541
- /**
542
- * Handle dbStats command
543
- */
544
- async handleDbStats(context) {
545
- const { storage, database } = context;
546
- const collections = await storage.listCollections(database);
547
- let totalSize = 0;
548
- let totalObjects = 0;
549
- for (const collName of collections) {
550
- const docs = await storage.findAll(database, collName);
551
- totalObjects += docs.length;
552
- totalSize += docs.reduce((sum, doc) => sum + JSON.stringify(doc).length, 0);
553
- }
554
- return {
555
- ok: 1,
556
- db: database,
557
- collections: collections.length,
558
- views: 0,
559
- objects: totalObjects,
560
- avgObjSize: totalObjects > 0 ? totalSize / totalObjects : 0,
561
- dataSize: totalSize,
562
- storageSize: totalSize,
563
- indexes: collections.length, // At least _id index per collection
564
- indexSize: 0,
565
- totalSize,
566
- };
567
- }
568
- /**
569
- * Handle connectionStatus command
570
- */
571
- async handleConnectionStatus(context) {
572
- return {
573
- ok: 1,
574
- authInfo: {
575
- authenticatedUsers: [],
576
- authenticatedUserRoles: [],
577
- },
578
- };
579
- }
580
- /**
581
- * Handle currentOp command
582
- */
583
- async handleCurrentOp(context) {
584
- return {
585
- ok: 1,
586
- inprog: [],
587
- };
588
- }
589
- /**
590
- * Handle collMod command
591
- */
592
- async handleCollMod(context) {
593
- // We don't support modifying collection options, but acknowledge the command
594
- return { ok: 1 };
595
- }
596
- /**
597
- * Handle renameCollection command
598
- */
599
- async handleRenameCollection(context) {
600
- const { storage, command } = context;
601
- const from = command.renameCollection;
602
- const to = command.to;
603
- const dropTarget = command.dropTarget || false;
604
- if (!from || !to) {
605
- return {
606
- ok: 0,
607
- errmsg: 'renameCollection requires both source and target',
608
- code: 2,
609
- codeName: 'BadValue',
610
- };
611
- }
612
- // Parse namespace (format: "db.collection")
613
- const fromParts = from.split('.');
614
- const toParts = to.split('.');
615
- if (fromParts.length < 2 || toParts.length < 2) {
616
- return {
617
- ok: 0,
618
- errmsg: 'Invalid namespace format',
619
- code: 73,
620
- codeName: 'InvalidNamespace',
621
- };
622
- }
623
- const fromDb = fromParts[0];
624
- const fromColl = fromParts.slice(1).join('.');
625
- const toDb = toParts[0];
626
- const toColl = toParts.slice(1).join('.');
627
- // Check if source exists
628
- const sourceExists = await storage.collectionExists(fromDb, fromColl);
629
- if (!sourceExists) {
630
- return {
631
- ok: 0,
632
- errmsg: `source namespace ${from} does not exist`,
633
- code: 26,
634
- codeName: 'NamespaceNotFound',
635
- };
636
- }
637
- // Check if target exists
638
- const targetExists = await storage.collectionExists(toDb, toColl);
639
- if (targetExists) {
640
- if (dropTarget) {
641
- await storage.dropCollection(toDb, toColl);
642
- }
643
- else {
644
- return {
645
- ok: 0,
646
- errmsg: `target namespace ${to} already exists`,
647
- code: 48,
648
- codeName: 'NamespaceExists',
649
- };
650
- }
651
- }
652
- // Same database rename
653
- if (fromDb === toDb) {
654
- await storage.renameCollection(fromDb, fromColl, toColl);
655
- }
656
- else {
657
- // Cross-database rename: copy documents then drop source
658
- await storage.createCollection(toDb, toColl);
659
- const docs = await storage.findAll(fromDb, fromColl);
660
- for (const doc of docs) {
661
- await storage.insertOne(toDb, toColl, doc);
662
- }
663
- await storage.dropCollection(fromDb, fromColl);
664
- }
665
- return { ok: 1 };
666
- }
667
- }
668
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRtaW5IYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvdHNfc21hcnRkYi9zZXJ2ZXIvaGFuZGxlcnMvQWRtaW5IYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTlEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFDdkIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUF3QjtRQUNuQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRTVCLG9DQUFvQztRQUNwQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0MsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNqRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzlDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxF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