knex 0.12.6 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/CONTRIBUTING.md +7 -1
  3. package/bin/cli.js +5 -5
  4. package/lib/client.js +9 -1
  5. package/lib/dialects/maria/transaction.js +10 -1
  6. package/lib/dialects/mssql/index.js +15 -9
  7. package/lib/dialects/mssql/query/compiler.js +18 -1
  8. package/lib/dialects/mssql/schema/tablecompiler.js +6 -2
  9. package/lib/dialects/mssql/transaction.js +3 -0
  10. package/lib/dialects/mysql/index.js +2 -2
  11. package/lib/dialects/mysql/schema/tablecompiler.js +2 -0
  12. package/lib/dialects/mysql/transaction.js +10 -1
  13. package/lib/dialects/mysql2/transaction.js +10 -1
  14. package/lib/dialects/oracle/index.js +4 -8
  15. package/lib/dialects/oracle/query/compiler.js +5 -2
  16. package/lib/dialects/oracle/schema/columncompiler.js +6 -12
  17. package/lib/dialects/oracle/schema/compiler.js +8 -4
  18. package/lib/dialects/oracle/schema/tablecompiler.js +11 -6
  19. package/lib/dialects/oracle/schema/trigger.js +35 -0
  20. package/lib/dialects/oracle/transaction.js +13 -1
  21. package/lib/dialects/oracledb/index.js +35 -6
  22. package/lib/dialects/oracledb/query/compiler.js +3 -0
  23. package/lib/dialects/oracledb/transaction.js +11 -0
  24. package/lib/dialects/postgres/index.js +13 -3
  25. package/lib/dialects/postgres/query/compiler.js +1 -1
  26. package/lib/dialects/postgres/schema/tablecompiler.js +61 -0
  27. package/lib/dialects/sqlite3/schema/columncompiler.js +1 -1
  28. package/lib/dialects/sqlite3/schema/tablecompiler.js +4 -1
  29. package/lib/dialects/websql/transaction.js +1 -1
  30. package/lib/formatter.js +1 -1
  31. package/lib/interface.js +3 -4
  32. package/lib/migrate/index.js +74 -36
  33. package/lib/migrate/stub/knexfile-ts.stub +44 -0
  34. package/lib/migrate/stub/ts.stub +16 -0
  35. package/lib/query/builder.js +32 -3
  36. package/lib/query/compiler.js +7 -7
  37. package/lib/query/methods.js +1 -1
  38. package/lib/raw.js +20 -16
  39. package/lib/runner.js +11 -3
  40. package/lib/schema/columnbuilder.js +11 -1
  41. package/lib/schema/columncompiler.js +2 -1
  42. package/lib/schema/tablebuilder.js +6 -2
  43. package/lib/schema/tablecompiler.js +66 -22
  44. package/lib/seed/index.js +1 -1
  45. package/lib/seed/stub/coffee.stub +6 -7
  46. package/lib/seed/stub/eg.stub +5 -5
  47. package/lib/seed/stub/js.stub +5 -5
  48. package/lib/seed/stub/ls.stub +5 -5
  49. package/lib/seed/stub/ts.stub +14 -0
  50. package/lib/transaction.js +17 -6
  51. package/lib/util/batchInsert.js +60 -84
  52. package/lib/util/make-knex.js +5 -5
  53. package/package.json +8 -3
  54. package/src/client.js +9 -1
  55. package/src/dialects/maria/transaction.js +7 -1
  56. package/src/dialects/mssql/index.js +11 -5
  57. package/src/dialects/mssql/query/compiler.js +15 -2
  58. package/src/dialects/mssql/schema/tablecompiler.js +6 -2
  59. package/src/dialects/mssql/transaction.js +7 -1
  60. package/src/dialects/mysql/schema/tablecompiler.js +2 -0
  61. package/src/dialects/mysql/transaction.js +7 -2
  62. package/src/dialects/mysql2/transaction.js +7 -2
  63. package/src/dialects/oracle/index.js +2 -3
  64. package/src/dialects/oracle/query/compiler.js +11 -2
  65. package/src/dialects/oracle/schema/columncompiler.js +4 -26
  66. package/src/dialects/oracle/schema/compiler.js +3 -1
  67. package/src/dialects/oracle/schema/tablecompiler.js +6 -4
  68. package/src/dialects/oracle/schema/trigger.js +109 -0
  69. package/src/dialects/oracle/transaction.js +8 -1
  70. package/src/dialects/oracledb/index.js +40 -10
  71. package/src/dialects/oracledb/query/compiler.js +3 -0
  72. package/src/dialects/oracledb/transaction.js +9 -0
  73. package/src/dialects/postgres/index.js +13 -5
  74. package/src/dialects/postgres/query/compiler.js +3 -1
  75. package/src/dialects/postgres/schema/tablecompiler.js +44 -0
  76. package/src/dialects/sqlite3/schema/columncompiler.js +1 -1
  77. package/src/dialects/sqlite3/schema/tablecompiler.js +4 -1
  78. package/src/dialects/websql/transaction.js +2 -1
  79. package/src/formatter.js +4 -1
  80. package/src/interface.js +4 -4
  81. package/src/migrate/index.js +103 -81
  82. package/src/migrate/stub/knexfile-ts.stub +44 -0
  83. package/src/migrate/stub/ts.stub +16 -0
  84. package/src/query/builder.js +23 -3
  85. package/src/query/compiler.js +9 -5
  86. package/src/query/methods.js +2 -0
  87. package/src/raw.js +16 -11
  88. package/src/runner.js +5 -1
  89. package/src/schema/columnbuilder.js +11 -2
  90. package/src/schema/columncompiler.js +1 -0
  91. package/src/schema/tablebuilder.js +6 -2
  92. package/src/schema/tablecompiler.js +35 -14
  93. package/src/seed/index.js +2 -1
  94. package/src/seed/stub/coffee.stub +6 -7
  95. package/src/seed/stub/eg.stub +5 -5
  96. package/src/seed/stub/js.stub +5 -5
  97. package/src/seed/stub/ls.stub +5 -5
  98. package/src/seed/stub/ts.stub +14 -0
  99. package/src/transaction.js +15 -7
  100. package/src/util/batchInsert.js +59 -66
  101. package/src/util/make-knex.js +4 -4
  102. package/README.md +0 -80
  103. package/lib/dialects/oracle/stream.js +0 -62
  104. package/src/dialects/oracle/stream.js +0 -50
package/CHANGELOG.md CHANGED
@@ -1,6 +1,48 @@
1
1
 
2
2
  # Master (Unreleased)
3
+
4
+ # 0.13 - 29 Apr, 2017
5
+
6
+ ### Breaking Changes:
7
+ - Multiple concurrent migration runners blocks instead of throwing error when possible #1962
8
+ - Fixed transaction promise mutation issue #1991
9
+
10
+ ### Other Changes:
11
+ - Allow passing version of connected db in configuration file #1993
12
+ - Bugfixes on batchInsert and transactions for mysql/maria #1992
13
+ - Add fetchAsString optional parameter to oracledb dialect #1998
14
+ - fix: escapeObject parameter order for Postgres dialect. #2003
15
+
16
+ # 0.12.9 - 23 Mar, 2017
17
+ - Fixed unhandled exception in batchInsert when the rows to be inserted resulted in duplicate key violation #1880
18
+
19
+ # 0.12.8 - 15 Mar, 2017
20
+ - Added clearSelect and clearWhere to query builder #1912
21
+ - Properly close Postgres query streams on error #1935
22
+ - Transactions should never reject with undefined #1970
23
+ - Clear acquireConnectionTimeout if an error occurs when acquiring a connection #1973
24
+
25
+ # 0.12.7 - 17 Feb, 2017
26
+
27
+ ### Accidental Breaking Change:
28
+ - Ensure that 'client' is provided in knex config object #1822
29
+
30
+ ### Other Changes:
31
+ - Support custom foreign key names #1311, #1726
32
+ - Fixed named bindings to work with queries containing `:`-chars #1890
33
+ - Exposed more promise functions #1896
34
+ - Pass rollback errors to transaction promise in mssql #1885
35
+ - ONLY keyword support for PostgreSQL (for table inheritance) #1874
36
+ - Fixed Mssql update with join syntax #1777
37
+ - Replace migrations and seed for react-native packager #1813
38
+ - Support knexfile, migration and seeds in TypeScript #1769
39
+ - Fix float to integer conversion of decimal fields in MSSQL #1781
40
+ - External authentication capability when using oracledb driver #1716
41
+ - Fixed MSSQL incorect query build when locks are used #1707
42
+ - Allow to use `first` method as aliased select #1784
43
+ - Alter column for nullability, type and default value #46, #1759
3
44
  - Add more having* methods / join clause on* methods #1674
45
+ - Compatibility fixes and cleanups #1788, #1792, #1794, #1814, #1857, #1649
4
46
 
5
47
  # 0.12.6 - 19 Oct, 2016
6
48
  - Address warnings mentioned in #1388 (#1740)
package/CONTRIBUTING.md CHANGED
@@ -12,6 +12,12 @@
12
12
 
13
13
  * All pull requests should be made to the `master` branch.
14
14
 
15
+ ## Documentation
16
+
17
+ Documentation is no longer maintained in knex master repository. All the documentation pull requests should be sent to https://github.com/knex/documentation
18
+
19
+ Documentation pull requests should not be merged before knex version which has the new documented feature is released.
20
+
15
21
  ## Integration Tests
16
22
 
17
23
  ### The Easy Way
@@ -65,7 +71,7 @@ There is always room for more collaborators. Be active on resolving github issue
65
71
 
66
72
  ### Etiquette (/ˈɛtᵻkɛt/ or /ˈɛtᵻkɪt/, French: [e.ti.kɛt])
67
73
 
68
- Make pull requests for your changes, do not commit directly to master (release stuff / documentation changes are ok though).
74
+ Make pull requests for your changes, do not commit directly to master (release stuff like fixing changelog are ok though).
69
75
 
70
76
  All the pull requests must be peer reviewed by other collaborator, so don't merge your request before that. If there is no response ping others.
71
77
 
package/bin/cli.js CHANGED
@@ -71,7 +71,7 @@ function initKnex(env) {
71
71
 
72
72
  function invoke(env) {
73
73
 
74
- var filetypes = ['js', 'coffee', 'eg', 'ls'];
74
+ var filetypes = ['js', 'coffee', 'ts', 'eg', 'ls'];
75
75
  var pending = null;
76
76
 
77
77
  commander
@@ -110,7 +110,7 @@ function invoke(env) {
110
110
 
111
111
  commander
112
112
  .command('migrate:make <name>')
113
- .description(' Create a named migration file.')
113
+ .description(' Create a named migration file.')
114
114
  .option(`-x [${filetypes.join('|')}]`, 'Specify the stub extension (default js)')
115
115
  .action(function(name) {
116
116
  var instance = initKnex(env);
@@ -152,7 +152,7 @@ function invoke(env) {
152
152
 
153
153
  commander
154
154
  .command('migrate:currentVersion')
155
- .description(' View the current version for the migration.')
155
+ .description(' View the current version for the migration.')
156
156
  .action(function () {
157
157
  pending = initKnex(env).migrate.currentVersion().then(function(version) {
158
158
  success(chalk.green('Current Version: ') + chalk.blue(version));
@@ -161,7 +161,7 @@ function invoke(env) {
161
161
 
162
162
  commander
163
163
  .command('seed:make <name>')
164
- .description(' Create a named seed file.')
164
+ .description(' Create a named seed file.')
165
165
  .option(`-x [${filetypes.join('|')}]`, 'Specify the stub extension (default js)')
166
166
  .action(function(name) {
167
167
  var instance = initKnex(env);
@@ -173,7 +173,7 @@ function invoke(env) {
173
173
 
174
174
  commander
175
175
  .command('seed:run')
176
- .description(' Run seed files.')
176
+ .description(' Run seed files.')
177
177
  .action(function() {
178
178
  pending = initKnex(env).seed.run().spread(function(log) {
179
179
  if (log.length === 0) {
package/lib/client.js CHANGED
@@ -100,6 +100,14 @@ function Client() {
100
100
  var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
101
101
 
102
102
  this.config = config;
103
+
104
+ //Client is a required field, so throw error if it's not supplied.
105
+ //If 'this.dialect' is set, then this is a 'super()' call, in which case
106
+ //'client' does not have to be set as it's already assigned on the client prototype.
107
+ if (!this.config.client && !this.dialect) {
108
+ throw new Error('knex: Required configuration option \'client\' is missing.');
109
+ }
110
+
103
111
  this.connectionSettings = (0, _cloneDeep3.default)(config.connection || {});
104
112
  if (this.driverName && config.connection) {
105
113
  this.initializeDriver();
@@ -279,10 +287,10 @@ function Client() {
279
287
  rejecter(new _bluebird2.default.TimeoutError('Knex: Timeout acquiring a connection. The pool is probably full. ' + 'Are you missing a .transacting(trx) call?'));
280
288
  }, _this4.config.acquireConnectionTimeout || 60000);
281
289
  _this4.pool.acquire(function (err, connection) {
290
+ clearTimeout(t);
282
291
  if (err) {
283
292
  return rejecter(err);
284
293
  }
285
- clearTimeout(t);
286
294
  if (wasRejected) {
287
295
  _this4.pool.release(connection);
288
296
  } else {
@@ -14,6 +14,10 @@ var _inherits2 = require('babel-runtime/helpers/inherits');
14
14
 
15
15
  var _inherits3 = _interopRequireDefault(_inherits2);
16
16
 
17
+ var _isUndefined2 = require('lodash/isUndefined');
18
+
19
+ var _isUndefined3 = _interopRequireDefault(_isUndefined2);
20
+
17
21
  var _debug = require('debug');
18
22
 
19
23
  var _debug2 = _interopRequireDefault(_debug);
@@ -53,7 +57,12 @@ var Transaction_Maria = function (_Transaction) {
53
57
  debug('%s error running transaction query', t.txid);
54
58
  }).tap(function () {
55
59
  if (status === 1) t._resolver(value);
56
- if (status === 2) t._rejecter(value);
60
+ if (status === 2) {
61
+ if ((0, _isUndefined3.default)(value)) {
62
+ value = new Error('Transaction rejected with non-error: ' + value);
63
+ }
64
+ t._rejecter(value);
65
+ }
57
66
  });
58
67
  if (status === 1 || status === 2) {
59
68
  t._completed = true;
@@ -180,8 +180,8 @@ function Client_MSSQL(config) {
180
180
  rejecter(err);
181
181
  });
182
182
  stream.on('end', resolver);
183
- var _obj = obj;
184
- var sql = _obj.sql;
183
+ var _obj = obj,
184
+ sql = _obj.sql;
185
185
 
186
186
  if (!sql) return resolver();
187
187
  var req = (connection.tx_ || connection).request();
@@ -207,8 +207,8 @@ function Client_MSSQL(config) {
207
207
  // convert ? params into positional bindings (@p1)
208
208
  obj.sql = this.positionBindings(obj.sql);
209
209
  return new _bluebird2.default(function (resolver, rejecter) {
210
- var _obj2 = obj;
211
- var sql = _obj2.sql;
210
+ var _obj2 = obj,
211
+ sql = _obj2.sql;
212
212
 
213
213
  if (!sql) return resolver();
214
214
  var req = (connection.tx_ || connection).request();
@@ -230,13 +230,19 @@ function Client_MSSQL(config) {
230
230
  },
231
231
 
232
232
 
233
- // sets a request input parameter. Detects bigints and sets type appropriately.
233
+ // sets a request input parameter. Detects bigints and decimals and sets type appropriately.
234
234
  _setReqInput: function _setReqInput(req, i, binding) {
235
- if (typeof binding == 'number' && (binding < SQL_INT4.MIN || binding > SQL_INT4.MAX)) {
236
- if (binding < SQL_BIGINT_SAFE.MIN || binding > SQL_BIGINT_SAFE.MAX) {
237
- throw new Error('Bigint must be safe integer or must be passed as string, saw ' + binding);
235
+ if (typeof binding == 'number') {
236
+ if (binding % 1 !== 0) {
237
+ req.input('p' + i, this.driver.Decimal(38, 10), binding);
238
+ } else if (binding < SQL_INT4.MIN || binding > SQL_INT4.MAX) {
239
+ if (binding < SQL_BIGINT_SAFE.MIN || binding > SQL_BIGINT_SAFE.MAX) {
240
+ throw new Error('Bigint must be safe integer or must be passed as string, saw ' + binding);
241
+ }
242
+ req.input('p' + i, this.driver.BigInt, binding);
243
+ } else {
244
+ req.input('p' + i, this.driver.Int, binding);
238
245
  }
239
- req.input('p' + i, this.driver.BigInt, binding);
240
246
  } else {
241
247
  req.input('p' + i, binding);
242
248
  }
@@ -6,6 +6,10 @@ var _typeof2 = require('babel-runtime/helpers/typeof');
6
6
 
7
7
  var _typeof3 = _interopRequireDefault(_typeof2);
8
8
 
9
+ var _compact2 = require('lodash/compact');
10
+
11
+ var _compact3 = _interopRequireDefault(_compact2);
12
+
9
13
  var _isEmpty2 = require('lodash/isEmpty');
10
14
 
11
15
  var _isEmpty3 = _interopRequireDefault(_isEmpty2);
@@ -31,10 +35,23 @@ function QueryCompiler_MSSQL(client, builder) {
31
35
  }
32
36
  (0, _inherits2.default)(QueryCompiler_MSSQL, _compiler2.default);
33
37
 
38
+ var components = ['columns', 'join', 'lock', 'where', 'union', 'group', 'having', 'order', 'limit', 'offset'];
39
+
34
40
  (0, _assign3.default)(QueryCompiler_MSSQL.prototype, {
35
41
 
36
42
  _emptyInsertValue: 'default values',
37
43
 
44
+ select: function select() {
45
+ var _this = this;
46
+
47
+ var sql = this.with();
48
+ var statements = components.map(function (component) {
49
+ return _this[component](_this);
50
+ });
51
+ return sql + (0, _compact3.default)(statements).join(' ');
52
+ },
53
+
54
+
38
55
  // Compiles an "insert" query, allowing for multiple
39
56
  // inserts using a single query statement.
40
57
  insert: function insert() {
@@ -91,7 +108,7 @@ function QueryCompiler_MSSQL(client, builder) {
91
108
  var returning = this.single.returning;
92
109
 
93
110
  return {
94
- sql: this.with() + ('update ' + (top ? top + ' ' : '') + this.tableName) + (join ? ' ' + join : '') + ' set ' + updates.join(', ') + (returning ? ' ' + this._returning('update', returning) : '') + (where ? ' ' + where : '') + (order ? ' ' + order : '') + (!returning ? this._returning('rowcount', '@@rowcount') : ''),
111
+ sql: this.with() + ('update ' + (top ? top + ' ' : '') + this.tableName) + ' set ' + updates.join(', ') + (join ? ' from ' + this.tableName + ' ' + join : '') + (returning ? ' ' + this._returning('update', returning) : '') + (where ? ' ' + where : '') + (order ? ' ' + order : '') + (!returning ? this._returning('rowcount', '@@rowcount') : ''),
95
112
  returning: returning || '@@rowcount'
96
113
  };
97
114
  },
@@ -60,11 +60,15 @@ function TableCompiler_MSSQL() {
60
60
 
61
61
  dropColumnPrefix: 'DROP COLUMN ',
62
62
 
63
+ alterColumnPrefix: 'ALTER COLUMN ',
64
+
63
65
  // Compiles column add. Multiple columns need only one ADD clause (not one ADD per column) so core addColumns doesn't work. #1348
64
- addColumns: function addColumns(columns) {
66
+ addColumns: function addColumns(columns, prefix) {
67
+ prefix = prefix || this.addColumnsPrefix;
68
+
65
69
  if (columns.sql.length > 0) {
66
70
  this.pushQuery({
67
- sql: (this.lowerCase ? 'alter table ' : 'ALTER TABLE ') + this.tableName() + ' ' + this.addColumnsPrefix + columns.sql.join(', '),
71
+ sql: (this.lowerCase ? 'alter table ' : 'ALTER TABLE ') + this.tableName() + ' ' + prefix + columns.sql.join(', '),
68
72
  bindings: columns.bindings
69
73
  });
70
74
  }
@@ -69,6 +69,9 @@ var Transaction_MSSQL = function (_Transaction) {
69
69
  debug('%s: rolling back', this.txid);
70
70
  return conn.tx_.rollback().then(function () {
71
71
  return _this4._rejecter(error);
72
+ }, function (err) {
73
+ if (error) err.originalError = error;
74
+ return _this4._rejecter(err);
72
75
  });
73
76
  };
74
77
 
@@ -144,8 +144,8 @@ function Client_MySQL(config) {
144
144
  _query: function _query(connection, obj) {
145
145
  if (!obj || typeof obj === 'string') obj = { sql: obj };
146
146
  return new _bluebird2.default(function (resolver, rejecter) {
147
- var _obj = obj;
148
- var sql = _obj.sql;
147
+ var _obj = obj,
148
+ sql = _obj.sql;
149
149
 
150
150
  if (!sql) return resolver();
151
151
  if (obj.options) sql = (0, _assign3.default)({ sql: sql }, obj.options);
@@ -72,6 +72,8 @@ function TableCompiler_MySQL() {
72
72
 
73
73
  addColumnsPrefix: 'add ',
74
74
 
75
+ alterColumnsPrefix: 'modify ',
76
+
75
77
  dropColumnPrefix: 'drop ',
76
78
 
77
79
  // Compiles the comment on the table.
@@ -2,6 +2,10 @@
2
2
 
3
3
  exports.__esModule = true;
4
4
 
5
+ var _isUndefined2 = require('lodash/isUndefined');
6
+
7
+ var _isUndefined3 = _interopRequireDefault(_isUndefined2);
8
+
5
9
  var _assign2 = require('lodash/assign');
6
10
 
7
11
  var _assign3 = _interopRequireDefault(_assign2);
@@ -47,7 +51,12 @@ function Transaction_MySQL() {
47
51
  debug('%s error running transaction query', t.txid);
48
52
  }).tap(function () {
49
53
  if (status === 1) t._resolver(value);
50
- if (status === 2) t._rejecter(value);
54
+ if (status === 2) {
55
+ if ((0, _isUndefined3.default)(value)) {
56
+ value = new Error('Transaction rejected with non-error: ' + value);
57
+ }
58
+ t._rejecter(value);
59
+ }
51
60
  });
52
61
  if (status === 1 || status === 2) {
53
62
  t._completed = true;
@@ -2,6 +2,10 @@
2
2
 
3
3
  exports.__esModule = true;
4
4
 
5
+ var _isUndefined2 = require('lodash/isUndefined');
6
+
7
+ var _isUndefined3 = _interopRequireDefault(_isUndefined2);
8
+
5
9
  var _assign2 = require('lodash/assign');
6
10
 
7
11
  var _assign3 = _interopRequireDefault(_assign2);
@@ -44,7 +48,12 @@ function Transaction_MySQL2() {
44
48
  debug('%s error running transaction query', t.txid);
45
49
  }).tap(function () {
46
50
  if (status === 1) t._resolver(value);
47
- if (status === 2) t._rejecter(value);
51
+ if (status === 2) {
52
+ if ((0, _isUndefined3.default)(value)) {
53
+ value = new Error('Transaction rejected with non-error: ' + value);
54
+ }
55
+ t._rejecter(value);
56
+ }
48
57
  });
49
58
  if (status === 1 || status === 2) {
50
59
  t._completed = true;
@@ -66,10 +66,6 @@ var _tablecompiler = require('./schema/tablecompiler');
66
66
 
67
67
  var _tablecompiler2 = _interopRequireDefault(_tablecompiler);
68
68
 
69
- var _stream2 = require('./stream');
70
-
71
- var _stream3 = _interopRequireDefault(_stream2);
72
-
73
69
  var _utils = require('./utils');
74
70
 
75
71
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
@@ -79,12 +75,12 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
79
75
  // Always initialize with the "QueryBuilder" and "QueryCompiler"
80
76
  // objects, which extend the base 'lib/query/builder' and
81
77
  // 'lib/query/compiler', respectively.
82
-
83
- // Oracle Client
84
- // -------
85
78
  function Client_Oracle(config) {
86
79
  _client2.default.call(this, config);
87
80
  }
81
+ // Oracle Client
82
+ // -------
83
+
88
84
  (0, _inherits2.default)(Client_Oracle, _client2.default);
89
85
 
90
86
  (0, _assign3.default)(Client_Oracle.prototype, {
@@ -183,7 +179,7 @@ function Client_Oracle(config) {
183
179
  rejecter(err);
184
180
  });
185
181
  stream.on('end', resolver);
186
- var queryStream = new _stream3.default(connection, obj.sql, obj.bindings, options);
182
+ var queryStream = connection.queryStream(obj.sql, obj.bindings, options);
187
183
  queryStream.pipe(stream);
188
184
  });
189
185
  },
@@ -188,13 +188,16 @@ function QueryCompiler_Oracle(client, builder) {
188
188
  // Compiles a `columnInfo` query.
189
189
  columnInfo: function columnInfo() {
190
190
  var column = this.single.columnInfo;
191
+ // Node oracle drivers doesn't support LONG type (which is data_default type)
192
+ var sql = 'select * from xmltable( \'/ROWSET/ROW\'\n passing dbms_xmlgen.getXMLType(\'\n select char_col_decl_length, column_name, data_type, data_default, nullable\n from user_tab_columns where table_name = \'\'' + this.single.table + '\'\' \')\n columns\n CHAR_COL_DECL_LENGTH number, COLUMN_NAME varchar2(200), DATA_TYPE varchar2(106),\n DATA_DEFAULT clob, NULLABLE varchar2(1))';
193
+
191
194
  return {
192
- sql: 'select COLUMN_NAME, DATA_TYPE, CHAR_COL_DECL_LENGTH, NULLABLE from USER_TAB_COLS where TABLE_NAME = :1',
193
- bindings: [this.single.table],
195
+ sql: sql,
194
196
  output: function output(resp) {
195
197
  var out = (0, _reduce3.default)(resp, function (columns, val) {
196
198
  columns[val.COLUMN_NAME] = {
197
199
  type: val.DATA_TYPE,
200
+ defaultValue: val.DATA_DEFAULT,
198
201
  maxLength: val.CHAR_COL_DECL_LENGTH,
199
202
  nullable: val.NULLABLE === 'Y'
200
203
  };
@@ -18,10 +18,6 @@ var _inherits = require('inherits');
18
18
 
19
19
  var _inherits2 = _interopRequireDefault(_inherits);
20
20
 
21
- var _utils = require('../utils');
22
-
23
- var utils = _interopRequireWildcard(_utils);
24
-
25
21
  var _raw = require('../../../raw');
26
22
 
27
23
  var _raw2 = _interopRequireDefault(_raw);
@@ -30,7 +26,9 @@ var _columncompiler = require('../../../schema/columncompiler');
30
26
 
31
27
  var _columncompiler2 = _interopRequireDefault(_columncompiler);
32
28
 
33
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
29
+ var _trigger = require('./trigger');
30
+
31
+ var _trigger2 = _interopRequireDefault(_trigger);
34
32
 
35
33
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
36
34
 
@@ -38,8 +36,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
38
36
  // -------
39
37
 
40
38
  function ColumnCompiler_Oracle() {
41
- this.modifiers = ['defaultTo', 'checkIn', 'nullable', 'comment'];
42
39
  _columncompiler2.default.apply(this, arguments);
40
+ this.modifiers = ['defaultTo', 'checkIn', 'nullable', 'comment'];
43
41
  }
44
42
  (0, _inherits2.default)(ColumnCompiler_Oracle, _columncompiler2.default);
45
43
 
@@ -49,12 +47,8 @@ function ColumnCompiler_Oracle() {
49
47
  _createAutoIncrementTriggerAndSequence: function _createAutoIncrementTriggerAndSequence() {
50
48
  // TODO Add warning that sequence etc is created
51
49
  this.pushAdditional(function () {
52
- var sequenceName = this.tableCompiler._indexCommand('seq', this.tableCompiler.tableNameRaw);
53
- var triggerName = this.tableCompiler._indexCommand('trg', this.tableCompiler.tableNameRaw, this.getColumnName());
54
- var tableName = this.tableCompiler.tableName();
55
- var columnName = this.formatter.wrap(this.getColumnName());
56
- var createTriggerSQL = 'create or replace trigger ' + triggerName + ' before insert on ' + tableName + ' for each row' + ' declare' + ' checking number := 1;' + ' begin' + (' if (:new.' + columnName + ' is null) then') + ' while checking >= 1' + ' loop' + (' select ' + sequenceName + '.nextval into :new.' + columnName + ' from dual;') + (' select count(' + columnName + ') into checking from ' + tableName) + (' where ' + columnName + ' = :new.' + columnName + ';') + ' end loop;' + ' end if;' + ' end;';
57
- this.pushQuery(utils.wrapSqlWithCatch('create sequence ' + sequenceName, -955));
50
+ var tableName = this.tableCompiler.tableNameRaw;
51
+ var createTriggerSQL = _trigger2.default.createAutoIncrementTrigger(tableName);
58
52
  this.pushQuery(createTriggerSQL);
59
53
  });
60
54
  },
@@ -14,21 +14,25 @@ var _utils = require('../utils');
14
14
 
15
15
  var utils = _interopRequireWildcard(_utils);
16
16
 
17
+ var _trigger = require('./trigger');
18
+
19
+ var _trigger2 = _interopRequireDefault(_trigger);
20
+
17
21
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
18
22
 
19
23
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
24
 
25
+ // Oracle Schema Compiler
26
+ // -------
21
27
  function SchemaCompiler_Oracle() {
22
28
  _compiler2.default.apply(this, arguments);
23
29
  }
24
- // Oracle Schema Compiler
25
- // -------
26
-
27
30
  (0, _inherits2.default)(SchemaCompiler_Oracle, _compiler2.default);
28
31
 
29
32
  // Rename a table on the schema.
30
33
  SchemaCompiler_Oracle.prototype.renameTable = function (tableName, to) {
31
- this.pushQuery('rename ' + this.formatter.wrap(tableName) + ' to ' + this.formatter.wrap(to));
34
+ var renameTable = _trigger2.default.renameTableAndAutoIncrementTrigger(tableName, to);
35
+ this.pushQuery(renameTable);
32
36
  };
33
37
 
34
38
  // Check whether a table exists on the query.
@@ -22,6 +22,10 @@ var _helpers = require('../../../helpers');
22
22
 
23
23
  var helpers = _interopRequireWildcard(_helpers);
24
24
 
25
+ var _trigger = require('./trigger');
26
+
27
+ var _trigger2 = _interopRequireDefault(_trigger);
28
+
25
29
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
26
30
 
27
31
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -29,20 +33,19 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
29
33
  // Table Compiler
30
34
  // ------
31
35
 
32
- /* eslint max-len:0 */
33
-
34
36
  function TableCompiler_Oracle() {
35
37
  _tablecompiler2.default.apply(this, arguments);
36
- }
38
+ } /* eslint max-len:0 */
39
+
37
40
  (0, _inherits2.default)(TableCompiler_Oracle, _tablecompiler2.default);
38
41
 
39
42
  (0, _assign3.default)(TableCompiler_Oracle.prototype, {
40
43
 
41
44
  // Compile a rename column command.
42
45
  renameColumn: function renameColumn(from, to) {
43
- return this.pushQuery({
44
- sql: 'alter table ' + this.tableName() + ' rename column ' + this.formatter.wrap(from) + ' to ' + this.formatter.wrap(to)
45
- });
46
+ // Remove quotes around tableName
47
+ var tableName = this.tableName().slice(1, -1);
48
+ return this.pushQuery(_trigger2.default.renameColumnTrigger(tableName, from, to));
46
49
  },
47
50
  compileAdd: function compileAdd(builder) {
48
51
  var table = this.formatter.wrap(builder);
@@ -73,6 +76,8 @@ function TableCompiler_Oracle() {
73
76
 
74
77
  addColumnsPrefix: 'add ',
75
78
 
79
+ alterColumnsPrefix: 'modify ',
80
+
76
81
  dropColumn: function dropColumn() {
77
82
  var columns = helpers.normalizeArr.apply(null, arguments);
78
83
  this.pushQuery('alter table ' + this.tableName() + ' drop (' + this.formatter.columnize(columns) + ')');
@@ -0,0 +1,35 @@
1
+ 'use strict';
2
+
3
+ exports.__esModule = true;
4
+
5
+ var _utils = require('../utils');
6
+
7
+ var utils = _interopRequireWildcard(_utils);
8
+
9
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
10
+
11
+ var trigger = {
12
+
13
+ renameColumnTrigger: function renameColumnTrigger(tableName, columnName, to) {
14
+ var triggerName = utils.generateCombinedName('autoinc_trg', tableName);
15
+ var sequenceName = utils.generateCombinedName('seq', tableName);
16
+ return 'DECLARE ' + 'PK_NAME VARCHAR(200); ' + 'IS_AUTOINC NUMBER := 0; ' + 'BEGIN' + (' EXECUTE IMMEDIATE (\'ALTER TABLE "' + tableName + '" RENAME COLUMN "' + columnName + '" TO "' + to + '"\');') + (' SELECT COUNT(*) INTO IS_AUTOINC from "USER_TRIGGERS" where trigger_name = \'' + triggerName + '\';') + ' IF (IS_AUTOINC > 0) THEN' + ' SELECT cols.column_name INTO PK_NAME' + ' FROM all_constraints cons, all_cons_columns cols' + ' WHERE cons.constraint_type = \'P\'' + ' AND cons.constraint_name = cols.constraint_name' + ' AND cons.owner = cols.owner' + (' AND cols.table_name = \'' + tableName + '\';') + (' IF (\'' + to + '\' = PK_NAME) THEN') + (' EXECUTE IMMEDIATE (\'DROP TRIGGER "' + triggerName + '"\');') + (' EXECUTE IMMEDIATE (\'create or replace trigger "' + triggerName + '"') + (' BEFORE INSERT on "' + tableName + '" for each row') + ' declare' + ' checking number := 1;' + ' begin' + (' if (:new."' + to + '" is null) then') + ' while checking >= 1 loop' + (' select "' + sequenceName + '".nextval into :new."' + to + '" from dual;') + (' select count("' + to + '") into checking from "' + tableName + '"') + (' where "' + to + '" = :new."' + to + '";') + ' end loop;' + ' end if;' + ' end;\');' + ' end if;' + ' end if;' + 'END;';
17
+ },
18
+
19
+ createAutoIncrementTrigger: function createAutoIncrementTrigger(tableName) {
20
+ var triggerName = utils.generateCombinedName('autoinc_trg', tableName);
21
+ var sequenceName = utils.generateCombinedName('seq', tableName);
22
+ return 'DECLARE ' + 'PK_NAME VARCHAR(200); ' + 'BEGIN' + (' EXECUTE IMMEDIATE (\'CREATE SEQUENCE "' + sequenceName + '"\');') + ' SELECT cols.column_name INTO PK_NAME' + ' FROM all_constraints cons, all_cons_columns cols' + ' WHERE cons.constraint_type = \'P\'' + ' AND cons.constraint_name = cols.constraint_name' + ' AND cons.owner = cols.owner' + (' AND cols.table_name = \'' + tableName + '\';') + (' execute immediate (\'create or replace trigger "' + triggerName + '"') + (' BEFORE INSERT on "' + tableName + '"') + ' for each row' + ' declare' + ' checking number := 1;' + ' begin' + ' if (:new."\' || PK_NAME || \'" is null) then' + ' while checking >= 1 loop' + (' select "' + sequenceName + '".nextval into :new."\' || PK_NAME || \'" from dual;') + (' select count("\' || PK_NAME || \'") into checking from "' + tableName + '"') + ' where "\' || PK_NAME || \'" = :new."\' || PK_NAME || \'";' + ' end loop;' + ' end if;' + ' end;\'); ' + 'END;';
23
+ },
24
+
25
+ renameTableAndAutoIncrementTrigger: function renameTableAndAutoIncrementTrigger(tableName, to) {
26
+ var triggerName = utils.generateCombinedName('autoinc_trg', tableName);
27
+ var sequenceName = utils.generateCombinedName('seq', tableName);
28
+ var toTriggerName = utils.generateCombinedName('autoinc_trg', to);
29
+ var toSequenceName = utils.generateCombinedName('seq', to);
30
+ return 'DECLARE ' + 'PK_NAME VARCHAR(200); ' + 'IS_AUTOINC NUMBER := 0; ' + 'BEGIN' + (' EXECUTE IMMEDIATE (\'RENAME "' + tableName + '" TO "' + to + '"\');') + (' SELECT COUNT(*) INTO IS_AUTOINC from "USER_TRIGGERS" where trigger_name = \'' + triggerName + '\';') + ' IF (IS_AUTOINC > 0) THEN' + (' EXECUTE IMMEDIATE (\'DROP TRIGGER "' + triggerName + '"\');') + (' EXECUTE IMMEDIATE (\'RENAME "' + sequenceName + '" TO "' + toSequenceName + '"\');') + ' SELECT cols.column_name INTO PK_NAME' + ' FROM all_constraints cons, all_cons_columns cols' + ' WHERE cons.constraint_type = \'P\'' + ' AND cons.constraint_name = cols.constraint_name' + ' AND cons.owner = cols.owner' + (' AND cols.table_name = \'' + to + '\';') + (' EXECUTE IMMEDIATE (\'create or replace trigger "' + toTriggerName + '"') + (' BEFORE INSERT on "' + to + '" for each row') + ' declare' + ' checking number := 1;' + ' begin' + ' if (:new."\' || PK_NAME || \'" is null) then' + ' while checking >= 1 loop' + (' select "' + toSequenceName + '".nextval into :new."\' || PK_NAME || \'" from dual;') + (' select count("\' || PK_NAME || \'") into checking from "' + to + '"') + ' where "\' || PK_NAME || \'" = :new."\' || PK_NAME || \'";' + ' end loop;' + ' end if;' + ' end;\');' + ' end if;' + 'END;';
31
+ }
32
+ };
33
+
34
+ exports.default = trigger;
35
+ module.exports = exports['default'];
@@ -14,6 +14,10 @@ var _inherits2 = require('babel-runtime/helpers/inherits');
14
14
 
15
15
  var _inherits3 = _interopRequireDefault(_inherits2);
16
16
 
17
+ var _isUndefined2 = require('lodash/isUndefined');
18
+
19
+ var _isUndefined3 = _interopRequireDefault(_isUndefined2);
20
+
17
21
  var _bluebird = require('bluebird');
18
22
 
19
23
  var _bluebird2 = _interopRequireDefault(_bluebird);
@@ -49,9 +53,17 @@ var Oracle_Transaction = function (_Transaction) {
49
53
  };
50
54
 
51
55
  Oracle_Transaction.prototype.rollback = function rollback(conn, err) {
56
+ var _this2 = this;
57
+
52
58
  this._completed = true;
53
59
  debugTx('%s: rolling back', this.txid);
54
- return conn.rollbackAsync().throw(err).catch(this._rejecter);
60
+ return conn.rollbackAsync().throw(err).catch(function (error) {
61
+ if ((0, _isUndefined3.default)(error)) {
62
+ error = new Error('Transaction rejected with non-error: ' + error);
63
+ }
64
+
65
+ return _this2._rejecter(error);
66
+ });
55
67
  };
56
68
 
57
69
  Oracle_Transaction.prototype.acquireConnection = function acquireConnection(config) {