mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-17 23:45:59 +00:00
81 lines
2.3 KiB
JavaScript
81 lines
2.3 KiB
JavaScript
const fs = require('fs-extra');
|
|
const path = require('path');
|
|
const { getSchemasUsedByStructure } = require('dbgate-tools');
|
|
|
|
async function exportDbModelSql(dbModel, driver, outputDir, outputFile) {
|
|
const { tables, views, procedures, functions, triggers, matviews } = dbModel;
|
|
|
|
const usedSchemas = getSchemasUsedByStructure(dbModel);
|
|
const useSchemaDir = usedSchemas.length > 1;
|
|
|
|
const createdDirs = new Set();
|
|
async function ensureDir(dir) {
|
|
if (!createdDirs.has(dir)) {
|
|
await fs.mkdir(dir, { recursive: true });
|
|
createdDirs.add(dir);
|
|
}
|
|
}
|
|
|
|
async function writeLists(writeList) {
|
|
await writeList(views, 'views');
|
|
await writeList(procedures, 'procedures');
|
|
await writeList(functions, 'functions');
|
|
await writeList(triggers, 'triggers');
|
|
await writeList(matviews, 'matviews');
|
|
}
|
|
|
|
if (outputFile) {
|
|
const dmp = driver.createDumper();
|
|
for (const table of tables || []) {
|
|
dmp.createTable({
|
|
...table,
|
|
foreignKeys: [],
|
|
dependencies: [],
|
|
});
|
|
}
|
|
for (const table of tables || []) {
|
|
for (const fk of table.foreignKeys || []) {
|
|
dmp.createForeignKey(fk);
|
|
}
|
|
}
|
|
writeLists((list, folder) => {
|
|
for (const obj of list || []) {
|
|
dmp.createSqlObject(obj);
|
|
}
|
|
});
|
|
|
|
const script = dmp.s;
|
|
await fs.writeFile(outputFile, script);
|
|
}
|
|
|
|
if (outputDir) {
|
|
for (const table of tables || []) {
|
|
const tablesDir = useSchemaDir
|
|
? path.join(outputDir, table.schemaName ?? 'default', 'tables')
|
|
: path.join(outputDir, 'tables');
|
|
await ensureDir(tablesDir);
|
|
const dmp = driver.createDumper();
|
|
dmp.createTable({
|
|
...table,
|
|
foreignKeys: [],
|
|
dependencies: [],
|
|
});
|
|
await fs.writeFile(path.join(tablesDir, `${table.pureName}.sql`), dmp.s);
|
|
}
|
|
|
|
await writeLists(async (list, folder) => {
|
|
for (const obj of list || []) {
|
|
const objdir = useSchemaDir
|
|
? path.join(outputDir, obj.schemaName ?? 'default', folder)
|
|
: path.join(outputDir, folder);
|
|
await ensureDir(objdir);
|
|
const dmp = driver.createDumper();
|
|
dmp.createSqlObject(obj);
|
|
await fs.writeFile(path.join(objdir, `${obj.pureName}.sql`), dmp.s);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = exportDbModelSql;
|