mirror of
https://github.com/xfarrow/blink
synced 2025-06-27 09:03:02 +02:00
52 lines
1.3 KiB
JavaScript
52 lines
1.3 KiB
JavaScript
const chunk = require('lodash/chunk');
|
|
const flatten = require('lodash/flatten');
|
|
const delay = require('./internal/delay');
|
|
const { isNumber } = require('../util/is');
|
|
|
|
function batchInsert(client, tableName, batch, chunkSize = 1000) {
|
|
let returning = undefined;
|
|
let transaction = null;
|
|
if (!isNumber(chunkSize) || chunkSize < 1) {
|
|
throw new TypeError(`Invalid chunkSize: ${chunkSize}`);
|
|
}
|
|
if (!Array.isArray(batch)) {
|
|
throw new TypeError(`Invalid batch: Expected array, got ${typeof batch}`);
|
|
}
|
|
const chunks = chunk(batch, chunkSize);
|
|
|
|
const runInTransaction = (cb) => {
|
|
if (transaction) {
|
|
return cb(transaction);
|
|
}
|
|
return client.transaction(cb);
|
|
};
|
|
|
|
return Object.assign(
|
|
Promise.resolve().then(async () => {
|
|
//Next tick to ensure wrapper functions are called if needed
|
|
await delay(1);
|
|
return runInTransaction(async (tr) => {
|
|
const chunksResults = [];
|
|
for (const items of chunks) {
|
|
chunksResults.push(await tr(tableName).insert(items, returning));
|
|
}
|
|
return flatten(chunksResults);
|
|
});
|
|
}),
|
|
{
|
|
returning(columns) {
|
|
returning = columns;
|
|
|
|
return this;
|
|
},
|
|
transacting(tr) {
|
|
transaction = tr;
|
|
|
|
return this;
|
|
},
|
|
}
|
|
);
|
|
}
|
|
|
|
module.exports = batchInsert;
|