Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
closes #2354 refs #1641 - added addUnique() - added dropUnique() - added addColumn() -> needed for #2330 - dropColumn() is missing due to lack of knex support - further cleanup of the migrations module
- Loading branch information
Showing
6 changed files
with
260 additions
and
72 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,89 +1,123 @@ | ||
var _ = require('lodash'), | ||
when = require('when'), | ||
knex = require('../../models/base').knex, | ||
schema = require('../schema').tables, | ||
client = require('../../models/base').client; | ||
var _ = require('lodash'), | ||
when = require('when'), | ||
knex = require('../../models/base').knex, | ||
schema = require('../schema').tables, | ||
client = require('../../models/base').client, | ||
sqlite3 = require('./sqlite3'), | ||
mysql = require('./mysql'), | ||
pgsql = require('./pgsql'); | ||
|
||
function createTable(table) { | ||
return knex.schema.createTable(table, function (t) { | ||
var column, | ||
columnKeys = _.keys(schema[table]); | ||
_.each(columnKeys, function (key) { | ||
// creation distinguishes between text with fieldtype, string with maxlength and all others | ||
if (schema[table][key].type === 'text' && schema[table][key].hasOwnProperty('fieldtype')) { | ||
column = t[schema[table][key].type](key, schema[table][key].fieldtype); | ||
} else if (schema[table][key].type === 'string' && schema[table][key].hasOwnProperty('maxlength')) { | ||
column = t[schema[table][key].type](key, schema[table][key].maxlength); | ||
} else { | ||
column = t[schema[table][key].type](key); | ||
} | ||
function addTableColumn(tablename, table, columnname) { | ||
var column; | ||
// creation distinguishes between text with fieldtype, string with maxlength and all others | ||
if (schema[tablename][columnname].type === 'text' && schema[tablename][columnname].hasOwnProperty('fieldtype')) { | ||
column = table[schema[tablename][columnname].type](columnname, schema[tablename][columnname].fieldtype); | ||
} else if (schema[tablename][columnname].type === 'string' && schema[tablename][columnname].hasOwnProperty('maxlength')) { | ||
column = table[schema[tablename][columnname].type](columnname, schema[tablename][columnname].maxlength); | ||
} else { | ||
column = table[schema[tablename][columnname].type](columnname); | ||
} | ||
|
||
if (schema[table][key].hasOwnProperty('nullable') && schema[table][key].nullable === true) { | ||
column.nullable(); | ||
} else { | ||
column.notNullable(); | ||
} | ||
if (schema[table][key].hasOwnProperty('primary') && schema[table][key].primary === true) { | ||
column.primary(); | ||
} | ||
if (schema[table][key].hasOwnProperty('unique') && schema[table][key].unique) { | ||
column.unique(); | ||
} | ||
if (schema[table][key].hasOwnProperty('unsigned') && schema[table][key].unsigned) { | ||
column.unsigned(); | ||
} | ||
if (schema[table][key].hasOwnProperty('references')) { | ||
//check if table exists? | ||
column.references(schema[table][key].references); | ||
} | ||
if (schema[table][key].hasOwnProperty('defaultTo')) { | ||
column.defaultTo(schema[table][key].defaultTo); | ||
} | ||
}); | ||
}); | ||
if (schema[tablename][columnname].hasOwnProperty('nullable') && schema[tablename][columnname].nullable === true) { | ||
column.nullable(); | ||
} else { | ||
column.notNullable(); | ||
} | ||
if (schema[tablename][columnname].hasOwnProperty('primary') && schema[tablename][columnname].primary === true) { | ||
column.primary(); | ||
} | ||
if (schema[tablename][columnname].hasOwnProperty('unique') && schema[tablename][columnname].unique) { | ||
column.unique(); | ||
} | ||
if (schema[tablename][columnname].hasOwnProperty('unsigned') && schema[tablename][columnname].unsigned) { | ||
column.unsigned(); | ||
} | ||
if (schema[tablename][columnname].hasOwnProperty('references')) { | ||
//check if table exists? | ||
column.references(schema[tablename][columnname].references); | ||
} | ||
if (schema[tablename][columnname].hasOwnProperty('defaultTo')) { | ||
column.defaultTo(schema[tablename][columnname].defaultTo); | ||
} | ||
} | ||
|
||
function deleteTable(table) { | ||
return knex.schema.dropTableIfExists(table); | ||
function addColumn(table, column) { | ||
return knex.schema.table(table, function (t) { | ||
addTableColumn(table, t, column); | ||
}); | ||
} | ||
|
||
function getTablesFromSqlite3() { | ||
return knex.raw("select * from sqlite_master where type = 'table'").then(function (response) { | ||
return _.reject(_.pluck(response, 'tbl_name'), function (name) { | ||
return name === 'sqlite_sequence'; | ||
}); | ||
function addUnique(table, column) { | ||
return knex.schema.table(table, function (table) { | ||
table.unique(column); | ||
}); | ||
} | ||
|
||
function getTablesFromPgSQL() { | ||
return knex.raw("SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'").then(function (response) { | ||
return _.flatten(_.pluck(response.rows, 'table_name')); | ||
function dropUnique(table, column) { | ||
return knex.schema.table(table, function (table) { | ||
table.dropUnique(column); | ||
}); | ||
} | ||
|
||
function getTablesFromMySQL() { | ||
return knex.raw('show tables').then(function (response) { | ||
return _.flatten(_.map(response[0], function (entry) { | ||
return _.values(entry); | ||
})); | ||
function createTable(table) { | ||
return knex.schema.createTable(table, function (t) { | ||
var columnKeys = _.keys(schema[table]); | ||
_.each(columnKeys, function (column) { | ||
return addTableColumn(table, t, column); | ||
}); | ||
}); | ||
} | ||
|
||
function deleteTable(table) { | ||
return knex.schema.dropTableIfExists(table); | ||
} | ||
|
||
function getTables() { | ||
if (client === 'sqlite3') { | ||
return getTablesFromSqlite3(); | ||
return sqlite3.getTables(); | ||
} | ||
if (client === 'mysql') { | ||
return mysql.getTables(); | ||
} | ||
if (client === 'pg') { | ||
return pgsql.getTables(); | ||
} | ||
return when.reject("No support for database client " + client); | ||
} | ||
|
||
function getIndexes(table) { | ||
if (client === 'sqlite3') { | ||
return sqlite3.getIndexes(table); | ||
} | ||
if (client === 'mysql') { | ||
return mysql.getIndexes(table); | ||
} | ||
if (client === 'pg') { | ||
return pgsql.getIndexes(table); | ||
} | ||
return when.reject("No support for database client " + client); | ||
} | ||
|
||
function getColumns(table) { | ||
if (client === 'sqlite3') { | ||
return sqlite3.getColumns(table); | ||
} | ||
if (client === 'mysql') { | ||
return getTablesFromMySQL(); | ||
return mysql.getColumns(table); | ||
} | ||
if (client === 'pg') { | ||
return getTablesFromPgSQL(); | ||
return pgsql.getColumns(table); | ||
} | ||
return when.reject("No support for database client " + client); | ||
} | ||
|
||
module.exports = { | ||
createTable: createTable, | ||
deleteTable: deleteTable, | ||
getTables: getTables | ||
getTables: getTables, | ||
getIndexes: getIndexes, | ||
addUnique: addUnique, | ||
dropUnique: dropUnique, | ||
addColumn: addColumn, | ||
getColumns: getColumns | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
var _ = require('lodash'), | ||
knex = require('../../models/base').knex; | ||
|
||
function getTables() { | ||
return knex.raw('show tables').then(function (response) { | ||
return _.flatten(_.map(response[0], function (entry) { | ||
return _.values(entry); | ||
})); | ||
}); | ||
} | ||
|
||
function getIndexes(table) { | ||
return knex.raw('SHOW INDEXES from ' + table).then(function (response) { | ||
return _.flatten(_.pluck(response[0], 'Key_name')); | ||
}); | ||
} | ||
|
||
function getColumns(table) { | ||
return knex.raw('SHOW COLUMNS FROM ' + table).then(function (response) { | ||
return _.flatten(_.pluck(response[0], 'Field')); | ||
}); | ||
} | ||
|
||
module.exports = { | ||
getTables: getTables, | ||
getIndexes: getIndexes, | ||
getColumns: getColumns | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
var _ = require('lodash'), | ||
knex = require('../../models/base').knex; | ||
|
||
function getTables() { | ||
return knex.raw("SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'").then(function (response) { | ||
return _.flatten(_.pluck(response.rows, 'table_name')); | ||
}); | ||
} | ||
|
||
function getIndexes(table) { | ||
var selectIndexes = "SELECT t.relname as table_name, i.relname as index_name, a.attname as column_name" | ||
+ " FROM pg_class t, pg_class i, pg_index ix, pg_attribute a" | ||
+ " WHERE t.oid = ix.indrelid and i.oid = ix.indexrelid and" | ||
+ " a.attrelid = t.oid and a.attnum = ANY(ix.indkey) and t.relname = '" + table + "'"; | ||
|
||
return knex.raw(selectIndexes).then(function (response) { | ||
return _.flatten(_.pluck(response.rows, 'index_name')); | ||
}); | ||
} | ||
|
||
function getColumns(table) { | ||
var selectIndexes = "SELECT column_name FROM information_schema.columns WHERE table_name = '" + table + "'"; | ||
|
||
return knex.raw(selectIndexes).then(function (response) { | ||
return _.flatten(_.pluck(response.rows, 'column_name')); | ||
}); | ||
} | ||
|
||
module.exports = { | ||
getTables: getTables, | ||
getIndexes: getIndexes, | ||
getColumns: getColumns | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
var _ = require('lodash'), | ||
knex = require('../../models/base').knex; | ||
|
||
function getTables() { | ||
return knex.raw("select * from sqlite_master where type = 'table'").then(function (response) { | ||
return _.reject(_.pluck(response, 'tbl_name'), function (name) { | ||
return name === 'sqlite_sequence'; | ||
}); | ||
}); | ||
} | ||
|
||
function getIndexes(table) { | ||
return knex.raw("pragma index_list('" + table + "')").then(function (response) { | ||
|
||
return _.flatten(_.pluck(response, 'name')); | ||
}); | ||
} | ||
|
||
function getColumns(table) { | ||
return knex.raw("pragma table_info('" + table + "')").then(function (response) { | ||
return _.flatten(_.pluck(response, 'name')); | ||
}); | ||
} | ||
|
||
module.exports = { | ||
getTables: getTables, | ||
getIndexes: getIndexes, | ||
getColumns: getColumns | ||
}; |