Comparing version 0.19.8 to 0.19.9
@@ -26,3 +26,5 @@ // Copyright 2013 SAP AG. | ||
PART_HEADER_LENGTH: 16, | ||
MAX_PACKET_SIZE: Math.pow(2, 17), | ||
DEFAULT_PACKET_SIZE: Math.pow(2, 17), | ||
MAXIMUM_PACKET_SIZE: Math.pow(2, 30) - 1, | ||
MINIMUM_PACKET_SIZE: Math.pow(2, 16), | ||
MAX_RESULT_SET_SIZE: Math.pow(2, 20), | ||
@@ -29,0 +31,0 @@ EMPTY_BUFFER: new Buffer(0), |
@@ -39,8 +39,8 @@ // Copyright 2013 SAP AG. | ||
var EMPTY_BUFFER = common.EMPTY_BUFFER; | ||
var MAX_PACKET_SIZE = common.MAX_PACKET_SIZE; | ||
var DEFAULT_PACKET_SIZE = common.DEFAULT_PACKET_SIZE; | ||
var MINIMUM_PACKET_SIZE = common.MINIMUM_PACKET_SIZE; | ||
var MAXIMUM_PACKET_SIZE = common.MAXIMUM_PACKET_SIZE; | ||
var PACKET_HEADER_LENGTH = common.PACKET_HEADER_LENGTH; | ||
var SEGMENT_HEADER_LENGTH = common.SEGMENT_HEADER_LENGTH; | ||
var PART_HEADER_LENGTH = common.PART_HEADER_LENGTH; | ||
var MAX_AVAILABLE_SIZE = MAX_PACKET_SIZE - | ||
PACKET_HEADER_LENGTH - SEGMENT_HEADER_LENGTH - PART_HEADER_LENGTH; | ||
@@ -165,2 +165,18 @@ module.exports = Connection; | ||
} | ||
}, | ||
packetSize: { | ||
get: function getPacketSize() { | ||
let size = this._settings.packetSize || DEFAULT_PACKET_SIZE; | ||
size = Math.min(size, MAXIMUM_PACKET_SIZE); | ||
size = Math.max(size, MINIMUM_PACKET_SIZE); | ||
return size; | ||
} | ||
}, | ||
packetSizeLimit: { | ||
get: function getPacketSizeLimit() { | ||
let limit = this._settings.packetSizeLimit || this.packetSize; | ||
limit = Math.min(limit, MAXIMUM_PACKET_SIZE); | ||
limit = Math.max(limit, this.packetSize); | ||
return limit; | ||
} | ||
} | ||
@@ -306,4 +322,7 @@ }); | ||
var size = MAX_PACKET_SIZE - PACKET_HEADER_LENGTH; | ||
var size = this.packetSizeLimit - PACKET_HEADER_LENGTH; | ||
var buffer = message.toBuffer(size); | ||
if(buffer.length > size) { | ||
return receive(new Error('Packet size limit exceeded')); | ||
} | ||
var packet = new Buffer(PACKET_HEADER_LENGTH + buffer.length); | ||
@@ -352,4 +371,5 @@ buffer.copy(packet, PACKET_HEADER_LENGTH); | ||
Connection.prototype.getAvailableSize = function getAvailableSize() { | ||
var availableSize = MAX_AVAILABLE_SIZE; | ||
Connection.prototype.getAvailableSize = function getAvailableSize(forLobs = false) { | ||
var totalSize = forLobs ? this.packetSize : this.packetSizeLimit; | ||
var availableSize = totalSize - PACKET_HEADER_LENGTH - SEGMENT_HEADER_LENGTH - PART_HEADER_LENGTH; | ||
if (this._statementContext) { | ||
@@ -356,0 +376,0 @@ availableSize -= this._statementContext.size; |
@@ -144,3 +144,3 @@ // Copyright 2013 SAP AG. | ||
ExecuteTask.prototype.getParameters = function getParameters(availableSize, cb) { | ||
ExecuteTask.prototype.getParameters = function getParameters(availableSize, availableSizeForLOBs, cb) { | ||
var self = this; | ||
@@ -180,2 +180,3 @@ var bytesWritten = 0; | ||
var remainingSize = availableSize - bytesWritten; | ||
var remainingSizeForLOBs = availableSizeForLOBs - bytesWritten; | ||
if (self.writer.length > remainingSize) { | ||
@@ -186,5 +187,10 @@ if (self.autoCommit) { | ||
} | ||
return cb(null, args); | ||
if(args.length === 0) { | ||
self.needFinializeTransaction = false; | ||
return cb(new Error('Failed to set parameters, maximum packet size exceeded.')); | ||
} else { | ||
return cb(null, args); | ||
} | ||
} | ||
self.writer.getParameters(remainingSize, handleParameters); | ||
self.writer.getParameters(remainingSizeForLOBs, handleParameters); | ||
} | ||
@@ -197,5 +203,5 @@ | ||
var self = this; | ||
var availableSize = self.connection.getAvailableSize(); | ||
availableSize -= STATEMENT_ID_PART_LENGTH; | ||
self.getParameters(availableSize, function send(err, parameters) { | ||
var availableSize = self.connection.getAvailableSize(false) - STATEMENT_ID_PART_LENGTH; | ||
var availableSizeForLOBs = self.connection.getAvailableSize(true) - STATEMENT_ID_PART_LENGTH; | ||
self.getParameters(availableSize, availableSizeForLOBs, function send(err, parameters) { | ||
if (err) { | ||
@@ -217,3 +223,3 @@ return cb(err); | ||
var self = this; | ||
var availableSize = self.connection.getAvailableSize(); | ||
var availableSize = self.connection.getAvailableSize(true); | ||
self.writer.getWriteLobRequest(availableSize, function send(err, buffer) { | ||
@@ -220,0 +226,0 @@ if (err) { |
@@ -23,4 +23,4 @@ // Copyright 2013 SAP AG. | ||
var PartKindName = common.PartKindName; | ||
var MAX_PACKET_SIZE = common.MAX_PACKET_SIZE; | ||
var PACKET_HEADER_LENGTH = common.PACKET_HEADER_LENGTH; | ||
var DEFAULT_SEGMENT_SIZE = common.DEFAULT_PACKET_SIZE - PACKET_HEADER_LENGTH; | ||
var SEGMENT_HEADER_LENGTH = common.SEGMENT_HEADER_LENGTH; | ||
@@ -86,3 +86,3 @@ | ||
Segment.prototype.toBuffer = function toBuffer(size) { | ||
size = size || (MAX_PACKET_SIZE - PACKET_HEADER_LENGTH); | ||
size = size || DEFAULT_SEGMENT_SIZE; | ||
var remainingSize = size - SEGMENT_HEADER_LENGTH; | ||
@@ -89,0 +89,0 @@ var length = SEGMENT_HEADER_LENGTH; |
@@ -22,4 +22,4 @@ // Copyright 2013 SAP AG. | ||
var SegmentKind = common.SegmentKind; | ||
var MAX_SEGMENT_SIZE = common.MAX_PACKET_SIZE - common.PACKET_HEADER_LENGTH; | ||
var PACKET_HEADER_LENGTH = common.PACKET_HEADER_LENGTH; | ||
var DEFAULT_SEGMENT_SIZE = common.DEFAULT_PACKET_SIZE - PACKET_HEADER_LENGTH; | ||
var SEGMENT_HEADER_LENGTH = common.SEGMENT_HEADER_LENGTH; | ||
@@ -77,3 +77,3 @@ | ||
Segment.prototype.toBuffer = function toBuffer(size) { | ||
size = size || MAX_SEGMENT_SIZE; | ||
size = size || DEFAULT_SEGMENT_SIZE; | ||
var remainingSize = size - SEGMENT_HEADER_LENGTH; | ||
@@ -80,0 +80,0 @@ var length = SEGMENT_HEADER_LENGTH; |
@@ -190,2 +190,2 @@ // Copyright 2013 SAP AG. | ||
return metadata.ioType === IoType.OUTPUT || metadata.ioType === IoType.IN_OUT; | ||
} | ||
} |
@@ -105,3 +105,3 @@ // Copyright 2013 SAP AG. | ||
Writer.prototype.finializeParameters = function finializeParameters( | ||
bytesRemaining, cb) { | ||
bytesRemainingForLOBs, cb) { | ||
var self = this; | ||
@@ -159,3 +159,3 @@ var stream, header; | ||
/* jshint validthis:true */ | ||
var chunk = this.read(bytesRemaining); | ||
var chunk = this.read(bytesRemainingForLOBs); | ||
if (chunk === null) { | ||
@@ -167,3 +167,3 @@ chunk = this.read(); | ||
} | ||
if (chunk.length > bytesRemaining) { | ||
if (chunk.length > bytesRemainingForLOBs) { | ||
cleanup(); | ||
@@ -178,5 +178,5 @@ return cb(createReadStreamError()); | ||
self.push(chunk); | ||
bytesRemaining -= chunk.length; | ||
bytesRemainingForLOBs -= chunk.length; | ||
// stop appending if there is no remaining space | ||
if (bytesRemaining === 0) { | ||
if (bytesRemainingForLOBs === 0) { | ||
cleanup(); | ||
@@ -195,3 +195,3 @@ // finalize lob if the stream has already ended | ||
function next() { | ||
if (!self._lobs.length || bytesRemaining <= 0) { | ||
if (!self._lobs.length || bytesRemainingForLOBs <= 0) { | ||
return cb(null); | ||
@@ -218,3 +218,3 @@ } | ||
Writer.prototype.getParameters = function getParameters(bytesAvailable, cb) { | ||
Writer.prototype.getParameters = function getParameters(bytesAvailableForLOBs, cb) { | ||
var self = this; | ||
@@ -232,4 +232,4 @@ | ||
} | ||
var bytesRemaining = bytesAvailable - this._bytesWritten; | ||
this.finializeParameters(bytesRemaining, done); | ||
var bytesRemainingForLOBs = bytesAvailableForLOBs - this._bytesWritten; | ||
this.finializeParameters(bytesRemainingForLOBs, done); | ||
}; | ||
@@ -236,0 +236,0 @@ |
@@ -9,3 +9,3 @@ { | ||
"description": "SAP HANA Database Client for Node", | ||
"version": "0.19.8", | ||
"version": "0.19.9", | ||
"repository": { | ||
@@ -12,0 +12,0 @@ "type": "git", |
@@ -279,2 +279,18 @@ hdb - Pure JavaScript SAP HANA Database Client | ||
### Controlling the Maximum Packet Size | ||
By default, the node-hdb driver restricts the size of outgoing packets to 128KB. Attempting to execute SQL statements larger than this limit will result in an error. Furthermore, large object parameters (LOBs) larger than this limit will be broken up and sent in multiple packets to the server. | ||
This limit is configurable via the `packetSize` and `packetSizeLimit` connect options. Node-hdb will never allocate outgoing packets larger than `packetSizeLimit` and will restrict the packet size further to `packetSize` if possible (via breaking up LOB parameters into multiple packets). | ||
For example, the following configuration will allow packets up to 2^20 bytes (1MB) if necessary, but will still restrict LOB data to 2^17 byte (128KB) packets: | ||
```js | ||
var client = hdb.createClient({ | ||
host : 'hostname', | ||
port : 30015, | ||
packetSize : Math.pow(2, 17), | ||
packetSizeLimit : Math.pow(2, 20) | ||
... | ||
}); | ||
``` | ||
If not set, the value of `packetSize` defaults to 131072 (128KB) and `packetSizeLimit` defaults to `packetSize`. Values for `packetSize` may range from 65536 (64KB) to 1073741823 (1GB-1). Values for `packetSizeLimit` may range from `packetSize` to 1073741823 (1GB-1). | ||
Direct Statement Execution | ||
@@ -281,0 +297,0 @@ -------------------------- |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
334409
8767
744