db depoloy simple test

This commit is contained in:
Jan Prochazka
2021-10-02 14:32:56 +02:00
parent 0974c76fc6
commit d953d1b342
5 changed files with 94 additions and 59 deletions

View File

@@ -1,55 +1,41 @@
/// TODO /// TODO
const stableStringify = require('json-stable-stringify');
const _ = require('lodash');
const fp = require('lodash/fp');
const uuidv1 = require('uuid/v1');
const { testWrapper } = require('../tools'); const { testWrapper } = require('../tools');
const engines = require('../engines'); const engines = require('../engines');
const { getAlterDatabaseScript, extendDatabaseInfo, generateDbPairingId } = require('dbgate-tools'); const deployDb = require('dbgate-api/src/shell/deployDb');
function flatSource() { async function testDatabaseDeploy(conn, driver, dbModelYaml, checkDb) {
return _.flatten( await deployDb({
engines.map(engine => (engine.objects || []).map(object => [engine.label, object.type, object, engine])) systemConnection: conn,
); driver,
} loadedDbModel: dbModelYaml,
});
async function testDatabaseDiff(conn, driver, mangle, createObject = null) { const structure = await driver.analyseFull(conn);
await driver.query(conn, `create table t1 (id int not null primary key)`); checkDb(structure);
await driver.query(
conn,
`create table t2 (
id int not null primary key,
t1_id int null references t1(id)
)`
);
if (createObject) await driver.query(conn, createObject);
const structure1 = generateDbPairingId(extendDatabaseInfo(await driver.analyseFull(conn)));
let structure2 = _.cloneDeep(structure1);
mangle(structure2);
structure2 = extendDatabaseInfo(structure2);
const { sql } = getAlterDatabaseScript(structure1, structure2, {}, structure2, driver);
console.log('RUNNING ALTER SQL', driver.engine, ':', sql);
await driver.script(conn, sql);
const structure2Real = extendDatabaseInfo(await driver.analyseFull(conn));
expect(structure2Real.tables.length).toEqual(structure2.tables.length);
return structure2Real;
} }
describe('Deploy database', () => { describe('Deploy database', () => {
test.each(engines.map(engine => [engine.label, engine]))( test.each(engines.map(engine => [engine.label, engine]))(
'Drop referenced table - %s', 'Drop referenced table - %s',
testWrapper(async (conn, driver, engine) => { testWrapper(async (conn, driver, engine) => {
await testDatabaseDiff(conn, driver, db => { await testDatabaseDeploy(
_.remove(db.tables, x => x.pureName == 't1'); conn,
}); driver,
[
{
name: 'tables.yaml',
json: {
name: 't1',
columns: [{ name: 'id', type: 'int' }],
primaryKey: ['id'],
},
},
],
db => {
expect(db.tables.length).toEqual(1);
}
);
}) })
); );
}); });

View File

@@ -12,6 +12,7 @@ const { archivedir } = require('../utility/directories');
const path = require('path'); const path = require('path');
const importDbModel = require('../utility/importDbModel'); const importDbModel = require('../utility/importDbModel');
const requireEngineDriver = require('../utility/requireEngineDriver'); const requireEngineDriver = require('../utility/requireEngineDriver');
const generateDeploySql = require('../shell/generateDeploySql');
module.exports = { module.exports = {
/** @type {import('dbgate-types').OpenedDatabaseConnection[]} */ /** @type {import('dbgate-types').OpenedDatabaseConnection[]} */
@@ -257,19 +258,25 @@ module.exports = {
generateDeploySql_meta: 'post', generateDeploySql_meta: 'post',
async generateDeploySql({ conid, database, archiveFolder }) { async generateDeploySql({ conid, database, archiveFolder }) {
const deployedModel = generateDbPairingId(await importDbModel(path.join(archivedir(), archiveFolder)));
const currentModel = generateDbPairingId(await this.structure({ conid, database }));
const currentModelPaired = matchPairedObjects(deployedModel, currentModel);
const connection = await connections.get({ conid }); const connection = await connections.get({ conid });
const driver = requireEngineDriver(connection); return generateDeploySql({
const { sql } = getAlterDatabaseScript(currentModelPaired, deployedModel, {}, deployedModel, driver); connection,
return { analysedStructure: await this.structure({ conid, database }),
deployedModel, modelFolder: path.join(archivedir(), archiveFolder),
currentModel, });
currentModelPaired, // const deployedModel = generateDbPairingId(await importDbModel(path.join(archivedir(), archiveFolder)));
sql, // const currentModel = generateDbPairingId(await this.structure({ conid, database }));
}; // const currentModelPaired = matchPairedObjects(deployedModel, currentModel);
return sql; // const connection = await connections.get({ conid });
// const driver = requireEngineDriver(connection);
// const { sql } = getAlterDatabaseScript(currentModelPaired, deployedModel, {}, deployedModel, driver);
// return {
// deployedModel,
// currentModel,
// currentModelPaired,
// sql,
// };
// return sql;
}, },
// runCommand_meta: 'post', // runCommand_meta: 'post',
// async runCommand({ conid, database, sql }) { // async runCommand({ conid, database, sql }) {

View File

@@ -1,8 +1,16 @@
const EnsureStreamHeaderStream = require('../utility/EnsureStreamHeaderStream'); const generateDeploySql = require('./generateDeploySql');
const importDbModel = require('../utility/importDbModel'); const executeQuery = require('./executeQuery');
async function deployDb(connection, modelFolder, options) { async function deployDb({ connection, systemConnection, driver, analysedStructure, modelFolder, loadedDbModel }) {
const dbModel = await importDbModel(modelFolder); const sql = await generateDeploySql({
connection,
systemConnection,
driver,
analysedStructure,
modelFolder,
loadedDbModel,
});
await executeQuery({ connection, systemConnection, driver, sql });
} }
module.exports = deployDb; module.exports = deployDb;

View File

@@ -2,11 +2,11 @@ const { splitQuery } = require('dbgate-query-splitter');
const requireEngineDriver = require('../utility/requireEngineDriver'); const requireEngineDriver = require('../utility/requireEngineDriver');
const connectUtility = require('../utility/connectUtility'); const connectUtility = require('../utility/connectUtility');
async function executeQuery({ connection, sql }) { async function executeQuery({ connection = undefined, systemConnection = undefined, driver = undefined, sql }) {
console.log(`Execute query ${sql}`); console.log(`Execute query ${sql}`);
const driver = requireEngineDriver(connection); if (!driver) driver = requireEngineDriver(connection);
const pool = await connectUtility(driver, connection); const pool = systemConnection || (await connectUtility(driver, connection));
console.log(`Connected.`); console.log(`Connected.`);
for (const sqlItem of splitQuery(sql, driver.getQuerySplitterOptions('script'))) { for (const sqlItem of splitQuery(sql, driver.getQuerySplitterOptions('script'))) {

View File

@@ -0,0 +1,34 @@
const {
getAlterDatabaseScript,
generateDbPairingId,
matchPairedObjects,
databaseInfoFromYamlModel,
} = require('dbgate-tools');
const importDbModel = require('../utility/importDbModel');
const requireEngineDriver = require('../utility/requireEngineDriver');
const connectUtility = require('../utility/connectUtility');
async function generateDeploySql({
connection,
systemConnection = undefined,
driver = undefined,
analysedStructure = undefined,
modelFolder = undefined,
loadedDbModel = undefined,
}) {
if (!driver) driver = requireEngineDriver(connection);
if (!analysedStructure) {
const pool = systemConnection || (await connectUtility(driver, connection));
analysedStructure = await driver.analyseFull(pool);
}
const deployedModel = generateDbPairingId(
loadedDbModel ? databaseInfoFromYamlModel(loadedDbModel) : await importDbModel(modelFolder)
);
const currentModel = generateDbPairingId(analysedStructure);
const currentModelPaired = matchPairedObjects(deployedModel, currentModel);
const { sql } = getAlterDatabaseScript(currentModelPaired, deployedModel, {}, deployedModel, driver);
return sql;
}
module.exports = generateDeploySql;