agent-database-cli 0.2.7
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/AI_INSTALL.md +72 -0
- package/LICENSE +21 -0
- package/README.md +340 -0
- package/README_EN.md +341 -0
- package/SKILL.md +252 -0
- package/config/docker-test.json +40 -0
- package/dist/adapters/base-sql.d.ts +12 -0
- package/dist/adapters/base-sql.js +22 -0
- package/dist/adapters/base-sql.js.map +1 -0
- package/dist/adapters/factory.d.ts +2 -0
- package/dist/adapters/factory.js +26 -0
- package/dist/adapters/factory.js.map +1 -0
- package/dist/adapters/mongodb.d.ts +14 -0
- package/dist/adapters/mongodb.js +137 -0
- package/dist/adapters/mongodb.js.map +1 -0
- package/dist/adapters/mysql.d.ts +12 -0
- package/dist/adapters/mysql.js +38 -0
- package/dist/adapters/mysql.js.map +1 -0
- package/dist/adapters/oracle-sqlcl.d.ts +19 -0
- package/dist/adapters/oracle-sqlcl.js +334 -0
- package/dist/adapters/oracle-sqlcl.js.map +1 -0
- package/dist/adapters/oracle.d.ts +13 -0
- package/dist/adapters/oracle.js +47 -0
- package/dist/adapters/oracle.js.map +1 -0
- package/dist/adapters/postgres.d.ts +12 -0
- package/dist/adapters/postgres.js +40 -0
- package/dist/adapters/postgres.js.map +1 -0
- package/dist/adapters/redis.d.ts +15 -0
- package/dist/adapters/redis.js +91 -0
- package/dist/adapters/redis.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +118 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.js +147 -0
- package/dist/config.js.map +1 -0
- package/dist/connection-manager.d.ts +24 -0
- package/dist/connection-manager.js +91 -0
- package/dist/connection-manager.js.map +1 -0
- package/dist/daemon/client.d.ts +3 -0
- package/dist/daemon/client.js +33 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/config-manager.d.ts +15 -0
- package/dist/daemon/config-manager.js +44 -0
- package/dist/daemon/config-manager.js.map +1 -0
- package/dist/daemon/control.d.ts +9 -0
- package/dist/daemon/control.js +53 -0
- package/dist/daemon/control.js.map +1 -0
- package/dist/daemon/paths.d.ts +5 -0
- package/dist/daemon/paths.js +18 -0
- package/dist/daemon/paths.js.map +1 -0
- package/dist/daemon/server.d.ts +1 -0
- package/dist/daemon/server.js +119 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/output.d.ts +2 -0
- package/dist/output.js +39 -0
- package/dist/output.js.map +1 -0
- package/dist/runtime.d.ts +5 -0
- package/dist/runtime.js +25 -0
- package/dist/runtime.js.map +1 -0
- package/dist/security.d.ts +8 -0
- package/dist/security.js +239 -0
- package/dist/security.js.map +1 -0
- package/dist/ssh-tunnel.d.ts +8 -0
- package/dist/ssh-tunnel.js +231 -0
- package/dist/ssh-tunnel.js.map +1 -0
- package/dist/types.d.ts +69 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/masking.d.ts +2 -0
- package/dist/utils/masking.js +14 -0
- package/dist/utils/masking.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { MongoDbAdapter } from "./mongodb.js";
|
|
2
|
+
import { MySqlAdapter } from "./mysql.js";
|
|
3
|
+
import { OracleAdapter } from "./oracle.js";
|
|
4
|
+
import { OracleSqlclAdapter } from "./oracle-sqlcl.js";
|
|
5
|
+
import { PostgresAdapter } from "./postgres.js";
|
|
6
|
+
import { RedisAdapter } from "./redis.js";
|
|
7
|
+
export function createAdapter(config, url = config.url) {
|
|
8
|
+
switch (config.type) {
|
|
9
|
+
case "mysql":
|
|
10
|
+
return new MySqlAdapter(url);
|
|
11
|
+
case "postgres":
|
|
12
|
+
return new PostgresAdapter(url);
|
|
13
|
+
case "redis":
|
|
14
|
+
return new RedisAdapter(url, config.redisCluster);
|
|
15
|
+
case "oracle":
|
|
16
|
+
if (config.oracleDriver === "sqlcl") {
|
|
17
|
+
return new OracleSqlclAdapter(url, config.sqlclPath, config.javaHome);
|
|
18
|
+
}
|
|
19
|
+
return new OracleAdapter(url);
|
|
20
|
+
case "mongodb":
|
|
21
|
+
return new MongoDbAdapter(url, config.database);
|
|
22
|
+
default:
|
|
23
|
+
throw new Error(`不支持的数据库类型: ${config.type}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/adapters/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,UAAU,aAAa,CAAC,MAAsB,EAAE,GAAG,GAAG,MAAM,CAAC,GAAG;IACpE,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;QAC/B,KAAK,UAAU;YACb,OAAO,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;QAClC,KAAK,OAAO;YACV,OAAO,IAAI,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QACpD,KAAK,QAAQ;YACX,IAAI,MAAM,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;gBACpC,OAAO,IAAI,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxE,CAAC;YACD,OAAO,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;QAChC,KAAK,SAAS;YACZ,OAAO,IAAI,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClD;YACE,MAAM,IAAI,KAAK,CAAC,cAAe,MAAyB,CAAC,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DatabaseAdapter, MetadataRequest, QueryResult } from "../types.js";
|
|
2
|
+
export declare class MongoDbAdapter implements DatabaseAdapter {
|
|
3
|
+
private readonly url;
|
|
4
|
+
private readonly database?;
|
|
5
|
+
private client?;
|
|
6
|
+
private db?;
|
|
7
|
+
constructor(url: string, database?: string | undefined);
|
|
8
|
+
connect(): Promise<void>;
|
|
9
|
+
disconnect(): Promise<void>;
|
|
10
|
+
test(): Promise<void>;
|
|
11
|
+
execute(command: string): Promise<QueryResult>;
|
|
12
|
+
metadata(request: MetadataRequest): Promise<QueryResult>;
|
|
13
|
+
private runOperation;
|
|
14
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { MongoClient } from "mongodb";
|
|
2
|
+
const DEFAULT_QUERY_LIMIT = 100;
|
|
3
|
+
const MAX_QUERY_LIMIT = 1000;
|
|
4
|
+
export class MongoDbAdapter {
|
|
5
|
+
url;
|
|
6
|
+
database;
|
|
7
|
+
client;
|
|
8
|
+
db;
|
|
9
|
+
constructor(url, database) {
|
|
10
|
+
this.url = url;
|
|
11
|
+
this.database = database;
|
|
12
|
+
}
|
|
13
|
+
async connect() {
|
|
14
|
+
if (!this.client) {
|
|
15
|
+
this.client = new MongoClient(this.url);
|
|
16
|
+
await this.client.connect();
|
|
17
|
+
this.db = this.client.db(this.database);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async disconnect() {
|
|
21
|
+
if (this.client) {
|
|
22
|
+
await this.client.close();
|
|
23
|
+
this.client = undefined;
|
|
24
|
+
this.db = undefined;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async test() {
|
|
28
|
+
await this.connect();
|
|
29
|
+
await this.db.command({ ping: 1 });
|
|
30
|
+
}
|
|
31
|
+
async execute(command) {
|
|
32
|
+
await this.connect();
|
|
33
|
+
const parsed = JSON.parse(command);
|
|
34
|
+
const [operation, payload] = Object.entries(parsed)[0] ?? [];
|
|
35
|
+
if (!operation) {
|
|
36
|
+
throw new Error("MongoDB 命令 JSON 不能为空");
|
|
37
|
+
}
|
|
38
|
+
const rows = await this.runOperation(operation, payload);
|
|
39
|
+
return { rows, rowCount: rows.length };
|
|
40
|
+
}
|
|
41
|
+
async metadata(request) {
|
|
42
|
+
if (request.type !== "collections") {
|
|
43
|
+
throw new Error(`MongoDB 不支持元信息类型: ${request.type}`);
|
|
44
|
+
}
|
|
45
|
+
await this.connect();
|
|
46
|
+
const collections = await this.db.listCollections().toArray();
|
|
47
|
+
return {
|
|
48
|
+
rows: collections.map((collection) => ({ name: collection.name, type: collection.type })),
|
|
49
|
+
fields: ["name", "type"],
|
|
50
|
+
rowCount: collections.length
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async runOperation(operation, payload) {
|
|
54
|
+
const request = normalizeMongoPayload(payload);
|
|
55
|
+
const collection = this.db.collection(request.collection);
|
|
56
|
+
switch (operation) {
|
|
57
|
+
case "find":
|
|
58
|
+
return collection.find(request.filter, { projection: request.projection }).limit(request.limit ?? DEFAULT_QUERY_LIMIT).toArray();
|
|
59
|
+
case "findOne": {
|
|
60
|
+
const row = await collection.findOne(request.filter, { projection: request.projection });
|
|
61
|
+
return row ? [row] : [];
|
|
62
|
+
}
|
|
63
|
+
case "aggregate":
|
|
64
|
+
return collection.aggregate(request.pipeline ?? []).limit(request.limit ?? DEFAULT_QUERY_LIMIT).toArray();
|
|
65
|
+
case "count":
|
|
66
|
+
case "countDocuments": {
|
|
67
|
+
const count = await collection.countDocuments(request.filter);
|
|
68
|
+
return [{ count }];
|
|
69
|
+
}
|
|
70
|
+
case "estimatedDocumentCount": {
|
|
71
|
+
const count = await collection.estimatedDocumentCount();
|
|
72
|
+
return [{ count }];
|
|
73
|
+
}
|
|
74
|
+
case "distinct": {
|
|
75
|
+
if (!request.field) {
|
|
76
|
+
throw new Error("distinct 命令必须提供 field");
|
|
77
|
+
}
|
|
78
|
+
const values = await collection.distinct(request.field, request.filter);
|
|
79
|
+
return values.map((value) => ({ value }));
|
|
80
|
+
}
|
|
81
|
+
default:
|
|
82
|
+
throw new Error(`不支持的 MongoDB 命令: ${operation}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function normalizeMongoPayload(payload) {
|
|
87
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
|
|
88
|
+
throw new Error("MongoDB 命令必须是对象");
|
|
89
|
+
}
|
|
90
|
+
const value = payload;
|
|
91
|
+
if (!value.collection || typeof value.collection !== "string") {
|
|
92
|
+
throw new Error("MongoDB 命令必须提供 collection");
|
|
93
|
+
}
|
|
94
|
+
const filter = normalizePlainObject(value.filter, "filter") ?? {};
|
|
95
|
+
const projection = normalizePlainObject(value.projection, "projection");
|
|
96
|
+
const pipeline = normalizePipeline(value.pipeline);
|
|
97
|
+
const limit = normalizeLimit(value.limit);
|
|
98
|
+
return {
|
|
99
|
+
collection: value.collection,
|
|
100
|
+
filter,
|
|
101
|
+
projection,
|
|
102
|
+
pipeline,
|
|
103
|
+
limit,
|
|
104
|
+
field: value.field
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function normalizePlainObject(value, fieldName) {
|
|
108
|
+
if (value === undefined) {
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
if (!isPlainObject(value)) {
|
|
112
|
+
throw new Error(`MongoDB 命令 ${fieldName} 必须是对象`);
|
|
113
|
+
}
|
|
114
|
+
return value;
|
|
115
|
+
}
|
|
116
|
+
function normalizePipeline(value) {
|
|
117
|
+
if (value === undefined) {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
if (!Array.isArray(value) || !value.every(isPlainObject)) {
|
|
121
|
+
throw new Error("MongoDB 命令 pipeline 必须是对象数组");
|
|
122
|
+
}
|
|
123
|
+
return value;
|
|
124
|
+
}
|
|
125
|
+
function normalizeLimit(value) {
|
|
126
|
+
if (value === undefined) {
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value < 1 || value > MAX_QUERY_LIMIT) {
|
|
130
|
+
throw new Error(`MongoDB 命令 limit 必须是 1-${MAX_QUERY_LIMIT} 的整数`);
|
|
131
|
+
}
|
|
132
|
+
return value;
|
|
133
|
+
}
|
|
134
|
+
function isPlainObject(value) {
|
|
135
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=mongodb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongodb.js","sourceRoot":"","sources":["../../src/adapters/mongodb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseSqlAdapter } from "./base-sql.js";
|
|
2
|
+
import type { QueryResult } from "../types.js";
|
|
3
|
+
export declare class MySqlAdapter extends BaseSqlAdapter {
|
|
4
|
+
private readonly url;
|
|
5
|
+
private connection?;
|
|
6
|
+
constructor(url: string);
|
|
7
|
+
connect(): Promise<void>;
|
|
8
|
+
disconnect(): Promise<void>;
|
|
9
|
+
execute(command: string): Promise<QueryResult>;
|
|
10
|
+
protected listTables(): Promise<QueryResult>;
|
|
11
|
+
protected listColumns(table: string): Promise<QueryResult>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import mysql from "mysql2/promise";
|
|
2
|
+
import { BaseSqlAdapter } from "./base-sql.js";
|
|
3
|
+
export class MySqlAdapter extends BaseSqlAdapter {
|
|
4
|
+
url;
|
|
5
|
+
connection;
|
|
6
|
+
constructor(url) {
|
|
7
|
+
super();
|
|
8
|
+
this.url = url;
|
|
9
|
+
}
|
|
10
|
+
async connect() {
|
|
11
|
+
if (!this.connection) {
|
|
12
|
+
this.connection = await mysql.createConnection(this.url);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async disconnect() {
|
|
16
|
+
if (this.connection) {
|
|
17
|
+
await this.connection.end();
|
|
18
|
+
this.connection = undefined;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async execute(command) {
|
|
22
|
+
await this.connect();
|
|
23
|
+
const [rows, fields] = await this.connection.query(command);
|
|
24
|
+
const normalizedRows = Array.isArray(rows) ? rows : [];
|
|
25
|
+
return {
|
|
26
|
+
rows: normalizedRows,
|
|
27
|
+
fields: Array.isArray(fields) ? fields.map((field) => field.name) : undefined,
|
|
28
|
+
rowCount: normalizedRows.length
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async listTables() {
|
|
32
|
+
return this.execute("show tables");
|
|
33
|
+
}
|
|
34
|
+
async listColumns(table) {
|
|
35
|
+
return this.execute(`show columns from \`${table.replace(/`/g, "``")}\``);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=mysql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../src/adapters/mysql.ts"],"names":[],"mappings":"AAAA,OAAO,KAA0B,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,OAAO,YAAa,SAAQ,cAAc;IAGjB;IAFrB,UAAU,CAAc;IAEhC,YAA6B,GAAW;QACtC,KAAK,EAAE,CAAC;QADmB,QAAG,GAAH,GAAG,CAAQ;IAExC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe;QAC3B,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7D,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,OAAO;YACL,IAAI,EAAE,cAA2B;YACjC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YAC7E,QAAQ,EAAE,cAAc,CAAC,MAAM;SAChC,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,UAAU;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACrC,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,KAAa;QACvC,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { BaseSqlAdapter } from "./base-sql.js";
|
|
2
|
+
import type { QueryResult } from "../types.js";
|
|
3
|
+
export declare class OracleSqlclAdapter extends BaseSqlAdapter {
|
|
4
|
+
private readonly url;
|
|
5
|
+
private readonly sqlclPath;
|
|
6
|
+
private readonly javaHome?;
|
|
7
|
+
constructor(url: string, sqlclPath?: string, javaHome?: string | undefined);
|
|
8
|
+
connect(): Promise<void>;
|
|
9
|
+
disconnect(): Promise<void>;
|
|
10
|
+
execute(command: string): Promise<QueryResult>;
|
|
11
|
+
protected testQuery(): string;
|
|
12
|
+
protected listTables(): Promise<QueryResult>;
|
|
13
|
+
protected listColumns(table: string): Promise<QueryResult>;
|
|
14
|
+
private runSqlcl;
|
|
15
|
+
private buildScript;
|
|
16
|
+
private buildConnectString;
|
|
17
|
+
private buildEnv;
|
|
18
|
+
private withTempScript;
|
|
19
|
+
}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { dirname } from "node:path";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { BaseSqlAdapter } from "./base-sql.js";
|
|
8
|
+
import { maskSecret } from "../utils/masking.js";
|
|
9
|
+
const SQLCL_META_COMMANDS = new Set([
|
|
10
|
+
"@",
|
|
11
|
+
"@@",
|
|
12
|
+
"accept",
|
|
13
|
+
"append",
|
|
14
|
+
"break",
|
|
15
|
+
"clear",
|
|
16
|
+
"column",
|
|
17
|
+
"connect",
|
|
18
|
+
"copy",
|
|
19
|
+
"define",
|
|
20
|
+
"disconnect",
|
|
21
|
+
"edit",
|
|
22
|
+
"execute",
|
|
23
|
+
"exit",
|
|
24
|
+
"get",
|
|
25
|
+
"host",
|
|
26
|
+
"input",
|
|
27
|
+
"list",
|
|
28
|
+
"password",
|
|
29
|
+
"pause",
|
|
30
|
+
"print",
|
|
31
|
+
"prompt",
|
|
32
|
+
"quit",
|
|
33
|
+
"remark",
|
|
34
|
+
"run",
|
|
35
|
+
"save",
|
|
36
|
+
"set",
|
|
37
|
+
"show",
|
|
38
|
+
"spool",
|
|
39
|
+
"start",
|
|
40
|
+
"undefine",
|
|
41
|
+
"variable",
|
|
42
|
+
"whenever"
|
|
43
|
+
]);
|
|
44
|
+
export class OracleSqlclAdapter extends BaseSqlAdapter {
|
|
45
|
+
url;
|
|
46
|
+
sqlclPath;
|
|
47
|
+
javaHome;
|
|
48
|
+
constructor(url, sqlclPath = "sql", javaHome) {
|
|
49
|
+
super();
|
|
50
|
+
this.url = url;
|
|
51
|
+
this.sqlclPath = sqlclPath;
|
|
52
|
+
this.javaHome = javaHome;
|
|
53
|
+
}
|
|
54
|
+
async connect() {
|
|
55
|
+
// SQLcl 是短进程 CLI,不维护驱动级长连接;daemon 会复用配置和执行入口。
|
|
56
|
+
}
|
|
57
|
+
async disconnect() {
|
|
58
|
+
// SQLcl 每次命令执行后进程退出,无需显式断开。
|
|
59
|
+
}
|
|
60
|
+
async execute(command) {
|
|
61
|
+
const result = await this.runSqlcl(command);
|
|
62
|
+
if (result.queryResult) {
|
|
63
|
+
return result.queryResult;
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
rows: [{ output: result.output }],
|
|
67
|
+
fields: ["output"],
|
|
68
|
+
rowCount: result.output ? 1 : 0
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
testQuery() {
|
|
72
|
+
return "select 1 from dual";
|
|
73
|
+
}
|
|
74
|
+
async listTables() {
|
|
75
|
+
return this.execute("select table_name from user_tables order by table_name");
|
|
76
|
+
}
|
|
77
|
+
async listColumns(table) {
|
|
78
|
+
const escaped = table.replace(/'/g, "''").toUpperCase();
|
|
79
|
+
return this.execute(`select table_name, column_name, data_type from user_tab_columns where table_name = '${escaped}' order by column_id`);
|
|
80
|
+
}
|
|
81
|
+
runSqlcl(command) {
|
|
82
|
+
const markers = createQueryResultMarkers();
|
|
83
|
+
return this.withTempScript(command, markers, (scriptPath) => new Promise((resolve, reject) => {
|
|
84
|
+
const child = spawn(this.sqlclPath, ["-S", "/nolog", `@${scriptPath}`], {
|
|
85
|
+
env: this.buildEnv(),
|
|
86
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
87
|
+
});
|
|
88
|
+
let stdout = "";
|
|
89
|
+
let stderr = "";
|
|
90
|
+
child.stdout.on("data", (chunk) => {
|
|
91
|
+
stdout += chunk.toString("utf8");
|
|
92
|
+
});
|
|
93
|
+
child.stderr.on("data", (chunk) => {
|
|
94
|
+
stderr += chunk.toString("utf8");
|
|
95
|
+
});
|
|
96
|
+
child.on("error", (error) => {
|
|
97
|
+
reject(new Error(`SQLcl 启动失败: ${error.message}`));
|
|
98
|
+
});
|
|
99
|
+
child.on("close", (code) => {
|
|
100
|
+
const stdoutOutput = stripAnsi(stdout).trim();
|
|
101
|
+
const stderrOutput = stripAnsi(stderr).trim();
|
|
102
|
+
const combinedOutput = [stdoutOutput, stderrOutput].filter(Boolean).join("\n");
|
|
103
|
+
if (containsSqlclError(combinedOutput)) {
|
|
104
|
+
reject(new Error(maskSecret(`SQLcl 执行失败: ${combinedOutput}`.trim())));
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (code === 0) {
|
|
108
|
+
resolve(parseSqlclOutput(stdoutOutput, stderrOutput, markers));
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
reject(new Error(maskSecret(`SQLcl 执行失败(code=${code}): ${stderr || stdout}`.trim())));
|
|
112
|
+
});
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
buildScript(command, markers) {
|
|
116
|
+
const sql = normalizeSqlclSql(command);
|
|
117
|
+
return [
|
|
118
|
+
"set heading on",
|
|
119
|
+
"set feedback off",
|
|
120
|
+
"set pagesize 50000",
|
|
121
|
+
"set linesize 32767",
|
|
122
|
+
"set sqlformat json",
|
|
123
|
+
"whenever sqlerror exit sql.sqlcode",
|
|
124
|
+
`connect ${this.buildConnectString()}`,
|
|
125
|
+
`prompt ${markers.begin}`,
|
|
126
|
+
`${sql};`,
|
|
127
|
+
`prompt ${markers.end}`,
|
|
128
|
+
"exit"
|
|
129
|
+
].join("\n");
|
|
130
|
+
}
|
|
131
|
+
buildConnectString() {
|
|
132
|
+
const parsed = new URL(this.url);
|
|
133
|
+
const user = decodeURIComponent(parsed.username);
|
|
134
|
+
const password = quotePassword(decodeURIComponent(parsed.password));
|
|
135
|
+
const service = parsed.pathname.replace(/^\//, "");
|
|
136
|
+
return `${user}/${password}@//${parsed.hostname}:${parsed.port || "1521"}/${service}`;
|
|
137
|
+
}
|
|
138
|
+
buildEnv() {
|
|
139
|
+
if (!this.javaHome) {
|
|
140
|
+
return {
|
|
141
|
+
...process.env,
|
|
142
|
+
NO_COLOR: "1",
|
|
143
|
+
TERM: "dumb"
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const binPath = `${this.javaHome}/bin`;
|
|
147
|
+
return {
|
|
148
|
+
...process.env,
|
|
149
|
+
JAVA_HOME: this.javaHome,
|
|
150
|
+
PATH: `${binPath}:${dirname(this.sqlclPath)}:${process.env.PATH ?? ""}`,
|
|
151
|
+
NO_COLOR: "1",
|
|
152
|
+
TERM: "dumb"
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
async withTempScript(command, markers, run) {
|
|
156
|
+
const directoryPath = await mkdtemp(join(tmpdir(), "agent-database-cli-sqlcl-"));
|
|
157
|
+
const scriptPath = join(directoryPath, "command.sql");
|
|
158
|
+
try {
|
|
159
|
+
await writeFile(scriptPath, this.buildScript(command, markers), { encoding: "utf8", mode: 0o600 });
|
|
160
|
+
return await run(scriptPath);
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
await rm(directoryPath, { recursive: true, force: true });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function quotePassword(value) {
|
|
168
|
+
if (!/[^\w$#]/.test(value)) {
|
|
169
|
+
return value;
|
|
170
|
+
}
|
|
171
|
+
return `"${value.replace(/"/g, '\\"')}"`;
|
|
172
|
+
}
|
|
173
|
+
function stripAnsi(value) {
|
|
174
|
+
return value.replace(/\u001b\[[0-9;]*m/g, "");
|
|
175
|
+
}
|
|
176
|
+
function createQueryResultMarkers() {
|
|
177
|
+
const token = randomUUID().replace(/-/g, "");
|
|
178
|
+
return {
|
|
179
|
+
begin: `__DATABASE_CLI_SQLCL_RESULT_BEGIN_${token}__`,
|
|
180
|
+
end: `__DATABASE_CLI_SQLCL_RESULT_END_${token}__`
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
function parseSqlclOutput(stdoutOutput, stderrOutput, markers) {
|
|
184
|
+
const preferredOutput = stdoutOutput || stderrOutput;
|
|
185
|
+
const markerResult = extractMarkedSection(stdoutOutput, markers) ?? extractMarkedSection(stderrOutput, markers);
|
|
186
|
+
if (!markerResult) {
|
|
187
|
+
return { output: preferredOutput };
|
|
188
|
+
}
|
|
189
|
+
const parsedJson = tryParseJson(markerResult.section);
|
|
190
|
+
if (!parsedJson) {
|
|
191
|
+
return { output: markerResult.section };
|
|
192
|
+
}
|
|
193
|
+
const rows = normalizeRows(parsedJson);
|
|
194
|
+
if (!rows) {
|
|
195
|
+
return { output: markerResult.section };
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
output: markerResult.section,
|
|
199
|
+
queryResult: {
|
|
200
|
+
rows,
|
|
201
|
+
fields: collectFields(rows),
|
|
202
|
+
rowCount: rows.length
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
function extractMarkedSection(output, markers) {
|
|
207
|
+
const beginIndex = output.indexOf(markers.begin);
|
|
208
|
+
const endIndex = output.indexOf(markers.end);
|
|
209
|
+
if (beginIndex === -1 || endIndex === -1 || endIndex <= beginIndex) {
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
const section = output
|
|
213
|
+
.slice(beginIndex + markers.begin.length, endIndex)
|
|
214
|
+
.trim();
|
|
215
|
+
return { section };
|
|
216
|
+
}
|
|
217
|
+
function tryParseJson(value) {
|
|
218
|
+
if (!value) {
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
try {
|
|
222
|
+
return JSON.parse(value);
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return undefined;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
function normalizeRows(value) {
|
|
229
|
+
if (Array.isArray(value)) {
|
|
230
|
+
return value;
|
|
231
|
+
}
|
|
232
|
+
if (isRecord(value) && Array.isArray(value.items)) {
|
|
233
|
+
return value.items;
|
|
234
|
+
}
|
|
235
|
+
if (isRecord(value) &&
|
|
236
|
+
Array.isArray(value.results) &&
|
|
237
|
+
value.results.length > 0 &&
|
|
238
|
+
isRecord(value.results[0]) &&
|
|
239
|
+
Array.isArray(value.results[0].items)) {
|
|
240
|
+
return value.results[0].items;
|
|
241
|
+
}
|
|
242
|
+
return undefined;
|
|
243
|
+
}
|
|
244
|
+
function collectFields(rows) {
|
|
245
|
+
const fields = new Set();
|
|
246
|
+
for (const row of rows) {
|
|
247
|
+
if (!isRecord(row)) {
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
for (const key of Object.keys(row)) {
|
|
251
|
+
fields.add(key);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return [...fields];
|
|
255
|
+
}
|
|
256
|
+
function isRecord(value) {
|
|
257
|
+
return typeof value === "object" && value !== null;
|
|
258
|
+
}
|
|
259
|
+
function containsSqlclError(output) {
|
|
260
|
+
if (!output) {
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
return /(^|\n)\s*(SP2-|ORA-)/i.test(output);
|
|
264
|
+
}
|
|
265
|
+
function normalizeSqlclSql(command) {
|
|
266
|
+
const sql = command.trim().replace(/;+\s*$/, "");
|
|
267
|
+
assertSingleSqlStatement(sql);
|
|
268
|
+
assertNoSqlclMetaCommand(sql);
|
|
269
|
+
return sql;
|
|
270
|
+
}
|
|
271
|
+
function assertSingleSqlStatement(command) {
|
|
272
|
+
const sanitized = stripSqlLiteralsAndComments(command);
|
|
273
|
+
if (sanitized.includes(";")) {
|
|
274
|
+
throw new Error("SQLcl 模式仅允许执行单条 SQL 语句");
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
function assertNoSqlclMetaCommand(command) {
|
|
278
|
+
const sanitized = stripSqlLiteralsAndComments(command);
|
|
279
|
+
for (const line of sanitized.split(/\r?\n/)) {
|
|
280
|
+
const head = line.trim().split(/\s+/)[0]?.toLowerCase();
|
|
281
|
+
if (head && (SQLCL_META_COMMANDS.has(head) || head.startsWith("@"))) {
|
|
282
|
+
throw new Error(`SQLcl 模式拒绝执行 SQLcl 元命令: ${head}`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
function stripSqlLiteralsAndComments(command) {
|
|
287
|
+
let result = "";
|
|
288
|
+
let index = 0;
|
|
289
|
+
while (index < command.length) {
|
|
290
|
+
const char = command[index];
|
|
291
|
+
const next = command[index + 1];
|
|
292
|
+
if (char === "-" && next === "-") {
|
|
293
|
+
const endIndex = findLineEnd(command, index + 2);
|
|
294
|
+
result += " ".repeat(endIndex - index);
|
|
295
|
+
index = endIndex;
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
if (char === "/" && next === "*") {
|
|
299
|
+
const commentEnd = command.indexOf("*/", index + 2);
|
|
300
|
+
const endIndex = commentEnd === -1 ? command.length : commentEnd + 2;
|
|
301
|
+
result += " ".repeat(endIndex - index);
|
|
302
|
+
index = endIndex;
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
if (char === "'") {
|
|
306
|
+
const endIndex = findQuotedTokenEnd(command, index);
|
|
307
|
+
result += " ".repeat(endIndex - index);
|
|
308
|
+
index = endIndex;
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
result += char;
|
|
312
|
+
index += 1;
|
|
313
|
+
}
|
|
314
|
+
return result;
|
|
315
|
+
}
|
|
316
|
+
function findLineEnd(command, start) {
|
|
317
|
+
const lineEnd = command.indexOf("\n", start);
|
|
318
|
+
return lineEnd === -1 ? command.length : lineEnd;
|
|
319
|
+
}
|
|
320
|
+
function findQuotedTokenEnd(command, start) {
|
|
321
|
+
let index = start + 1;
|
|
322
|
+
while (index < command.length) {
|
|
323
|
+
if (command[index] === "'") {
|
|
324
|
+
if (command[index + 1] === "'") {
|
|
325
|
+
index += 2;
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
return index + 1;
|
|
329
|
+
}
|
|
330
|
+
index += 1;
|
|
331
|
+
}
|
|
332
|
+
return command.length;
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=oracle-sqlcl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oracle-sqlcl.js","sourceRoot":"","sources":["../../src/adapters/oracle-sqlcl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BaseSqlAdapter } from "./base-sql.js";
|
|
2
|
+
import type { QueryResult } from "../types.js";
|
|
3
|
+
export declare class OracleAdapter extends BaseSqlAdapter {
|
|
4
|
+
private readonly url;
|
|
5
|
+
private connection?;
|
|
6
|
+
constructor(url: string);
|
|
7
|
+
connect(): Promise<void>;
|
|
8
|
+
disconnect(): Promise<void>;
|
|
9
|
+
execute(command: string): Promise<QueryResult>;
|
|
10
|
+
protected testQuery(): string;
|
|
11
|
+
protected listTables(): Promise<QueryResult>;
|
|
12
|
+
protected listColumns(table: string): Promise<QueryResult>;
|
|
13
|
+
}
|