Repository navigation
Expand file tree
/
Copy pathmysql.ts
More file actions
67 lines (65 loc) · 2.32 KB
/
Copy pathmysql.ts
File metadata and controls
67 lines (65 loc) · 2.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import { QueryResult, SqlExecutor } from "../types";
import { SQLKITException } from "../exceptions";
export class MySQLAdapter implements SqlExecutor {
constructor(private mysqlConnection: any) {}
async executeSQL<T>(sql: string, values: any[]): Promise<QueryResult<T>> {
return new Promise((resolve, reject) => {
// Handle different MySQL library interfaces
if (this.mysqlConnection.query) {
// mysql2 or mysql library
this.mysqlConnection.query(sql, values, (err: any, results: any, fields: any) => {
if (err) {
reject(new SQLKITException(err.message));
} else {
// Handle different result types
if (Array.isArray(results)) {
// SELECT queries return array of rows
resolve({
rows: results as T[],
rowCount: results.length
});
} else if (results.affectedRows !== undefined) {
// INSERT/UPDATE/DELETE queries return result object
resolve({
rows: results.insertId ? [{ insertId: results.insertId }] as T[] : [],
rowCount: results.affectedRows
});
} else {
// Fallback for other result types
resolve({
rows: [results] as T[],
rowCount: 1
});
}
}
});
} else if (this.mysqlConnection.execute) {
// mysql2 with prepared statements
this.mysqlConnection.execute(sql, values, (err: any, results: any, fields: any) => {
if (err) {
reject(new SQLKITException(err.message));
} else {
if (Array.isArray(results)) {
resolve({
rows: results as T[],
rowCount: results.length
});
} else if (results.affectedRows !== undefined) {
resolve({
rows: results.insertId ? [{ insertId: results.insertId }] as T[] : [],
rowCount: results.affectedRows
});
} else {
resolve({
rows: [results] as T[],
rowCount: 1
});
}
}
});
} else {
reject(new SQLKITException("Unsupported MySQL database interface"));
}
});
}
}