diff --git a/package.json b/package.json index 77ac2ba3..2fae7dce 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "standard-version": "^9.3.0", "stylelint": "^13.13.1", "stylelint-config-standard": "^22.0.0", - "stylelint-scss": "^3.19.0", + "stylelint-scss": "^3.20.1", "vue": "^2.6.14", "vue-template-compiler": "^2.6.14", "webpack": "^4.46.0" diff --git a/src/main/ipc-handlers/schema.js b/src/main/ipc-handlers/schema.js index f3d00183..8087c68a 100644 --- a/src/main/ipc-handlers/schema.js +++ b/src/main/ipc-handlers/schema.js @@ -128,7 +128,12 @@ export default connections => { if (!query) return; try { - const result = await connections[uid].raw(query, { nest: true, details: true, schema }); + const result = await connections[uid].raw(query, { + nest: true, + details: true, + schema, + comments: false + }); return { status: 'success', response: result }; } diff --git a/src/main/ipc-handlers/tables.js b/src/main/ipc-handlers/tables.js index 56705fb0..8c9799c2 100644 --- a/src/main/ipc-handlers/tables.js +++ b/src/main/ipc-handlers/tables.js @@ -29,7 +29,7 @@ export default (connections) => { if (sortParams && sortParams.field && sortParams.dir) query.orderBy({ [sortParams.field]: sortParams.dir.toUpperCase() }); - const result = await query.run({ details: true }); + const result = await query.run({ details: true, schema }); return { status: 'success', response: result }; } diff --git a/src/main/libs/clients/MySQLClient.js b/src/main/libs/clients/MySQLClient.js index 7787e5e6..4deb60d2 100644 --- a/src/main/libs/clients/MySQLClient.js +++ b/src/main/libs/clients/MySQLClient.js @@ -335,11 +335,11 @@ export class MySQLClient extends AntaresCore { .select('*') .schema('information_schema') .from('COLUMNS') - .where({ TABLE_SCHEMA: `= '${this._schema || schema}'`, TABLE_NAME: `= '${table}'` }) + .where({ TABLE_SCHEMA: `= '${schema}'`, TABLE_NAME: `= '${table}'` }) .orderBy({ ORDINAL_POSITION: 'ASC' }) .run(); - const { rows: fields } = await this.raw(`SHOW CREATE TABLE \`${this._schema || schema}\`.\`${table}\``); + const { rows: fields } = await this.raw(`SHOW CREATE TABLE \`${schema}\`.\`${table}\``); const remappedFields = fields.map(row => { if (!row['Create Table']) return false; @@ -363,15 +363,14 @@ export class MySQLClient extends AntaresCore { const details = fieldArr.slice(2).join(' '); let defaultValue = null; - if (details.includes('DEFAULT')) { + if (details.includes('DEFAULT')) defaultValue = details.match(/(?<=DEFAULT ).*?$/gs)[0].split(' COMMENT')[0]; - const defaultValueArr = defaultValue.split(''); - if (defaultValueArr[0] === '\'') { - defaultValueArr.shift(); - defaultValueArr.pop(); - defaultValue = defaultValueArr.join(''); - } - } + // const defaultValueArr = defaultValue.split(''); + // if (defaultValueArr[0] === '\'') { + // defaultValueArr.shift(); + // defaultValueArr.pop(); + // defaultValue = defaultValueArr.join(''); + // } const typeAndLength = nameAndType[1].replace(')', '').split('('); @@ -574,7 +573,7 @@ export class MySQLClient extends AntaresCore { * @memberof MySQLClient */ async dropView (params) { - const sql = `DROP VIEW \`${this._schema}\`.\`${params.view}\``; + const sql = `DROP VIEW \`${params.schema}\`.\`${params.view}\``; return await this.raw(sql); } @@ -586,10 +585,10 @@ export class MySQLClient extends AntaresCore { */ async alterView (params) { const { view } = params; - let sql = `ALTER ALGORITHM = ${view.algorithm}${view.definer ? ` DEFINER=${view.definer}` : ''} SQL SECURITY ${view.security} VIEW \`${this._schema}\`.\`${view.oldName}\` AS ${view.sql} ${view.updateOption ? `WITH ${view.updateOption} CHECK OPTION` : ''}`; + let sql = `ALTER ALGORITHM = ${view.algorithm}${view.definer ? ` DEFINER=${view.definer}` : ''} SQL SECURITY ${view.security} VIEW \`${view.schema}\`.\`${view.oldName}\` AS ${view.sql} ${view.updateOption ? `WITH ${view.updateOption} CHECK OPTION` : ''}`; if (view.name !== view.oldName) - sql += `; RENAME TABLE \`${this._schema}\`.\`${view.oldName}\` TO \`${this._schema}\`.\`${view.name}\``; + sql += `; RENAME TABLE \`${view.schema}\`.\`${view.oldName}\` TO \`${view.schema}\`.\`${view.name}\``; return await this.raw(sql); } @@ -600,8 +599,8 @@ export class MySQLClient extends AntaresCore { * @returns {Array.} parameters * @memberof MySQLClient */ - async createView (view) { - const sql = `CREATE ALGORITHM = ${view.algorithm} ${view.definer ? `DEFINER=${view.definer} ` : ''}SQL SECURITY ${view.security} VIEW \`${this._schema}\`.\`${view.name}\` AS ${view.sql} ${view.updateOption ? `WITH ${view.updateOption} CHECK OPTION` : ''}`; + async createView (params) { + const sql = `CREATE ALGORITHM = ${params.algorithm} ${params.definer ? `DEFINER=${params.definer} ` : ''}SQL SECURITY ${params.security} VIEW \`${params.schema}\`.\`${params.name}\` AS ${params.sql} ${params.updateOption ? `WITH ${params.updateOption} CHECK OPTION` : ''}`; return await this.raw(sql); } @@ -634,7 +633,7 @@ export class MySQLClient extends AntaresCore { * @memberof MySQLClient */ async dropTrigger (params) { - const sql = `DROP TRIGGER \`${this._schema}\`.\`${params.trigger}\``; + const sql = `DROP TRIGGER \`${params.schema}\`.\`${params.trigger}\``; return await this.raw(sql); } @@ -651,8 +650,8 @@ export class MySQLClient extends AntaresCore { try { await this.createTrigger(tempTrigger); - await this.dropTrigger({ trigger: tempTrigger.name }); - await this.dropTrigger({ trigger: trigger.oldName }); + await this.dropTrigger({ schema: trigger.schema, trigger: tempTrigger.name }); + await this.dropTrigger({ schema: trigger.schema, trigger: trigger.oldName }); await this.createTrigger(trigger); } catch (err) { @@ -666,8 +665,8 @@ export class MySQLClient extends AntaresCore { * @returns {Array.} parameters * @memberof MySQLClient */ - async createTrigger (trigger) { - const sql = `CREATE ${trigger.definer ? `DEFINER=${trigger.definer} ` : ''}TRIGGER \`${this._schema}\`.\`${trigger.name}\` ${trigger.activation} ${trigger.event} ON \`${trigger.table}\` FOR EACH ROW ${trigger.sql}`; + async createTrigger (params) { + const sql = `CREATE ${params.definer ? `DEFINER=${params.definer} ` : ''}TRIGGER \`${params.schema}\`.\`${params.name}\` ${params.activation} ${params.event} ON \`${params.table}\` FOR EACH ROW ${params.sql}`; return await this.raw(sql, { split: false }); } @@ -741,7 +740,7 @@ export class MySQLClient extends AntaresCore { * @memberof MySQLClient */ async dropRoutine (params) { - const sql = `DROP PROCEDURE \`${this._schema}\`.\`${params.routine}\``; + const sql = `DROP PROCEDURE \`${params.schema}\`.\`${params.routine}\``; return await this.raw(sql); } @@ -758,8 +757,8 @@ export class MySQLClient extends AntaresCore { try { await this.createRoutine(tempProcedure); - await this.dropRoutine({ routine: tempProcedure.name }); - await this.dropRoutine({ routine: routine.oldName }); + await this.dropRoutine({ schema: routine.schema, routine: tempProcedure.name }); + await this.dropRoutine({ schema: routine.schema, routine: routine.oldName }); await this.createRoutine(routine); } catch (err) { @@ -773,21 +772,21 @@ export class MySQLClient extends AntaresCore { * @returns {Array.} parameters * @memberof MySQLClient */ - async createRoutine (routine) { - const parameters = 'parameters' in routine - ? routine.parameters.reduce((acc, curr) => { + async createRoutine (params) { + const parameters = 'parameters' in params + ? params.parameters.reduce((acc, curr) => { acc.push(`${curr.context} \`${curr.name}\` ${curr.type}${curr.length ? `(${curr.length})` : ''}`); return acc; }, []).join(',') : ''; - const sql = `CREATE ${routine.definer ? `DEFINER=${routine.definer} ` : ''}PROCEDURE \`${this._schema}\`.\`${routine.name}\`(${parameters}) + const sql = `CREATE ${params.definer ? `DEFINER=${params.definer} ` : ''}PROCEDURE \`${params.schema}\`.\`${params.name}\`(${parameters}) LANGUAGE SQL - ${routine.deterministic ? 'DETERMINISTIC' : 'NOT DETERMINISTIC'} - ${routine.dataAccess} - SQL SECURITY ${routine.security} - COMMENT '${routine.comment}' - ${routine.sql}`; + ${params.deterministic ? 'DETERMINISTIC' : 'NOT DETERMINISTIC'} + ${params.dataAccess} + SQL SECURITY ${params.security} + COMMENT '${params.comment}' + ${params.sql}`; return await this.raw(sql, { split: false }); } @@ -868,7 +867,7 @@ export class MySQLClient extends AntaresCore { * @memberof MySQLClient */ async dropFunction (params) { - const sql = `DROP FUNCTION \`${this._schema}\`.\`${params.func}\``; + const sql = `DROP FUNCTION \`${params.schema}\`.\`${params.func}\``; return await this.raw(sql); } @@ -885,8 +884,8 @@ export class MySQLClient extends AntaresCore { try { await this.createFunction(tempProcedure); - await this.dropFunction({ func: tempProcedure.name }); - await this.dropFunction({ func: func.oldName }); + await this.dropFunction({ schema: func.schema, func: tempProcedure.name }); + await this.dropFunction({ schema: func.schema, func: func.oldName }); await this.createFunction(func); } catch (err) { @@ -900,20 +899,20 @@ export class MySQLClient extends AntaresCore { * @returns {Array.} parameters * @memberof MySQLClient */ - async createFunction (func) { - const parameters = func.parameters.reduce((acc, curr) => { + async createFunction (params) { + const parameters = params.parameters.reduce((acc, curr) => { acc.push(`\`${curr.name}\` ${curr.type}${curr.length ? `(${curr.length})` : ''}`); return acc; }, []).join(','); - const body = func.returns ? func.sql : 'BEGIN\n RETURN 0;\nEND'; + const body = params.returns ? params.sql : 'BEGIN\n RETURN 0;\nEND'; - const sql = `CREATE ${func.definer ? `DEFINER=${func.definer} ` : ''}FUNCTION \`${this._schema}\`.\`${func.name}\`(${parameters}) RETURNS ${func.returns || 'SMALLINT'}${func.returnsLength ? `(${func.returnsLength})` : ''} + const sql = `CREATE ${params.definer ? `DEFINER=${params.definer} ` : ''}FUNCTION \`${params.schema}\`.\`${params.name}\`(${parameters}) RETURNS ${params.returns || 'SMALLINT'}${params.returnsLength ? `(${params.returnsLength})` : ''} LANGUAGE SQL - ${func.deterministic ? 'DETERMINISTIC' : 'NOT DETERMINISTIC'} - ${func.dataAccess} - SQL SECURITY ${func.security} - COMMENT '${func.comment}' + ${params.deterministic ? 'DETERMINISTIC' : 'NOT DETERMINISTIC'} + ${params.dataAccess} + SQL SECURITY ${params.security} + COMMENT '${params.comment}' ${body}`; return await this.raw(sql, { split: false }); @@ -960,7 +959,7 @@ export class MySQLClient extends AntaresCore { * @memberof MySQLClient */ async dropEvent (params) { - const sql = `DROP EVENT \`${this._schema}\`.\`${params.scheduler}\``; + const sql = `DROP EVENT \`${params.schema}\`.\`${params.scheduler}\``; return await this.raw(sql); } @@ -976,13 +975,13 @@ export class MySQLClient extends AntaresCore { if (scheduler.execution === 'EVERY' && scheduler.every[0].includes('-')) scheduler.every[0] = `'${scheduler.every[0]}'`; - const sql = `ALTER ${scheduler.definer ? ` DEFINER=${scheduler.definer}` : ''} EVENT \`${this._schema}\`.\`${scheduler.oldName}\` + const sql = `ALTER ${scheduler.definer ? ` DEFINER=${scheduler.definer}` : ''} EVENT \`${scheduler.schema}\`.\`${scheduler.oldName}\` ON SCHEDULE ${scheduler.execution === 'EVERY' ? `EVERY ${scheduler.every.join(' ')}${scheduler.starts ? ` STARTS '${scheduler.starts}'` : ''}${scheduler.ends ? ` ENDS '${scheduler.ends}'` : ''}` : `AT '${scheduler.at}'`} ON COMPLETION${!scheduler.preserve ? ' NOT' : ''} PRESERVE - ${scheduler.name !== scheduler.oldName ? `RENAME TO \`${this._schema}\`.\`${scheduler.name}\`` : ''} + ${scheduler.name !== scheduler.oldName ? `RENAME TO \`${scheduler.schema}\`.\`${scheduler.name}\`` : ''} ${scheduler.state} COMMENT '${scheduler.comment}' DO ${scheduler.sql}`; @@ -996,16 +995,16 @@ export class MySQLClient extends AntaresCore { * @returns {Array.} parameters * @memberof MySQLClient */ - async createEvent (scheduler) { - const sql = `CREATE ${scheduler.definer ? ` DEFINER=${scheduler.definer}` : ''} EVENT \`${this._schema}\`.\`${scheduler.name}\` + async createEvent (params) { + const sql = `CREATE ${params.definer ? ` DEFINER=${params.definer}` : ''} EVENT \`${params.schema}\`.\`${params.name}\` ON SCHEDULE - ${scheduler.execution === 'EVERY' - ? `EVERY ${scheduler.every.join(' ')}${scheduler.starts ? ` STARTS '${scheduler.starts}'` : ''}${scheduler.ends ? ` ENDS '${scheduler.ends}'` : ''}` - : `AT '${scheduler.at}'`} - ON COMPLETION${!scheduler.preserve ? ' NOT' : ''} PRESERVE - ${scheduler.state} - COMMENT '${scheduler.comment}' - DO ${scheduler.sql}`; + ${params.execution === 'EVERY' + ? `EVERY ${params.every.join(' ')}${params.starts ? ` STARTS '${params.starts}'` : ''}${params.ends ? ` ENDS '${params.ends}'` : ''}` + : `AT '${params.at}'`} + ON COMPLETION${!params.preserve ? ' NOT' : ''} PRESERVE + ${params.state} + COMMENT '${params.comment}' + DO ${params.sql}`; return await this.raw(sql, { split: false }); } @@ -1127,14 +1126,7 @@ export class MySQLClient extends AntaresCore { * @memberof MySQLClient */ async createTable (params) { - const { - name, - collation, - comment, - engine - } = params; - - const sql = `CREATE TABLE \`${this._schema}\`.\`${name}\` (\`${name}_ID\` INT NULL) COMMENT='${comment}', COLLATE='${collation}', ENGINE=${engine}`; + const sql = `CREATE TABLE \`${params.schema}\`.\`${params.name}\` (\`${params.name}_ID\` INT NULL) COMMENT='${params.comment}', COLLATE='${params.collation}', ENGINE=${params.engine}`; return await this.raw(sql); } @@ -1148,6 +1140,7 @@ export class MySQLClient extends AntaresCore { async alterTable (params) { const { table, + schema, additions, deletions, changes, @@ -1156,7 +1149,7 @@ export class MySQLClient extends AntaresCore { options } = params; - let sql = `ALTER TABLE \`${this._schema || params.options.schema}\`.\`${table}\` `; + let sql = `ALTER TABLE \`${schema}\`.\`${table}\` `; const alterColumns = []; // OPTIONS @@ -1268,7 +1261,7 @@ export class MySQLClient extends AntaresCore { sql += alterColumns.join(', '); // RENAME - if (options.name) sql += `; RENAME TABLE \`${this._schema}\`.\`${table}\` TO \`${this._schema}\`.\`${options.name}\``; + if (options.name) sql += `; RENAME TABLE \`${schema}\`.\`${table}\` TO \`${schema}\`.\`${options.name}\``; return await this.raw(sql); } @@ -1280,7 +1273,7 @@ export class MySQLClient extends AntaresCore { * @memberof MySQLClient */ async duplicateTable (params) { - const sql = `CREATE TABLE \`${this._schema}\`.\`${params.table}_copy\` LIKE \`${this._schema}\`.\`${params.table}\``; + const sql = `CREATE TABLE \`${params.schema}\`.\`${params.table}_copy\` LIKE \`${params.schema}\`.\`${params.table}\``; return await this.raw(sql); } @@ -1291,7 +1284,7 @@ export class MySQLClient extends AntaresCore { * @memberof MySQLClient */ async truncateTable (params) { - const sql = `TRUNCATE TABLE \`${this._schema}\`.\`${params.table}\``; + const sql = `TRUNCATE TABLE \`${params.schema}\`.\`${params.table}\``; return await this.raw(sql); } @@ -1302,7 +1295,7 @@ export class MySQLClient extends AntaresCore { * @memberof MySQLClient */ async dropTable (params) { - const sql = `DROP TABLE \`${this._schema}\`.\`${params.table}\``; + const sql = `DROP TABLE \`${params.schema}\`.\`${params.table}\``; return await this.raw(sql); } @@ -1373,16 +1366,19 @@ export class MySQLClient extends AntaresCore { * @memberof MySQLClient */ async raw (sql, args) { - sql = sql.replace(/(\/\*(.|[\r\n])*?\*\/)|(--(.*|[\r\n]))/gm, ''); if (process.env.NODE_ENV === 'development') this._logger(sql);// TODO: replace BLOB content with a placeholder args = { nest: false, details: false, split: true, + comments: true, ...args }; + if (!args.comments) + sql = sql.replace(/(\/\*(.|[\r\n])*?\*\/)|(--(.*|[\r\n]))/gm, '');// Remove comments + const nestTables = args.nest ? '.' : false; const resultsArr = []; let paramsArr = []; @@ -1419,7 +1415,7 @@ export class MySQLClient extends AntaresCore { name: field.orgName, alias: field.name, orgName: field.orgName, - schema: field.schema, + schema: args.schema || field.schema, table: field.table, tableAlias: field.table, orgTable: field.orgTable, diff --git a/src/main/libs/clients/PostgreSQLClient.js b/src/main/libs/clients/PostgreSQLClient.js index ba0b18d1..01cd42e8 100644 --- a/src/main/libs/clients/PostgreSQLClient.js +++ b/src/main/libs/clients/PostgreSQLClient.js @@ -483,7 +483,7 @@ export class PostgreSQLClient extends AntaresCore { * @memberof PostgreSQLClient */ async dropView (params) { - const sql = `DROP VIEW ${this._schema}.${params.view}`; + const sql = `DROP VIEW ${params.schema}.${params.view}`; return await this.raw(sql); } @@ -495,10 +495,10 @@ export class PostgreSQLClient extends AntaresCore { */ async alterView (params) { const { view } = params; - let sql = `CREATE OR REPLACE VIEW ${this._schema}.${view.oldName} AS ${view.sql}`; + let sql = `CREATE OR REPLACE VIEW ${view.schema}.${view.oldName} AS ${view.sql}`; if (view.name !== view.oldName) - sql += `; ALTER VIEW ${this._schema}.${view.oldName} RENAME TO ${view.name}`; + sql += `; ALTER VIEW ${view.schema}.${view.oldName} RENAME TO ${view.name}`; return await this.raw(sql); } @@ -509,8 +509,8 @@ export class PostgreSQLClient extends AntaresCore { * @returns {Array.} parameters * @memberof PostgreSQLClient */ - async createView (view) { - const sql = `CREATE VIEW ${this._schema}.${view.name} AS ${view.sql}`; + async createView (params) { + const sql = `CREATE VIEW ${params.schema}.${params.name} AS ${params.sql}`; return await this.raw(sql); } @@ -560,7 +560,7 @@ export class PostgreSQLClient extends AntaresCore { */ async dropTrigger (params) { const triggerParts = params.trigger.split('.'); - const sql = `DROP TRIGGER "${triggerParts[1]}" ON "${triggerParts[0]}"`; + const sql = `DROP TRIGGER "${triggerParts[1]}" ON "${params.schema}"."${triggerParts[0]}"`; return await this.raw(sql); } @@ -577,8 +577,8 @@ export class PostgreSQLClient extends AntaresCore { try { await this.createTrigger(tempTrigger); - await this.dropTrigger({ trigger: `${tempTrigger.table}.${tempTrigger.name}` }); - await this.dropTrigger({ trigger: `${trigger.table}.${trigger.oldName}` }); + await this.dropTrigger({ schema: trigger.schema, trigger: `${tempTrigger.table}.${tempTrigger.name}` }); + await this.dropTrigger({ schema: trigger.schema, trigger: `${trigger.table}.${trigger.oldName}` }); await this.createTrigger(trigger); } catch (err) { @@ -592,9 +592,9 @@ export class PostgreSQLClient extends AntaresCore { * @returns {Array.} parameters * @memberof PostgreSQLClient */ - async createTrigger (trigger) { - const eventsString = Array.isArray(trigger.event) ? trigger.event.join(' OR ') : trigger.event; - const sql = `CREATE TRIGGER "${trigger.name}" ${trigger.activation} ${eventsString} ON "${trigger.table}" FOR EACH ROW ${trigger.sql}`; + async createTrigger (params) { + const eventsString = Array.isArray(params.event) ? params.event.join(' OR ') : params.event; + const sql = `CREATE TRIGGER "${params.name}" ${params.activation} ${eventsString} ON "${params.schema}"."${params.table}" FOR EACH ROW ${params.sql}`; return await this.raw(sql, { split: false }); } @@ -637,6 +637,7 @@ export class PostgreSQLClient extends AntaresCore { AND proc.routine_type = 'PROCEDURE' AND proc.routine_name = '${routine}' AND proc.specific_schema = '${schema}' + AND args.data_type != NULL ORDER BY procedure_schema, specific_name, procedure_name, @@ -675,7 +676,7 @@ export class PostgreSQLClient extends AntaresCore { * @memberof PostgreSQLClient */ async dropRoutine (params) { - const sql = `DROP PROCEDURE ${this._schema}.${params.routine}`; + const sql = `DROP PROCEDURE "${params.schema}"."${params.routine}"`; return await this.raw(sql); } @@ -692,8 +693,8 @@ export class PostgreSQLClient extends AntaresCore { try { await this.createRoutine(tempProcedure); - await this.dropRoutine({ routine: tempProcedure.name }); - await this.dropRoutine({ routine: routine.oldName }); + await this.dropRoutine({ schema: routine.schema, routine: tempProcedure.name }); + await this.dropRoutine({ schema: routine.schema, routine: routine.oldName }); await this.createRoutine(routine); } catch (err) { @@ -715,10 +716,10 @@ export class PostgreSQLClient extends AntaresCore { }, []).join(',') : ''; - if (this._schema !== 'public') - await this.use(this._schema); + if (routine.schema !== 'public') + await this.use(routine.schema); - const sql = `CREATE PROCEDURE ${this._schema}.${routine.name}(${parameters}) + const sql = `CREATE PROCEDURE "${routine.schema}"."${routine.name}"(${parameters}) LANGUAGE ${routine.language} SECURITY ${routine.security} AS ${routine.sql}`; @@ -804,7 +805,7 @@ export class PostgreSQLClient extends AntaresCore { * @memberof PostgreSQLClient */ async dropFunction (params) { - const sql = `DROP FUNCTION ${this._schema}.${params.func}`; + const sql = `DROP FUNCTION "${params.schema}"."${params.func}"`; return await this.raw(sql); } @@ -821,8 +822,8 @@ export class PostgreSQLClient extends AntaresCore { try { await this.createFunction(tempProcedure); - await this.dropFunction({ func: tempProcedure.name }); - await this.dropFunction({ func: func.oldName }); + await this.dropFunction({ schema: func.schema, func: tempProcedure.name }); + await this.dropFunction({ schema: func.schema, func: func.oldName }); await this.createFunction(func); } catch (err) { @@ -839,17 +840,17 @@ export class PostgreSQLClient extends AntaresCore { async createFunction (func) { const parameters = 'parameters' in func ? func.parameters.reduce((acc, curr) => { - acc.push(`${curr.context} ${curr.name} ${curr.type}${curr.length ? `(${curr.length})` : ''}`); + acc.push(`${curr.context} ${curr.name || ''} ${curr.type}${curr.length ? `(${curr.length})` : ''}`); return acc; }, []).join(',') : ''; - if (this._schema !== 'public') - await this.use(this._schema); + if (func.schema !== 'public') + await this.use(func.schema); const body = func.returns ? func.sql : '$function$\n$function$'; - const sql = `CREATE FUNCTION ${this._schema}.${func.name}(${parameters}) + const sql = `CREATE FUNCTION "${func.schema}"."${func.name}" (${parameters}) RETURNS ${func.returns || 'void'} LANGUAGE ${func.language} SECURITY ${func.security} @@ -867,12 +868,12 @@ export class PostgreSQLClient extends AntaresCore { async alterTriggerFunction (params) { const { func } = params; - if (this._schema !== 'public') - await this.use(this._schema); + if (func.schema !== 'public') + await this.use(func.schema); const body = func.returns ? func.sql : '$function$\n$function$'; - const sql = `CREATE OR REPLACE FUNCTION ${this._schema}.${func.name}() + const sql = `CREATE OR REPLACE FUNCTION "${func.schema}"."${func.name}" () RETURNS TRIGGER LANGUAGE ${func.language} AS ${body}`; @@ -887,12 +888,12 @@ export class PostgreSQLClient extends AntaresCore { * @memberof PostgreSQLClient */ async createTriggerFunction (func) { - if (this._schema !== 'public') - await this.use(this._schema); + if (func.schema !== 'public') + await this.use(func.schema); const body = func.returns ? func.sql : '$function$\r\nBEGIN\r\n\r\nEND\r\n$function$'; - const sql = `CREATE FUNCTION ${this._schema}.${func.name}() + const sql = `CREATE FUNCTION "${func.schema}"."${func.name}" () RETURNS TRIGGER LANGUAGE ${func.language} AS ${body}`; @@ -988,11 +989,7 @@ export class PostgreSQLClient extends AntaresCore { * @memberof PostgreSQLClient */ async createTable (params) { - const { - name - } = params; - - const sql = `CREATE TABLE ${this._schema}.${name} (${name}_id INTEGER NULL); ALTER TABLE ${this._schema}.${name} DROP COLUMN ${name}_id`; + const sql = `CREATE TABLE "${params.schema}"."${params.name}" (${params.name}_id INTEGER NULL); ALTER TABLE "${params.schema}"."${params.name}" DROP COLUMN ${params.name}_id`; return await this.raw(sql); } @@ -1006,6 +1003,7 @@ export class PostgreSQLClient extends AntaresCore { async alterTable (params) { const { table, + schema, additions, deletions, changes, @@ -1014,8 +1012,8 @@ export class PostgreSQLClient extends AntaresCore { options } = params; - if (this._schema !== 'public') - await this.use(this._schema); + if (schema !== 'public') + await this.use(schema); let sql = ''; const alterColumns = []; @@ -1056,7 +1054,7 @@ export class PostgreSQLClient extends AntaresCore { else if (type === 'UNIQUE') alterColumns.push(`ADD CONSTRAINT ${addition.name} UNIQUE (${fields})`); else - manageIndexes.push(`CREATE INDEX ${addition.name} ON ${this._schema}.${table}(${fields})`); + manageIndexes.push(`CREATE INDEX ${addition.name} ON "${schema}"."${table}" (${fields})`); }); // ADD FOREIGN KEYS @@ -1094,7 +1092,7 @@ export class PostgreSQLClient extends AntaresCore { } if (change.orgName !== change.name) - renameColumns.push(`ALTER TABLE "${this._schema}"."${table}" RENAME COLUMN "${change.orgName}" TO "${change.name}"`); + renameColumns.push(`ALTER TABLE "${schema}"."${table}" RENAME COLUMN "${change.orgName}" TO "${change.name}"`); }); // CHANGE INDEX @@ -1112,7 +1110,7 @@ export class PostgreSQLClient extends AntaresCore { else if (type === 'UNIQUE') alterColumns.push(`ADD CONSTRAINT ${change.name} UNIQUE (${fields})`); else - manageIndexes.push(`CREATE INDEX ${change.name} ON ${this._schema}.${table}(${fields})`); + manageIndexes.push(`CREATE INDEX ${change.name} ON "${schema}"."${table}" (${fields})`); }); // CHANGE FOREIGN KEYS @@ -1139,10 +1137,10 @@ export class PostgreSQLClient extends AntaresCore { alterColumns.push(`DROP CONSTRAINT ${deletion.constraintName}`); }); - if (alterColumns.length) sql += `ALTER TABLE "${this._schema}"."${table}" ${alterColumns.join(', ')}; `; + if (alterColumns.length) sql += `ALTER TABLE "${schema}"."${table}" ${alterColumns.join(', ')}; `; if (createSequences.length) sql = `${createSequences.join(';')}; ${sql}`; if (manageIndexes.length) sql = `${manageIndexes.join(';')}; ${sql}`; - if (options.name) sql += `ALTER TABLE "${this._schema}"."${table}" RENAME TO "${options.name}"; `; + if (options.name) sql += `ALTER TABLE "${schema}"."${table}" RENAME TO "${options.name}"; `; // RENAME if (renameColumns.length) sql = `${renameColumns.join(';')}; ${sql}`; @@ -1157,7 +1155,7 @@ export class PostgreSQLClient extends AntaresCore { * @memberof PostgreSQLClient */ async duplicateTable (params) { - const sql = `CREATE TABLE ${this._schema}.${params.table}_copy (LIKE ${this._schema}.${params.table} INCLUDING ALL)`; + const sql = `CREATE TABLE ${params.schema}.${params.table}_copy (LIKE ${params.schema}.${params.table} INCLUDING ALL)`; return await this.raw(sql); } @@ -1168,7 +1166,7 @@ export class PostgreSQLClient extends AntaresCore { * @memberof PostgreSQLClient */ async truncateTable (params) { - const sql = `TRUNCATE TABLE ${this._schema}.${params.table}`; + const sql = `TRUNCATE TABLE ${params.schema}.${params.table}`; return await this.raw(sql); } @@ -1179,7 +1177,7 @@ export class PostgreSQLClient extends AntaresCore { * @memberof PostgreSQLClient */ async dropTable (params) { - const sql = `DROP TABLE ${this._schema}.${params.table}`; + const sql = `DROP TABLE ${params.schema}.${params.table}`; return await this.raw(sql); } @@ -1250,18 +1248,20 @@ export class PostgreSQLClient extends AntaresCore { * @memberof PostgreSQLClient */ async raw (sql, args) { - sql = sql.replace(/(\/\*(.|[\r\n])*?\*\/)|(--(.*|[\r\n]))/gm, ''); - args = { nest: false, details: false, split: true, + comments: true, ...args }; if (args.schema && args.schema !== 'public') await this.use(args.schema); + if (!args.comments) + sql = sql.replace(/(\/\*(.|[\r\n])*?\*\/)|(--(.*|[\r\n]))/gm, '');// Remove comments + const resultsArr = []; let paramsArr = []; const queries = args.split diff --git a/src/renderer/App.vue b/src/renderer/App.vue index 2c57f3da..8427004d 100644 --- a/src/renderer/App.vue +++ b/src/renderer/App.vue @@ -16,7 +16,6 @@ - @@ -39,7 +38,6 @@ export default { WorkspaceAddConnectionPanel: () => import(/* webpackChunkName: "WorkspaceAddConnectionPanel" */'@/components/WorkspaceAddConnectionPanel'), ModalSettings: () => import(/* webpackChunkName: "ModalSettings" */'@/components/ModalSettings'), TheScratchpad: () => import(/* webpackChunkName: "TheScratchpad" */'@/components/TheScratchpad'), - ModalDiscardChanges: () => import(/* webpackChunkName: "ModalDiscardChanges" */'@/components/ModalDiscardChanges'), BaseTextEditor: () => import(/* webpackChunkName: "BaseTextEditor" */'@/components/BaseTextEditor') }, data () { diff --git a/src/renderer/components/ModalAskCredentials.vue b/src/renderer/components/ModalAskCredentials.vue index d74ba637..796c5402 100644 --- a/src/renderer/components/ModalAskCredentials.vue +++ b/src/renderer/components/ModalAskCredentials.vue @@ -41,7 +41,7 @@ -