/* eslint max-len:0 */ import inherits from 'inherits'; import * as utils from '../utils'; import TableCompiler from '../../../schema/tablecompiler'; import * as helpers from '../../../helpers'; import Trigger from './trigger'; import { assign, map } from 'lodash' // Table Compiler // ------ function TableCompiler_Oracle() { TableCompiler.apply(this, arguments); } inherits(TableCompiler_Oracle, TableCompiler); assign(TableCompiler_Oracle.prototype, { addColumns(columns, prefix) { if (columns.sql.length > 0) { prefix = prefix || this.addColumnsPrefix; const columnSql = map(columns.sql, (column) => column); const alter = this.lowerCase ? 'alter table ' : 'ALTER TABLE '; let sql = `${alter}${this.tableName()} ${prefix}`; if (columns.sql.length > 1) { sql += `(${columnSql.join(', ')})`; } else { sql += columnSql.join(', '); } this.pushQuery({ sql, bindings: columns.bindings, }); } }, // Compile a rename column command. renameColumn(from, to) { // Remove quotes around tableName const tableName = this.tableName().slice(1, -1) return this.pushQuery(Trigger.renameColumnTrigger(this.client.logger, tableName, from, to)); }, compileAdd(builder) { const table = this.formatter.wrap(builder); const columns = this.prefixArray('add column', this.getColumns(builder)); return this.pushQuery({ sql: `alter table ${table} ${columns.join(', ')}` }); }, // Adds the "create" query to the query sequence. createQuery(columns, ifNot) { const sql = `create table ${this.tableName()} (${columns.sql.join(', ')})`; this.pushQuery({ // catch "name is already used by an existing object" for workaround for "if not exists" sql: ifNot ? utils.wrapSqlWithCatch(sql, -955) : sql, bindings: columns.bindings }); if (this.single.comment) this.comment(this.single.comment); }, // Compiles the comment on the table. comment(comment) { this.pushQuery(`comment on table ${this.tableName()} is '${comment}'`); }, addColumnsPrefix: 'add ', alterColumnsPrefix: 'modify ', dropColumn() { const columns = helpers.normalizeArr.apply(null, arguments); this.pushQuery(`alter table ${this.tableName()} drop (${this.formatter.columnize(columns)})`); }, changeType() { // alter table + table + ' modify ' + wrapped + '// type'; }, _indexCommand(type, tableName, columns) { return this.formatter.wrap(utils.generateCombinedName(this.client.logger, type, tableName, columns)); }, primary(columns, constraintName) { constraintName = constraintName ? this.formatter.wrap(constraintName) : this.formatter.wrap(`${this.tableNameRaw}_pkey`); this.pushQuery(`alter table ${this.tableName()} add constraint ${constraintName} primary key (${this.formatter.columnize(columns)})`); }, dropPrimary(constraintName) { constraintName = constraintName ? this.formatter.wrap(constraintName) : this.formatter.wrap(this.tableNameRaw + '_pkey'); this.pushQuery(`alter table ${this.tableName()} drop constraint ${constraintName}`); }, index(columns, indexName) { indexName = indexName ? this.formatter.wrap(indexName) : this._indexCommand('index', this.tableNameRaw, columns); this.pushQuery(`create index ${indexName} on ${this.tableName()}` + ' (' + this.formatter.columnize(columns) + ')'); }, dropIndex(columns, indexName) { indexName = indexName ? this.formatter.wrap(indexName) : this._indexCommand('index', this.tableNameRaw, columns); this.pushQuery(`drop index ${indexName}`); }, unique(columns, indexName) { indexName = indexName ? this.formatter.wrap(indexName) : this._indexCommand('unique', this.tableNameRaw, columns); this.pushQuery(`alter table ${this.tableName()} add constraint ${indexName}` + ' unique (' + this.formatter.columnize(columns) + ')'); }, dropUnique(columns, indexName) { indexName = indexName ? this.formatter.wrap(indexName) : this._indexCommand('unique', this.tableNameRaw, columns); this.pushQuery(`alter table ${this.tableName()} drop constraint ${indexName}`); }, dropForeign(columns, indexName) { indexName = indexName ? this.formatter.wrap(indexName) : this._indexCommand('foreign', this.tableNameRaw, columns); this.pushQuery(`alter table ${this.tableName()} drop constraint ${indexName}`); } }) export default TableCompiler_Oracle;