db-mcp 4.0.0 → 5.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 (138) hide show
  1. package/README.md +30 -25
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/adapters/database-adapter.d.ts +9 -0
  4. package/dist/adapters/database-adapter.d.ts.map +1 -1
  5. package/dist/adapters/sqlite/query-executor.d.ts.map +1 -1
  6. package/dist/adapters/sqlite/read-write-lock.d.ts +49 -0
  7. package/dist/adapters/sqlite/read-write-lock.d.ts.map +1 -0
  8. package/dist/adapters/sqlite/schemas/admin.d.ts +5 -5
  9. package/dist/adapters/sqlite/schemas/admin.d.ts.map +1 -1
  10. package/dist/adapters/sqlite/schemas/core.d.ts +94 -0
  11. package/dist/adapters/sqlite/schemas/core.d.ts.map +1 -1
  12. package/dist/adapters/sqlite/schemas/introspection.d.ts +8 -7
  13. package/dist/adapters/sqlite/schemas/introspection.d.ts.map +1 -1
  14. package/dist/adapters/sqlite/schemas/migration.d.ts +2 -2
  15. package/dist/adapters/sqlite/schemas/migration.d.ts.map +1 -1
  16. package/dist/adapters/sqlite/sqlite-adapter.d.ts +6 -0
  17. package/dist/adapters/sqlite/sqlite-adapter.d.ts.map +1 -1
  18. package/dist/adapters/sqlite/tools/admin/backup/create.d.ts.map +1 -1
  19. package/dist/adapters/sqlite/tools/admin/backup/dump.d.ts.map +1 -1
  20. package/dist/adapters/sqlite/tools/admin/backup/restore.d.ts.map +1 -1
  21. package/dist/adapters/sqlite/tools/admin/pragma.d.ts.map +1 -1
  22. package/dist/adapters/sqlite/tools/admin/verify.d.ts.map +1 -1
  23. package/dist/adapters/sqlite/tools/codemode.d.ts.map +1 -1
  24. package/dist/adapters/sqlite/tools/core/convenience.d.ts.map +1 -1
  25. package/dist/adapters/sqlite/tools/core/index.d.ts.map +1 -1
  26. package/dist/adapters/sqlite/tools/core/queries.d.ts.map +1 -1
  27. package/dist/adapters/sqlite/tools/core/versioning.d.ts +19 -0
  28. package/dist/adapters/sqlite/tools/core/versioning.d.ts.map +1 -0
  29. package/dist/adapters/sqlite/tools/introspection/graph/tools.d.ts.map +1 -1
  30. package/dist/adapters/sqlite/tools/json-operations/crud.d.ts.map +1 -1
  31. package/dist/adapters/sqlite/tools/migration/helpers.d.ts.map +1 -1
  32. package/dist/adapters/sqlite/tools/vector/metadata.d.ts.map +1 -1
  33. package/dist/adapters/sqlite/tools/vector/search.d.ts.map +1 -1
  34. package/dist/adapters/sqlite/tools/vector/storage.d.ts.map +1 -1
  35. package/dist/adapters/sqlite/tools/virtual/vtable/analyze-csv.d.ts.map +1 -1
  36. package/dist/adapters/sqlite/tools/virtual/vtable/csv.d.ts.map +1 -1
  37. package/dist/adapters/sqlite/tools/virtual/vtable/info.d.ts.map +1 -1
  38. package/dist/adapters/sqlite/types.d.ts +1 -1
  39. package/dist/adapters/sqlite/types.d.ts.map +1 -1
  40. package/dist/adapters/sqlite-native/index.d.ts +1 -1
  41. package/dist/adapters/sqlite-native/index.d.ts.map +1 -1
  42. package/dist/adapters/sqlite-native/tools/window/helpers.d.ts +52 -0
  43. package/dist/adapters/sqlite-native/tools/window/helpers.d.ts.map +1 -0
  44. package/dist/adapters/sqlite-native/tools/window/index.d.ts +7 -0
  45. package/dist/adapters/sqlite-native/tools/window/index.d.ts.map +1 -0
  46. package/dist/adapters/sqlite-native/tools/window/lag-lead.d.ts +7 -0
  47. package/dist/adapters/sqlite-native/tools/window/lag-lead.d.ts.map +1 -0
  48. package/dist/adapters/sqlite-native/tools/window/moving-average.d.ts +7 -0
  49. package/dist/adapters/sqlite-native/tools/window/moving-average.d.ts.map +1 -0
  50. package/dist/adapters/sqlite-native/tools/window/ntile.d.ts +7 -0
  51. package/dist/adapters/sqlite-native/tools/window/ntile.d.ts.map +1 -0
  52. package/dist/adapters/sqlite-native/tools/window/rank.d.ts +7 -0
  53. package/dist/adapters/sqlite-native/tools/window/rank.d.ts.map +1 -0
  54. package/dist/adapters/sqlite-native/tools/window/row-number.d.ts +7 -0
  55. package/dist/adapters/sqlite-native/tools/window/row-number.d.ts.map +1 -0
  56. package/dist/adapters/sqlite-native/tools/window/running-total.d.ts +7 -0
  57. package/dist/adapters/sqlite-native/tools/window/running-total.d.ts.map +1 -0
  58. package/dist/adapters/sqlite-native/tools/window/schemas.d.ts +159 -0
  59. package/dist/adapters/sqlite-native/tools/window/schemas.d.ts.map +1 -0
  60. package/dist/adapters/sqlite-native/transaction-methods.d.ts.map +1 -1
  61. package/dist/audit/logger.d.ts.map +1 -1
  62. package/dist/auth/authorization-server-discovery.d.ts.map +1 -1
  63. package/dist/auth/scopes/mapping.d.ts.map +1 -1
  64. package/dist/auth/token-validator.d.ts.map +1 -1
  65. package/dist/{chunk-EQF3WZHX.js → chunk-27C5EE6U.js} +15 -2
  66. package/dist/{chunk-R5M4WKDM.js → chunk-2TYICG7B.js} +381 -185
  67. package/dist/{chunk-NIC5Z2CA.js → chunk-LLIAIJPO.js} +394 -381
  68. package/dist/{chunk-TGE7LFAR.js → chunk-UE7GVOBV.js} +1069 -355
  69. package/dist/{chunk-Y57WFKAP.js → chunk-XLIYO3YA.js} +178 -72
  70. package/dist/cli.js +18 -6
  71. package/dist/codemode/api-constants.d.ts.map +1 -1
  72. package/dist/codemode/api.d.ts.map +1 -1
  73. package/dist/codemode/sandbox-factory.d.ts.map +1 -1
  74. package/dist/codemode/sandbox.d.ts +0 -3
  75. package/dist/codemode/sandbox.d.ts.map +1 -1
  76. package/dist/codemode/security.d.ts.map +1 -1
  77. package/dist/codemode/types.d.ts +2 -0
  78. package/dist/codemode/types.d.ts.map +1 -1
  79. package/dist/constants/server-instructions.d.ts.map +1 -1
  80. package/dist/filtering/tool-constants.d.ts +5 -5
  81. package/dist/filtering/tool-constants.d.ts.map +1 -1
  82. package/dist/{http-2WGR3E5K.js → http-ZDMK46QU.js} +183 -32
  83. package/dist/index.js +4 -4
  84. package/dist/observability/system-db.d.ts.map +1 -1
  85. package/dist/server/mcp-server.d.ts.map +1 -1
  86. package/dist/server/registration/admin-tools.d.ts.map +1 -1
  87. package/dist/server/registration/audit-tools/backup.d.ts +8 -0
  88. package/dist/server/registration/audit-tools/backup.d.ts.map +1 -0
  89. package/dist/server/registration/audit-tools/helpers.d.ts +11 -0
  90. package/dist/server/registration/audit-tools/helpers.d.ts.map +1 -0
  91. package/dist/server/registration/audit-tools/index.d.ts +4 -0
  92. package/dist/server/registration/audit-tools/index.d.ts.map +1 -0
  93. package/dist/server/registration/audit-tools/resource.d.ts +8 -0
  94. package/dist/server/registration/audit-tools/resource.d.ts.map +1 -0
  95. package/dist/server/registration/audit-tools/search.d.ts +7 -0
  96. package/dist/server/registration/audit-tools/search.d.ts.map +1 -0
  97. package/dist/server/registration/index.d.ts +1 -1
  98. package/dist/server/registration/index.d.ts.map +1 -1
  99. package/dist/{sqlite-D4WCNPU4.js → sqlite-XWZPEZJO.js} +192 -19
  100. package/dist/{sqlite-native-DLVS2T52.js → sqlite-native-5GQ3WKCZ.js} +156 -117
  101. package/dist/transports/http/middleware.d.ts.map +1 -1
  102. package/dist/transports/http/oauth.d.ts.map +1 -1
  103. package/dist/transports/http/sessions/legacy-sse.d.ts.map +1 -1
  104. package/dist/transports/http/sessions/stateful.d.ts +5 -1
  105. package/dist/transports/http/sessions/stateful.d.ts.map +1 -1
  106. package/dist/transports/http/transport.d.ts +2 -0
  107. package/dist/transports/http/transport.d.ts.map +1 -1
  108. package/dist/transports/http/types.d.ts +9 -0
  109. package/dist/transports/http/types.d.ts.map +1 -1
  110. package/dist/types/auth.d.ts +4 -0
  111. package/dist/types/auth.d.ts.map +1 -1
  112. package/dist/types/server.d.ts +3 -0
  113. package/dist/types/server.d.ts.map +1 -1
  114. package/dist/utils/annotations.d.ts +8 -0
  115. package/dist/utils/annotations.d.ts.map +1 -1
  116. package/dist/utils/errors/categories.d.ts +16 -11
  117. package/dist/utils/errors/categories.d.ts.map +1 -1
  118. package/dist/utils/errors/classes.d.ts +37 -0
  119. package/dist/utils/errors/classes.d.ts.map +1 -1
  120. package/dist/utils/errors/format.d.ts +2 -2
  121. package/dist/utils/errors/format.d.ts.map +1 -1
  122. package/dist/utils/errors/index.d.ts +1 -1
  123. package/dist/utils/errors/index.d.ts.map +1 -1
  124. package/dist/utils/errors/suggestions.d.ts +1 -0
  125. package/dist/utils/errors/suggestions.d.ts.map +1 -1
  126. package/dist/utils/index.d.ts +2 -0
  127. package/dist/utils/index.d.ts.map +1 -1
  128. package/dist/utils/security-utils.d.ts +29 -0
  129. package/dist/utils/security-utils.d.ts.map +1 -0
  130. package/dist/utils/stream-utils.d.ts +14 -0
  131. package/dist/utils/stream-utils.d.ts.map +1 -0
  132. package/dist/utils/where-clause.d.ts +0 -13
  133. package/dist/utils/where-clause.d.ts.map +1 -1
  134. package/package.json +35 -38
  135. package/dist/adapters/sqlite-native/tools/window.d.ts +0 -7
  136. package/dist/adapters/sqlite-native/tools/window.d.ts.map +0 -1
  137. package/dist/server/registration/audit-tools.d.ts +0 -17
  138. package/dist/server/registration/audit-tools.d.ts.map +0 -1
@@ -0,0 +1,7 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { AuditLogger } from "../../../audit/logger.js";
3
+ /**
4
+ * Register the sqlite_audit_search tool.
5
+ */
6
+ export declare function registerAuditSearchTool(server: McpServer, auditLogger: AuditLogger | null): void;
7
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../src/server/registration/audit-tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAe5D;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,WAAW,GAAG,IAAI,GAC9B,IAAI,CA6EN"}
@@ -1,6 +1,6 @@
1
1
  export * from "./built-in-tools.js";
2
2
  export * from "./help-resources.js";
3
- export { registerAuditResource, registerAuditBackupTools, registerAuditSearchTool, } from "./audit-tools.js";
3
+ export { registerAuditResource, registerAuditBackupTools, registerAuditSearchTool, } from "./audit-tools/index.js";
4
4
  export * from "./observability-resources.js";
5
5
  export * from "./admin-tools.js";
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/registration/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/registration/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAChC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kBAAkB,CAAC"}
@@ -1,8 +1,8 @@
1
- import { getCoreTools, getJsonHelperTools, getJsonOperationTools, getTextTools, getStatsTools, getVirtualTools, getVectorTools, getGeoTools, getAdminTools, getIntrospectionTools, getMigrationTools, getCodeModeTools, executeRead, executeWrite, isDDL, executeGeneral, getResourceDefinitions, getPromptDefinitions, applyCommonPragmas, autoEnableWal, detectAndSetJsonbSupport, SchemaManager } from './chunk-TGE7LFAR.js';
2
- export { getCoreTools } from './chunk-TGE7LFAR.js';
3
- import { DatabaseAdapter } from './chunk-EQF3WZHX.js';
4
- import { getToolGroupIcon, VERSION } from './chunk-R5M4WKDM.js';
5
- import { createModuleLogger, ConnectionError, ConfigurationError, ERROR_CODES, DbMcpError } from './chunk-Y57WFKAP.js';
1
+ import { getCoreTools, getJsonHelperTools, getJsonOperationTools, getTextTools, getStatsTools, getVirtualTools, getVectorTools, getGeoTools, getAdminTools, getIntrospectionTools, getMigrationTools, getCodeModeTools, executeRead, executeWrite, isDDL, executeGeneral, getResourceDefinitions, getPromptDefinitions, applyCommonPragmas, autoEnableWal, detectAndSetJsonbSupport, SchemaManager } from './chunk-UE7GVOBV.js';
2
+ export { getCoreTools } from './chunk-UE7GVOBV.js';
3
+ import { DatabaseAdapter } from './chunk-27C5EE6U.js';
4
+ import { getToolGroupIcon, VERSION } from './chunk-2TYICG7B.js';
5
+ import { createModuleLogger, ConnectionError, ConfigurationError, ERROR_CODES, DbMcpError, ErrorCategory } from './chunk-XLIYO3YA.js';
6
6
  import initSqlJs from 'sql.js';
7
7
 
8
8
  // src/adapters/sqlite/tools/index.ts
@@ -34,6 +34,142 @@ function getAllToolDefinitions(adapter) {
34
34
  function getToolsByGroup(adapter, group) {
35
35
  return getAllToolDefinitions(adapter).filter((tool) => tool.group === group);
36
36
  }
37
+
38
+ // src/adapters/sqlite/read-write-lock.ts
39
+ var ReadWriteLock = class {
40
+ activeReaders = 0;
41
+ isWriting = false;
42
+ readWaiters = [];
43
+ readHead = 0;
44
+ writeWaiters = [];
45
+ writeHead = 0;
46
+ maxConcurrentReaders;
47
+ consecutiveWriters = 0;
48
+ MAX_CONSECUTIVE_WRITERS = 5;
49
+ constructor(options) {
50
+ this.maxConcurrentReaders = options?.maxConcurrentReaders ?? 10;
51
+ }
52
+ /**
53
+ * Acquire a read lock.
54
+ * Multiple readers can acquire the lock simultaneously up to maxConcurrentReaders.
55
+ * If a writer is currently active OR there are writers waiting (fairness),
56
+ * the read request is queued.
57
+ */
58
+ async acquireRead() {
59
+ return new Promise((resolve, reject) => {
60
+ const grantRead = () => {
61
+ this.activeReaders++;
62
+ let released = false;
63
+ resolve(() => {
64
+ if (released) return;
65
+ released = true;
66
+ this.releaseRead();
67
+ });
68
+ };
69
+ const writersWaiting = this.writeWaiters.length - this.writeHead > 0;
70
+ if (this.isWriting || writersWaiting && this.consecutiveWriters < this.MAX_CONSECUTIVE_WRITERS || this.activeReaders >= this.maxConcurrentReaders) {
71
+ this.readWaiters.push({ resolve: grantRead, reject });
72
+ } else {
73
+ grantRead();
74
+ }
75
+ });
76
+ }
77
+ /**
78
+ * Acquire a write lock.
79
+ * Writers have exclusive access.
80
+ * If there are active readers or an active writer, the write request is queued.
81
+ */
82
+ async acquireWrite() {
83
+ return new Promise((resolve, reject) => {
84
+ const grantWrite = () => {
85
+ this.isWriting = true;
86
+ this.consecutiveWriters++;
87
+ let released = false;
88
+ resolve(() => {
89
+ if (released) return;
90
+ released = true;
91
+ this.releaseWrite();
92
+ });
93
+ };
94
+ if (this.isWriting || this.activeReaders > 0) {
95
+ this.writeWaiters.push({ resolve: grantWrite, reject });
96
+ } else {
97
+ grantWrite();
98
+ }
99
+ });
100
+ }
101
+ releaseRead() {
102
+ this.activeReaders--;
103
+ this.processQueues();
104
+ }
105
+ releaseWrite() {
106
+ this.isWriting = false;
107
+ this.processQueues();
108
+ }
109
+ popReader() {
110
+ if (this.readHead >= this.readWaiters.length) return void 0;
111
+ const req = this.readWaiters[this.readHead++];
112
+ if (this.readHead > 100) {
113
+ this.readWaiters = this.readWaiters.slice(this.readHead);
114
+ this.readHead = 0;
115
+ }
116
+ return req;
117
+ }
118
+ popWriter() {
119
+ if (this.writeHead >= this.writeWaiters.length) return void 0;
120
+ const req = this.writeWaiters[this.writeHead++];
121
+ if (this.writeHead > 100) {
122
+ this.writeWaiters = this.writeWaiters.slice(this.writeHead);
123
+ this.writeHead = 0;
124
+ }
125
+ return req;
126
+ }
127
+ processQueues() {
128
+ const writersWaiting = this.writeWaiters.length - this.writeHead > 0;
129
+ const readersWaiting = this.readWaiters.length - this.readHead > 0;
130
+ if (!writersWaiting || readersWaiting && this.consecutiveWriters >= this.MAX_CONSECUTIVE_WRITERS) {
131
+ this.consecutiveWriters = 0;
132
+ }
133
+ if (writersWaiting && this.activeReaders === 0 && !this.isWriting && this.consecutiveWriters < this.MAX_CONSECUTIVE_WRITERS) {
134
+ const nextWriter = this.popWriter();
135
+ nextWriter?.resolve(() => void 0);
136
+ return;
137
+ }
138
+ if (!this.isWriting && (!writersWaiting || this.consecutiveWriters >= this.MAX_CONSECUTIVE_WRITERS)) {
139
+ while (this.readWaiters.length - this.readHead > 0 && this.activeReaders < this.maxConcurrentReaders) {
140
+ const nextReader = this.popReader();
141
+ nextReader?.resolve(() => void 0);
142
+ }
143
+ }
144
+ }
145
+ /**
146
+ * Get current lock statistics
147
+ */
148
+ getStats() {
149
+ return {
150
+ activeReaders: this.activeReaders,
151
+ isWriting: this.isWriting,
152
+ waitingReaders: this.readWaiters.length - this.readHead,
153
+ waitingWriters: this.writeWaiters.length - this.writeHead
154
+ };
155
+ }
156
+ /**
157
+ * Force release all waiting locks (useful for shutdown)
158
+ */
159
+ dispose() {
160
+ const cancelError = new ConnectionError("Database connection shutting down", "CONNECTION_CLOSED");
161
+ for (let i = this.readHead; i < this.readWaiters.length; i++) {
162
+ this.readWaiters[i]?.reject(cancelError);
163
+ }
164
+ for (let i = this.writeHead; i < this.writeWaiters.length; i++) {
165
+ this.writeWaiters[i]?.reject(cancelError);
166
+ }
167
+ this.readWaiters = [];
168
+ this.readHead = 0;
169
+ this.writeWaiters = [];
170
+ this.writeHead = 0;
171
+ }
172
+ };
37
173
  var log = createModuleLogger("SQLITE");
38
174
  var _sqlJsPromise = null;
39
175
  function getSqlJs() {
@@ -168,7 +304,7 @@ async function fallBackDescribeTable(adapter, tableName) {
168
304
  throw new DbMcpError(
169
305
  "Invalid table name",
170
306
  "SQLITE_INVALID_TABLE",
171
- "validation" /* VALIDATION */
307
+ ErrorCategory.VALIDATION
172
308
  );
173
309
  }
174
310
  const result = await adapter.executeReadQuery(
@@ -248,6 +384,7 @@ async function fallBackGetIndexes(adapter, table) {
248
384
  }
249
385
 
250
386
  // src/adapters/sqlite/sqlite-adapter.ts
387
+ var DDL_NAME_REGEX = /(?:table|view|index)\s+([a-zA-Z0-9_]+)/i;
251
388
  var SqliteAdapter = class extends DatabaseAdapter {
252
389
  type = "sqlite";
253
390
  name = "SQLite Adapter";
@@ -267,6 +404,7 @@ var SqliteAdapter = class extends DatabaseAdapter {
267
404
  return this.config?.filePath ?? this.config?.connectionString ?? ":memory:";
268
405
  }
269
406
  db = null;
407
+ rwLock = new ReadWriteLock();
270
408
  config = null;
271
409
  schemaManager = null;
272
410
  cachedToolDefinitions = null;
@@ -284,6 +422,7 @@ var SqliteAdapter = class extends DatabaseAdapter {
284
422
  * Disconnect from the database
285
423
  */
286
424
  async disconnect() {
425
+ this.rwLock.dispose();
287
426
  if (this.db) {
288
427
  await disconnectSqliteDatabase(this.db, this.config);
289
428
  this.db = null;
@@ -321,10 +460,15 @@ var SqliteAdapter = class extends DatabaseAdapter {
321
460
  /**
322
461
  * Execute a read-only query
323
462
  */
324
- executeReadQuery(sql, params) {
463
+ async executeReadQuery(sql, params) {
325
464
  this.ensureConnected();
326
465
  this.validateQuery(sql, true);
327
- return executeRead(this.ensureDb(), sql, params);
466
+ const release = await this.rwLock.acquireRead();
467
+ try {
468
+ return await executeRead(this.ensureDb(), sql, params);
469
+ } finally {
470
+ release();
471
+ }
328
472
  }
329
473
  /**
330
474
  * Execute a write query
@@ -332,9 +476,15 @@ var SqliteAdapter = class extends DatabaseAdapter {
332
476
  async executeWriteQuery(sql, params) {
333
477
  this.ensureConnected();
334
478
  this.validateQuery(sql, false);
335
- const result = await executeWrite(this.ensureDb(), sql, params);
479
+ const release = await this.rwLock.acquireWrite();
480
+ let result;
481
+ try {
482
+ result = await executeWrite(this.ensureDb(), sql, params);
483
+ } finally {
484
+ release();
485
+ }
336
486
  if (isDDL(sql)) {
337
- const match = /(?:table|view|index)\s+([a-zA-Z0-9_]+)/i.exec(sql);
487
+ const match = DDL_NAME_REGEX.exec(sql);
338
488
  if (match?.[1] && this.schemaManager) {
339
489
  this.schemaManager.clearTableCache(match[1]);
340
490
  } else {
@@ -350,9 +500,15 @@ var SqliteAdapter = class extends DatabaseAdapter {
350
500
  async executeQuery(sql, params) {
351
501
  this.ensureConnected();
352
502
  this.validateQuery(sql, false);
353
- const result = await executeGeneral(this.ensureDb(), sql, params);
503
+ const release = await this.rwLock.acquireWrite();
504
+ let result;
505
+ try {
506
+ result = await executeGeneral(this.ensureDb(), sql, params);
507
+ } finally {
508
+ release();
509
+ }
354
510
  if (isDDL(sql)) {
355
- const match = /(?:table|view|index)\s+([a-zA-Z0-9_]+)/i.exec(sql);
511
+ const match = DDL_NAME_REGEX.exec(sql);
356
512
  if (match?.[1] && this.schemaManager) {
357
513
  this.schemaManager.clearTableCache(match[1]);
358
514
  } else {
@@ -365,12 +521,16 @@ var SqliteAdapter = class extends DatabaseAdapter {
365
521
  /**
366
522
  * Execute a SQL script containing multiple statements
367
523
  */
368
- executeScript(sql) {
524
+ async executeScript(sql) {
369
525
  this.ensureConnected();
370
- this.ensureDb().run(sql);
526
+ const release = await this.rwLock.acquireWrite();
527
+ try {
528
+ this.ensureDb().run(sql);
529
+ } finally {
530
+ release();
531
+ }
371
532
  this.clearSchemaCache();
372
533
  this.emit("schemaChanged");
373
- return Promise.resolve();
374
534
  }
375
535
  /**
376
536
  * Get full database schema (cached via SchemaManager)
@@ -451,8 +611,8 @@ var SqliteAdapter = class extends DatabaseAdapter {
451
611
  // SpatiaLite not bundled
452
612
  transactions: true,
453
613
  preparedStatements: true,
454
- connectionPooling: false
455
- // sql.js is single-connection
614
+ connectionPooling: true
615
+ // Managed by ReadWriteLock for WASM
456
616
  };
457
617
  }
458
618
  /**
@@ -550,6 +710,12 @@ var SqliteAdapter = class extends DatabaseAdapter {
550
710
  }
551
711
  return db;
552
712
  }
713
+ /**
714
+ * Get pool statistics
715
+ */
716
+ getPoolStats() {
717
+ return this.rwLock.getStats();
718
+ }
553
719
  /**
554
720
  * Get the raw database instance (for tools)
555
721
  */
@@ -559,8 +725,15 @@ var SqliteAdapter = class extends DatabaseAdapter {
559
725
  /**
560
726
  * Execute raw SQL and return results (for tools)
561
727
  */
562
- rawQuery(sql, params) {
563
- return executeGeneral(this.ensureDb(), sql, params);
728
+ async rawQuery(sql, params) {
729
+ const trimmed = sql.trim().toUpperCase();
730
+ const isRead = trimmed.startsWith("SELECT") || trimmed.startsWith("EXPLAIN") || trimmed.startsWith("PRAGMA") && !sql.includes("=");
731
+ const release = isRead ? await this.rwLock.acquireRead() : await this.rwLock.acquireWrite();
732
+ try {
733
+ return await executeGeneral(this.ensureDb(), sql, params);
734
+ } finally {
735
+ release();
736
+ }
564
737
  }
565
738
  };
566
739
  function createSqliteAdapter() {