universal-db-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +93 -0
- package/DEPLOYMENT.md +411 -0
- package/EXAMPLES.md +362 -0
- package/LICENSE +21 -0
- package/README.md +167 -0
- package/dist/adapters/mysql.d.ts +41 -0
- package/dist/adapters/mysql.d.ts.map +1 -0
- package/dist/adapters/mysql.js +173 -0
- package/dist/adapters/mysql.js.map +1 -0
- package/dist/adapters/postgres.d.ts +41 -0
- package/dist/adapters/postgres.d.ts.map +1 -0
- package/dist/adapters/postgres.js +210 -0
- package/dist/adapters/postgres.js.map +1 -0
- package/dist/adapters/redis.d.ts +53 -0
- package/dist/adapters/redis.d.ts.map +1 -0
- package/dist/adapters/redis.js +227 -0
- package/dist/adapters/redis.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +100 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +32 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +194 -0
- package/dist/server.js.map +1 -0
- package/dist/types/adapter.d.ts +114 -0
- package/dist/types/adapter.d.ts.map +1 -0
- package/dist/types/adapter.js +6 -0
- package/dist/types/adapter.js.map +1 -0
- package/dist/utils/safety.d.ts +24 -0
- package/dist/utils/safety.d.ts.map +1 -0
- package/dist/utils/safety.js +56 -0
- package/dist/utils/safety.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MySQL 数据库适配器
|
|
3
|
+
* 使用 mysql2 驱动实现 DbAdapter 接口
|
|
4
|
+
*/
|
|
5
|
+
import mysql from 'mysql2/promise';
|
|
6
|
+
import { isWriteOperation as checkWriteOperation } from '../utils/safety.js';
|
|
7
|
+
export class MySQLAdapter {
|
|
8
|
+
connection = null;
|
|
9
|
+
config;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 连接到 MySQL 数据库
|
|
15
|
+
*/
|
|
16
|
+
async connect() {
|
|
17
|
+
try {
|
|
18
|
+
this.connection = await mysql.createConnection({
|
|
19
|
+
host: this.config.host,
|
|
20
|
+
port: this.config.port,
|
|
21
|
+
user: this.config.user,
|
|
22
|
+
password: this.config.password,
|
|
23
|
+
database: this.config.database,
|
|
24
|
+
// 启用多语句查询支持
|
|
25
|
+
multipleStatements: false,
|
|
26
|
+
});
|
|
27
|
+
// 测试连接
|
|
28
|
+
await this.connection.ping();
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
throw new Error(`MySQL 连接失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 断开数据库连接
|
|
36
|
+
*/
|
|
37
|
+
async disconnect() {
|
|
38
|
+
if (this.connection) {
|
|
39
|
+
await this.connection.end();
|
|
40
|
+
this.connection = null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 执行 SQL 查询
|
|
45
|
+
*/
|
|
46
|
+
async executeQuery(query, params) {
|
|
47
|
+
if (!this.connection) {
|
|
48
|
+
throw new Error('数据库未连接');
|
|
49
|
+
}
|
|
50
|
+
const startTime = Date.now();
|
|
51
|
+
try {
|
|
52
|
+
const [rows, fields] = await this.connection.execute(query, params);
|
|
53
|
+
const executionTime = Date.now() - startTime;
|
|
54
|
+
// 处理不同类型的查询结果
|
|
55
|
+
if (Array.isArray(rows)) {
|
|
56
|
+
return {
|
|
57
|
+
rows: rows,
|
|
58
|
+
executionTime,
|
|
59
|
+
metadata: {
|
|
60
|
+
fieldCount: fields?.length || 0,
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
// INSERT/UPDATE/DELETE 等操作
|
|
66
|
+
const result = rows;
|
|
67
|
+
return {
|
|
68
|
+
rows: [],
|
|
69
|
+
affectedRows: result.affectedRows,
|
|
70
|
+
executionTime,
|
|
71
|
+
metadata: {
|
|
72
|
+
insertId: result.insertId,
|
|
73
|
+
changedRows: result.changedRows,
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
throw new Error(`查询执行失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 获取数据库结构信息
|
|
84
|
+
*/
|
|
85
|
+
async getSchema() {
|
|
86
|
+
if (!this.connection) {
|
|
87
|
+
throw new Error('数据库未连接');
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
// 获取数据库版本
|
|
91
|
+
const [versionRows] = await this.connection.query('SELECT VERSION() as version');
|
|
92
|
+
const version = versionRows[0]?.version || 'unknown';
|
|
93
|
+
// 获取当前数据库名
|
|
94
|
+
const [dbRows] = await this.connection.query('SELECT DATABASE() as db');
|
|
95
|
+
const databaseName = dbRows[0]?.db || this.config.database || 'unknown';
|
|
96
|
+
// 获取所有表
|
|
97
|
+
const [tables] = await this.connection.query('SHOW TABLES');
|
|
98
|
+
const tableInfos = [];
|
|
99
|
+
for (const tableRow of tables) {
|
|
100
|
+
const tableName = Object.values(tableRow)[0];
|
|
101
|
+
const tableInfo = await this.getTableInfo(tableName);
|
|
102
|
+
tableInfos.push(tableInfo);
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
databaseType: 'mysql',
|
|
106
|
+
databaseName,
|
|
107
|
+
tables: tableInfos,
|
|
108
|
+
version,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
throw new Error(`获取数据库结构失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 获取单个表的详细信息
|
|
117
|
+
*/
|
|
118
|
+
async getTableInfo(tableName) {
|
|
119
|
+
if (!this.connection) {
|
|
120
|
+
throw new Error('数据库未连接');
|
|
121
|
+
}
|
|
122
|
+
// 获取列信息
|
|
123
|
+
const [columns] = await this.connection.query('SHOW FULL COLUMNS FROM ??', [tableName]);
|
|
124
|
+
const columnInfos = columns.map((col) => ({
|
|
125
|
+
name: col.Field,
|
|
126
|
+
type: col.Type,
|
|
127
|
+
nullable: col.Null === 'YES',
|
|
128
|
+
defaultValue: col.Default,
|
|
129
|
+
comment: col.Comment || undefined,
|
|
130
|
+
}));
|
|
131
|
+
// 获取主键
|
|
132
|
+
const primaryKeys = columns
|
|
133
|
+
.filter((col) => col.Key === 'PRI')
|
|
134
|
+
.map((col) => col.Field);
|
|
135
|
+
// 获取索引信息
|
|
136
|
+
const [indexes] = await this.connection.query('SHOW INDEX FROM ??', [tableName]);
|
|
137
|
+
const indexMap = new Map();
|
|
138
|
+
for (const idx of indexes) {
|
|
139
|
+
const indexName = idx.Key_name;
|
|
140
|
+
if (indexName === 'PRIMARY')
|
|
141
|
+
continue; // 跳过主键索引
|
|
142
|
+
if (!indexMap.has(indexName)) {
|
|
143
|
+
indexMap.set(indexName, {
|
|
144
|
+
columns: [],
|
|
145
|
+
unique: idx.Non_unique === 0,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
indexMap.get(indexName).columns.push(idx.Column_name);
|
|
149
|
+
}
|
|
150
|
+
const indexInfos = Array.from(indexMap.entries()).map(([name, info]) => ({
|
|
151
|
+
name,
|
|
152
|
+
columns: info.columns,
|
|
153
|
+
unique: info.unique,
|
|
154
|
+
}));
|
|
155
|
+
// 获取表行数估算
|
|
156
|
+
const [statusRows] = await this.connection.query('SHOW TABLE STATUS WHERE Name = ?', [tableName]);
|
|
157
|
+
const estimatedRows = statusRows[0]?.Rows || 0;
|
|
158
|
+
return {
|
|
159
|
+
name: tableName,
|
|
160
|
+
columns: columnInfos,
|
|
161
|
+
primaryKeys,
|
|
162
|
+
indexes: indexInfos,
|
|
163
|
+
estimatedRows,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* 检查是否为写操作
|
|
168
|
+
*/
|
|
169
|
+
isWriteOperation(query) {
|
|
170
|
+
return checkWriteOperation(query);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=mysql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../src/adapters/mysql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL 数据库适配器
|
|
3
|
+
* 使用 pg 驱动实现 DbAdapter 接口
|
|
4
|
+
*/
|
|
5
|
+
import type { DbAdapter, QueryResult, SchemaInfo } from '../types/adapter.js';
|
|
6
|
+
export declare class PostgreSQLAdapter implements DbAdapter {
|
|
7
|
+
private client;
|
|
8
|
+
private config;
|
|
9
|
+
constructor(config: {
|
|
10
|
+
host: string;
|
|
11
|
+
port: number;
|
|
12
|
+
user?: string;
|
|
13
|
+
password?: string;
|
|
14
|
+
database?: string;
|
|
15
|
+
});
|
|
16
|
+
/**
|
|
17
|
+
* 连接到 PostgreSQL 数据库
|
|
18
|
+
*/
|
|
19
|
+
connect(): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* 断开数据库连接
|
|
22
|
+
*/
|
|
23
|
+
disconnect(): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* 执行 SQL 查询
|
|
26
|
+
*/
|
|
27
|
+
executeQuery(query: string, params?: unknown[]): Promise<QueryResult>;
|
|
28
|
+
/**
|
|
29
|
+
* 获取数据库结构信息
|
|
30
|
+
*/
|
|
31
|
+
getSchema(): Promise<SchemaInfo>;
|
|
32
|
+
/**
|
|
33
|
+
* 获取单个表的详细信息
|
|
34
|
+
*/
|
|
35
|
+
private getTableInfo;
|
|
36
|
+
/**
|
|
37
|
+
* 检查是否为写操作
|
|
38
|
+
*/
|
|
39
|
+
isWriteOperation(query: string): boolean;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=postgres.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/adapters/postgres.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,UAAU,EAIX,MAAM,qBAAqB,CAAC;AAK7B,qBAAa,iBAAkB,YAAW,SAAS;IACjD,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAMZ;gBAEU,MAAM,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IAID;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IA8B3E;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IA4CtC;;OAEG;YACW,YAAY;IA2G1B;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGzC"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL 数据库适配器
|
|
3
|
+
* 使用 pg 驱动实现 DbAdapter 接口
|
|
4
|
+
*/
|
|
5
|
+
import pg from 'pg';
|
|
6
|
+
import { isWriteOperation as checkWriteOperation } from '../utils/safety.js';
|
|
7
|
+
const { Client } = pg;
|
|
8
|
+
export class PostgreSQLAdapter {
|
|
9
|
+
client = null;
|
|
10
|
+
config;
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this.config = config;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 连接到 PostgreSQL 数据库
|
|
16
|
+
*/
|
|
17
|
+
async connect() {
|
|
18
|
+
try {
|
|
19
|
+
this.client = new Client({
|
|
20
|
+
host: this.config.host,
|
|
21
|
+
port: this.config.port,
|
|
22
|
+
user: this.config.user,
|
|
23
|
+
password: this.config.password,
|
|
24
|
+
database: this.config.database,
|
|
25
|
+
});
|
|
26
|
+
await this.client.connect();
|
|
27
|
+
// 测试连接
|
|
28
|
+
await this.client.query('SELECT 1');
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
throw new Error(`PostgreSQL 连接失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 断开数据库连接
|
|
36
|
+
*/
|
|
37
|
+
async disconnect() {
|
|
38
|
+
if (this.client) {
|
|
39
|
+
await this.client.end();
|
|
40
|
+
this.client = null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 执行 SQL 查询
|
|
45
|
+
*/
|
|
46
|
+
async executeQuery(query, params) {
|
|
47
|
+
if (!this.client) {
|
|
48
|
+
throw new Error('数据库未连接');
|
|
49
|
+
}
|
|
50
|
+
const startTime = Date.now();
|
|
51
|
+
try {
|
|
52
|
+
const result = await this.client.query(query, params);
|
|
53
|
+
const executionTime = Date.now() - startTime;
|
|
54
|
+
return {
|
|
55
|
+
rows: result.rows,
|
|
56
|
+
affectedRows: result.rowCount || 0,
|
|
57
|
+
executionTime,
|
|
58
|
+
metadata: {
|
|
59
|
+
command: result.command,
|
|
60
|
+
fields: result.fields?.map(f => ({
|
|
61
|
+
name: f.name,
|
|
62
|
+
dataTypeID: f.dataTypeID,
|
|
63
|
+
})),
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
throw new Error(`查询执行失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 获取数据库结构信息
|
|
73
|
+
*/
|
|
74
|
+
async getSchema() {
|
|
75
|
+
if (!this.client) {
|
|
76
|
+
throw new Error('数据库未连接');
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
// 获取数据库版本
|
|
80
|
+
const versionResult = await this.client.query('SELECT version()');
|
|
81
|
+
const version = versionResult.rows[0]?.version || 'unknown';
|
|
82
|
+
// 获取当前数据库名
|
|
83
|
+
const dbResult = await this.client.query('SELECT current_database()');
|
|
84
|
+
const databaseName = dbResult.rows[0]?.current_database || this.config.database || 'unknown';
|
|
85
|
+
// 获取所有表(仅 public schema)
|
|
86
|
+
const tablesResult = await this.client.query(`
|
|
87
|
+
SELECT table_name
|
|
88
|
+
FROM information_schema.tables
|
|
89
|
+
WHERE table_schema = 'public'
|
|
90
|
+
AND table_type = 'BASE TABLE'
|
|
91
|
+
ORDER BY table_name
|
|
92
|
+
`);
|
|
93
|
+
const tableInfos = [];
|
|
94
|
+
for (const row of tablesResult.rows) {
|
|
95
|
+
const tableName = row.table_name;
|
|
96
|
+
const tableInfo = await this.getTableInfo(tableName);
|
|
97
|
+
tableInfos.push(tableInfo);
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
databaseType: 'postgres',
|
|
101
|
+
databaseName,
|
|
102
|
+
tables: tableInfos,
|
|
103
|
+
version,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
throw new Error(`获取数据库结构失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 获取单个表的详细信息
|
|
112
|
+
*/
|
|
113
|
+
async getTableInfo(tableName) {
|
|
114
|
+
if (!this.client) {
|
|
115
|
+
throw new Error('数据库未连接');
|
|
116
|
+
}
|
|
117
|
+
// 获取列信息
|
|
118
|
+
const columnsResult = await this.client.query(`
|
|
119
|
+
SELECT
|
|
120
|
+
column_name,
|
|
121
|
+
data_type,
|
|
122
|
+
is_nullable,
|
|
123
|
+
column_default,
|
|
124
|
+
character_maximum_length,
|
|
125
|
+
numeric_precision,
|
|
126
|
+
numeric_scale
|
|
127
|
+
FROM information_schema.columns
|
|
128
|
+
WHERE table_schema = 'public'
|
|
129
|
+
AND table_name = $1
|
|
130
|
+
ORDER BY ordinal_position
|
|
131
|
+
`, [tableName]);
|
|
132
|
+
const columnInfos = columnsResult.rows.map((col) => {
|
|
133
|
+
let dataType = col.data_type;
|
|
134
|
+
// 添加长度/精度信息
|
|
135
|
+
if (col.character_maximum_length) {
|
|
136
|
+
dataType += `(${col.character_maximum_length})`;
|
|
137
|
+
}
|
|
138
|
+
else if (col.numeric_precision) {
|
|
139
|
+
dataType += `(${col.numeric_precision}${col.numeric_scale ? `,${col.numeric_scale}` : ''})`;
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
name: col.column_name,
|
|
143
|
+
type: dataType,
|
|
144
|
+
nullable: col.is_nullable === 'YES',
|
|
145
|
+
defaultValue: col.column_default || undefined,
|
|
146
|
+
};
|
|
147
|
+
});
|
|
148
|
+
// 获取主键
|
|
149
|
+
const pkResult = await this.client.query(`
|
|
150
|
+
SELECT a.attname
|
|
151
|
+
FROM pg_index i
|
|
152
|
+
JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
|
|
153
|
+
WHERE i.indrelid = $1::regclass
|
|
154
|
+
AND i.indisprimary
|
|
155
|
+
`, [tableName]);
|
|
156
|
+
const primaryKeys = pkResult.rows.map(row => row.attname);
|
|
157
|
+
// 获取索引信息
|
|
158
|
+
const indexResult = await this.client.query(`
|
|
159
|
+
SELECT
|
|
160
|
+
i.relname as index_name,
|
|
161
|
+
a.attname as column_name,
|
|
162
|
+
ix.indisunique as is_unique
|
|
163
|
+
FROM pg_class t
|
|
164
|
+
JOIN pg_index ix ON t.oid = ix.indrelid
|
|
165
|
+
JOIN pg_class i ON i.oid = ix.indexrelid
|
|
166
|
+
JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey)
|
|
167
|
+
WHERE t.relname = $1
|
|
168
|
+
AND t.relkind = 'r'
|
|
169
|
+
AND NOT ix.indisprimary
|
|
170
|
+
ORDER BY i.relname, a.attnum
|
|
171
|
+
`, [tableName]);
|
|
172
|
+
const indexMap = new Map();
|
|
173
|
+
for (const idx of indexResult.rows) {
|
|
174
|
+
const indexName = idx.index_name;
|
|
175
|
+
if (!indexMap.has(indexName)) {
|
|
176
|
+
indexMap.set(indexName, {
|
|
177
|
+
columns: [],
|
|
178
|
+
unique: idx.is_unique,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
indexMap.get(indexName).columns.push(idx.column_name);
|
|
182
|
+
}
|
|
183
|
+
const indexInfos = Array.from(indexMap.entries()).map(([name, info]) => ({
|
|
184
|
+
name,
|
|
185
|
+
columns: info.columns,
|
|
186
|
+
unique: info.unique,
|
|
187
|
+
}));
|
|
188
|
+
// 获取表行数估算
|
|
189
|
+
const statsResult = await this.client.query(`
|
|
190
|
+
SELECT reltuples::bigint as estimate
|
|
191
|
+
FROM pg_class
|
|
192
|
+
WHERE relname = $1
|
|
193
|
+
`, [tableName]);
|
|
194
|
+
const estimatedRows = Number(statsResult.rows[0]?.estimate || 0);
|
|
195
|
+
return {
|
|
196
|
+
name: tableName,
|
|
197
|
+
columns: columnInfos,
|
|
198
|
+
primaryKeys,
|
|
199
|
+
indexes: indexInfos,
|
|
200
|
+
estimatedRows,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* 检查是否为写操作
|
|
205
|
+
*/
|
|
206
|
+
isWriteOperation(query) {
|
|
207
|
+
return checkWriteOperation(query);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=postgres.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/adapters/postgres.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis 数据库适配器
|
|
3
|
+
* 使用 ioredis 驱动实现 DbAdapter 接口
|
|
4
|
+
*
|
|
5
|
+
* 注意:Redis 是 NoSQL 键值存储,没有传统的表结构
|
|
6
|
+
* 本适配器提供基本的键值操作和信息查询功能
|
|
7
|
+
*/
|
|
8
|
+
import type { DbAdapter, QueryResult, SchemaInfo } from '../types/adapter.js';
|
|
9
|
+
export declare class RedisAdapter implements DbAdapter {
|
|
10
|
+
private client;
|
|
11
|
+
private config;
|
|
12
|
+
constructor(config: {
|
|
13
|
+
host: string;
|
|
14
|
+
port: number;
|
|
15
|
+
password?: string;
|
|
16
|
+
database?: string;
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* 连接到 Redis 数据库
|
|
20
|
+
*/
|
|
21
|
+
connect(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* 断开数据库连接
|
|
24
|
+
*/
|
|
25
|
+
disconnect(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* 执行 Redis 命令
|
|
28
|
+
*
|
|
29
|
+
* 支持的命令格式示例:
|
|
30
|
+
* - "GET mykey"
|
|
31
|
+
* - "SET mykey myvalue"
|
|
32
|
+
* - "HGETALL myhash"
|
|
33
|
+
* - "KEYS pattern*"
|
|
34
|
+
*/
|
|
35
|
+
executeQuery(query: string, params?: unknown[]): Promise<QueryResult>;
|
|
36
|
+
/**
|
|
37
|
+
* 格式化 Redis 命令结果为统一的行格式
|
|
38
|
+
*/
|
|
39
|
+
private formatRedisResult;
|
|
40
|
+
/**
|
|
41
|
+
* 获取 Redis 数据库信息
|
|
42
|
+
*
|
|
43
|
+
* Redis 没有传统的表结构,这里返回数据库统计信息
|
|
44
|
+
*/
|
|
45
|
+
getSchema(): Promise<SchemaInfo>;
|
|
46
|
+
/**
|
|
47
|
+
* 检查是否为写操作
|
|
48
|
+
*
|
|
49
|
+
* Redis 写操作包括:SET, DEL, FLUSHDB, FLUSHALL 等
|
|
50
|
+
*/
|
|
51
|
+
isWriteOperation(query: string): boolean;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=redis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/adapters/redis.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,UAAU,EAGX,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,YAAa,YAAW,SAAS;IAC5C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAKZ;gBAEU,MAAM,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IAID;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC;;;;;;;;OAQG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAwC3E;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4BzB;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IAiGtC;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAmBzC"}
|