zapql-mcp 0.1.2 → 0.1.4
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/dist/database/driver-factory.d.ts +6 -0
- package/dist/database/driver-factory.js +65 -0
- package/dist/database/driver-factory.js.map +1 -0
- package/dist/database/native-sql-server-driver.d.ts +26 -0
- package/dist/database/native-sql-server-driver.js +287 -0
- package/dist/database/native-sql-server-driver.js.map +1 -0
- package/dist/database/sql-driver.d.ts +33 -0
- package/dist/database/sql-driver.js +3 -0
- package/dist/database/sql-driver.js.map +1 -0
- package/dist/database/sql-server-driver.d.ts +15 -26
- package/dist/database/sql-server-driver.js +49 -7
- package/dist/database/sql-server-driver.js.map +1 -1
- package/dist/resources/queries.js +2 -2
- package/dist/resources/queries.js.map +1 -1
- package/dist/tools/analyze-query.js +14 -3
- package/dist/tools/analyze-query.js.map +1 -1
- package/dist/tools/connect-database.js +2 -2
- package/dist/tools/connect-database.js.map +1 -1
- package/dist/tools/optimize-query.js +51 -4
- package/dist/tools/optimize-query.js.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { SQLServerDriver } from './sql-server-driver';
|
|
2
|
+
export type DriverPreference = 'native' | 'tedious' | 'auto';
|
|
3
|
+
export declare function resolveDriverPreference(rawValue: string | undefined): DriverPreference;
|
|
4
|
+
export declare function connectionStringPrefersNative(connectionString: string): boolean;
|
|
5
|
+
export declare function isNativeDriverAvailable(): boolean;
|
|
6
|
+
export declare function createSQLServerDriver(connectionString: string, databaseName?: string, timeoutMs?: number): SQLServerDriver;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveDriverPreference = resolveDriverPreference;
|
|
4
|
+
exports.connectionStringPrefersNative = connectionStringPrefersNative;
|
|
5
|
+
exports.isNativeDriverAvailable = isNativeDriverAvailable;
|
|
6
|
+
exports.createSQLServerDriver = createSQLServerDriver;
|
|
7
|
+
const native_sql_server_driver_1 = require("./native-sql-server-driver");
|
|
8
|
+
const sql_server_driver_1 = require("./sql-server-driver");
|
|
9
|
+
const TRUE_LIKE_VALUES = new Set(['true', 'yes', 'sspi']);
|
|
10
|
+
function resolveDriverPreference(rawValue) {
|
|
11
|
+
const normalized = String(rawValue || 'auto').trim().toLowerCase();
|
|
12
|
+
if (normalized === 'native' || normalized === 'tedious') {
|
|
13
|
+
return normalized;
|
|
14
|
+
}
|
|
15
|
+
return 'auto';
|
|
16
|
+
}
|
|
17
|
+
function connectionStringPrefersNative(connectionString) {
|
|
18
|
+
const settings = parseConnectionString(connectionString);
|
|
19
|
+
const trustedConnection = settings.get('trusted_connection');
|
|
20
|
+
const integratedSecurity = settings.get('integrated security');
|
|
21
|
+
const trustedEnabled = trustedConnection ? TRUE_LIKE_VALUES.has(trustedConnection) : false;
|
|
22
|
+
const integratedEnabled = integratedSecurity ? TRUE_LIKE_VALUES.has(integratedSecurity) : false;
|
|
23
|
+
return trustedEnabled || integratedEnabled;
|
|
24
|
+
}
|
|
25
|
+
function isNativeDriverAvailable() {
|
|
26
|
+
try {
|
|
27
|
+
require('msnodesqlv8');
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function createSQLServerDriver(connectionString, databaseName, timeoutMs) {
|
|
35
|
+
const preference = resolveDriverPreference(process.env.ZAPQL_DRIVER);
|
|
36
|
+
const nativeAvailable = isNativeDriverAvailable();
|
|
37
|
+
const shouldAutoSelectNative = preference === 'auto' &&
|
|
38
|
+
nativeAvailable &&
|
|
39
|
+
connectionStringPrefersNative(connectionString);
|
|
40
|
+
if (preference === 'native' || shouldAutoSelectNative) {
|
|
41
|
+
if (!nativeAvailable) {
|
|
42
|
+
throw new Error('ZAPQL_DRIVER is set to native but msnodesqlv8 is not installed. Install msnodesqlv8 or set ZAPQL_DRIVER=tedious.');
|
|
43
|
+
}
|
|
44
|
+
return new native_sql_server_driver_1.NativeSQLServerDriver(connectionString, databaseName, timeoutMs);
|
|
45
|
+
}
|
|
46
|
+
return new sql_server_driver_1.SQLServerDriver(connectionString, databaseName, timeoutMs);
|
|
47
|
+
}
|
|
48
|
+
function parseConnectionString(connectionString) {
|
|
49
|
+
const parsed = new Map();
|
|
50
|
+
const segments = connectionString.split(';').map((segment) => segment.trim()).filter(Boolean);
|
|
51
|
+
for (const segment of segments) {
|
|
52
|
+
const index = segment.indexOf('=');
|
|
53
|
+
if (index === -1) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const key = segment.slice(0, index).trim().toLowerCase();
|
|
57
|
+
const value = segment.slice(index + 1).trim().toLowerCase();
|
|
58
|
+
if (!key) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
parsed.set(key, value);
|
|
62
|
+
}
|
|
63
|
+
return parsed;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=driver-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver-factory.js","sourceRoot":"","sources":["../../src/database/driver-factory.ts"],"names":[],"mappings":";;AAOA,0DAMC;AAED,sEAQC;AAED,0DAOC;AAED,sDAmBC;AArDD,yEAAmE;AACnE,2DAAsD;AAItD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAE1D,SAAgB,uBAAuB,CAAC,QAA4B;IAClE,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACnE,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACxD,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,6BAA6B,CAAC,gBAAwB;IACpE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IACzD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC7D,MAAM,kBAAkB,GAAG,QAAQ,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAE/D,MAAM,cAAc,GAAG,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3F,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAChG,OAAO,cAAc,IAAI,iBAAiB,CAAC;AAC7C,CAAC;AAED,SAAgB,uBAAuB;IACrC,IAAI,CAAC;QACH,OAAO,CAAC,aAAa,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,qBAAqB,CACnC,gBAAwB,EACxB,YAAqB,EACrB,SAAkB;IAElB,MAAM,UAAU,GAAG,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACrE,MAAM,eAAe,GAAG,uBAAuB,EAAE,CAAC;IAClD,MAAM,sBAAsB,GAAG,UAAU,KAAK,MAAM;QAClD,eAAe;QACf,6BAA6B,CAAC,gBAAgB,CAAC,CAAC;IAElD,IAAI,UAAU,KAAK,QAAQ,IAAI,sBAAsB,EAAE,CAAC;QACtD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,kHAAkH,CAAC,CAAC;QACtI,CAAC;QACD,OAAO,IAAI,gDAAqB,CAAC,gBAAgB,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,IAAI,mCAAe,CAAC,gBAAgB,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,qBAAqB,CAAC,gBAAwB;IACrD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE9F,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,SAAS;QACX,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ConnectionPool, config } from 'mssql';
|
|
2
|
+
import { SQLServerDriver } from './sql-server-driver';
|
|
3
|
+
import type { ConnectionInfo, ConnectionStatus, QueryResult, SQLDriverType } from './sql-driver';
|
|
4
|
+
export declare class NativeSQLServerDriver extends SQLServerDriver {
|
|
5
|
+
private nativeModule;
|
|
6
|
+
private nativeConnection;
|
|
7
|
+
private readonly nativeConnectionString;
|
|
8
|
+
private connected;
|
|
9
|
+
protected readonly timeoutMs: number;
|
|
10
|
+
constructor(connectionString: string, databaseName?: string, timeoutMs?: number);
|
|
11
|
+
getDriverType(): SQLDriverType;
|
|
12
|
+
getPool(): ConnectionPool | null;
|
|
13
|
+
getConnectionConfig(): config;
|
|
14
|
+
connect(): Promise<ConnectionStatus>;
|
|
15
|
+
disconnect(): Promise<void>;
|
|
16
|
+
executeQuery<T = any>(sql: string, parameters?: Record<string, any>): Promise<QueryResult<T>>;
|
|
17
|
+
getConnectionInfo(): Promise<ConnectionInfo>;
|
|
18
|
+
isConnected(): boolean;
|
|
19
|
+
private getNativeModule;
|
|
20
|
+
private ensureConnected;
|
|
21
|
+
private runNativeQuery;
|
|
22
|
+
private runModuleQuery;
|
|
23
|
+
private normalizeQueryResult;
|
|
24
|
+
private bindNamedParameters;
|
|
25
|
+
private buildNativeConnectionString;
|
|
26
|
+
}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NativeSQLServerDriver = void 0;
|
|
4
|
+
const sql_server_driver_1 = require("./sql-server-driver");
|
|
5
|
+
class NativeSQLServerDriver extends sql_server_driver_1.SQLServerDriver {
|
|
6
|
+
nativeModule = null;
|
|
7
|
+
nativeConnection = null;
|
|
8
|
+
nativeConnectionString;
|
|
9
|
+
connected = false;
|
|
10
|
+
timeoutMs;
|
|
11
|
+
constructor(connectionString, databaseName, timeoutMs) {
|
|
12
|
+
super(connectionString, databaseName, timeoutMs);
|
|
13
|
+
this.nativeConnectionString = this.buildNativeConnectionString(connectionString, databaseName, timeoutMs);
|
|
14
|
+
this.timeoutMs = timeoutMs ?? 30000;
|
|
15
|
+
}
|
|
16
|
+
getDriverType() {
|
|
17
|
+
return 'native';
|
|
18
|
+
}
|
|
19
|
+
getPool() {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
getConnectionConfig() {
|
|
23
|
+
return super.getConnectionConfig();
|
|
24
|
+
}
|
|
25
|
+
async connect() {
|
|
26
|
+
try {
|
|
27
|
+
await this.ensureConnected();
|
|
28
|
+
const serverInfo = await this.fetchServerInfo();
|
|
29
|
+
return {
|
|
30
|
+
connected: true,
|
|
31
|
+
message: 'Successfully connected to SQL Server using native Windows auth driver',
|
|
32
|
+
serverInfo
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
const message = this.wrapSqlError(error, 'Failed to connect to SQL Server (native driver)');
|
|
37
|
+
this.connected = false;
|
|
38
|
+
this.nativeConnection = null;
|
|
39
|
+
return {
|
|
40
|
+
connected: false,
|
|
41
|
+
message
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async disconnect() {
|
|
46
|
+
const connection = this.nativeConnection;
|
|
47
|
+
this.nativeConnection = null;
|
|
48
|
+
this.connected = false;
|
|
49
|
+
if (!connection?.close) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
await new Promise((resolve) => {
|
|
53
|
+
try {
|
|
54
|
+
connection.close(() => resolve());
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
resolve();
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async executeQuery(sql, parameters) {
|
|
62
|
+
if (!this.connected) {
|
|
63
|
+
throw new Error('Not connected to database. Call connect() first.');
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
const { sqlText, values } = this.bindNamedParameters(sql, parameters);
|
|
67
|
+
const rawResult = await this.runNativeQuery(sqlText, values);
|
|
68
|
+
return this.normalizeQueryResult(rawResult);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
throw new Error(this.wrapSqlError(error, 'Failed to execute query (native driver)'));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async getConnectionInfo() {
|
|
75
|
+
if (!this.connected) {
|
|
76
|
+
return { connected: false };
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
const serverInfo = await this.fetchServerInfo();
|
|
80
|
+
return { ...serverInfo, connected: true };
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return { connected: false };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
isConnected() {
|
|
87
|
+
return this.connected;
|
|
88
|
+
}
|
|
89
|
+
getNativeModule() {
|
|
90
|
+
if (this.nativeModule) {
|
|
91
|
+
return this.nativeModule;
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
// Optional dependency loaded lazily so non-Windows installs still work.
|
|
95
|
+
const loaded = require('msnodesqlv8');
|
|
96
|
+
if (!loaded || (typeof loaded.query !== 'function' && typeof loaded.Connection !== 'function')) {
|
|
97
|
+
throw new Error('msnodesqlv8 module does not expose expected query APIs');
|
|
98
|
+
}
|
|
99
|
+
this.nativeModule = loaded;
|
|
100
|
+
return loaded;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
const baseMessage = 'Native SQL Server driver requested but msnodesqlv8 is not available.';
|
|
104
|
+
throw new Error(`${baseMessage} Install msnodesqlv8 or set ZAPQL_DRIVER=tedious. (${error.message})`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async ensureConnected() {
|
|
108
|
+
if (this.connected) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const moduleRef = this.getNativeModule();
|
|
112
|
+
if (typeof moduleRef.Connection === 'function') {
|
|
113
|
+
const connection = new moduleRef.Connection();
|
|
114
|
+
await new Promise((resolve, reject) => {
|
|
115
|
+
if (typeof connection.open !== 'function') {
|
|
116
|
+
reject(new Error('Native connection object does not support open()'));
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
connection.open(this.nativeConnectionString, (error) => {
|
|
121
|
+
if (error) {
|
|
122
|
+
reject(error);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
resolve();
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
reject(error);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
this.nativeConnection = connection;
|
|
133
|
+
this.connected = true;
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// Fallback to one-shot query mode if persistent connections are unavailable.
|
|
137
|
+
await this.runModuleQuery('SELECT 1 AS Connected', []);
|
|
138
|
+
this.connected = true;
|
|
139
|
+
}
|
|
140
|
+
async runNativeQuery(sql, params) {
|
|
141
|
+
if (this.nativeConnection && (typeof this.nativeConnection.query === 'function' || typeof this.nativeConnection.queryRaw === 'function')) {
|
|
142
|
+
const queryFn = this.nativeConnection.queryRaw || this.nativeConnection.query;
|
|
143
|
+
return new Promise((resolve, reject) => {
|
|
144
|
+
const callback = (error, result) => {
|
|
145
|
+
if (error) {
|
|
146
|
+
reject(error);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
resolve(result ?? []);
|
|
150
|
+
};
|
|
151
|
+
try {
|
|
152
|
+
if (params.length > 0) {
|
|
153
|
+
queryFn.call(this.nativeConnection, sql, params, callback);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
queryFn.call(this.nativeConnection, sql, callback);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
reject(error);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return this.runModuleQuery(sql, params);
|
|
165
|
+
}
|
|
166
|
+
async runModuleQuery(sql, params) {
|
|
167
|
+
const moduleRef = this.getNativeModule();
|
|
168
|
+
const queryFn = moduleRef.queryRaw || moduleRef.query;
|
|
169
|
+
if (typeof queryFn !== 'function') {
|
|
170
|
+
throw new Error('msnodesqlv8 query() API is unavailable');
|
|
171
|
+
}
|
|
172
|
+
return new Promise((resolve, reject) => {
|
|
173
|
+
const callback = (error, result) => {
|
|
174
|
+
if (error) {
|
|
175
|
+
reject(error);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
resolve(result ?? []);
|
|
179
|
+
};
|
|
180
|
+
try {
|
|
181
|
+
if (params.length > 0) {
|
|
182
|
+
queryFn(this.nativeConnectionString, sql, params, callback);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
queryFn(this.nativeConnectionString, sql, callback);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
reject(error);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
normalizeQueryResult(rawResult) {
|
|
194
|
+
let recordsets;
|
|
195
|
+
if (rawResult && Array.isArray(rawResult.recordsets)) {
|
|
196
|
+
recordsets = rawResult.recordsets;
|
|
197
|
+
}
|
|
198
|
+
else if (Array.isArray(rawResult) && rawResult.length > 0 && Array.isArray(rawResult[0])) {
|
|
199
|
+
recordsets = rawResult;
|
|
200
|
+
}
|
|
201
|
+
else if (Array.isArray(rawResult)) {
|
|
202
|
+
recordsets = [rawResult];
|
|
203
|
+
}
|
|
204
|
+
else if (rawResult && Array.isArray(rawResult.recordset)) {
|
|
205
|
+
recordsets = [rawResult.recordset];
|
|
206
|
+
}
|
|
207
|
+
else if (rawResult && Array.isArray(rawResult.rows)) {
|
|
208
|
+
recordsets = [rawResult.rows];
|
|
209
|
+
}
|
|
210
|
+
else if (rawResult && typeof rawResult === 'object') {
|
|
211
|
+
recordsets = [[rawResult]];
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
recordsets = [[]];
|
|
215
|
+
}
|
|
216
|
+
const recordset = recordsets[0] || [];
|
|
217
|
+
const rowsAffected = Array.isArray(rawResult?.rowsAffected)
|
|
218
|
+
? rawResult.rowsAffected
|
|
219
|
+
: [Array.isArray(recordset) ? recordset.length : 0];
|
|
220
|
+
return {
|
|
221
|
+
recordsets,
|
|
222
|
+
recordset,
|
|
223
|
+
rowsAffected,
|
|
224
|
+
output: rawResult?.output ?? {}
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
bindNamedParameters(sql, parameters) {
|
|
228
|
+
if (!parameters || Object.keys(parameters).length === 0) {
|
|
229
|
+
return { sqlText: sql, values: [] };
|
|
230
|
+
}
|
|
231
|
+
const values = [];
|
|
232
|
+
const missing = new Set();
|
|
233
|
+
const sqlText = sql.replace(/(^|[^@])@([A-Za-z_][A-Za-z0-9_]*)/g, (_match, prefix, name) => {
|
|
234
|
+
if (!Object.prototype.hasOwnProperty.call(parameters, name)) {
|
|
235
|
+
missing.add(name);
|
|
236
|
+
return `${prefix}@${name}`;
|
|
237
|
+
}
|
|
238
|
+
values.push(parameters[name]);
|
|
239
|
+
return `${prefix}?`;
|
|
240
|
+
});
|
|
241
|
+
if (missing.size > 0) {
|
|
242
|
+
throw new Error(`Missing SQL parameter value(s): ${Array.from(missing).join(', ')}`);
|
|
243
|
+
}
|
|
244
|
+
return { sqlText, values };
|
|
245
|
+
}
|
|
246
|
+
buildNativeConnectionString(connectionString, databaseName, timeoutMs) {
|
|
247
|
+
const timeoutSeconds = Math.max(1, Math.ceil((timeoutMs ?? 30000) / 1000));
|
|
248
|
+
const entries = connectionString
|
|
249
|
+
.split(';')
|
|
250
|
+
.map((part) => part.trim())
|
|
251
|
+
.filter(Boolean)
|
|
252
|
+
.map((part) => {
|
|
253
|
+
const index = part.indexOf('=');
|
|
254
|
+
if (index === -1) {
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
key: part.slice(0, index).trim(),
|
|
259
|
+
value: part.slice(index + 1).trim()
|
|
260
|
+
};
|
|
261
|
+
})
|
|
262
|
+
.filter((entry) => entry !== null);
|
|
263
|
+
const indexByKey = new Map();
|
|
264
|
+
entries.forEach((entry, idx) => indexByKey.set(entry.key.toLowerCase(), idx));
|
|
265
|
+
if (databaseName) {
|
|
266
|
+
const dbKeys = ['database', 'initial catalog'];
|
|
267
|
+
const existingDbIndex = dbKeys
|
|
268
|
+
.map((key) => indexByKey.get(key))
|
|
269
|
+
.find((index) => index !== undefined);
|
|
270
|
+
if (existingDbIndex !== undefined) {
|
|
271
|
+
entries[existingDbIndex].value = databaseName;
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
entries.push({ key: 'Database', value: databaseName });
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
if (!indexByKey.has('driver')) {
|
|
278
|
+
entries.push({ key: 'Driver', value: '{ODBC Driver 18 for SQL Server}' });
|
|
279
|
+
}
|
|
280
|
+
if (!indexByKey.has('connection timeout')) {
|
|
281
|
+
entries.push({ key: 'Connection Timeout', value: String(timeoutSeconds) });
|
|
282
|
+
}
|
|
283
|
+
return `${entries.map((entry) => `${entry.key}=${entry.value}`).join(';')};`;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
exports.NativeSQLServerDriver = NativeSQLServerDriver;
|
|
287
|
+
//# sourceMappingURL=native-sql-server-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-sql-server-driver.js","sourceRoot":"","sources":["../../src/database/native-sql-server-driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ConnectionPool, config, IRecordSet } from 'mssql';
|
|
2
|
+
export type SQLDriverType = 'tedious' | 'native';
|
|
3
|
+
export interface ConnectionStatus {
|
|
4
|
+
connected: boolean;
|
|
5
|
+
message: string;
|
|
6
|
+
serverInfo?: {
|
|
7
|
+
serverName?: string;
|
|
8
|
+
databaseName?: string;
|
|
9
|
+
version?: string;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export interface ConnectionInfo {
|
|
13
|
+
serverName?: string;
|
|
14
|
+
databaseName?: string;
|
|
15
|
+
version?: string;
|
|
16
|
+
connected: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface QueryResult<T = any> {
|
|
19
|
+
recordsets: IRecordSet<T>[];
|
|
20
|
+
recordset: IRecordSet<T>;
|
|
21
|
+
rowsAffected: number[];
|
|
22
|
+
output: any;
|
|
23
|
+
}
|
|
24
|
+
export interface SQLDriver {
|
|
25
|
+
getDriverType(): SQLDriverType;
|
|
26
|
+
getPool(): ConnectionPool | null;
|
|
27
|
+
getConnectionConfig(): config;
|
|
28
|
+
connect(): Promise<ConnectionStatus>;
|
|
29
|
+
disconnect(): Promise<void>;
|
|
30
|
+
executeQuery<T = any>(sql: string, parameters?: Record<string, any>): Promise<QueryResult<T>>;
|
|
31
|
+
getConnectionInfo(): Promise<ConnectionInfo>;
|
|
32
|
+
isConnected(): boolean;
|
|
33
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-driver.js","sourceRoot":"","sources":["../../src/database/sql-driver.ts"],"names":[],"mappings":""}
|
|
@@ -1,31 +1,16 @@
|
|
|
1
|
-
import { ConnectionPool, config
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
message: string;
|
|
5
|
-
serverInfo?: {
|
|
6
|
-
serverName?: string;
|
|
7
|
-
databaseName?: string;
|
|
8
|
-
version?: string;
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
export interface ConnectionInfo {
|
|
12
|
-
serverName?: string;
|
|
13
|
-
databaseName?: string;
|
|
14
|
-
version?: string;
|
|
15
|
-
connected: boolean;
|
|
16
|
-
}
|
|
17
|
-
export interface QueryResult<T = any> {
|
|
18
|
-
recordsets: IRecordSet<T>[];
|
|
19
|
-
recordset: IRecordSet<T>;
|
|
20
|
-
rowsAffected: number[];
|
|
21
|
-
output: any;
|
|
22
|
-
}
|
|
1
|
+
import { ConnectionPool, config } from 'mssql';
|
|
2
|
+
import type { ConnectionInfo, ConnectionStatus, QueryResult, SQLDriverType } from './sql-driver';
|
|
3
|
+
export type { ConnectionInfo, ConnectionStatus, QueryResult } from './sql-driver';
|
|
23
4
|
export declare class SQLServerDriver {
|
|
24
5
|
private pool;
|
|
25
6
|
private connectionString;
|
|
26
7
|
private databaseName?;
|
|
27
|
-
|
|
8
|
+
protected timeoutMs: number;
|
|
28
9
|
constructor(connectionString: string, databaseName?: string, timeoutMs?: number);
|
|
10
|
+
/**
|
|
11
|
+
* Driver implementation type
|
|
12
|
+
*/
|
|
13
|
+
getDriverType(): SQLDriverType;
|
|
29
14
|
/**
|
|
30
15
|
* Get the active connection pool (if connected)
|
|
31
16
|
*/
|
|
@@ -66,13 +51,17 @@ export declare class SQLServerDriver {
|
|
|
66
51
|
/**
|
|
67
52
|
* Fetch server information safely
|
|
68
53
|
*/
|
|
69
|
-
|
|
54
|
+
protected fetchServerInfo(): Promise<{
|
|
55
|
+
serverName?: string;
|
|
56
|
+
databaseName?: string;
|
|
57
|
+
version?: string;
|
|
58
|
+
}>;
|
|
70
59
|
/**
|
|
71
60
|
* Wrap SQL errors with descriptive messages while avoiding credential exposure
|
|
72
61
|
*/
|
|
73
|
-
|
|
62
|
+
protected wrapSqlError(error: any, context: string): string;
|
|
74
63
|
/**
|
|
75
64
|
* Check if a string might contain credentials (basic heuristic)
|
|
76
65
|
*/
|
|
77
|
-
|
|
66
|
+
protected containsCredentials(text: string): boolean;
|
|
78
67
|
}
|
|
@@ -14,6 +14,12 @@ class SQLServerDriver {
|
|
|
14
14
|
this.timeoutMs = timeoutMs;
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Driver implementation type
|
|
19
|
+
*/
|
|
20
|
+
getDriverType() {
|
|
21
|
+
return 'tedious';
|
|
22
|
+
}
|
|
17
23
|
/**
|
|
18
24
|
* Get the active connection pool (if connected)
|
|
19
25
|
*/
|
|
@@ -141,18 +147,41 @@ class SQLServerDriver {
|
|
|
141
147
|
*/
|
|
142
148
|
parseConnectionString(connectionString) {
|
|
143
149
|
const parsedConfig = {};
|
|
150
|
+
let domain;
|
|
151
|
+
let port;
|
|
144
152
|
// Handle different connection string formats
|
|
145
153
|
if (connectionString.includes('=')) {
|
|
146
154
|
// Key-value pair format: Server=..;Database=..;
|
|
147
155
|
const pairs = connectionString.split(';').filter(pair => pair.trim());
|
|
148
156
|
for (const pair of pairs) {
|
|
149
|
-
const
|
|
157
|
+
const eqIndex = pair.indexOf('=');
|
|
158
|
+
if (eqIndex === -1)
|
|
159
|
+
continue;
|
|
160
|
+
const key = pair.substring(0, eqIndex).trim();
|
|
161
|
+
const value = pair.substring(eqIndex + 1).trim();
|
|
150
162
|
if (!key || !value)
|
|
151
163
|
continue;
|
|
152
164
|
switch (key.toLowerCase()) {
|
|
153
165
|
case 'server':
|
|
154
166
|
case 'data source':
|
|
155
|
-
|
|
167
|
+
// Handle comma-port format: server,port (ODBC style)
|
|
168
|
+
if (value.includes(',')) {
|
|
169
|
+
const parts = value.split(',');
|
|
170
|
+
parsedConfig.server = parts[0].trim();
|
|
171
|
+
const parsedPort = parseInt(parts[1].trim(), 10);
|
|
172
|
+
if (!isNaN(parsedPort)) {
|
|
173
|
+
port = parsedPort;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
parsedConfig.server = value;
|
|
178
|
+
}
|
|
179
|
+
break;
|
|
180
|
+
case 'port':
|
|
181
|
+
const parsedPortVal = parseInt(value, 10);
|
|
182
|
+
if (!isNaN(parsedPortVal)) {
|
|
183
|
+
port = parsedPortVal;
|
|
184
|
+
}
|
|
156
185
|
break;
|
|
157
186
|
case 'database':
|
|
158
187
|
case 'initial catalog':
|
|
@@ -166,9 +195,12 @@ class SQLServerDriver {
|
|
|
166
195
|
case 'pwd':
|
|
167
196
|
parsedConfig.password = value;
|
|
168
197
|
break;
|
|
198
|
+
case 'domain':
|
|
199
|
+
domain = value;
|
|
200
|
+
break;
|
|
169
201
|
case 'trusted_connection':
|
|
170
202
|
case 'integrated security':
|
|
171
|
-
if (value.toLowerCase() === 'true' || value.toLowerCase() === 'sspi') {
|
|
203
|
+
if (value.toLowerCase() === 'true' || value.toLowerCase() === 'yes' || value.toLowerCase() === 'sspi') {
|
|
172
204
|
parsedConfig.options = { ...parsedConfig.options, trustedConnection: true };
|
|
173
205
|
}
|
|
174
206
|
break;
|
|
@@ -176,10 +208,12 @@ class SQLServerDriver {
|
|
|
176
208
|
parsedConfig.options = { ...parsedConfig.options, encrypt: value.toLowerCase() === 'true' };
|
|
177
209
|
break;
|
|
178
210
|
case 'trustservercertificate':
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
211
|
+
if (value.toLowerCase() === 'true' || value.toLowerCase() === 'yes') {
|
|
212
|
+
parsedConfig.options = {
|
|
213
|
+
...parsedConfig.options,
|
|
214
|
+
trustServerCertificate: true
|
|
215
|
+
};
|
|
216
|
+
}
|
|
183
217
|
break;
|
|
184
218
|
}
|
|
185
219
|
}
|
|
@@ -198,6 +232,14 @@ class SQLServerDriver {
|
|
|
198
232
|
trustServerCertificate: false,
|
|
199
233
|
...parsedConfig.options,
|
|
200
234
|
};
|
|
235
|
+
// Set port if parsed from connection string
|
|
236
|
+
if (port) {
|
|
237
|
+
parsedConfig.port = port;
|
|
238
|
+
}
|
|
239
|
+
// Configure domain authentication (NTLM) for Windows auth
|
|
240
|
+
if (domain) {
|
|
241
|
+
parsedConfig.domain = domain;
|
|
242
|
+
}
|
|
201
243
|
return {
|
|
202
244
|
server: parsedConfig.server,
|
|
203
245
|
...parsedConfig,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-server-driver.js","sourceRoot":"","sources":["../../src/database/sql-server-driver.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"sql-server-driver.js","sourceRoot":"","sources":["../../src/database/sql-server-driver.ts"],"names":[],"mappings":"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"}
|