diff --git a/lib/dialects/mssql/schema/columncompiler.js b/lib/dialects/mssql/schema/columncompiler.js index 2d85c658..7273d291 100644 --- a/lib/dialects/mssql/schema/columncompiler.js +++ b/lib/dialects/mssql/schema/columncompiler.js @@ -48,17 +48,13 @@ assign(ColumnCompiler_MSSQL.prototype, { return 'nvarchar(' + this._num(length, 255) + ')'; }, - text: function text(column) { - return 'nvarchar(max)'; - }, + text: 'nvarchar(max)', mediumtext: 'nvarchar(max)', longtext: 'nvarchar(max)', - enu: function enu(allowed) { - return 'nvarchar(100)'; - }, + enu: 'nvarchar(100)', uuid: 'uniqueidentifier', diff --git a/lib/dialects/mssql/schema/tablecompiler.js b/lib/dialects/mssql/schema/tablecompiler.js index 14576724..3e69d149 100644 --- a/lib/dialects/mssql/schema/tablecompiler.js +++ b/lib/dialects/mssql/schema/tablecompiler.js @@ -46,7 +46,7 @@ assign(TableCompiler_MSSQL.prototype, { dropColumnPrefix: 'drop column ', // Compiles the comment on the table. - comment: function comment(_comment) {}, + comment: function comment() {}, changeType: function changeType() {}, @@ -55,14 +55,22 @@ assign(TableCompiler_MSSQL.prototype, { this.pushQuery('exec sp_rename ' + this.formatter.parameter(this.tableName() + '.' + from) + ', ' + this.formatter.parameter(to) + ', \'COLUMN\''); }, - getFKRefs: function getFKRefs(runner) { - var formatter = this.client.formatter(); - var sql = 'SELECT KCU.CONSTRAINT_NAME, KCU.TABLE_NAME, KCU.COLUMN_NAME, ' + ' KCU.REFERENCED_TABLE_NAME, KCU.REFERENCED_COLUMN_NAME, ' + ' RC.UPDATE_RULE, RC.DELETE_RULE ' + 'FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU ' + 'JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC ' + ' USING(CONSTRAINT_NAME)' + 'WHERE KCU.REFERENCED_TABLE_NAME = ' + formatter.parameter(this.tableNameRaw) + ' ' + ' AND KCU.CONSTRAINT_SCHEMA = ' + formatter.parameter(this.client.database()) + ' ' + ' AND RC.CONSTRAINT_SCHEMA = ' + formatter.parameter(this.client.database()); - return runner.query({ - sql: sql, - bindings: formatter.bindings - }); - }, + // getFKRefs: function (runner) { + // var formatter = this.client.formatter(); + // var sql = 'SELECT KCU.CONSTRAINT_NAME, KCU.TABLE_NAME, KCU.COLUMN_NAME, '+ + // ' KCU.REFERENCED_TABLE_NAME, KCU.REFERENCED_COLUMN_NAME, '+ + // ' RC.UPDATE_RULE, RC.DELETE_RULE '+ + // 'FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU '+ + // 'JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC '+ + // ' USING(CONSTRAINT_NAME)' + + // 'WHERE KCU.REFERENCED_TABLE_NAME = ' + formatter.parameter(this.tableNameRaw) + ' '+ + // ' AND KCU.CONSTRAINT_SCHEMA = ' + formatter.parameter(this.client.database()) + ' '+ + // ' AND RC.CONSTRAINT_SCHEMA = ' + formatter.parameter(this.client.database()); + // return runner.query({ + // sql: sql, + // bindings: formatter.bindings + // }); + // }, dropFKRefs: function dropFKRefs(runner, refs) { var formatter = this.client.formatter(); return Promise.all(refs.map(function (ref) { diff --git a/lib/dialects/mssql/transaction.js b/lib/dialects/mssql/transaction.js index debd17f6..725b8f51 100644 --- a/lib/dialects/mssql/transaction.js +++ b/lib/dialects/mssql/transaction.js @@ -3,7 +3,6 @@ var inherits = require('inherits'); var assign = require('lodash/object/assign'); var Promise = require('../../promise'); -var helpers = require('../../helpers'); var Transaction = require('../../transaction'); var debug = require('debug')('knex:tx'); @@ -15,42 +14,52 @@ inherits(Transaction_MSSQL, Transaction); assign(Transaction_MSSQL.prototype, { begin: function begin(conn) { - // console.log('begin', this.txid) + debug('%s: begin', this.txid); return conn.tx_.begin().then(this._resolver, this._rejecter); - //return this.query(conn, 'BEGIN TRANSACTION;') }, savepoint: function savepoint(conn) { - //console.log('savepoint', this.txid) - return Promise.resolve(); - //return this.query(conn, 'SAVE TRANSACTION ' + this.txid + ';') + var _this = this; + + debug('%s: savepoint at', this.txid); + return Promise.resolve().then(function () { + return _this.query(conn, 'SAVE TRANSACTION ' + _this.txid); + }); }, commit: function commit(conn, value) { - //console.log('commit', this.txid) + var _this2 = this; + this._completed = true; - return conn.tx_.commit().then(this._resolver(value), this._rejecter); - //return this.query(conn, 'COMMIT TRANSACTION;', 1, value) + debug('%s: commit', this.txid); + return conn.tx_.commit().then(function () { + return _this2._resolver(value); + }, this._rejecter); }, release: function release(conn, value) { - //console.log('release', this.txid) return this._resolver(value); - //return '' }, rollback: function rollback(conn, error) { - //console.log('rollback', this.txid) + var _this3 = this; + this._completed = true; debug('%s: rolling back', this.txid); - return conn.tx_.rollback()['catch'](this._rejecter(error)); - //return this.query(conn, 'ROLLBACK TRANSACTION;', 2, error) + return conn.tx_.rollback().then(function () { + return _this3._rejecter(error); + }); }, rollbackTo: function rollbackTo(conn, error) { - //console.log('rollbackTo', this.txid) - return Promise.resolve(); - //return this.query(conn, 'ROLLBACK TRANSACTION ' + this.txid, 2, error) + var _this4 = this; + + debug('%s: rolling backTo', this.txid); + return Promise.resolve().then(function () { + return _this4.query(conn, 'ROLLBACK TRANSACTION ' + _this4.txid, 2, error); + }).then(function () { + return _this4._rejecter(error); + }); }, // Acquire a connection and create a disposer - either using the one passed @@ -60,24 +69,25 @@ assign(Transaction_MSSQL.prototype, { var t = this; var configConnection = config && config.connection; return Promise['try'](function () { - return configConnection || t.client.acquireConnection(); - }).tap(function (connection) { - //console.log('acquireConnection:begin', !!t.outerTx, t.txid); + return (t.outerTx ? t.outerTx.conn : null) || configConnection || t.client.acquireConnection(); + }).tap(function (conn) { if (!t.outerTx) { - connection.tx_ = connection.transaction(); + t.conn = conn; + conn.tx_ = conn.transaction(); } - }).disposer(function (connection) { - //console.log('acquireConnection:end', !!t.outerTx, t.txid); - if (!t.outerTx && connection.tx_) { + }).disposer(function (conn) { + if (t.outerTx) return; + if (conn.tx_) { if (!t._completed) { debug('%s: unreleased transaction', t.txid); - connection.tx_.rollback(); + conn.tx_.rollback(); } - connection.tx_ = null; + conn.tx_ = null; } + t.conn = null; if (!configConnection) { debug('%s: releasing connection', t.txid); - t.client.releaseConnection(connection); + t.client.releaseConnection(conn); } else { debug('%s: not releasing external connection', t.txid); } diff --git a/src/dialects/mssql/schema/columncompiler.js b/src/dialects/mssql/schema/columncompiler.js index 1efef2f4..2e7bbf3e 100644 --- a/src/dialects/mssql/schema/columncompiler.js +++ b/src/dialects/mssql/schema/columncompiler.js @@ -46,17 +46,13 @@ assign(ColumnCompiler_MSSQL.prototype, { return 'nvarchar(' + this._num(length, 255) + ')'; }, - text: function(column) { - return 'nvarchar(max)'; - }, + text: 'nvarchar(max)', mediumtext: 'nvarchar(max)', longtext: 'nvarchar(max)', - enu: function(allowed) { - return 'nvarchar(100)'; - }, + enu: 'nvarchar(100)', uuid: 'uniqueidentifier', diff --git a/src/dialects/mssql/schema/tablecompiler.js b/src/dialects/mssql/schema/tablecompiler.js index 4ff84580..9893630f 100644 --- a/src/dialects/mssql/schema/tablecompiler.js +++ b/src/dialects/mssql/schema/tablecompiler.js @@ -43,7 +43,7 @@ assign(TableCompiler_MSSQL.prototype, { dropColumnPrefix: 'drop column ', // Compiles the comment on the table. - comment: function(comment) { + comment: function() { }, changeType: function() { @@ -54,22 +54,22 @@ assign(TableCompiler_MSSQL.prototype, { this.pushQuery('exec sp_rename ' + this.formatter.parameter(this.tableName() + '.' + from) + ', ' + this.formatter.parameter(to) + ', \'COLUMN\''); }, - getFKRefs: function (runner) { - var formatter = this.client.formatter(); - var sql = 'SELECT KCU.CONSTRAINT_NAME, KCU.TABLE_NAME, KCU.COLUMN_NAME, '+ - ' KCU.REFERENCED_TABLE_NAME, KCU.REFERENCED_COLUMN_NAME, '+ - ' RC.UPDATE_RULE, RC.DELETE_RULE '+ - 'FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU '+ - 'JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC '+ - ' USING(CONSTRAINT_NAME)' + - 'WHERE KCU.REFERENCED_TABLE_NAME = ' + formatter.parameter(this.tableNameRaw) + ' '+ - ' AND KCU.CONSTRAINT_SCHEMA = ' + formatter.parameter(this.client.database()) + ' '+ - ' AND RC.CONSTRAINT_SCHEMA = ' + formatter.parameter(this.client.database()); - return runner.query({ - sql: sql, - bindings: formatter.bindings - }); - }, + // getFKRefs: function (runner) { + // var formatter = this.client.formatter(); + // var sql = 'SELECT KCU.CONSTRAINT_NAME, KCU.TABLE_NAME, KCU.COLUMN_NAME, '+ + // ' KCU.REFERENCED_TABLE_NAME, KCU.REFERENCED_COLUMN_NAME, '+ + // ' RC.UPDATE_RULE, RC.DELETE_RULE '+ + // 'FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU '+ + // 'JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC '+ + // ' USING(CONSTRAINT_NAME)' + + // 'WHERE KCU.REFERENCED_TABLE_NAME = ' + formatter.parameter(this.tableNameRaw) + ' '+ + // ' AND KCU.CONSTRAINT_SCHEMA = ' + formatter.parameter(this.client.database()) + ' '+ + // ' AND RC.CONSTRAINT_SCHEMA = ' + formatter.parameter(this.client.database()); + // return runner.query({ + // sql: sql, + // bindings: formatter.bindings + // }); + // }, dropFKRefs: function (runner, refs) { var formatter = this.client.formatter(); return Promise.all(refs.map(function (ref) { diff --git a/src/dialects/mssql/transaction.js b/src/dialects/mssql/transaction.js index 867b7d57..040ede43 100644 --- a/src/dialects/mssql/transaction.js +++ b/src/dialects/mssql/transaction.js @@ -1,8 +1,7 @@ var inherits = require('inherits') var assign = require('lodash/object/assign'); -var Promise = require('../../promise') -var helpers = require('../../helpers') +var Promise = require('../../promise') var Transaction = require('../../transaction') var debug = require('debug')('knex:tx') @@ -14,45 +13,40 @@ inherits(Transaction_MSSQL, Transaction) assign(Transaction_MSSQL.prototype, { begin: function(conn) { - // console.log('begin', this.txid) + debug('%s: begin', this.txid) return conn.tx_.begin() .then(this._resolver, this._rejecter) - //return this.query(conn, 'BEGIN TRANSACTION;') }, savepoint: function(conn) { - //console.log('savepoint', this.txid) - return Promise.resolve(); - //return this.query(conn, 'SAVE TRANSACTION ' + this.txid + ';') + debug('%s: savepoint at', this.txid) + return Promise.resolve() + .then(() => this.query(conn, 'SAVE TRANSACTION ' + this.txid)) }, commit: function(conn, value) { - //console.log('commit', this.txid) this._completed = true + debug('%s: commit', this.txid) return conn.tx_.commit() - .then(this._resolver(value), this._rejecter) - //return this.query(conn, 'COMMIT TRANSACTION;', 1, value) + .then(() => this._resolver(value), this._rejecter) }, release: function(conn, value) { - //console.log('release', this.txid) return this._resolver(value) - //return '' }, rollback: function(conn, error) { - //console.log('rollback', this.txid) this._completed = true debug('%s: rolling back', this.txid) return conn.tx_.rollback() - .catch(this._rejecter(error)) - //return this.query(conn, 'ROLLBACK TRANSACTION;', 2, error) + .then(() => this._rejecter(error)) }, rollbackTo: function(conn, error) { - //console.log('rollbackTo', this.txid) - return Promise.resolve(); - //return this.query(conn, 'ROLLBACK TRANSACTION ' + this.txid, 2, error) + debug('%s: rolling backTo', this.txid) + return Promise.resolve() + .then(() => this.query(conn, 'ROLLBACK TRANSACTION ' + this.txid, 2, error)) + .then(() => this._rejecter(error)) }, // Acquire a connection and create a disposer - either using the one passed @@ -62,24 +56,25 @@ assign(Transaction_MSSQL.prototype, { var t = this var configConnection = config && config.connection return Promise.try(function() { - return configConnection || t.client.acquireConnection() - }).tap(function(connection) { - //console.log('acquireConnection:begin', !!t.outerTx, t.txid); + return (t.outerTx ? t.outerTx.conn : null) || configConnection || t.client.acquireConnection() + }).tap(function(conn) { if (!t.outerTx) { - connection.tx_ = connection.transaction() + t.conn = conn + conn.tx_ = conn.transaction() } - }).disposer(function(connection) { - //console.log('acquireConnection:end', !!t.outerTx, t.txid); - if (!t.outerTx && connection.tx_) { + }).disposer(function(conn) { + if (t.outerTx) return; + if (conn.tx_) { if (!t._completed) { debug('%s: unreleased transaction', t.txid) - connection.tx_.rollback(); + conn.tx_.rollback(); } - connection.tx_ = null; + conn.tx_ = null; } + t.conn = null if (!configConnection) { debug('%s: releasing connection', t.txid) - t.client.releaseConnection(connection) + t.client.releaseConnection(conn) } else { debug('%s: not releasing external connection', t.txid) } diff --git a/test/integration/builder/aggregate.js b/test/integration/builder/aggregate.js index db1ce67a..ef3506ac 100644 --- a/test/integration/builder/aggregate.js +++ b/test/integration/builder/aggregate.js @@ -68,7 +68,7 @@ module.exports = function(knex) { return Math.abs(10/6 - +(resp[0][key])) < 0.001; } function checkResRangeMssql(key, resp) { - return +(resp[0][key]) == 1; + return +(resp[0][key]) === 1; } // mysql: 1.6667 diff --git a/test/tape/transactions.js b/test/tape/transactions.js index 8ffc8404..e7b064ec 100644 --- a/test/tape/transactions.js +++ b/test/tape/transactions.js @@ -141,7 +141,7 @@ module.exports = function(knex) { t.equal(err.message, 'Rolled back') }) .finally(function() { - t.equal(queryCount, knex.client.dialect === 'oracle' ? 1 : 3) + t.equal(queryCount, knex.client.dialect === 'oracle' || knex.client.dialect === 'mssql' ? 1 : 3) }) }) @@ -169,7 +169,7 @@ module.exports = function(knex) { }) if (knex.client.driverName === 'pg') { - tape('allows postgres ? operator in knex.raw() if no bindings given #519 and #888', function (t) { + tape('allows postgres ? operator in knex.raw() if no bindings given #519 and #888', 'pg', function (t) { t.plan(1) knex.from('test_table_two') .whereRaw("(json_data->'me')::jsonb \\?& array['keyOne', 'keyTwo']")