lokicms-plugin-sql 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/federation/cache-layer.d.ts +58 -0
- package/dist/federation/cache-layer.d.ts.map +1 -0
- package/dist/federation/cache-layer.js +210 -0
- package/dist/federation/cache-layer.js.map +1 -0
- package/dist/federation/index.d.ts +12 -0
- package/dist/federation/index.d.ts.map +1 -0
- package/dist/federation/index.js +9 -0
- package/dist/federation/index.js.map +1 -0
- package/dist/federation/source-manager.d.ts +57 -0
- package/dist/federation/source-manager.d.ts.map +1 -0
- package/dist/federation/source-manager.js +238 -0
- package/dist/federation/source-manager.js.map +1 -0
- package/dist/federation/sync-engine.d.ts +68 -0
- package/dist/federation/sync-engine.d.ts.map +1 -0
- package/dist/federation/sync-engine.js +288 -0
- package/dist/federation/sync-engine.js.map +1 -0
- package/dist/index.d.ts +80 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +28 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +798 -0
- package/dist/plugin.js.map +1 -0
- package/dist/providers/base.d.ts +142 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +161 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/index.d.ts +22 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +74 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/mariadb.d.ts +83 -0
- package/dist/providers/mariadb.d.ts.map +1 -0
- package/dist/providers/mariadb.js +293 -0
- package/dist/providers/mariadb.js.map +1 -0
- package/dist/providers/mysql.d.ts +78 -0
- package/dist/providers/mysql.d.ts.map +1 -0
- package/dist/providers/mysql.js +284 -0
- package/dist/providers/mysql.js.map +1 -0
- package/dist/providers/postgresql.d.ts +77 -0
- package/dist/providers/postgresql.d.ts.map +1 -0
- package/dist/providers/postgresql.js +296 -0
- package/dist/providers/postgresql.js.map +1 -0
- package/dist/providers/sqlite.d.ts +80 -0
- package/dist/providers/sqlite.d.ts.map +1 -0
- package/dist/providers/sqlite.js +283 -0
- package/dist/providers/sqlite.js.map +1 -0
- package/dist/query/builder.d.ts +74 -0
- package/dist/query/builder.d.ts.map +1 -0
- package/dist/query/builder.js +279 -0
- package/dist/query/builder.js.map +1 -0
- package/dist/query/index.d.ts +10 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +8 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/transformer.d.ts +74 -0
- package/dist/query/transformer.d.ts.map +1 -0
- package/dist/query/transformer.js +236 -0
- package/dist/query/transformer.js.map +1 -0
- package/dist/types.d.ts +350 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +38 -0
- package/dist/types.js.map +1 -0
- package/dist/vectors/adapter.d.ts +128 -0
- package/dist/vectors/adapter.d.ts.map +1 -0
- package/dist/vectors/adapter.js +79 -0
- package/dist/vectors/adapter.js.map +1 -0
- package/dist/vectors/index.d.ts +41 -0
- package/dist/vectors/index.d.ts.map +1 -0
- package/dist/vectors/index.js +87 -0
- package/dist/vectors/index.js.map +1 -0
- package/dist/vectors/lokijs-vector.d.ts +112 -0
- package/dist/vectors/lokijs-vector.d.ts.map +1 -0
- package/dist/vectors/lokijs-vector.js +217 -0
- package/dist/vectors/lokijs-vector.js.map +1 -0
- package/dist/vectors/mariadb-vector.d.ts +56 -0
- package/dist/vectors/mariadb-vector.d.ts.map +1 -0
- package/dist/vectors/mariadb-vector.js +263 -0
- package/dist/vectors/mariadb-vector.js.map +1 -0
- package/dist/vectors/mysql-vector.d.ts +56 -0
- package/dist/vectors/mysql-vector.d.ts.map +1 -0
- package/dist/vectors/mysql-vector.js +235 -0
- package/dist/vectors/mysql-vector.js.map +1 -0
- package/dist/vectors/pgvector.d.ts +52 -0
- package/dist/vectors/pgvector.d.ts.map +1 -0
- package/dist/vectors/pgvector.js +190 -0
- package/dist/vectors/pgvector.js.map +1 -0
- package/dist/vectors/sqlite-vec.d.ts +80 -0
- package/dist/vectors/sqlite-vec.d.ts.map +1 -0
- package/dist/vectors/sqlite-vec.js +362 -0
- package/dist/vectors/sqlite-vec.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MariaDB Provider
|
|
3
|
+
*
|
|
4
|
+
* MariaDB database provider with vector support detection (MariaDB 11.6+).
|
|
5
|
+
* Uses mysql2 driver for compatibility.
|
|
6
|
+
*/
|
|
7
|
+
import { BaseProvider } from './base.js';
|
|
8
|
+
// Dynamic import for mysql2 (compatible with MariaDB)
|
|
9
|
+
let mysql2 = null;
|
|
10
|
+
async function getMySQL() {
|
|
11
|
+
if (!mysql2) {
|
|
12
|
+
try {
|
|
13
|
+
mysql2 = await import('mysql2/promise');
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
throw new Error('mysql2 package not installed. Install with: npm install mysql2');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return mysql2;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* MariaDB Provider
|
|
23
|
+
*/
|
|
24
|
+
export class MariaDBProvider extends BaseProvider {
|
|
25
|
+
pool = null;
|
|
26
|
+
connection = null;
|
|
27
|
+
capabilities = null;
|
|
28
|
+
version = '';
|
|
29
|
+
constructor(options) {
|
|
30
|
+
super({ ...options, type: 'mariadb' });
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Connect to MariaDB
|
|
34
|
+
*/
|
|
35
|
+
async connect() {
|
|
36
|
+
if (this.connected)
|
|
37
|
+
return;
|
|
38
|
+
const mysql = await getMySQL();
|
|
39
|
+
const config = this.config;
|
|
40
|
+
this.pool = mysql.createPool({
|
|
41
|
+
host: config.host,
|
|
42
|
+
port: config.port ?? 3306,
|
|
43
|
+
database: config.database,
|
|
44
|
+
user: config.user,
|
|
45
|
+
password: config.password,
|
|
46
|
+
ssl: config.ssl,
|
|
47
|
+
waitForConnections: true,
|
|
48
|
+
connectionLimit: 10,
|
|
49
|
+
queueLimit: 0,
|
|
50
|
+
enableKeepAlive: true,
|
|
51
|
+
});
|
|
52
|
+
// Test connection
|
|
53
|
+
const testConn = await this.pool.getConnection();
|
|
54
|
+
testConn.release();
|
|
55
|
+
this.connected = true;
|
|
56
|
+
this.logger.info('MariaDB connected');
|
|
57
|
+
// Detect capabilities
|
|
58
|
+
this.capabilities = await this.detectCapabilities();
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Disconnect from MariaDB
|
|
62
|
+
*/
|
|
63
|
+
async disconnect() {
|
|
64
|
+
if (this.connection) {
|
|
65
|
+
this.connection.release();
|
|
66
|
+
this.connection = null;
|
|
67
|
+
}
|
|
68
|
+
if (this.pool) {
|
|
69
|
+
await this.pool.end();
|
|
70
|
+
this.pool = null;
|
|
71
|
+
}
|
|
72
|
+
this.connected = false;
|
|
73
|
+
this.logger.info('MariaDB disconnected');
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Detect database capabilities
|
|
77
|
+
*/
|
|
78
|
+
async detectCapabilities() {
|
|
79
|
+
const caps = {
|
|
80
|
+
json: true, // MariaDB 10.2+ has JSON
|
|
81
|
+
vectors: false,
|
|
82
|
+
fullText: true,
|
|
83
|
+
fullTextMethod: 'FULLTEXT',
|
|
84
|
+
transactions: true,
|
|
85
|
+
};
|
|
86
|
+
// Get version
|
|
87
|
+
try {
|
|
88
|
+
const result = await this.query('SELECT VERSION() as version');
|
|
89
|
+
if (result.rows.length > 0) {
|
|
90
|
+
this.version = result.rows[0].version;
|
|
91
|
+
// MariaDB 11.6+ supports VECTOR type with HNSW indexing
|
|
92
|
+
// Version format: 11.6.0-MariaDB
|
|
93
|
+
const versionMatch = this.version.match(/^(\d+)\.(\d+)/);
|
|
94
|
+
if (versionMatch) {
|
|
95
|
+
const major = parseInt(versionMatch[1], 10);
|
|
96
|
+
const minor = parseInt(versionMatch[2], 10);
|
|
97
|
+
if (major > 11 || (major === 11 && minor >= 6)) {
|
|
98
|
+
caps.vectors = true;
|
|
99
|
+
caps.vectorInfo = `MariaDB ${this.version} native VECTOR with HNSW`;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Ignore
|
|
106
|
+
}
|
|
107
|
+
// Get max connections
|
|
108
|
+
try {
|
|
109
|
+
const result = await this.query("SHOW VARIABLES LIKE 'max_connections'");
|
|
110
|
+
if (result.rows.length > 0) {
|
|
111
|
+
caps.maxConnections = parseInt(result.rows[0].Value, 10);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Ignore
|
|
116
|
+
}
|
|
117
|
+
return caps;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get capabilities
|
|
121
|
+
*/
|
|
122
|
+
async getCapabilities() {
|
|
123
|
+
if (!this.capabilities) {
|
|
124
|
+
this.capabilities = await this.detectCapabilities();
|
|
125
|
+
}
|
|
126
|
+
return this.capabilities;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Execute a query
|
|
130
|
+
*/
|
|
131
|
+
async query(sql, params) {
|
|
132
|
+
this.assertConnected();
|
|
133
|
+
this.logQuery(sql, params);
|
|
134
|
+
const conn = this.connection ?? this.pool;
|
|
135
|
+
const [rows, fields] = await conn.query(sql, params);
|
|
136
|
+
const resultRows = Array.isArray(rows) ? rows : [];
|
|
137
|
+
return {
|
|
138
|
+
rows: resultRows,
|
|
139
|
+
rowCount: resultRows.length,
|
|
140
|
+
fields: fields?.map((f) => ({
|
|
141
|
+
name: f.name,
|
|
142
|
+
dataType: String(f.type ?? 0),
|
|
143
|
+
})),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Execute a non-query statement
|
|
148
|
+
*/
|
|
149
|
+
async execute(sql, params) {
|
|
150
|
+
this.assertConnected();
|
|
151
|
+
this.assertWritable();
|
|
152
|
+
this.logQuery(sql, params);
|
|
153
|
+
const conn = this.connection ?? this.pool;
|
|
154
|
+
const [result] = await conn.execute(sql, params);
|
|
155
|
+
return result.affectedRows ?? 0;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Begin transaction
|
|
159
|
+
*/
|
|
160
|
+
async beginTransaction() {
|
|
161
|
+
this.assertConnected();
|
|
162
|
+
if (this.inTransaction) {
|
|
163
|
+
throw new Error('Transaction already in progress');
|
|
164
|
+
}
|
|
165
|
+
this.connection = await this.pool.getConnection();
|
|
166
|
+
await this.connection.beginTransaction();
|
|
167
|
+
this.inTransaction = true;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Commit transaction
|
|
171
|
+
*/
|
|
172
|
+
async commit() {
|
|
173
|
+
if (!this.inTransaction || !this.connection) {
|
|
174
|
+
throw new Error('No transaction in progress');
|
|
175
|
+
}
|
|
176
|
+
await this.connection.commit();
|
|
177
|
+
this.connection.release();
|
|
178
|
+
this.connection = null;
|
|
179
|
+
this.inTransaction = false;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Rollback transaction
|
|
183
|
+
*/
|
|
184
|
+
async rollback() {
|
|
185
|
+
if (!this.inTransaction || !this.connection) {
|
|
186
|
+
throw new Error('No transaction in progress');
|
|
187
|
+
}
|
|
188
|
+
await this.connection.rollback();
|
|
189
|
+
this.connection.release();
|
|
190
|
+
this.connection = null;
|
|
191
|
+
this.inTransaction = false;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get database schema
|
|
195
|
+
*/
|
|
196
|
+
async getSchema() {
|
|
197
|
+
this.assertConnected();
|
|
198
|
+
// Get tables
|
|
199
|
+
const tablesResult = await this.query(`SELECT TABLE_NAME
|
|
200
|
+
FROM information_schema.TABLES
|
|
201
|
+
WHERE TABLE_SCHEMA = DATABASE()
|
|
202
|
+
AND TABLE_TYPE = 'BASE TABLE'
|
|
203
|
+
ORDER BY TABLE_NAME`);
|
|
204
|
+
const tables = [];
|
|
205
|
+
for (const row of tablesResult.rows) {
|
|
206
|
+
const info = await this.getTableInfo(row.TABLE_NAME);
|
|
207
|
+
if (info)
|
|
208
|
+
tables.push(info);
|
|
209
|
+
}
|
|
210
|
+
// Get views
|
|
211
|
+
const viewsResult = await this.query(`SELECT TABLE_NAME
|
|
212
|
+
FROM information_schema.VIEWS
|
|
213
|
+
WHERE TABLE_SCHEMA = DATABASE()
|
|
214
|
+
ORDER BY TABLE_NAME`);
|
|
215
|
+
return {
|
|
216
|
+
tables,
|
|
217
|
+
views: viewsResult.rows.map((r) => r.TABLE_NAME),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get table info
|
|
222
|
+
*/
|
|
223
|
+
async getTableInfo(tableName) {
|
|
224
|
+
this.assertConnected();
|
|
225
|
+
// Get columns
|
|
226
|
+
const columnsResult = await this.query(`SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_KEY
|
|
227
|
+
FROM information_schema.COLUMNS
|
|
228
|
+
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?
|
|
229
|
+
ORDER BY ORDINAL_POSITION`, [tableName]);
|
|
230
|
+
if (columnsResult.rows.length === 0) {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
// Get row count
|
|
234
|
+
const countResult = await this.query(`SELECT COUNT(*) as count FROM ${this.escapeIdentifier(tableName)}`);
|
|
235
|
+
const columns = columnsResult.rows.map((row) => ({
|
|
236
|
+
name: row.COLUMN_NAME,
|
|
237
|
+
type: row.DATA_TYPE,
|
|
238
|
+
nullable: row.IS_NULLABLE === 'YES',
|
|
239
|
+
primaryKey: row.COLUMN_KEY === 'PRI',
|
|
240
|
+
defaultValue: row.COLUMN_DEFAULT,
|
|
241
|
+
}));
|
|
242
|
+
return {
|
|
243
|
+
name: tableName,
|
|
244
|
+
columns,
|
|
245
|
+
rowCount: countResult.rows[0]?.count ?? 0,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Escape identifier
|
|
250
|
+
*/
|
|
251
|
+
escapeIdentifier(name) {
|
|
252
|
+
return `\`${name.replace(/`/g, '``')}\``;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Get parameter placeholder
|
|
256
|
+
*/
|
|
257
|
+
getPlaceholder(_index) {
|
|
258
|
+
return '?';
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Map column type
|
|
262
|
+
*/
|
|
263
|
+
mapColumnType(type) {
|
|
264
|
+
const typeMap = {
|
|
265
|
+
string: 'VARCHAR(255)',
|
|
266
|
+
text: 'TEXT',
|
|
267
|
+
integer: 'INT',
|
|
268
|
+
bigint: 'BIGINT',
|
|
269
|
+
float: 'FLOAT',
|
|
270
|
+
double: 'DOUBLE',
|
|
271
|
+
boolean: 'TINYINT(1)',
|
|
272
|
+
date: 'DATE',
|
|
273
|
+
datetime: 'DATETIME',
|
|
274
|
+
json: 'JSON',
|
|
275
|
+
blob: 'BLOB',
|
|
276
|
+
vector: 'VECTOR', // MariaDB 11.6+ native VECTOR type
|
|
277
|
+
};
|
|
278
|
+
return typeMap[type.toLowerCase()] ?? type;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Get MariaDB version
|
|
282
|
+
*/
|
|
283
|
+
getVersion() {
|
|
284
|
+
return this.version;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Check if this is actually MariaDB (not MySQL)
|
|
288
|
+
*/
|
|
289
|
+
isMariaDB() {
|
|
290
|
+
return this.version.toLowerCase().includes('mariadb');
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=mariadb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mariadb.js","sourceRoot":"","sources":["../../src/providers/mariadb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MySQL Provider
|
|
3
|
+
*
|
|
4
|
+
* MySQL database provider with vector support detection (MySQL 9+).
|
|
5
|
+
*/
|
|
6
|
+
import type { ProviderCapabilities, QueryResult, DatabaseSchema, TableInfo } from '../types.js';
|
|
7
|
+
import { BaseProvider, BaseProviderOptions } from './base.js';
|
|
8
|
+
/**
|
|
9
|
+
* MySQL Provider
|
|
10
|
+
*/
|
|
11
|
+
export declare class MySQLProvider extends BaseProvider {
|
|
12
|
+
private pool;
|
|
13
|
+
private connection;
|
|
14
|
+
private capabilities;
|
|
15
|
+
private version;
|
|
16
|
+
constructor(options: BaseProviderOptions);
|
|
17
|
+
/**
|
|
18
|
+
* Connect to MySQL
|
|
19
|
+
*/
|
|
20
|
+
connect(): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Disconnect from MySQL
|
|
23
|
+
*/
|
|
24
|
+
disconnect(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Detect database capabilities
|
|
27
|
+
*/
|
|
28
|
+
private detectCapabilities;
|
|
29
|
+
/**
|
|
30
|
+
* Get capabilities
|
|
31
|
+
*/
|
|
32
|
+
getCapabilities(): Promise<ProviderCapabilities>;
|
|
33
|
+
/**
|
|
34
|
+
* Execute a query
|
|
35
|
+
*/
|
|
36
|
+
query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<QueryResult<T>>;
|
|
37
|
+
/**
|
|
38
|
+
* Execute a non-query statement
|
|
39
|
+
*/
|
|
40
|
+
execute(sql: string, params?: unknown[]): Promise<number>;
|
|
41
|
+
/**
|
|
42
|
+
* Begin transaction
|
|
43
|
+
*/
|
|
44
|
+
beginTransaction(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Commit transaction
|
|
47
|
+
*/
|
|
48
|
+
commit(): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Rollback transaction
|
|
51
|
+
*/
|
|
52
|
+
rollback(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Get database schema
|
|
55
|
+
*/
|
|
56
|
+
getSchema(): Promise<DatabaseSchema>;
|
|
57
|
+
/**
|
|
58
|
+
* Get table info
|
|
59
|
+
*/
|
|
60
|
+
getTableInfo(tableName: string): Promise<TableInfo | null>;
|
|
61
|
+
/**
|
|
62
|
+
* Escape identifier
|
|
63
|
+
*/
|
|
64
|
+
escapeIdentifier(name: string): string;
|
|
65
|
+
/**
|
|
66
|
+
* Get parameter placeholder
|
|
67
|
+
*/
|
|
68
|
+
getPlaceholder(_index: number): string;
|
|
69
|
+
/**
|
|
70
|
+
* Map column type
|
|
71
|
+
*/
|
|
72
|
+
protected mapColumnType(type: string): string;
|
|
73
|
+
/**
|
|
74
|
+
* Get MySQL version
|
|
75
|
+
*/
|
|
76
|
+
getVersion(): string;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=mysql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../src/providers/mysql.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAEV,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,SAAS,EAEV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAkB9D;;GAEG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,IAAI,CAA8C;IAC1D,OAAO,CAAC,UAAU,CAAwD;IAC1E,OAAO,CAAC,YAAY,CAAqC;IACzD,OAAO,CAAC,OAAO,CAAc;gBAEjB,OAAO,EAAE,mBAAmB;IAIxC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAejC;;OAEG;YACW,kBAAkB;IA8ChC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAOtD;;OAEG;IACG,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAmB1B;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAW/D;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAYvC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAW7B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAW/B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IAgC1C;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IA0ChE;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAItC;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAItC;;OAEG;cACgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAmBtD;;OAEG;IACH,UAAU,IAAI,MAAM;CAGrB"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MySQL Provider
|
|
3
|
+
*
|
|
4
|
+
* MySQL database provider with vector support detection (MySQL 9+).
|
|
5
|
+
*/
|
|
6
|
+
import { BaseProvider } from './base.js';
|
|
7
|
+
// Dynamic import for mysql2
|
|
8
|
+
let mysql2 = null;
|
|
9
|
+
async function getMySQL() {
|
|
10
|
+
if (!mysql2) {
|
|
11
|
+
try {
|
|
12
|
+
mysql2 = await import('mysql2/promise');
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
throw new Error('mysql2 package not installed. Install with: npm install mysql2');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return mysql2;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* MySQL Provider
|
|
22
|
+
*/
|
|
23
|
+
export class MySQLProvider extends BaseProvider {
|
|
24
|
+
pool = null;
|
|
25
|
+
connection = null;
|
|
26
|
+
capabilities = null;
|
|
27
|
+
version = '';
|
|
28
|
+
constructor(options) {
|
|
29
|
+
super({ ...options, type: 'mysql' });
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Connect to MySQL
|
|
33
|
+
*/
|
|
34
|
+
async connect() {
|
|
35
|
+
if (this.connected)
|
|
36
|
+
return;
|
|
37
|
+
const mysql = await getMySQL();
|
|
38
|
+
const config = this.config;
|
|
39
|
+
this.pool = mysql.createPool({
|
|
40
|
+
host: config.host,
|
|
41
|
+
port: config.port ?? 3306,
|
|
42
|
+
database: config.database,
|
|
43
|
+
user: config.user,
|
|
44
|
+
password: config.password,
|
|
45
|
+
ssl: config.ssl,
|
|
46
|
+
waitForConnections: true,
|
|
47
|
+
connectionLimit: 10,
|
|
48
|
+
queueLimit: 0,
|
|
49
|
+
enableKeepAlive: true,
|
|
50
|
+
});
|
|
51
|
+
// Test connection
|
|
52
|
+
const testConn = await this.pool.getConnection();
|
|
53
|
+
testConn.release();
|
|
54
|
+
this.connected = true;
|
|
55
|
+
this.logger.info('MySQL connected');
|
|
56
|
+
// Detect capabilities
|
|
57
|
+
this.capabilities = await this.detectCapabilities();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Disconnect from MySQL
|
|
61
|
+
*/
|
|
62
|
+
async disconnect() {
|
|
63
|
+
if (this.connection) {
|
|
64
|
+
this.connection.release();
|
|
65
|
+
this.connection = null;
|
|
66
|
+
}
|
|
67
|
+
if (this.pool) {
|
|
68
|
+
await this.pool.end();
|
|
69
|
+
this.pool = null;
|
|
70
|
+
}
|
|
71
|
+
this.connected = false;
|
|
72
|
+
this.logger.info('MySQL disconnected');
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Detect database capabilities
|
|
76
|
+
*/
|
|
77
|
+
async detectCapabilities() {
|
|
78
|
+
const caps = {
|
|
79
|
+
json: true, // MySQL 5.7+ has JSON type
|
|
80
|
+
vectors: false,
|
|
81
|
+
fullText: true,
|
|
82
|
+
fullTextMethod: 'FULLTEXT',
|
|
83
|
+
transactions: true,
|
|
84
|
+
};
|
|
85
|
+
// Get version
|
|
86
|
+
try {
|
|
87
|
+
const result = await this.query('SELECT VERSION() as version');
|
|
88
|
+
if (result.rows.length > 0) {
|
|
89
|
+
this.version = result.rows[0].version;
|
|
90
|
+
// MySQL 9.0+ supports VECTOR type
|
|
91
|
+
const versionMatch = this.version.match(/^(\d+)\.(\d+)/);
|
|
92
|
+
if (versionMatch) {
|
|
93
|
+
const major = parseInt(versionMatch[1], 10);
|
|
94
|
+
if (major >= 9) {
|
|
95
|
+
caps.vectors = true;
|
|
96
|
+
caps.vectorInfo = `MySQL ${this.version} native VECTOR`;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Ignore
|
|
103
|
+
}
|
|
104
|
+
// Get max connections
|
|
105
|
+
try {
|
|
106
|
+
const result = await this.query("SHOW VARIABLES LIKE 'max_connections'");
|
|
107
|
+
if (result.rows.length > 0) {
|
|
108
|
+
caps.maxConnections = parseInt(result.rows[0].Value, 10);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Ignore
|
|
113
|
+
}
|
|
114
|
+
return caps;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get capabilities
|
|
118
|
+
*/
|
|
119
|
+
async getCapabilities() {
|
|
120
|
+
if (!this.capabilities) {
|
|
121
|
+
this.capabilities = await this.detectCapabilities();
|
|
122
|
+
}
|
|
123
|
+
return this.capabilities;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Execute a query
|
|
127
|
+
*/
|
|
128
|
+
async query(sql, params) {
|
|
129
|
+
this.assertConnected();
|
|
130
|
+
this.logQuery(sql, params);
|
|
131
|
+
const conn = this.connection ?? this.pool;
|
|
132
|
+
const [rows, fields] = await conn.query(sql, params);
|
|
133
|
+
const resultRows = Array.isArray(rows) ? rows : [];
|
|
134
|
+
return {
|
|
135
|
+
rows: resultRows,
|
|
136
|
+
rowCount: resultRows.length,
|
|
137
|
+
fields: fields?.map((f) => ({
|
|
138
|
+
name: f.name,
|
|
139
|
+
dataType: String(f.type ?? 0),
|
|
140
|
+
})),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Execute a non-query statement
|
|
145
|
+
*/
|
|
146
|
+
async execute(sql, params) {
|
|
147
|
+
this.assertConnected();
|
|
148
|
+
this.assertWritable();
|
|
149
|
+
this.logQuery(sql, params);
|
|
150
|
+
const conn = this.connection ?? this.pool;
|
|
151
|
+
const [result] = await conn.execute(sql, params);
|
|
152
|
+
return result.affectedRows ?? 0;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Begin transaction
|
|
156
|
+
*/
|
|
157
|
+
async beginTransaction() {
|
|
158
|
+
this.assertConnected();
|
|
159
|
+
if (this.inTransaction) {
|
|
160
|
+
throw new Error('Transaction already in progress');
|
|
161
|
+
}
|
|
162
|
+
this.connection = await this.pool.getConnection();
|
|
163
|
+
await this.connection.beginTransaction();
|
|
164
|
+
this.inTransaction = true;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Commit transaction
|
|
168
|
+
*/
|
|
169
|
+
async commit() {
|
|
170
|
+
if (!this.inTransaction || !this.connection) {
|
|
171
|
+
throw new Error('No transaction in progress');
|
|
172
|
+
}
|
|
173
|
+
await this.connection.commit();
|
|
174
|
+
this.connection.release();
|
|
175
|
+
this.connection = null;
|
|
176
|
+
this.inTransaction = false;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Rollback transaction
|
|
180
|
+
*/
|
|
181
|
+
async rollback() {
|
|
182
|
+
if (!this.inTransaction || !this.connection) {
|
|
183
|
+
throw new Error('No transaction in progress');
|
|
184
|
+
}
|
|
185
|
+
await this.connection.rollback();
|
|
186
|
+
this.connection.release();
|
|
187
|
+
this.connection = null;
|
|
188
|
+
this.inTransaction = false;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get database schema
|
|
192
|
+
*/
|
|
193
|
+
async getSchema() {
|
|
194
|
+
this.assertConnected();
|
|
195
|
+
// Get tables
|
|
196
|
+
const tablesResult = await this.query(`SELECT TABLE_NAME
|
|
197
|
+
FROM information_schema.TABLES
|
|
198
|
+
WHERE TABLE_SCHEMA = DATABASE()
|
|
199
|
+
AND TABLE_TYPE = 'BASE TABLE'
|
|
200
|
+
ORDER BY TABLE_NAME`);
|
|
201
|
+
const tables = [];
|
|
202
|
+
for (const row of tablesResult.rows) {
|
|
203
|
+
const info = await this.getTableInfo(row.TABLE_NAME);
|
|
204
|
+
if (info)
|
|
205
|
+
tables.push(info);
|
|
206
|
+
}
|
|
207
|
+
// Get views
|
|
208
|
+
const viewsResult = await this.query(`SELECT TABLE_NAME
|
|
209
|
+
FROM information_schema.VIEWS
|
|
210
|
+
WHERE TABLE_SCHEMA = DATABASE()
|
|
211
|
+
ORDER BY TABLE_NAME`);
|
|
212
|
+
return {
|
|
213
|
+
tables,
|
|
214
|
+
views: viewsResult.rows.map((r) => r.TABLE_NAME),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get table info
|
|
219
|
+
*/
|
|
220
|
+
async getTableInfo(tableName) {
|
|
221
|
+
this.assertConnected();
|
|
222
|
+
// Get columns
|
|
223
|
+
const columnsResult = await this.query(`SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_KEY
|
|
224
|
+
FROM information_schema.COLUMNS
|
|
225
|
+
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?
|
|
226
|
+
ORDER BY ORDINAL_POSITION`, [tableName]);
|
|
227
|
+
if (columnsResult.rows.length === 0) {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
// Get row count
|
|
231
|
+
const countResult = await this.query(`SELECT COUNT(*) as count FROM ${this.escapeIdentifier(tableName)}`);
|
|
232
|
+
const columns = columnsResult.rows.map((row) => ({
|
|
233
|
+
name: row.COLUMN_NAME,
|
|
234
|
+
type: row.DATA_TYPE,
|
|
235
|
+
nullable: row.IS_NULLABLE === 'YES',
|
|
236
|
+
primaryKey: row.COLUMN_KEY === 'PRI',
|
|
237
|
+
defaultValue: row.COLUMN_DEFAULT,
|
|
238
|
+
}));
|
|
239
|
+
return {
|
|
240
|
+
name: tableName,
|
|
241
|
+
columns,
|
|
242
|
+
rowCount: countResult.rows[0]?.count ?? 0,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Escape identifier
|
|
247
|
+
*/
|
|
248
|
+
escapeIdentifier(name) {
|
|
249
|
+
return `\`${name.replace(/`/g, '``')}\``;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get parameter placeholder
|
|
253
|
+
*/
|
|
254
|
+
getPlaceholder(_index) {
|
|
255
|
+
return '?';
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Map column type
|
|
259
|
+
*/
|
|
260
|
+
mapColumnType(type) {
|
|
261
|
+
const typeMap = {
|
|
262
|
+
string: 'VARCHAR(255)',
|
|
263
|
+
text: 'TEXT',
|
|
264
|
+
integer: 'INT',
|
|
265
|
+
bigint: 'BIGINT',
|
|
266
|
+
float: 'FLOAT',
|
|
267
|
+
double: 'DOUBLE',
|
|
268
|
+
boolean: 'TINYINT(1)',
|
|
269
|
+
date: 'DATE',
|
|
270
|
+
datetime: 'DATETIME',
|
|
271
|
+
json: 'JSON',
|
|
272
|
+
blob: 'BLOB',
|
|
273
|
+
vector: 'VECTOR', // MySQL 9+ native VECTOR type
|
|
274
|
+
};
|
|
275
|
+
return typeMap[type.toLowerCase()] ?? type;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Get MySQL version
|
|
279
|
+
*/
|
|
280
|
+
getVersion() {
|
|
281
|
+
return this.version;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=mysql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../src/providers/mysql.ts"],"names":[],"mappings":"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"}
|