mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-27 10:16:03 +00:00
backend exporters/importers from plugins
This commit is contained in:
@@ -5,10 +5,19 @@ const uuidv1 = require('uuid/v1');
|
|||||||
const byline = require('byline');
|
const byline = require('byline');
|
||||||
const socket = require('../utility/socket');
|
const socket = require('../utility/socket');
|
||||||
const { fork } = require('child_process');
|
const { fork } = require('child_process');
|
||||||
const { rundir, uploadsdir } = require('../utility/directories');
|
const { rundir, uploadsdir, pluginsdir } = require('../utility/directories');
|
||||||
|
|
||||||
|
function extractPlugins(script) {
|
||||||
|
const requireRegex = /\s*\/\/\s*@require\s+([^\s]+)\s*\n/g;
|
||||||
|
const matches = [...script.matchAll(requireRegex)];
|
||||||
|
return matches.map((x) => x[1]);
|
||||||
|
}
|
||||||
|
|
||||||
const scriptTemplate = (script) => `
|
const scriptTemplate = (script) => `
|
||||||
const dbgateApi = require(process.env.DBGATE_API || "dbgate-api");
|
const dbgateApi = require(process.env.DBGATE_API);
|
||||||
|
${extractPlugins(script)
|
||||||
|
.map((packageName) => `const ${_.camelCase(packageName)} = require(process.env.PLUGIN_${_.camelCase(packageName)});\n`)
|
||||||
|
.join('')}
|
||||||
require=null;
|
require=null;
|
||||||
async function run() {
|
async function run() {
|
||||||
${script}
|
${script}
|
||||||
@@ -19,7 +28,7 @@ dbgateApi.runScript(run);
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
const loaderScriptTemplate = (functionName, props, runid) => `
|
const loaderScriptTemplate = (functionName, props, runid) => `
|
||||||
const dbgateApi = require(process.env.DBGATE_API || "dbgate-api");
|
const dbgateApi = require(process.env.DBGATE_API);
|
||||||
require=null;
|
require=null;
|
||||||
async function run() {
|
async function run() {
|
||||||
const reader=await dbgateApi.${functionName}(${JSON.stringify(props)});
|
const reader=await dbgateApi.${functionName}(${JSON.stringify(props)});
|
||||||
@@ -73,12 +82,14 @@ module.exports = {
|
|||||||
const scriptFile = path.join(uploadsdir(), runid + '.js');
|
const scriptFile = path.join(uploadsdir(), runid + '.js');
|
||||||
fs.writeFileSync(`${scriptFile}`, scriptText);
|
fs.writeFileSync(`${scriptFile}`, scriptText);
|
||||||
fs.mkdirSync(directory);
|
fs.mkdirSync(directory);
|
||||||
|
const pluginNames = fs.readdirSync(pluginsdir());
|
||||||
console.log(`RUNNING SCRIPT ${scriptFile}`);
|
console.log(`RUNNING SCRIPT ${scriptFile}`);
|
||||||
const subprocess = fork(scriptFile, ['--checkParent'], {
|
const subprocess = fork(scriptFile, ['--checkParent'], {
|
||||||
cwd: directory,
|
cwd: directory,
|
||||||
stdio: ['ignore', 'pipe', 'pipe', 'ipc'],
|
stdio: ['ignore', 'pipe', 'pipe', 'ipc'],
|
||||||
env: {
|
env: {
|
||||||
DBGATE_API: process.argv[1],
|
DBGATE_API: process.argv[1],
|
||||||
|
..._.fromPairs(pluginNames.map((name) => [`PLUGIN_${_.camelCase(name)}`, path.join(pluginsdir(), name)])),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
const pipeDispatcher = (severity) => (data) =>
|
const pipeDispatcher = (severity) => (data) =>
|
||||||
@@ -153,4 +164,3 @@ module.exports = {
|
|||||||
return promise;
|
return promise;
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
|
import _ from 'lodash';
|
||||||
|
|
||||||
export default class ScriptWriter {
|
export default class ScriptWriter {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.s = '';
|
this.s = '';
|
||||||
|
this.packageNames = [];
|
||||||
|
this.engines = [];
|
||||||
this.varCount = 0;
|
this.varCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -15,8 +19,22 @@ export default class ScriptWriter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
assign(variableName, functionName, props) {
|
assign(variableName, functionName, props) {
|
||||||
|
const nsMatch = functionName.match(/^([^@]+)@([^@]+)/);
|
||||||
|
if (nsMatch) {
|
||||||
|
const packageName = nsMatch[2];
|
||||||
|
if (!this.packageNames.includes(packageName)) {
|
||||||
|
this.packageNames.push(packageName);
|
||||||
|
}
|
||||||
|
this.put(
|
||||||
|
`const ${variableName} = await ${_.camelCase(packageName)}.shellApi.${nsMatch[1]}(${JSON.stringify(props)});`
|
||||||
|
);
|
||||||
|
} else {
|
||||||
this.put(`const ${variableName} = await dbgateApi.${functionName}(${JSON.stringify(props)});`);
|
this.put(`const ${variableName} = await dbgateApi.${functionName}(${JSON.stringify(props)});`);
|
||||||
}
|
}
|
||||||
|
if (props && props.connection && props.connection.engine && !this.engines.includes(props.connection.engine)) {
|
||||||
|
this.engines.push(props.connection.engine);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
copyStream(sourceVar, targetVar) {
|
copyStream(sourceVar, targetVar) {
|
||||||
this.put(`await dbgateApi.copyStream(${sourceVar}, ${targetVar});`);
|
this.put(`await dbgateApi.copyStream(${sourceVar}, ${targetVar});`);
|
||||||
@@ -25,4 +43,17 @@ export default class ScriptWriter {
|
|||||||
comment(s) {
|
comment(s) {
|
||||||
this.put(`// ${s}`);
|
this.put(`// ${s}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getScript(extensions) {
|
||||||
|
// if (this.packageNames.length > 0) {
|
||||||
|
// this.comment('@packages');
|
||||||
|
// this.comment(JSON.stringify(this.packageNames));
|
||||||
|
// }
|
||||||
|
// if (this.engines.length > 0) {
|
||||||
|
// this.comment('@engines');
|
||||||
|
// this.comment(JSON.stringify(this.engines));
|
||||||
|
// }
|
||||||
|
const packageNames = this.packageNames;
|
||||||
|
return packageNames.map((packageName) => `// @require ${packageName}\n`).join('') + '\n' + this.s;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ export default async function createImpExpScript(extensions, values, addEditorIn
|
|||||||
script.comment('@ImportExportConfigurator');
|
script.comment('@ImportExportConfigurator');
|
||||||
script.comment(JSON.stringify(values));
|
script.comment(JSON.stringify(values));
|
||||||
}
|
}
|
||||||
return script.s;
|
return script.getScript(extensions);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getActionOptions(extensions, source, values, targetDbinfo) {
|
export function getActionOptions(extensions, source, values, targetDbinfo) {
|
||||||
|
|||||||
Reference in New Issue
Block a user