batchInsert.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. 'use strict';
  2. exports.__esModule = true;
  3. var _typeof2 = require('babel-runtime/helpers/typeof');
  4. var _typeof3 = _interopRequireDefault(_typeof2);
  5. var _assign2 = require('lodash/assign');
  6. var _assign3 = _interopRequireDefault(_assign2);
  7. var _flatten2 = require('lodash/flatten');
  8. var _flatten3 = _interopRequireDefault(_flatten2);
  9. var _chunk2 = require('lodash/chunk');
  10. var _chunk3 = _interopRequireDefault(_chunk2);
  11. var _isArray2 = require('lodash/isArray');
  12. var _isArray3 = _interopRequireDefault(_isArray2);
  13. var _isNumber2 = require('lodash/isNumber');
  14. var _isNumber3 = _interopRequireDefault(_isNumber2);
  15. exports.default = batchInsert;
  16. var _bluebird = require('bluebird');
  17. var _bluebird2 = _interopRequireDefault(_bluebird);
  18. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  19. function batchInsert(client, tableName, batch) {
  20. var chunkSize = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1000;
  21. var _returning = void 0;
  22. var autoTransaction = true;
  23. var transaction = null;
  24. var getTransaction = function getTransaction() {
  25. return new _bluebird2.default(function (resolve, reject) {
  26. if (transaction) {
  27. autoTransaction = false;
  28. return resolve(transaction);
  29. }
  30. autoTransaction = true;
  31. client.transaction(resolve).catch(reject);
  32. });
  33. };
  34. var wrapper = (0, _assign3.default)(new _bluebird2.default(function (resolve, reject) {
  35. var chunks = (0, _chunk3.default)(batch, chunkSize);
  36. if (!(0, _isNumber3.default)(chunkSize) || chunkSize < 1) {
  37. return reject(new TypeError('Invalid chunkSize: ' + chunkSize));
  38. }
  39. if (!(0, _isArray3.default)(batch)) {
  40. return reject(new TypeError('Invalid batch: Expected array, got ' + (typeof batch === 'undefined' ? 'undefined' : (0, _typeof3.default)(batch))));
  41. }
  42. //Next tick to ensure wrapper functions are called if needed
  43. return _bluebird2.default.delay(1).then(getTransaction).then(function (tr) {
  44. return _bluebird2.default.mapSeries(chunks, function (items) {
  45. return tr(tableName).insert(items, _returning);
  46. }).then(function (result) {
  47. result = (0, _flatten3.default)(result || []);
  48. if (autoTransaction) {
  49. //TODO: -- Oracle tr.commit() does not return a 'thenable' !? Ugly hack for now.
  50. return (tr.commit(result) || _bluebird2.default.resolve()).then(function () {
  51. return result;
  52. });
  53. }
  54. return result;
  55. }).catch(function (error) {
  56. if (autoTransaction) {
  57. return tr.rollback(error).then(function () {
  58. return _bluebird2.default.reject(error);
  59. });
  60. }
  61. return _bluebird2.default.reject(error);
  62. });
  63. }).then(resolve).catch(reject);
  64. }), {
  65. returning: function returning(columns) {
  66. _returning = columns;
  67. return this;
  68. },
  69. transacting: function transacting(tr) {
  70. transaction = tr;
  71. return this;
  72. }
  73. });
  74. return wrapper;
  75. }
  76. module.exports = exports['default'];