diff --git a/NEWS.carto.md b/NEWS.carto.md index 095fb9f..d5fae03 100644 --- a/NEWS.carto.md +++ b/NEWS.carto.md @@ -1,5 +1,11 @@ # CARTO's Changelog +## v1.2.0-carto.1 +Released 2018-mm-dd + +Bug fixes: + * Improves performance of COPY TO by sending bigger chunks through low level `push()`. See https://github.com/CartoDB/node-pg-copy-streams/pull/1 + ## v1.2.0 Released 2016-08-22 diff --git a/copy-to.js b/copy-to.js index a45ee6e..ad66b45 100644 --- a/copy-to.js +++ b/copy-to.js @@ -42,6 +42,16 @@ CopyStreamQuery.prototype._transform = function(chunk, enc, cb) { var messageCode; var needPush = false; + var buffer = Buffer.alloc(chunk.length); + var buffer_offset = 0; + + this.pushBufferIfneeded = function() { + if (needPush && buffer_offset > 0) { + this.push(buffer.slice(0, buffer_offset)) + buffer_offset = 0; + } + } + while((chunk.length - offset) >= (Byte1Len + Int32Len)) { var messageCode = chunk[offset] @@ -70,6 +80,7 @@ CopyStreamQuery.prototype._transform = function(chunk, enc, cb) { case code.ErrorResponse: case code.CopyDone: + this.pushBufferIfneeded(); this._detach() this.push(null) return cb(); @@ -84,7 +95,8 @@ CopyStreamQuery.prototype._transform = function(chunk, enc, cb) { if (needPush) { var row = chunk.slice(offset, offset + length - Int32Len) this.rowCount++ - this.push(row) + row.copy(buffer, buffer_offset); + buffer_offset += row.length; } offset += (length - Int32Len) } else { @@ -93,6 +105,8 @@ CopyStreamQuery.prototype._transform = function(chunk, enc, cb) { } } + this.pushBufferIfneeded(); + if(chunk.length - offset) { var slice = chunk.slice(offset) this._remainder = slice