@wowoengine/sawitdb 2.5.0 → 2.6.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.
- package/README.md +72 -16
- package/bin/sawit-server.js +5 -1
- package/cli/benchmark.js +292 -119
- package/cli/local.js +26 -11
- package/cli/remote.js +26 -11
- package/cli/test.js +110 -72
- package/cli/test_security.js +140 -0
- package/docs/DB Event.md +32 -0
- package/docs/index.html +125 -17
- package/package.json +10 -7
- package/src/SawitClient.js +122 -98
- package/src/SawitServer.js +77 -464
- package/src/SawitWorker.js +55 -0
- package/src/WowoEngine.js +245 -824
- package/src/modules/BTreeIndex.js +54 -24
- package/src/modules/ClusterManager.js +78 -0
- package/src/modules/Env.js +33 -0
- package/src/modules/Pager.js +12 -9
- package/src/modules/QueryParser.js +233 -48
- package/src/modules/ThreadManager.js +84 -0
- package/src/modules/ThreadPool.js +154 -0
- package/src/server/DatabaseRegistry.js +92 -0
- package/src/server/auth/AuthManager.js +92 -0
- package/src/server/router/RequestRouter.js +278 -0
- package/src/server/session/ClientSession.js +19 -0
- package/src/services/IndexManager.js +183 -0
- package/src/services/QueryExecutor.js +11 -0
- package/src/services/TableManager.js +162 -0
- package/src/services/event/DBEvent.js +61 -0
- package/src/services/event/DBEventHandler.js +39 -0
- package/src/services/executors/AggregateExecutor.js +153 -0
- package/src/services/executors/DeleteExecutor.js +134 -0
- package/src/services/executors/InsertExecutor.js +113 -0
- package/src/services/executors/SelectExecutor.js +130 -0
- package/src/services/executors/UpdateExecutor.js +156 -0
- package/src/services/logic/ConditionEvaluator.js +75 -0
- package/src/services/logic/JoinProcessor.js +230 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
const { parentPort, workerData, threadId } = require('worker_threads');
|
|
2
|
+
const SawitDB = require('./WowoEngine');
|
|
3
|
+
|
|
4
|
+
// Cache of DB instances: { [absolutePath]: SawitDB }
|
|
5
|
+
// NOTE: Since threads map to "Database Engines", they must be careful about FILE LOCKING.
|
|
6
|
+
// If multiple threads open the SAME file, we have the same corruption risk as processes.
|
|
7
|
+
// But this is the requested architecture.
|
|
8
|
+
const dbCache = new Map();
|
|
9
|
+
|
|
10
|
+
parentPort.on('message', async (task) => {
|
|
11
|
+
// task: { id: number, action: 'query', dbPath: string, sql: string, config: object }
|
|
12
|
+
// config can contain WAL settings etc for first open.
|
|
13
|
+
|
|
14
|
+
if (task.action === 'query') {
|
|
15
|
+
try {
|
|
16
|
+
let db = dbCache.get(task.dbPath);
|
|
17
|
+
if (!db) {
|
|
18
|
+
// Initialize DB if not open in this thread
|
|
19
|
+
const options = task.config || {};
|
|
20
|
+
db = new SawitDB(task.dbPath, options);
|
|
21
|
+
dbCache.set(task.dbPath, db);
|
|
22
|
+
// console.log(`[Thread ${threadId}] Opened DB: ${task.dbPath}`);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Execute Query
|
|
26
|
+
// Ensure we handle async queries (SawitDB v2.5+)
|
|
27
|
+
let result;
|
|
28
|
+
if (db.query.constructor.name === 'AsyncFunction') {
|
|
29
|
+
result = await db.query(task.sql);
|
|
30
|
+
} else {
|
|
31
|
+
result = db.query(task.sql);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Send Success
|
|
35
|
+
parentPort.postMessage({ id: task.id, status: 'ok', data: result });
|
|
36
|
+
|
|
37
|
+
} catch (err) {
|
|
38
|
+
// Send Error
|
|
39
|
+
parentPort.postMessage({
|
|
40
|
+
id: task.id,
|
|
41
|
+
status: 'error',
|
|
42
|
+
error: err.message,
|
|
43
|
+
stack: err.stack
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
} else if (task.action === 'close') {
|
|
47
|
+
// Close specific DB or all?
|
|
48
|
+
// Let's support clearing cache
|
|
49
|
+
dbCache.forEach(db => {
|
|
50
|
+
try { db.close(); } catch (e) { }
|
|
51
|
+
});
|
|
52
|
+
dbCache.clear();
|
|
53
|
+
parentPort.postMessage({ id: task.id, status: 'ok' });
|
|
54
|
+
}
|
|
55
|
+
});
|