119 lines
4.5 KiB
JavaScript
119 lines
4.5 KiB
JavaScript
|
|
'use strict';
|
||
|
|
|
||
|
|
var Utils = require('../../utils')
|
||
|
|
, Promise = require('../../promise');
|
||
|
|
|
||
|
|
/**
|
||
|
|
Returns an object that treats SQLite's inabilities to do certain queries.
|
||
|
|
|
||
|
|
@class QueryInterface
|
||
|
|
@static
|
||
|
|
*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
A wrapper that fixes SQLite's inability to remove columns from existing tables.
|
||
|
|
It will create a backup of the table, drop the table afterwards and create a
|
||
|
|
new table with the same name but without the obsolete column.
|
||
|
|
|
||
|
|
@method removeColumn
|
||
|
|
@for QueryInterface
|
||
|
|
|
||
|
|
@param {String} tableName The name of the table.
|
||
|
|
@param {String} attributeName The name of the attribute that we want to remove.
|
||
|
|
@param {Object} options
|
||
|
|
@param {Boolean|Function} [options.logging] A function that logs the sql queries, or false for explicitly not logging these queries
|
||
|
|
@param {CustomEventEmitter} emitter The EventEmitter from outside.
|
||
|
|
@param {Function} queryAndEmit The function from outside that triggers some events to get triggered.
|
||
|
|
|
||
|
|
@since 1.6.0
|
||
|
|
*/
|
||
|
|
var removeColumn = function(tableName, attributeName, options) {
|
||
|
|
var self = this;
|
||
|
|
options = options || {};
|
||
|
|
|
||
|
|
return this.describeTable(tableName).then(function(fields) {
|
||
|
|
delete fields[attributeName];
|
||
|
|
|
||
|
|
var sql = self.QueryGenerator.removeColumnQuery(tableName, fields)
|
||
|
|
, subQueries = sql.split(';').filter(function(q) { return q !== ''; });
|
||
|
|
|
||
|
|
return Promise.each(subQueries, function(subQuery) {
|
||
|
|
return self.sequelize.query(subQuery + ';', { raw: true, logging: options.logging });
|
||
|
|
});
|
||
|
|
});
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
A wrapper that fixes SQLite's inability to change columns from existing tables.
|
||
|
|
It will create a backup of the table, drop the table afterwards and create a
|
||
|
|
new table with the same name but with a modified version of the respective column.
|
||
|
|
|
||
|
|
@method changeColumn
|
||
|
|
@for QueryInterface
|
||
|
|
|
||
|
|
@param {String} tableName The name of the table.
|
||
|
|
@param {Object} attributes An object with the attribute's name as key and it's options as value object.
|
||
|
|
@param {Object} options
|
||
|
|
@param {Boolean|Function} [options.logging] A function that logs the sql queries, or false for explicitly not logging these queries
|
||
|
|
@param {CustomEventEmitter} emitter The EventEmitter from outside.
|
||
|
|
@param {Function} queryAndEmit The function from outside that triggers some events to get triggered.
|
||
|
|
|
||
|
|
@since 1.6.0
|
||
|
|
*/
|
||
|
|
var changeColumn = function(tableName, attributes, options) {
|
||
|
|
var attributeName = Utils._.keys(attributes)[0]
|
||
|
|
, self = this;
|
||
|
|
options = options || {};
|
||
|
|
|
||
|
|
return this.describeTable(tableName, options).then(function(fields) {
|
||
|
|
fields[attributeName] = attributes[attributeName];
|
||
|
|
|
||
|
|
var sql = self.QueryGenerator.removeColumnQuery(tableName, fields)
|
||
|
|
, subQueries = sql.split(';').filter(function(q) { return q !== ''; });
|
||
|
|
|
||
|
|
return Promise.each(subQueries, function(subQuery) {
|
||
|
|
return self.sequelize.query(subQuery + ';', { raw: true, logging: options.logging });
|
||
|
|
});
|
||
|
|
});
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
A wrapper that fixes SQLite's inability to rename columns from existing tables.
|
||
|
|
It will create a backup of the table, drop the table afterwards and create a
|
||
|
|
new table with the same name but with a renamed version of the respective column.
|
||
|
|
|
||
|
|
@method renameColumn
|
||
|
|
@for QueryInterface
|
||
|
|
|
||
|
|
@param {String} tableName The name of the table.
|
||
|
|
@param {String} attrNameBefore The name of the attribute before it was renamed.
|
||
|
|
@param {String} attrNameAfter The name of the attribute after it was renamed.
|
||
|
|
@param {Object} options
|
||
|
|
@param {Boolean|Function} [options.logging] A function that logs the sql queries, or false for explicitly not logging these queries
|
||
|
|
@param {CustomEventEmitter} emitter The EventEmitter from outside.
|
||
|
|
@param {Function} queryAndEmit The function from outside that triggers some events to get triggered.
|
||
|
|
|
||
|
|
@since 1.6.0
|
||
|
|
*/
|
||
|
|
var renameColumn = function(tableName, attrNameBefore, attrNameAfter, options) {
|
||
|
|
var self = this;
|
||
|
|
options = options || {};
|
||
|
|
|
||
|
|
return this.describeTable(tableName, options).then(function(fields) {
|
||
|
|
fields[attrNameAfter] = Utils._.clone(fields[attrNameBefore]);
|
||
|
|
delete fields[attrNameBefore];
|
||
|
|
|
||
|
|
var sql = self.QueryGenerator.renameColumnQuery(tableName, attrNameBefore, attrNameAfter, fields)
|
||
|
|
, subQueries = sql.split(';').filter(function(q) { return q !== ''; });
|
||
|
|
|
||
|
|
return Promise.each(subQueries, function(subQuery) {
|
||
|
|
return self.sequelize.query(subQuery + ';', { raw: true, logging: options.logging });
|
||
|
|
});
|
||
|
|
});
|
||
|
|
};
|
||
|
|
|
||
|
|
module.exports = {
|
||
|
|
removeColumn: removeColumn,
|
||
|
|
changeColumn: changeColumn,
|
||
|
|
renameColumn: renameColumn
|
||
|
|
};
|