78 lines
1.9 KiB
JavaScript
Executable File
78 lines
1.9 KiB
JavaScript
Executable File
const Myt = require('./myt');
|
|
const Command = require('./lib/command');
|
|
const Exporter = require('./lib/exporter');
|
|
const fs = require('fs-extra');
|
|
|
|
class Create extends Command {
|
|
static usage = {
|
|
description: 'Creates a new DB object',
|
|
params: {
|
|
type: 'The object type',
|
|
name: 'The object name, including schema'
|
|
},
|
|
operand: 'name'
|
|
};
|
|
|
|
static opts = {
|
|
alias: {
|
|
type: 't',
|
|
name: 'n'
|
|
},
|
|
string: [
|
|
'type',
|
|
'name'
|
|
],
|
|
default: {
|
|
type: 'procedure'
|
|
}
|
|
};
|
|
|
|
async cli(myt, opts) {
|
|
await super.cli(myt, opts);
|
|
console.log('Routine created.');
|
|
}
|
|
|
|
async run(myt, opts) {
|
|
const match = opts.name.match(/^(\w+)\.(\w+)$/);
|
|
if (!match)
|
|
throw new Error('Invalid object name, should contain schema and routine name');
|
|
|
|
const schema = match[1];
|
|
const name = match[2];
|
|
|
|
const params = {
|
|
schema,
|
|
name,
|
|
definer: opts.defaultDefiner
|
|
};
|
|
|
|
switch (opts.type) {
|
|
case 'event':
|
|
case 'function':
|
|
case 'procedure':
|
|
case 'trigger':
|
|
params.body = "BEGIN\n-- Your code goes here\nEND";
|
|
break;
|
|
case 'view':
|
|
params.definition = "SELECT TRUE"
|
|
break;
|
|
}
|
|
|
|
const exporter = new Exporter(opts.type, opts.replace);
|
|
await exporter.init();
|
|
const sql = exporter.format(params);
|
|
|
|
const routineDir = `${opts.routinesDir}/${schema}/${opts.type}s`;
|
|
if (!await fs.pathExists(routineDir))
|
|
await fs.mkdir(routineDir);
|
|
|
|
const routineFile = `${routineDir}/${name}.sql`;
|
|
await fs.writeFile(routineFile, sql);
|
|
}
|
|
}
|
|
|
|
module.exports = Create;
|
|
|
|
if (require.main === module)
|
|
new Myt().cli(Create);
|