feat: mssql client

This commit is contained in:
chenos 2025-04-16 22:14:04 +08:00
parent 46a77d265b
commit d8a34bc930
2 changed files with 67 additions and 5 deletions

View File

@ -71,6 +71,7 @@
"pg-hstore": "^2.3.4", "pg-hstore": "^2.3.4",
"sqlite3": "^5.0.8", "sqlite3": "^5.0.8",
"supertest": "^6.1.6", "supertest": "^6.1.6",
"tedious": "^18.6.1",
"vite": "^5.0.0", "vite": "^5.0.0",
"vitest": "^1.5.0", "vitest": "^1.5.0",
"vitest-dom": "^0.1.1", "vitest-dom": "^0.1.1",

View File

@ -7,13 +7,14 @@
* For more information, please refer to: https://www.nocobase.com/agreement. * For more information, please refer to: https://www.nocobase.com/agreement.
*/ */
import http from 'http';
import url from 'url';
import pg from 'pg';
import dotenv from 'dotenv'; import dotenv from 'dotenv';
import path from 'path'; import http from 'http';
import mysql from 'mysql2/promise';
import mariadb from 'mariadb'; import mariadb from 'mariadb';
import mysql from 'mysql2/promise';
import path from 'path';
import pg from 'pg';
import { Connection, Request } from 'tedious';
import url from 'url';
dotenv.config({ path: path.resolve(process.cwd(), '.env.test') }); dotenv.config({ path: path.resolve(process.cwd(), '.env.test') });
@ -135,6 +136,63 @@ class MariaDBClient extends BaseClient<any> {
} }
} }
class MSSQLClient extends BaseClient<Connection> {
async _createConnection(): Promise<Connection> {
return new Promise((resolve, reject) => {
const connection = new Connection({
server: process.env['DB_HOST'],
authentication: {
type: 'default',
options: {
userName: process.env['DB_USER'],
password: process.env['DB_PASSWORD'],
},
},
options: {
port: Number(process.env['DB_PORT']),
database: 'master',
trustServerCertificate: true,
},
});
connection.on('connect', (err) => {
if (err) return reject(err);
resolve(connection);
});
connection.connect();
});
}
async _createDB(name: string): Promise<void> {
return new Promise((resolve, reject) => {
const sql = `IF DB_ID('${name}') IS NULL CREATE DATABASE [${name}]`;
const request = new Request(sql, (err) => {
if (err) return reject(err);
resolve();
});
this._client.execSql(request);
});
}
async _removeDB(name: string): Promise<void> {
return new Promise((resolve, reject) => {
const sql = `
IF DB_ID('${name}') IS NOT NULL
BEGIN
ALTER DATABASE [${name}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE [${name}];
END
`;
const request = new Request(sql, (err) => {
if (err) return reject(err);
resolve();
});
this._client.execSql(request);
});
}
}
const client = { const client = {
postgres: () => { postgres: () => {
return new PostgresClient(); return new PostgresClient();
@ -145,6 +203,9 @@ const client = {
mariadb: () => { mariadb: () => {
return new MariaDBClient(); return new MariaDBClient();
}, },
mssql: () => {
return new MSSQLClient();
},
}; };
const dialect = process.env['DB_DIALECT']; const dialect = process.env['DB_DIALECT'];