universal-db-switcher 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/README.md +93 -0
- package/dist/adapters/index.d.ts +6 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +6 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/mongodb-adapter.d.ts +25 -0
- package/dist/adapters/mongodb-adapter.d.ts.map +1 -0
- package/dist/adapters/mongodb-adapter.js +150 -0
- package/dist/adapters/mongodb-adapter.js.map +1 -0
- package/dist/adapters/mysql-adapter.d.ts +25 -0
- package/dist/adapters/mysql-adapter.d.ts.map +1 -0
- package/dist/adapters/mysql-adapter.js +197 -0
- package/dist/adapters/mysql-adapter.js.map +1 -0
- package/dist/cli/cli.d.ts +6 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +164 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +5 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/adapter-factory.d.ts +7 -0
- package/dist/core/adapter-factory.d.ts.map +1 -0
- package/dist/core/adapter-factory.js +22 -0
- package/dist/core/adapter-factory.js.map +1 -0
- package/dist/core/base-adapter.d.ts +41 -0
- package/dist/core/base-adapter.d.ts.map +1 -0
- package/dist/core/base-adapter.js +14 -0
- package/dist/core/base-adapter.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/types.d.ts +52 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +33 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/migration/index.d.ts +3 -0
- package/dist/migration/index.d.ts.map +1 -0
- package/dist/migration/index.js +2 -0
- package/dist/migration/index.js.map +1 -0
- package/dist/migration/migration-engine.d.ts +29 -0
- package/dist/migration/migration-engine.d.ts.map +1 -0
- package/dist/migration/migration-engine.js +101 -0
- package/dist/migration/migration-engine.js.map +1 -0
- package/dist/schema-mapper/index.d.ts +2 -0
- package/dist/schema-mapper/index.d.ts.map +1 -0
- package/dist/schema-mapper/index.js +2 -0
- package/dist/schema-mapper/index.js.map +1 -0
- package/dist/schema-mapper/schema-mapper.d.ts +7 -0
- package/dist/schema-mapper/schema-mapper.d.ts.map +1 -0
- package/dist/schema-mapper/schema-mapper.js +99 -0
- package/dist/schema-mapper/schema-mapper.js.map +1 -0
- package/dist/switch-db.d.ts +32 -0
- package/dist/switch-db.d.ts.map +1 -0
- package/dist/switch-db.js +78 -0
- package/dist/switch-db.js.map +1 -0
- package/package.json +54 -0
package/README.md
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# universal-db-switcher
|
|
2
|
+
|
|
3
|
+
A universal database switching and migration tool that supports MongoDB, MySQL, PostgreSQL, and SQLite.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Switch** between MongoDB, MySQL, PostgreSQL, and SQLite
|
|
8
|
+
- **Extract** schema from source database
|
|
9
|
+
- **Convert** schema to target database format
|
|
10
|
+
- **Migrate** data with configurable batch size
|
|
11
|
+
- **CLI** tool for command-line migrations
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install universal-db-switcher
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
### Programmatic API
|
|
22
|
+
|
|
23
|
+
```javascript
|
|
24
|
+
import { switchDB } from 'universal-db-switcher';
|
|
25
|
+
|
|
26
|
+
const result = await switchDB(
|
|
27
|
+
{
|
|
28
|
+
type: 'mongodb',
|
|
29
|
+
host: 'localhost',
|
|
30
|
+
port: 27017,
|
|
31
|
+
database: 'mydb',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
type: 'mysql',
|
|
35
|
+
host: 'localhost',
|
|
36
|
+
port: 3306,
|
|
37
|
+
database: 'mydb',
|
|
38
|
+
username: 'root',
|
|
39
|
+
password: 'secret',
|
|
40
|
+
},
|
|
41
|
+
{ batchSize: 1000 }
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
console.log(result.success ? 'Migration complete!' : result.error);
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### CLI
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# Migrate from MySQL to MongoDB
|
|
51
|
+
npx udb-switch migrate -s mysql -t mongodb \
|
|
52
|
+
--source-uri "mysql://user:pass@localhost/sourcedb" \
|
|
53
|
+
--target-uri "mongodb://localhost:27017/targetdb"
|
|
54
|
+
|
|
55
|
+
# Extract schema only (no data)
|
|
56
|
+
npx udb-switch migrate -s mysql -t mongodb --schema-only \
|
|
57
|
+
--source-uri "mysql://user:pass@localhost/db" \
|
|
58
|
+
--target-uri "mongodb://localhost/db"
|
|
59
|
+
|
|
60
|
+
# Extract schema to file
|
|
61
|
+
npx udb-switch schema -t mysql --uri "mysql://user:pass@localhost/db" -o schema.json
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Supported Databases
|
|
65
|
+
|
|
66
|
+
| Database | Status |
|
|
67
|
+
|-----------|-----------|
|
|
68
|
+
| MongoDB | ✅ Supported |
|
|
69
|
+
| MySQL | ✅ Supported |
|
|
70
|
+
| PostgreSQL| 🔜 Planned |
|
|
71
|
+
| SQLite | 🔜 Planned |
|
|
72
|
+
|
|
73
|
+
## API Reference
|
|
74
|
+
|
|
75
|
+
### switchDB(sourceConfig, targetConfig, options?)
|
|
76
|
+
|
|
77
|
+
Migrates data from source to target database.
|
|
78
|
+
|
|
79
|
+
### extractSchema(config)
|
|
80
|
+
|
|
81
|
+
Extracts schema from a database.
|
|
82
|
+
|
|
83
|
+
### runQuery(config, query, params?)
|
|
84
|
+
|
|
85
|
+
Runs a raw query against a database.
|
|
86
|
+
|
|
87
|
+
### createAdapter(config)
|
|
88
|
+
|
|
89
|
+
Creates a database adapter instance.
|
|
90
|
+
|
|
91
|
+
## License
|
|
92
|
+
|
|
93
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal DB Switcher - MongoDB Adapter
|
|
3
|
+
*/
|
|
4
|
+
import { BaseAdapter } from '../core/base-adapter.js';
|
|
5
|
+
import type { ConnectionConfig, SchemaDefinition, QueryResult } from '../core/types.js';
|
|
6
|
+
export declare class MongoAdapter extends BaseAdapter {
|
|
7
|
+
private client;
|
|
8
|
+
private db;
|
|
9
|
+
constructor(config: ConnectionConfig);
|
|
10
|
+
connect(): Promise<void>;
|
|
11
|
+
private buildConnectionString;
|
|
12
|
+
disconnect(): Promise<void>;
|
|
13
|
+
getSchema(): Promise<SchemaDefinition>;
|
|
14
|
+
private inferSchemaFromDocument;
|
|
15
|
+
private getMongoType;
|
|
16
|
+
fetchData(collectionName: string, options?: {
|
|
17
|
+
limit?: number;
|
|
18
|
+
offset?: number;
|
|
19
|
+
query?: unknown;
|
|
20
|
+
}): Promise<Record<string, unknown>[]>;
|
|
21
|
+
insertData(collectionName: string, data: Record<string, unknown>[], _schema?: SchemaDefinition): Promise<number>;
|
|
22
|
+
runQuery(query: string, _params?: unknown[]): Promise<QueryResult>;
|
|
23
|
+
private ensureConnected;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=mongodb-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongodb-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/mongodb-adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAEhB,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAG1B,qBAAa,YAAa,SAAQ,WAAW;IAC3C,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,EAAE,CAAM;gBAEJ,MAAM,EAAE,gBAAgB;IAO9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB9B,OAAO,CAAC,qBAAqB;IAMvB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA6B5C,OAAO,CAAC,uBAAuB;IAS/B,OAAO,CAAC,YAAY;IAQd,SAAS,CACb,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAC7D,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IA2B/B,UAAU,CACd,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,MAAM,CAAC;IAwBZ,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAmBxE,OAAO,CAAC,eAAe;CAKxB"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal DB Switcher - MongoDB Adapter
|
|
3
|
+
*/
|
|
4
|
+
import { MongoClient } from 'mongodb';
|
|
5
|
+
import { BaseAdapter } from '../core/base-adapter.js';
|
|
6
|
+
import { ConnectionError, SchemaError } from '../core/types.js';
|
|
7
|
+
export class MongoAdapter extends BaseAdapter {
|
|
8
|
+
client;
|
|
9
|
+
db;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
super(config);
|
|
12
|
+
if (config.type !== 'mongodb') {
|
|
13
|
+
throw new ConnectionError('MongoAdapter requires type: mongodb');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async connect() {
|
|
17
|
+
try {
|
|
18
|
+
const uri = this.config.connectionString ??
|
|
19
|
+
this.buildConnectionString();
|
|
20
|
+
this.client = new MongoClient(uri);
|
|
21
|
+
await this.client.connect();
|
|
22
|
+
this.db = this.client.db(this.config.database ?? 'test');
|
|
23
|
+
this._connected = true;
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
this._connected = false;
|
|
27
|
+
throw new ConnectionError(`Failed to connect to MongoDB: ${error.message}`, error);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
buildConnectionString() {
|
|
31
|
+
const { host = 'localhost', port = 27017, username, password, database = 'test' } = this.config;
|
|
32
|
+
const auth = username && password ? `${encodeURIComponent(username)}:${encodeURIComponent(password)}@` : '';
|
|
33
|
+
return `mongodb://${auth}${host}:${port}/${database}`;
|
|
34
|
+
}
|
|
35
|
+
async disconnect() {
|
|
36
|
+
try {
|
|
37
|
+
if (this.client) {
|
|
38
|
+
await this.client.close();
|
|
39
|
+
}
|
|
40
|
+
this._connected = false;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
this._connected = false;
|
|
44
|
+
throw new ConnectionError(`Failed to disconnect from MongoDB: ${error.message}`, error);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async getSchema() {
|
|
48
|
+
this.ensureConnected();
|
|
49
|
+
try {
|
|
50
|
+
const collections = await this.db.listCollections().toArray();
|
|
51
|
+
const schemas = [];
|
|
52
|
+
for (const col of collections) {
|
|
53
|
+
const collection = this.db.collection(col.name);
|
|
54
|
+
const sample = await collection.findOne();
|
|
55
|
+
const fields = sample
|
|
56
|
+
? this.inferSchemaFromDocument(sample)
|
|
57
|
+
: {};
|
|
58
|
+
schemas.push({
|
|
59
|
+
name: col.name,
|
|
60
|
+
fields,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return schemas;
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
throw new SchemaError(`Failed to extract MongoDB schema: ${error.message}`, error);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
inferSchemaFromDocument(doc) {
|
|
70
|
+
const fields = {};
|
|
71
|
+
for (const [key, value] of Object.entries(doc)) {
|
|
72
|
+
if (key === '_id')
|
|
73
|
+
continue;
|
|
74
|
+
fields[key] = this.getMongoType(value);
|
|
75
|
+
}
|
|
76
|
+
return fields;
|
|
77
|
+
}
|
|
78
|
+
getMongoType(value) {
|
|
79
|
+
if (value === null)
|
|
80
|
+
return 'null';
|
|
81
|
+
if (Array.isArray(value))
|
|
82
|
+
return 'array';
|
|
83
|
+
if (value instanceof Date)
|
|
84
|
+
return 'date';
|
|
85
|
+
if (typeof value === 'object')
|
|
86
|
+
return 'object';
|
|
87
|
+
return typeof value;
|
|
88
|
+
}
|
|
89
|
+
async fetchData(collectionName, options) {
|
|
90
|
+
this.ensureConnected();
|
|
91
|
+
try {
|
|
92
|
+
const collection = this.db.collection(collectionName);
|
|
93
|
+
const query = (options?.query ?? {});
|
|
94
|
+
let cursor = collection.find(query);
|
|
95
|
+
const offset = options?.offset ?? 0;
|
|
96
|
+
const limit = options?.limit ?? 0;
|
|
97
|
+
if (offset > 0)
|
|
98
|
+
cursor = cursor.skip(offset);
|
|
99
|
+
if (limit > 0)
|
|
100
|
+
cursor = cursor.limit(limit);
|
|
101
|
+
const docs = await cursor.toArray();
|
|
102
|
+
return docs.map((doc) => {
|
|
103
|
+
const { _id, ...rest } = doc;
|
|
104
|
+
return { id: String(_id), ...rest };
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
throw new SchemaError(`Failed to fetch data from ${collectionName}: ${error.message}`, error);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async insertData(collectionName, data, _schema) {
|
|
112
|
+
this.ensureConnected();
|
|
113
|
+
try {
|
|
114
|
+
const collection = this.db.collection(collectionName);
|
|
115
|
+
const docs = data.map((row) => {
|
|
116
|
+
const { id, ...rest } = row;
|
|
117
|
+
const doc = { ...rest };
|
|
118
|
+
if (id !== undefined && id !== null) {
|
|
119
|
+
doc._id = id;
|
|
120
|
+
}
|
|
121
|
+
return doc;
|
|
122
|
+
});
|
|
123
|
+
const result = await collection.insertMany(docs);
|
|
124
|
+
return result.insertedCount;
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
throw new SchemaError(`Failed to insert data into ${collectionName}: ${error.message}`, error);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async runQuery(query, _params) {
|
|
131
|
+
this.ensureConnected();
|
|
132
|
+
try {
|
|
133
|
+
const result = await this.db.command(JSON.parse(query));
|
|
134
|
+
const rows = Array.isArray(result) ? result : [result];
|
|
135
|
+
return {
|
|
136
|
+
rows: rows,
|
|
137
|
+
rowCount: rows.length,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
throw new SchemaError(`Failed to run MongoDB command: ${error.message}`, error);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
ensureConnected() {
|
|
145
|
+
if (!this._connected || !this.client) {
|
|
146
|
+
throw new ConnectionError('Not connected to MongoDB');
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=mongodb-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongodb-adapter.js","sourceRoot":"","sources":["../../src/adapters/mongodb-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal DB Switcher - MySQL Adapter
|
|
3
|
+
*/
|
|
4
|
+
import { BaseAdapter } from '../core/base-adapter.js';
|
|
5
|
+
import type { ConnectionConfig, SchemaDefinition, QueryResult } from '../core/types.js';
|
|
6
|
+
export declare class MySQLAdapter extends BaseAdapter {
|
|
7
|
+
private connection;
|
|
8
|
+
constructor(config: ConnectionConfig);
|
|
9
|
+
connect(): Promise<void>;
|
|
10
|
+
disconnect(): Promise<void>;
|
|
11
|
+
getSchema(): Promise<SchemaDefinition>;
|
|
12
|
+
private normalizeColumnType;
|
|
13
|
+
fetchData(tableName: string, options?: {
|
|
14
|
+
limit?: number;
|
|
15
|
+
offset?: number;
|
|
16
|
+
query?: unknown;
|
|
17
|
+
}): Promise<Record<string, unknown>[]>;
|
|
18
|
+
private buildWhereClause;
|
|
19
|
+
insertData(tableName: string, data: Record<string, unknown>[], schema?: SchemaDefinition): Promise<number>;
|
|
20
|
+
runQuery(query: string, params?: unknown[]): Promise<QueryResult>;
|
|
21
|
+
createTable(table: import('../core/types.js').TableSchema): Promise<void>;
|
|
22
|
+
private toMySQLType;
|
|
23
|
+
private ensureConnected;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=mysql-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/mysql-adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAGhB,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAG1B,qBAAa,YAAa,SAAQ,WAAW;IAC3C,OAAO,CAAC,UAAU,CAAc;gBAEpB,MAAM,EAAE,gBAAgB;IAO9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA+C5C,OAAO,CAAC,mBAAmB;IAUrB,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAC7D,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IA8BrC,OAAO,CAAC,gBAAgB;IAalB,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,MAAM,CAAC;IAyBZ,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBjE,WAAW,CAAC,KAAK,EAAE,OAAO,kBAAkB,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAY/E,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,eAAe;CAKxB"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal DB Switcher - MySQL Adapter
|
|
3
|
+
*/
|
|
4
|
+
import mysql from 'mysql2/promise';
|
|
5
|
+
import { BaseAdapter } from '../core/base-adapter.js';
|
|
6
|
+
import { ConnectionError, SchemaError } from '../core/types.js';
|
|
7
|
+
export class MySQLAdapter extends BaseAdapter {
|
|
8
|
+
connection;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
super(config);
|
|
11
|
+
if (config.type !== 'mysql') {
|
|
12
|
+
throw new ConnectionError('MySQLAdapter requires type: mysql');
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async connect() {
|
|
16
|
+
try {
|
|
17
|
+
this.connection = await mysql.createConnection({
|
|
18
|
+
host: this.config.host ?? 'localhost',
|
|
19
|
+
port: this.config.port ?? 3306,
|
|
20
|
+
user: this.config.username,
|
|
21
|
+
password: this.config.password,
|
|
22
|
+
database: this.config.database,
|
|
23
|
+
});
|
|
24
|
+
this._connected = true;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
this._connected = false;
|
|
28
|
+
throw new ConnectionError(`Failed to connect to MySQL: ${error.message}`, error);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async disconnect() {
|
|
32
|
+
try {
|
|
33
|
+
if (this.connection) {
|
|
34
|
+
await this.connection.end();
|
|
35
|
+
}
|
|
36
|
+
this._connected = false;
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
this._connected = false;
|
|
40
|
+
throw new ConnectionError(`Failed to disconnect from MySQL: ${error.message}`, error);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async getSchema() {
|
|
44
|
+
this.ensureConnected();
|
|
45
|
+
try {
|
|
46
|
+
const [tables] = await this.connection.query("SHOW TABLES");
|
|
47
|
+
const schemas = [];
|
|
48
|
+
for (const row of tables) {
|
|
49
|
+
const tableName = Object.values(row)[0];
|
|
50
|
+
const [columns] = await this.connection.query(`DESCRIBE \`${tableName}\``);
|
|
51
|
+
const columnSchemas = columns.map((col) => {
|
|
52
|
+
const type = col.Type.toLowerCase();
|
|
53
|
+
const isNull = col.Null === 'YES';
|
|
54
|
+
const isPK = col.Key === 'PRI';
|
|
55
|
+
return {
|
|
56
|
+
name: col.Field,
|
|
57
|
+
type: this.normalizeColumnType(type),
|
|
58
|
+
nullable: isNull,
|
|
59
|
+
primaryKey: isPK,
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
const pkColumns = columnSchemas
|
|
63
|
+
.filter((c) => c.primaryKey)
|
|
64
|
+
.map((c) => c.name);
|
|
65
|
+
schemas.push({
|
|
66
|
+
name: tableName,
|
|
67
|
+
columns: columnSchemas,
|
|
68
|
+
primaryKey: pkColumns.length > 0 ? pkColumns : undefined,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return schemas;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
throw new SchemaError(`Failed to extract MySQL schema: ${error.message}`, error);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
normalizeColumnType(mysqlType) {
|
|
78
|
+
if (mysqlType.includes('int'))
|
|
79
|
+
return 'integer';
|
|
80
|
+
if (mysqlType.includes('decimal') || mysqlType.includes('float') || mysqlType.includes('double'))
|
|
81
|
+
return 'number';
|
|
82
|
+
if (mysqlType.includes('varchar') || mysqlType.includes('char') || mysqlType.includes('text'))
|
|
83
|
+
return 'string';
|
|
84
|
+
if (mysqlType.includes('datetime') || mysqlType.includes('timestamp') || mysqlType.includes('date'))
|
|
85
|
+
return 'datetime';
|
|
86
|
+
if (mysqlType.includes('bool'))
|
|
87
|
+
return 'boolean';
|
|
88
|
+
if (mysqlType.includes('json'))
|
|
89
|
+
return 'json';
|
|
90
|
+
return 'string';
|
|
91
|
+
}
|
|
92
|
+
async fetchData(tableName, options) {
|
|
93
|
+
this.ensureConnected();
|
|
94
|
+
try {
|
|
95
|
+
let sql = `SELECT * FROM \`${tableName}\``;
|
|
96
|
+
const params = [];
|
|
97
|
+
if (options?.query && typeof options.query === 'object') {
|
|
98
|
+
const where = this.buildWhereClause(options.query, params);
|
|
99
|
+
if (where)
|
|
100
|
+
sql += ` WHERE ${where}`;
|
|
101
|
+
}
|
|
102
|
+
if (options?.limit) {
|
|
103
|
+
sql += ' LIMIT ?';
|
|
104
|
+
params.push(options.limit);
|
|
105
|
+
}
|
|
106
|
+
if (options?.offset) {
|
|
107
|
+
sql += ' OFFSET ?';
|
|
108
|
+
params.push(options.offset);
|
|
109
|
+
}
|
|
110
|
+
const [rows] = await this.connection.query(sql, params);
|
|
111
|
+
return rows;
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
throw new SchemaError(`Failed to fetch data from ${tableName}: ${error.message}`, error);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
buildWhereClause(query, params) {
|
|
118
|
+
const conditions = [];
|
|
119
|
+
for (const [key, value] of Object.entries(query)) {
|
|
120
|
+
if (value === undefined)
|
|
121
|
+
continue;
|
|
122
|
+
conditions.push(`\`${key}\` = ?`);
|
|
123
|
+
params.push(value);
|
|
124
|
+
}
|
|
125
|
+
return conditions.join(' AND ');
|
|
126
|
+
}
|
|
127
|
+
async insertData(tableName, data, schema) {
|
|
128
|
+
this.ensureConnected();
|
|
129
|
+
if (data.length === 0)
|
|
130
|
+
return 0;
|
|
131
|
+
try {
|
|
132
|
+
const columns = Object.keys(data[0]);
|
|
133
|
+
const placeholders = columns.map(() => '?').join(', ');
|
|
134
|
+
const columnList = columns.map((c) => `\`${c}\``).join(', ');
|
|
135
|
+
const sql = `INSERT INTO \`${tableName}\` (${columnList}) VALUES (${placeholders})`;
|
|
136
|
+
let inserted = 0;
|
|
137
|
+
for (const row of data) {
|
|
138
|
+
const values = columns.map((c) => row[c]);
|
|
139
|
+
await this.connection.execute(sql, values);
|
|
140
|
+
inserted++;
|
|
141
|
+
}
|
|
142
|
+
return inserted;
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
throw new SchemaError(`Failed to insert data into ${tableName}: ${error.message}`, error);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async runQuery(query, params) {
|
|
149
|
+
this.ensureConnected();
|
|
150
|
+
try {
|
|
151
|
+
const [rows] = await this.connection.query(query, params ?? []);
|
|
152
|
+
const rowArray = Array.isArray(rows) ? rows : [rows];
|
|
153
|
+
return {
|
|
154
|
+
rows: rowArray,
|
|
155
|
+
rowCount: rowArray.length,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
throw new SchemaError(`Failed to run MySQL query: ${error.message}`, error);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async createTable(table) {
|
|
163
|
+
this.ensureConnected();
|
|
164
|
+
const cols = table.columns.map((col) => {
|
|
165
|
+
const type = this.toMySQLType(col.type);
|
|
166
|
+
const nn = col.nullable === false ? ' NOT NULL' : '';
|
|
167
|
+
const pk = col.primaryKey ? ' PRIMARY KEY' : '';
|
|
168
|
+
return `\`${col.name}\` ${type}${nn}${pk}`;
|
|
169
|
+
});
|
|
170
|
+
const sql = `CREATE TABLE IF NOT EXISTS \`${table.name}\` (${cols.join(', ')})`;
|
|
171
|
+
await this.connection.execute(sql);
|
|
172
|
+
}
|
|
173
|
+
toMySQLType(type) {
|
|
174
|
+
const lower = type.toLowerCase();
|
|
175
|
+
if (lower.includes('int') || lower === 'integer')
|
|
176
|
+
return 'INT';
|
|
177
|
+
if (lower.includes('varchar'))
|
|
178
|
+
return type;
|
|
179
|
+
if (lower.includes('decimal') || lower.includes('float') || lower.includes('double'))
|
|
180
|
+
return type;
|
|
181
|
+
if (lower.includes('text'))
|
|
182
|
+
return 'TEXT';
|
|
183
|
+
if (lower.includes('datetime') || lower.includes('date'))
|
|
184
|
+
return 'DATETIME';
|
|
185
|
+
if (lower.includes('bool'))
|
|
186
|
+
return 'BOOLEAN';
|
|
187
|
+
if (lower.includes('json'))
|
|
188
|
+
return 'JSON';
|
|
189
|
+
return 'TEXT';
|
|
190
|
+
}
|
|
191
|
+
ensureConnected() {
|
|
192
|
+
if (!this._connected || !this.connection) {
|
|
193
|
+
throw new ConnectionError('Not connected to MySQL');
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=mysql-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql-adapter.js","sourceRoot":"","sources":["../../src/adapters/mysql-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":";AAEA;;GAEG"}
|