mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-05-01 05:03:57 +00:00
runner openreader - support for plugins
This commit is contained in:
@@ -6,6 +6,7 @@ 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, pluginsdir } = require('../utility/directories');
|
const { rundir, uploadsdir, pluginsdir } = require('../utility/directories');
|
||||||
|
const { extractShellApiPlugins, extractShellApiFunctionName } = require('dbgate-tools');
|
||||||
|
|
||||||
function extractPlugins(script) {
|
function extractPlugins(script) {
|
||||||
const requireRegex = /\s*\/\/\s*@require\s+([^\s]+)\s*\n/g;
|
const requireRegex = /\s*\/\/\s*@require\s+([^\s]+)\s*\n/g;
|
||||||
@@ -13,11 +14,16 @@ function extractPlugins(script) {
|
|||||||
return matches.map((x) => x[1]);
|
return matches.map((x) => x[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const requirePluginsTemplate = (plugins) =>
|
||||||
|
plugins
|
||||||
|
.map(
|
||||||
|
(packageName) => `const ${_.camelCase(packageName)} = require(process.env.PLUGIN_${_.camelCase(packageName)});\n`
|
||||||
|
)
|
||||||
|
.join('');
|
||||||
|
|
||||||
const scriptTemplate = (script) => `
|
const scriptTemplate = (script) => `
|
||||||
const dbgateApi = require(process.env.DBGATE_API);
|
const dbgateApi = require(process.env.DBGATE_API);
|
||||||
${extractPlugins(script)
|
${requirePluginsTemplate(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}
|
||||||
@@ -29,9 +35,10 @@ dbgateApi.runScript(run);
|
|||||||
|
|
||||||
const loaderScriptTemplate = (functionName, props, runid) => `
|
const loaderScriptTemplate = (functionName, props, runid) => `
|
||||||
const dbgateApi = require(process.env.DBGATE_API);
|
const dbgateApi = require(process.env.DBGATE_API);
|
||||||
|
${requirePluginsTemplate(extractShellApiPlugins(functionName, props))}
|
||||||
require=null;
|
require=null;
|
||||||
async function run() {
|
async function run() {
|
||||||
const reader=await dbgateApi.${functionName}(${JSON.stringify(props)});
|
const reader=await ${extractShellApiFunctionName(functionName)}(${JSON.stringify(props)});
|
||||||
const writer=await dbgateApi.collectorWriter({runid: '${runid}'});
|
const writer=await dbgateApi.collectorWriter({runid: '${runid}'});
|
||||||
await dbgateApi.copyStream(reader, writer);
|
await dbgateApi.copyStream(reader, writer);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
export * from './commonTypeParser';
|
export * from './commonTypeParser';
|
||||||
export * from './nameTools';
|
export * from './nameTools';
|
||||||
export * from './tableTransforms';
|
export * from './tableTransforms';
|
||||||
|
export * from './packageTools';
|
||||||
|
|||||||
24
packages/tools/src/packageTools.ts
Normal file
24
packages/tools/src/packageTools.ts
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import _ from 'lodash';
|
||||||
|
|
||||||
|
export function extractShellApiPlugins(functionName, props): string[] {
|
||||||
|
const res = [];
|
||||||
|
const nsMatch = functionName.match(/^([^@]+)@([^@]+)/);
|
||||||
|
if (nsMatch) {
|
||||||
|
res.push(nsMatch[2]);
|
||||||
|
}
|
||||||
|
if (props && props.connection && props.connection.engine) {
|
||||||
|
const nsMatchEngine = props.connection.engine.match(/^([^@]+)@([^@]+)/);
|
||||||
|
if (nsMatchEngine) {
|
||||||
|
res.push(nsMatchEngine[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function extractShellApiFunctionName(functionName) {
|
||||||
|
const nsMatch = functionName.match(/^([^@]+)@([^@]+)/);
|
||||||
|
if (nsMatch) {
|
||||||
|
return `${_.camelCase(nsMatch[2])}.shellApi.${nsMatch[1]}`;
|
||||||
|
}
|
||||||
|
return `dbgateApi.${functionName}`;
|
||||||
|
}
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
"dbgate-datalib": "^1.0.0",
|
"dbgate-datalib": "^1.0.0",
|
||||||
"dbgate-engines": "^1.0.0",
|
"dbgate-engines": "^1.0.0",
|
||||||
"dbgate-sqltree": "^1.0.0",
|
"dbgate-sqltree": "^1.0.0",
|
||||||
|
"dbgate-tools": "^1.0.0",
|
||||||
"eslint": "^6.8.0",
|
"eslint": "^6.8.0",
|
||||||
"eslint-plugin-react": "^7.17.0",
|
"eslint-plugin-react": "^7.17.0",
|
||||||
"formik": "^2.1.0",
|
"formik": "^2.1.0",
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
|
import { extractShellApiFunctionName, extractShellApiPlugins } from 'dbgate-tools';
|
||||||
|
|
||||||
export default class ScriptWriter {
|
export default class ScriptWriter {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.s = '';
|
this.s = '';
|
||||||
this.packageNames = [];
|
this.packageNames = [];
|
||||||
this.engines = [];
|
// this.engines = [];
|
||||||
this.varCount = 0;
|
this.varCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -19,21 +20,8 @@ export default class ScriptWriter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
assign(variableName, functionName, props) {
|
assign(variableName, functionName, props) {
|
||||||
const nsMatch = functionName.match(/^([^@]+)@([^@]+)/);
|
this.put(`const ${variableName} = await ${extractShellApiFunctionName(functionName)}(${JSON.stringify(props)});`);
|
||||||
if (nsMatch) {
|
this.packageNames.push(...extractShellApiPlugins(functionName, props));
|
||||||
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)});`);
|
|
||||||
}
|
|
||||||
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) {
|
||||||
@@ -54,6 +42,6 @@ export default class ScriptWriter {
|
|||||||
// this.comment(JSON.stringify(this.engines));
|
// this.comment(JSON.stringify(this.engines));
|
||||||
// }
|
// }
|
||||||
const packageNames = this.packageNames;
|
const packageNames = this.packageNames;
|
||||||
return packageNames.map((packageName) => `// @require ${packageName}\n`).join('') + '\n' + this.s;
|
return _.uniq(packageNames).map((packageName) => `// @require ${packageName}\n`).join('') + '\n' + this.s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user