@conte777/db-view-mcp 1.0.0 → 1.2.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 (47) hide show
  1. package/config.example.json +15 -3
  2. package/dist/config/loader.d.ts +1 -0
  3. package/dist/config/loader.js +25 -1
  4. package/dist/config/loader.js.map +1 -1
  5. package/dist/config/types.d.ts +53 -15
  6. package/dist/config/types.js +31 -14
  7. package/dist/config/types.js.map +1 -1
  8. package/dist/connectors/clickhouse.d.ts +2 -2
  9. package/dist/connectors/clickhouse.js +14 -3
  10. package/dist/connectors/clickhouse.js.map +1 -1
  11. package/dist/connectors/instrumented.d.ts +18 -0
  12. package/dist/connectors/instrumented.js +52 -0
  13. package/dist/connectors/instrumented.js.map +1 -0
  14. package/dist/connectors/interface.d.ts +2 -2
  15. package/dist/connectors/manager.d.ts +11 -0
  16. package/dist/connectors/manager.js +81 -5
  17. package/dist/connectors/manager.js.map +1 -1
  18. package/dist/connectors/postgresql.d.ts +2 -2
  19. package/dist/connectors/postgresql.js +57 -19
  20. package/dist/connectors/postgresql.js.map +1 -1
  21. package/dist/index.js +75 -16
  22. package/dist/index.js.map +1 -1
  23. package/dist/server.js.map +1 -1
  24. package/dist/tools/readonly/explain.d.ts +2 -0
  25. package/dist/tools/readonly/explain.js +2 -1
  26. package/dist/tools/readonly/explain.js.map +1 -1
  27. package/dist/tools/readonly/performance.d.ts +1 -2
  28. package/dist/tools/readonly/performance.js +7 -9
  29. package/dist/tools/readonly/performance.js.map +1 -1
  30. package/dist/tools/readonly/schema.d.ts +2 -0
  31. package/dist/tools/readonly/schema.js +2 -1
  32. package/dist/tools/readonly/schema.js.map +1 -1
  33. package/dist/tools/registry.d.ts +1 -1
  34. package/dist/tools/registry.js +2 -2
  35. package/dist/tools/registry.js.map +1 -1
  36. package/dist/tools/write/transaction.d.ts +18 -0
  37. package/dist/tools/write/transaction.js +70 -13
  38. package/dist/tools/write/transaction.js.map +1 -1
  39. package/dist/transport/http.d.ts +2 -0
  40. package/dist/transport/http.js +28 -14
  41. package/dist/transport/http.js.map +1 -1
  42. package/dist/utils/logger.d.ts +15 -0
  43. package/dist/utils/logger.js +52 -0
  44. package/dist/utils/logger.js.map +1 -0
  45. package/dist/utils/sql-validator.js +39 -10
  46. package/dist/utils/sql-validator.js.map +1 -1
  47. package/package.json +15 -3
@@ -24,18 +24,30 @@
24
24
  "database": "myapp",
25
25
  "user": "admin",
26
26
  "password": "secret123",
27
- "description": "Main PostgreSQL",
27
+ "ssl": true,
28
+ "sslCa": "/path/to/ca-certificate.pem",
29
+ "description": "Main PostgreSQL (host-based)",
28
30
  "lazyConnection": true,
29
31
  "maxRows": 200
30
32
  },
33
+ {
34
+ "id": "main_pg_connstr",
35
+ "type": "postgresql",
36
+ "connectionString": "postgresql://admin:secret123@localhost:5432/myapp?sslmode=require",
37
+ "description": "Main PostgreSQL (connection string)"
38
+ },
31
39
  {
32
40
  "id": "analytics",
33
41
  "type": "clickhouse",
34
- "url": "http://localhost:8123",
42
+ "url": "https://localhost:8443",
35
43
  "database": "analytics",
36
44
  "user": "default",
37
45
  "password": "",
38
- "description": "ClickHouse analytics"
46
+ "tls": {
47
+ "ca": "/path/to/ca-certificate.pem",
48
+ "rejectUnauthorized": true
49
+ },
50
+ "description": "ClickHouse analytics with TLS"
39
51
  }
40
52
  ]
41
53
  }
@@ -1,4 +1,5 @@
1
1
  import { type AppConfig } from "./types.js";
2
+ export declare function resolveEnvVariables(obj: unknown): unknown;
2
3
  export declare function loadConfig(configPath: string): AppConfig;
3
4
  export declare function parseCliArgs(args: string[]): {
4
5
  configPath: string;
@@ -1,11 +1,35 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import { resolve } from "node:path";
3
3
  import { AppConfigSchema } from "./types.js";
4
+ const ENV_VAR_PATTERN = /\$\{([^}]+)\}/g;
5
+ export function resolveEnvVariables(obj) {
6
+ if (typeof obj === "string") {
7
+ return obj.replace(ENV_VAR_PATTERN, (match, varName) => {
8
+ const value = process.env[varName];
9
+ if (value === undefined) {
10
+ throw new Error(`Environment variable "${varName}" is not defined (referenced as "${match}")`);
11
+ }
12
+ return value;
13
+ });
14
+ }
15
+ if (Array.isArray(obj)) {
16
+ return obj.map((item) => resolveEnvVariables(item));
17
+ }
18
+ if (obj !== null && typeof obj === "object") {
19
+ const result = {};
20
+ for (const [key, value] of Object.entries(obj)) {
21
+ result[key] = resolveEnvVariables(value);
22
+ }
23
+ return result;
24
+ }
25
+ return obj;
26
+ }
4
27
  export function loadConfig(configPath) {
5
28
  const absolutePath = resolve(configPath);
6
29
  const raw = readFileSync(absolutePath, "utf-8");
7
30
  const json = JSON.parse(raw);
8
- return AppConfigSchema.parse(json);
31
+ const resolved = resolveEnvVariables(json);
32
+ return AppConfigSchema.parse(resolved);
9
33
  }
10
34
  export function parseCliArgs(args) {
11
35
  const configIndex = args.indexOf("--config");
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAkB,MAAM,YAAY,CAAC;AAE7D,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,MAAM,GAAyD;QACnE,UAAU,EAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;KAClC,CAAC;IAEF,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACnD,IAAI,cAAc,KAAK,CAAC,CAAC,IAAI,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,+BAA+B,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAkB,MAAM,YAAY,CAAC;AAE7D,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAEzC,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;YAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,oCAAoC,KAAK,IAAI,CAAC,CAAC;YACjG,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,MAAM,GAAyD;QACnE,UAAU,EAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;KAClC,CAAC;IAEF,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACnD,IAAI,cAAc,KAAK,CAAC,CAAC,IAAI,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,+BAA+B,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,13 +1,16 @@
1
1
  import { z } from "zod";
2
- declare const PostgresConfigSchema: z.ZodObject<{
2
+ declare const PostgresConfigBaseSchema: z.ZodObject<{
3
3
  id: z.ZodString;
4
4
  type: z.ZodLiteral<"postgresql">;
5
- host: z.ZodString;
5
+ connectionString: z.ZodOptional<z.ZodString>;
6
+ host: z.ZodOptional<z.ZodString>;
6
7
  port: z.ZodDefault<z.ZodNumber>;
7
- database: z.ZodString;
8
- user: z.ZodString;
8
+ database: z.ZodOptional<z.ZodString>;
9
+ user: z.ZodOptional<z.ZodString>;
9
10
  password: z.ZodDefault<z.ZodString>;
10
11
  ssl: z.ZodOptional<z.ZodBoolean>;
12
+ sslRejectUnauthorized: z.ZodDefault<z.ZodBoolean>;
13
+ sslCa: z.ZodOptional<z.ZodString>;
11
14
  description: z.ZodOptional<z.ZodString>;
12
15
  lazyConnection: z.ZodOptional<z.ZodBoolean>;
13
16
  maxRows: z.ZodOptional<z.ZodNumber>;
@@ -20,20 +23,27 @@ declare const ClickHouseConfigSchema: z.ZodObject<{
20
23
  database: z.ZodString;
21
24
  user: z.ZodDefault<z.ZodString>;
22
25
  password: z.ZodDefault<z.ZodString>;
26
+ tls: z.ZodOptional<z.ZodObject<{
27
+ ca: z.ZodOptional<z.ZodString>;
28
+ rejectUnauthorized: z.ZodDefault<z.ZodBoolean>;
29
+ }, z.core.$strip>>;
23
30
  description: z.ZodOptional<z.ZodString>;
24
31
  lazyConnection: z.ZodOptional<z.ZodBoolean>;
25
32
  maxRows: z.ZodOptional<z.ZodNumber>;
26
33
  queryTimeout: z.ZodOptional<z.ZodNumber>;
27
34
  }, z.core.$strip>;
28
- declare const DatabaseConfigSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
35
+ declare const DatabaseConfigSchema: z.ZodUnion<readonly [z.ZodObject<{
29
36
  id: z.ZodString;
30
37
  type: z.ZodLiteral<"postgresql">;
31
- host: z.ZodString;
38
+ connectionString: z.ZodOptional<z.ZodString>;
39
+ host: z.ZodOptional<z.ZodString>;
32
40
  port: z.ZodDefault<z.ZodNumber>;
33
- database: z.ZodString;
34
- user: z.ZodString;
41
+ database: z.ZodOptional<z.ZodString>;
42
+ user: z.ZodOptional<z.ZodString>;
35
43
  password: z.ZodDefault<z.ZodString>;
36
44
  ssl: z.ZodOptional<z.ZodBoolean>;
45
+ sslRejectUnauthorized: z.ZodDefault<z.ZodBoolean>;
46
+ sslCa: z.ZodOptional<z.ZodString>;
37
47
  description: z.ZodOptional<z.ZodString>;
38
48
  lazyConnection: z.ZodOptional<z.ZodBoolean>;
39
49
  maxRows: z.ZodOptional<z.ZodNumber>;
@@ -45,22 +55,33 @@ declare const DatabaseConfigSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
45
55
  database: z.ZodString;
46
56
  user: z.ZodDefault<z.ZodString>;
47
57
  password: z.ZodDefault<z.ZodString>;
58
+ tls: z.ZodOptional<z.ZodObject<{
59
+ ca: z.ZodOptional<z.ZodString>;
60
+ rejectUnauthorized: z.ZodDefault<z.ZodBoolean>;
61
+ }, z.core.$strip>>;
48
62
  description: z.ZodOptional<z.ZodString>;
49
63
  lazyConnection: z.ZodOptional<z.ZodBoolean>;
50
64
  maxRows: z.ZodOptional<z.ZodNumber>;
51
65
  queryTimeout: z.ZodOptional<z.ZodNumber>;
52
- }, z.core.$strip>], "type">;
66
+ }, z.core.$strip>]>;
53
67
  declare const DefaultsSchema: z.ZodObject<{
54
68
  maxRows: z.ZodDefault<z.ZodNumber>;
55
69
  lazyConnection: z.ZodDefault<z.ZodBoolean>;
56
70
  toolsPerDatabase: z.ZodDefault<z.ZodBoolean>;
57
71
  queryTimeout: z.ZodDefault<z.ZodNumber>;
72
+ logLevel: z.ZodDefault<z.ZodEnum<{
73
+ debug: "debug";
74
+ info: "info";
75
+ warn: "warn";
76
+ error: "error";
77
+ }>>;
58
78
  }, z.core.$strip>;
59
79
  declare const HttpTransportConfigSchema: z.ZodObject<{
60
80
  type: z.ZodLiteral<"http">;
61
81
  port: z.ZodDefault<z.ZodNumber>;
62
82
  host: z.ZodDefault<z.ZodString>;
63
83
  stateless: z.ZodDefault<z.ZodBoolean>;
84
+ sessionTimeout: z.ZodDefault<z.ZodNumber>;
64
85
  auth: z.ZodOptional<z.ZodObject<{
65
86
  type: z.ZodLiteral<"bearer">;
66
87
  token: z.ZodString;
@@ -73,6 +94,7 @@ declare const TransportConfigSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
73
94
  port: z.ZodDefault<z.ZodNumber>;
74
95
  host: z.ZodDefault<z.ZodString>;
75
96
  stateless: z.ZodDefault<z.ZodBoolean>;
97
+ sessionTimeout: z.ZodDefault<z.ZodNumber>;
76
98
  auth: z.ZodOptional<z.ZodObject<{
77
99
  type: z.ZodLiteral<"bearer">;
78
100
  token: z.ZodString;
@@ -86,6 +108,7 @@ export declare const AppConfigSchema: z.ZodObject<{
86
108
  port: z.ZodDefault<z.ZodNumber>;
87
109
  host: z.ZodDefault<z.ZodString>;
88
110
  stateless: z.ZodDefault<z.ZodBoolean>;
111
+ sessionTimeout: z.ZodDefault<z.ZodNumber>;
89
112
  auth: z.ZodOptional<z.ZodObject<{
90
113
  type: z.ZodLiteral<"bearer">;
91
114
  token: z.ZodString;
@@ -96,26 +119,37 @@ export declare const AppConfigSchema: z.ZodObject<{
96
119
  lazyConnection: z.ZodDefault<z.ZodBoolean>;
97
120
  toolsPerDatabase: z.ZodDefault<z.ZodBoolean>;
98
121
  queryTimeout: z.ZodDefault<z.ZodNumber>;
122
+ logLevel: z.ZodDefault<z.ZodEnum<{
123
+ debug: "debug";
124
+ info: "info";
125
+ warn: "warn";
126
+ error: "error";
127
+ }>>;
99
128
  }, z.core.$strip>>, z.ZodTransform<{
100
129
  maxRows: number;
101
130
  lazyConnection: boolean;
102
131
  toolsPerDatabase: boolean;
103
132
  queryTimeout: number;
133
+ logLevel: "debug" | "info" | "warn" | "error";
104
134
  }, {
105
135
  maxRows: number;
106
136
  lazyConnection: boolean;
107
137
  toolsPerDatabase: boolean;
108
138
  queryTimeout: number;
139
+ logLevel: "debug" | "info" | "warn" | "error";
109
140
  } | undefined>>;
110
- databases: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
141
+ databases: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
111
142
  id: z.ZodString;
112
143
  type: z.ZodLiteral<"postgresql">;
113
- host: z.ZodString;
144
+ connectionString: z.ZodOptional<z.ZodString>;
145
+ host: z.ZodOptional<z.ZodString>;
114
146
  port: z.ZodDefault<z.ZodNumber>;
115
- database: z.ZodString;
116
- user: z.ZodString;
147
+ database: z.ZodOptional<z.ZodString>;
148
+ user: z.ZodOptional<z.ZodString>;
117
149
  password: z.ZodDefault<z.ZodString>;
118
150
  ssl: z.ZodOptional<z.ZodBoolean>;
151
+ sslRejectUnauthorized: z.ZodDefault<z.ZodBoolean>;
152
+ sslCa: z.ZodOptional<z.ZodString>;
119
153
  description: z.ZodOptional<z.ZodString>;
120
154
  lazyConnection: z.ZodOptional<z.ZodBoolean>;
121
155
  maxRows: z.ZodOptional<z.ZodNumber>;
@@ -127,13 +161,17 @@ export declare const AppConfigSchema: z.ZodObject<{
127
161
  database: z.ZodString;
128
162
  user: z.ZodDefault<z.ZodString>;
129
163
  password: z.ZodDefault<z.ZodString>;
164
+ tls: z.ZodOptional<z.ZodObject<{
165
+ ca: z.ZodOptional<z.ZodString>;
166
+ rejectUnauthorized: z.ZodDefault<z.ZodBoolean>;
167
+ }, z.core.$strip>>;
130
168
  description: z.ZodOptional<z.ZodString>;
131
169
  lazyConnection: z.ZodOptional<z.ZodBoolean>;
132
170
  maxRows: z.ZodOptional<z.ZodNumber>;
133
171
  queryTimeout: z.ZodOptional<z.ZodNumber>;
134
- }, z.core.$strip>], "type">>;
172
+ }, z.core.$strip>]>>;
135
173
  }, z.core.$strip>;
136
- export type PostgresConfig = z.infer<typeof PostgresConfigSchema>;
174
+ export type PostgresConfig = z.infer<typeof PostgresConfigBaseSchema>;
137
175
  export type ClickHouseConfig = z.infer<typeof ClickHouseConfigSchema>;
138
176
  export type DatabaseConfig = z.infer<typeof DatabaseConfigSchema>;
139
177
  export type Defaults = z.infer<typeof DefaultsSchema>;
@@ -1,18 +1,29 @@
1
1
  import { z } from "zod";
2
- const PostgresConfigSchema = z.object({
2
+ const PostgresConfigBaseSchema = z.object({
3
3
  id: z.string(),
4
4
  type: z.literal("postgresql"),
5
- host: z.string(),
5
+ connectionString: z.string().optional(),
6
+ host: z.string().optional(),
6
7
  port: z.number().default(5432),
7
- database: z.string(),
8
- user: z.string(),
8
+ database: z.string().optional(),
9
+ user: z.string().optional(),
9
10
  password: z.string().default(""),
10
11
  ssl: z.boolean().optional(),
12
+ sslRejectUnauthorized: z.boolean().default(true),
13
+ sslCa: z.string().optional(),
11
14
  description: z.string().optional(),
12
15
  lazyConnection: z.boolean().optional(),
13
16
  maxRows: z.number().optional(),
14
17
  queryTimeout: z.number().optional(),
15
18
  });
19
+ const PostgresConfigSchema = PostgresConfigBaseSchema.superRefine((data, ctx) => {
20
+ if (!data.connectionString && (!data.host || !data.database || !data.user)) {
21
+ ctx.addIssue({
22
+ code: "custom",
23
+ message: "Either 'connectionString' or 'host' + 'database' + 'user' must be provided",
24
+ });
25
+ }
26
+ });
16
27
  const ClickHouseConfigSchema = z.object({
17
28
  id: z.string(),
18
29
  type: z.literal("clickhouse"),
@@ -20,38 +31,43 @@ const ClickHouseConfigSchema = z.object({
20
31
  database: z.string(),
21
32
  user: z.string().default("default"),
22
33
  password: z.string().default(""),
34
+ tls: z
35
+ .object({
36
+ ca: z.string().optional(),
37
+ rejectUnauthorized: z.boolean().default(true),
38
+ })
39
+ .optional(),
23
40
  description: z.string().optional(),
24
41
  lazyConnection: z.boolean().optional(),
25
42
  maxRows: z.number().optional(),
26
43
  queryTimeout: z.number().optional(),
27
44
  });
28
- const DatabaseConfigSchema = z.discriminatedUnion("type", [
29
- PostgresConfigSchema,
30
- ClickHouseConfigSchema,
31
- ]);
45
+ const DatabaseConfigSchema = z.union([PostgresConfigSchema, ClickHouseConfigSchema]);
46
+ const LogLevelSchema = z.enum(["debug", "info", "warn", "error"]);
32
47
  const DefaultsSchema = z.object({
33
48
  maxRows: z.number().default(100),
34
49
  lazyConnection: z.boolean().default(true),
35
50
  toolsPerDatabase: z.boolean().default(false),
36
51
  queryTimeout: z.number().default(30000),
52
+ logLevel: LogLevelSchema.default("info"),
37
53
  });
38
54
  const HttpTransportConfigSchema = z.object({
39
55
  type: z.literal("http"),
40
56
  port: z.number().default(3000),
41
57
  host: z.string().default("127.0.0.1"),
42
58
  stateless: z.boolean().default(false),
43
- auth: z.object({
59
+ sessionTimeout: z.number().default(30 * 60 * 1000), // 30 minutes
60
+ auth: z
61
+ .object({
44
62
  type: z.literal("bearer"),
45
63
  token: z.string(),
46
- }).optional(),
64
+ })
65
+ .optional(),
47
66
  });
48
67
  const StdioTransportConfigSchema = z.object({
49
68
  type: z.literal("stdio"),
50
69
  });
51
- const TransportConfigSchema = z.discriminatedUnion("type", [
52
- StdioTransportConfigSchema,
53
- HttpTransportConfigSchema,
54
- ]);
70
+ const TransportConfigSchema = z.discriminatedUnion("type", [StdioTransportConfigSchema, HttpTransportConfigSchema]);
55
71
  export const AppConfigSchema = z.object({
56
72
  transport: TransportConfigSchema.optional().default({ type: "stdio" }),
57
73
  defaults: DefaultsSchema.optional().transform((v) => v ?? {
@@ -59,6 +75,7 @@ export const AppConfigSchema = z.object({
59
75
  lazyConnection: true,
60
76
  toolsPerDatabase: false,
61
77
  queryTimeout: 30000,
78
+ logLevel: "info",
62
79
  }),
63
80
  databases: z.array(DatabaseConfigSchema).min(1),
64
81
  });
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IAC7B,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAChC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC3B,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAChD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IAC9E,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3E,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,4EAA4E;SACtF,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IAC7B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IACnC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAChC,GAAG,EAAE,CAAC;SACH,MAAM,CAAC;QACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACzB,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;KAC9C,CAAC;SACD,QAAQ,EAAE;IACb,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC,CAAC;AAErF,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAElE,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IAChC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACzC,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC5C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACvC,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC;CACzC,CAAC,CAAC;AAEH,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;IACrC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACrC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,aAAa;IACjE,IAAI,EAAE,CAAC;SACJ,MAAM,CAAC;QACN,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACzB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;KAClB,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,0BAA0B,EAAE,yBAAyB,CAAC,CAAC,CAAC;AAEpH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,SAAS,EAAE,qBAAqB,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACtE,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE,CAAC,SAAS,CAC3C,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,IAAI;QACH,OAAO,EAAE,GAAG;QACZ,cAAc,EAAE,IAAI;QACpB,gBAAgB,EAAE,KAAK;QACvB,YAAY,EAAE,KAAK;QACnB,QAAQ,EAAE,MAAe;KAC1B,CACJ;IACD,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CAChD,CAAC,CAAC;AAgBH,MAAM,UAAU,eAAe,CAAC,EAAkB,EAAE,QAAkB;IACpE,OAAO;QACL,GAAG,EAAE;QACL,cAAc,EAAE,EAAE,CAAC,cAAc,IAAI,QAAQ,CAAC,cAAc;QAC5D,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;QACvC,YAAY,EAAE,EAAE,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY;KAC7B,CAAC;AAC9B,CAAC"}
@@ -14,7 +14,7 @@ export declare class ClickHouseConnector implements Connector {
14
14
  execute(sql: string, _params?: string[]): Promise<QueryResult>;
15
15
  listTables(_schema?: string): Promise<TableInfo[]>;
16
16
  describeTable(table: string, _schema?: string): Promise<ColumnInfo[]>;
17
- getSchema(): Promise<string>;
18
- explain(sql: string): Promise<ExplainResult>;
17
+ getSchema(_schema?: string): Promise<string>;
18
+ explain(sql: string, analyze?: boolean): Promise<ExplainResult>;
19
19
  beginTransaction(): Promise<TransactionHandle>;
20
20
  }
@@ -1,4 +1,5 @@
1
1
  import { createClient } from "@clickhouse/client";
2
+ import { readFileSync } from "node:fs";
2
3
  export class ClickHouseConnector {
3
4
  type = "clickhouse";
4
5
  client = null;
@@ -11,12 +12,21 @@ export class ClickHouseConnector {
11
12
  this.maxRows = maxRows;
12
13
  }
13
14
  async connect() {
15
+ const tlsConfig = this.config.tls?.ca
16
+ ? {
17
+ ca_cert: this.config.tls.ca.startsWith("-----BEGIN")
18
+ ? Buffer.from(this.config.tls.ca)
19
+ : readFileSync(this.config.tls.ca),
20
+ reject_unauthorized: this.config.tls.rejectUnauthorized,
21
+ }
22
+ : undefined;
14
23
  this.client = createClient({
15
24
  url: this.config.url,
16
25
  database: this.config.database,
17
26
  username: this.config.user,
18
27
  password: this.config.password,
19
28
  request_timeout: this.queryTimeout,
29
+ ...(tlsConfig && { tls: tlsConfig }),
20
30
  });
21
31
  await this.client.ping();
22
32
  }
@@ -72,7 +82,7 @@ export class ClickHouseConnector {
72
82
  isPrimaryKey: r.is_in_primary_key === 1,
73
83
  }));
74
84
  }
75
- async getSchema() {
85
+ async getSchema(_schema) {
76
86
  const result = await this.getClient().query({
77
87
  query: `SELECT name, create_table_query FROM system.tables WHERE database = currentDatabase()`,
78
88
  format: "JSONEachRow",
@@ -80,9 +90,10 @@ export class ClickHouseConnector {
80
90
  const rows = (await result.json());
81
91
  return rows.map((r) => r.create_table_query).join(";\n\n");
82
92
  }
83
- async explain(sql) {
93
+ async explain(sql, analyze = false) {
94
+ const prefix = analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
84
95
  const result = await this.getClient().query({
85
- query: `EXPLAIN ${sql}`,
96
+ query: `${prefix} ${sql}`,
86
97
  format: "JSONEachRow",
87
98
  });
88
99
  const rows = (await result.json());
@@ -1 +1 @@
1
- {"version":3,"file":"clickhouse.js","sourceRoot":"","sources":["../../src/connectors/clickhouse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clickhouse.js","sourceRoot":"","sources":["../../src/connectors/clickhouse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyB,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAIvC,MAAM,OAAO,mBAAmB;IACrB,IAAI,GAAG,YAAqB,CAAC;IAC9B,MAAM,GAA4B,IAAI,CAAC;IACvC,MAAM,CAAmB;IACzB,OAAO,CAAS;IAChB,YAAY,CAAS;IAE7B,YAAY,MAAwB,EAAE,YAAoB,EAAE,OAAe;QACzE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE;YACnC,CAAC,CAAC;gBACE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;oBAClD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;oBACjC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,kBAAkB;aACxD;YACH,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;YACzB,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;YACpB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YAC1B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,eAAe,EAAE,IAAI,CAAC,YAAY;YAClC,GAAG,CAAC,SAAS,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;SACrC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,OAAkB,EAAE,OAAgB;QAC3D,MAAM,KAAK,GAAG,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;QACtC,MAAM,UAAU,GAAG,kBAAkB,GAAG,iBAAiB,KAAK,EAAE,CAAC;QACjE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC1F,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAA8B,CAAC;QAChE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,OAAkB;QAC3C,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/C,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAgB;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC;YAC1C,KAAK,EAAE,yFAAyF;YAChG,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAuC,CAAC;QACzE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC5B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;SACnD,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,OAAgB;QACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC;YAC1C,KAAK,EAAE;;;gCAGmB;YAC1B,MAAM,EAAE,aAAa;YACrB,YAAY,EAAE,EAAE,KAAK,EAAE;SACxB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAM9B,CAAC;QACJ,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YACvC,YAAY,EAAE,CAAC,CAAC,kBAAkB,IAAI,IAAI;YAC1C,YAAY,EAAE,CAAC,CAAC,iBAAiB,KAAK,CAAC;SACxC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAgB;QAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC;YAC1C,KAAK,EAAE,uFAAuF;YAC9F,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAmD,CAAC;QACrF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,OAAO,GAAG,KAAK;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC;YAC1C,KAAK,EAAE,GAAG,MAAM,IAAI,GAAG,EAAE;YACzB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAA0B,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import type { Connector, QueryResult, TableInfo, ColumnInfo, ExplainResult, TransactionHandle } from "./interface.js";
2
+ import type { PerformanceTracker } from "../tools/readonly/performance.js";
3
+ export declare class InstrumentedConnector implements Connector {
4
+ private inner;
5
+ private tracker;
6
+ private dbId;
7
+ readonly type: "postgresql" | "clickhouse";
8
+ constructor(inner: Connector, tracker: PerformanceTracker, dbId: string);
9
+ connect(): Promise<void>;
10
+ disconnect(): Promise<void>;
11
+ query(sql: string, params?: string[], maxRows?: number): Promise<QueryResult>;
12
+ execute(sql: string, params?: string[]): Promise<QueryResult>;
13
+ listTables(schema?: string): Promise<TableInfo[]>;
14
+ describeTable(table: string, schema?: string): Promise<ColumnInfo[]>;
15
+ getSchema(schema?: string): Promise<string>;
16
+ explain(sql: string, analyze?: boolean): Promise<ExplainResult>;
17
+ beginTransaction(): Promise<TransactionHandle>;
18
+ }
@@ -0,0 +1,52 @@
1
+ export class InstrumentedConnector {
2
+ inner;
3
+ tracker;
4
+ dbId;
5
+ type;
6
+ constructor(inner, tracker, dbId) {
7
+ this.inner = inner;
8
+ this.tracker = tracker;
9
+ this.dbId = dbId;
10
+ this.type = inner.type;
11
+ }
12
+ connect() {
13
+ return this.inner.connect();
14
+ }
15
+ disconnect() {
16
+ return this.inner.disconnect();
17
+ }
18
+ async query(sql, params, maxRows) {
19
+ const start = performance.now();
20
+ try {
21
+ return await this.inner.query(sql, params, maxRows);
22
+ }
23
+ finally {
24
+ this.tracker.recordQuery(sql, performance.now() - start, this.dbId);
25
+ }
26
+ }
27
+ async execute(sql, params) {
28
+ const start = performance.now();
29
+ try {
30
+ return await this.inner.execute(sql, params);
31
+ }
32
+ finally {
33
+ this.tracker.recordQuery(sql, performance.now() - start, this.dbId);
34
+ }
35
+ }
36
+ listTables(schema) {
37
+ return this.inner.listTables(schema);
38
+ }
39
+ describeTable(table, schema) {
40
+ return this.inner.describeTable(table, schema);
41
+ }
42
+ getSchema(schema) {
43
+ return this.inner.getSchema(schema);
44
+ }
45
+ explain(sql, analyze) {
46
+ return this.inner.explain(sql, analyze);
47
+ }
48
+ beginTransaction() {
49
+ return this.inner.beginTransaction();
50
+ }
51
+ }
52
+ //# sourceMappingURL=instrumented.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumented.js","sourceRoot":"","sources":["../../src/connectors/instrumented.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,qBAAqB;IAItB;IACA;IACA;IALD,IAAI,CAA8B;IAE3C,YACU,KAAgB,EAChB,OAA2B,EAC3B,IAAY;QAFZ,UAAK,GAAL,KAAK,CAAW;QAChB,YAAO,GAAP,OAAO,CAAoB;QAC3B,SAAI,GAAJ,IAAI,CAAQ;QAEpB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,MAAiB,EAAE,OAAgB;QAC1D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,MAAiB;QAC1C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,UAAU,CAAC,MAAe;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,aAAa,CAAC,KAAa,EAAE,MAAe;QAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,SAAS,CAAC,MAAe;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,OAAiB;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;IACvC,CAAC;CACF"}
@@ -31,7 +31,7 @@ export interface Connector {
31
31
  execute(sql: string, params?: string[]): Promise<QueryResult>;
32
32
  listTables(schema?: string): Promise<TableInfo[]>;
33
33
  describeTable(table: string, schema?: string): Promise<ColumnInfo[]>;
34
- getSchema(): Promise<string>;
35
- explain(sql: string): Promise<ExplainResult>;
34
+ getSchema(schema?: string): Promise<string>;
35
+ explain(sql: string, analyze?: boolean): Promise<ExplainResult>;
36
36
  beginTransaction(): Promise<TransactionHandle>;
37
37
  }
@@ -1,14 +1,25 @@
1
1
  import type { Connector } from "./interface.js";
2
2
  import type { ResolvedDatabaseConfig } from "../config/types.js";
3
+ import { PerformanceTracker } from "../tools/readonly/performance.js";
3
4
  export declare class ConnectorManager {
4
5
  private configs;
5
6
  private connectors;
7
+ private rawConnectors;
8
+ private tracker;
6
9
  constructor(databases: ResolvedDatabaseConfig[]);
7
10
  getDatabaseIds(): string[];
8
11
  getConfig(dbId: string): ResolvedDatabaseConfig | undefined;
9
12
  getAllConfigs(): ResolvedDatabaseConfig[];
13
+ getPerformanceTracker(): PerformanceTracker;
10
14
  getConnector(dbId: string): Promise<Connector>;
15
+ withConnector<T>(dbId: string, fn: (connector: Connector) => Promise<T>): Promise<T>;
16
+ invalidateConnector(dbId: string): void;
11
17
  private createConnector;
18
+ updateDatabases(newConfigs: ResolvedDatabaseConfig[]): {
19
+ added: string[];
20
+ removed: string[];
21
+ changed: string[];
22
+ };
12
23
  connectEager(): Promise<void>;
13
24
  disconnectAll(): Promise<void>;
14
25
  }