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);