UNPKG

knex

Version:

A batteries-included SQL query & schema builder for Postgres, MySQL and SQLite3 and the Browser

74 lines (56 loc) 2.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = batchInsert; var _lodash = require("lodash"); var _bluebird = _interopRequireDefault(require("bluebird")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function batchInsert(client, tableName, batch, chunkSize = 1000) { let returning = void 0; let autoTransaction = true; let transaction = null; const getTransaction = () => new _bluebird.default((resolve, reject) => { if (transaction) { autoTransaction = false; return resolve(transaction); } autoTransaction = true; client.transaction(resolve).catch(reject); }); const wrapper = (0, _lodash.assign)(new _bluebird.default((resolve, reject) => { const chunks = (0, _lodash.chunk)(batch, chunkSize); if (!(0, _lodash.isNumber)(chunkSize) || chunkSize < 1) { return reject(new TypeError(`Invalid chunkSize: ${chunkSize}`)); } if (!(0, _lodash.isArray)(batch)) { return reject(new TypeError(`Invalid batch: Expected array, got ${typeof batch}`)); } //Next tick to ensure wrapper functions are called if needed return _bluebird.default.delay(1).then(getTransaction).then(tr => { return _bluebird.default.mapSeries(chunks, items => tr(tableName).insert(items, returning)).then(result => { result = (0, _lodash.flatten)(result || []); if (autoTransaction) { //TODO: -- Oracle tr.commit() does not return a 'thenable' !? Ugly hack for now. return (tr.commit(result) || _bluebird.default.resolve()).then(() => result); } return result; }).catch(error => { if (autoTransaction) { return tr.rollback(error).then(() => _bluebird.default.reject(error)); } return _bluebird.default.reject(error); }); }).then(resolve).catch(reject); }), { returning(columns) { returning = columns; return this; }, transacting(tr) { transaction = tr; return this; } }); return wrapper; } module.exports = exports.default;