diff --git a/lib/wire/connection.js b/lib/wire/connection.js index 2099c2f..0000687 100644 --- a/lib/wire/connection.js +++ b/lib/wire/connection.js @@ -918,17 +918,10 @@ class Connection { } function PrepareParams(params, input, callback) { - + var value, meta; var ret = new Array(params.length); - var wait = params.length; - - function done() { - wait--; - if (wait === 0) - callback(ret); - } - + function putBlobData(index, value, callback) { self.createBlob2(transaction, function(err, blob) { @@ -951,41 +944,41 @@ class Connection { self.batchSegments(blob, b, next); }, function() { ret[index] = new Xsql.SQLParamQuad(blob.oid); - self.closeBlob(blob, callback); + self.closeBlob(blob, callback, false); }); return; } - + var isReading = false; var isEnd = false; - + value.on('data', function(chunk) { // Optimization: If chunk is smaller than transfer size, send directly if (chunk.length <= chunkSize) { self.batchSegments(blob, chunk, function () { if (isEnd && !isReading) { ret[index] = new Xsql.SQLParamQuad(blob.oid); - self.closeBlob(blob, callback); + self.closeBlob(blob, callback, false); } }); return; } - + value.pause(); isReading = true; bufferReader(chunk, chunkSize, function (b, next) { self.batchSegments(blob, b, next); }, function() { isReading = false; - + if (isEnd) { ret[index] = new Xsql.SQLParamQuad(blob.oid); - self.closeBlob(blob, callback); + self.closeBlob(blob, callback, false); } else value.resume(); }); }); - + value.on('end', function() { isEnd = true; if (isReading) @@ -994,16 +987,21 @@ class Connection { // If we are reading, the callback in batchSegments/bufferReader will handle closure if (!isReading) { ret[index] = new Xsql.SQLParamQuad(blob.oid); - self.closeBlob(blob, callback); + self.closeBlob(blob, callback, false); } }); }); } - for (var i = 0, length = params.length; i < length; i++) { + function step(i) { + if (i === params.length) { + callback(ret); + return; + } + value = params[i]; meta = input[i]; - + if (value === null || value === undefined) { switch (meta.type) { case Const.SQL_VARYING: @@ -1039,30 +1037,30 @@ class Connection { default: ret[i] = null; } - done(); + step(i + 1); } else { switch (meta.type) { case Const.SQL_BLOB: - putBlobData(i, value, done); + putBlobData(i, value, function() { step(i + 1); }); break; - - case Const.SQL_TIMESTAMP: - case Const.SQL_TYPE_DATE: - case Const.SQL_TYPE_TIME: - case Const.SQL_TIME_TZ: - case Const.SQL_TIME_TZ_EX: - case Const.SQL_TIMESTAMP_TZ: - case Const.SQL_TIMESTAMP_TZ_EX: - - if (value instanceof Date) ret[i] = new Xsql.SQLParamDate(value); + + case Const.SQL_TIMESTAMP: + case Const.SQL_TYPE_DATE: + case Const.SQL_TYPE_TIME: + case Const.SQL_TIME_TZ: + case Const.SQL_TIME_TZ_EX: + case Const.SQL_TIMESTAMP_TZ: + case Const.SQL_TIMESTAMP_TZ_EX: + if (value instanceof Date) + ret[i] = new Xsql.SQLParamDate(value); else if (typeof(value) === 'string') ret[i] = new Xsql.SQLParamDate(parseDate(value)); else ret[i] = new Xsql.SQLParamDate(new Date(value)); - - done(); + + step(i + 1); break; - + default: switch (typeof value) { case 'bigint': @@ -1088,10 +1086,12 @@ class Connection { ret[i] = new Xsql.SQLParamString(value.toString()); break; } - done(); + step(i + 1); } } } + + step(0); } var input = statement.input; @@ -1292,12 +1292,12 @@ class Connection { } - closeBlob(blob, callback) { + closeBlob(blob, callback, defer = true) { var msg = this._msg; msg.pos = 0; msg.addInt(Const.op_close_blob); msg.addInt(blob.handle); - this._queueEvent(callback, true); + this._queueEvent(callback, defer); }