diff --git a/lib/index.js b/lib/index.js index 1106765..aafd3be 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1133,6 +1133,27 @@ SQLParamString.prototype.calcBlr = function(blr) { //------------------------------------------------------ +function SQLParamStringBuffer(value) { + this.value = value; +} + +SQLParamStringBuffer.prototype.encode = function(data) { + if (this.value != null) { + data.addBuffer(this.value); + data.addInt(0); + } else { + data.addInt(1); + } +}; + +SQLParamStringBuffer.prototype.calcBlr = function(blr) { + blr.addByte(blr_text); + var len = this.value ? Buffer.byteLength(this.value) : 0; + blr.addWord(len); +}; + +//------------------------------------------------------ + function SQLParamQuad(value) { this.value = value; } @@ -3757,9 +3778,13 @@ Connection.prototype.executeStatement = function(transaction, statement, params, ret[i] = new SQLParamBool(value); break; default: + if (Buffer.isBuffer(value)) { + ret[i] = new SQLParamStringBuffer(value); + } else { //throw new Error('Unexpected parametter: ' + JSON.stringify(params) + ' - ' + JSON.stringify(input)); ret[i] = new SQLParamString(value.toString()); - break; + } + break; } done(); } diff --git a/lib/serialize.js b/lib/serialize.js index 4da4c91..33351ea 100644 --- a/lib/serialize.js +++ b/lib/serialize.js @@ -279,6 +279,14 @@ XdrWriter.prototype.addText = function(s, encoding) { this.pos += alen; }; +XdrWriter.prototype.addBuffer = function(b) { + var len = Buffer.byteLength(b) + var alen = align(len); + this.ensure(alen); + b.copy(this.buffer, this.pos); + this.pos += alen; +}; + XdrWriter.prototype.addBlr = function(blr) { var alen = align(blr.pos); this.ensure(alen + 4); diff --git a/test/index.js b/test/index.js index 902d171..7ae6b1e 100644 --- a/test/index.js +++ b/test/index.js @@ -148,6 +148,15 @@ describe('Database', function () { }); }); + it('should insert with string from buffer', function (done) { + db.query('INSERT INTO test (ID, NAME, CREATED) VALUES(?, ?, ?) RETURNING ID', [5, Buffer.from('Firebird 5'), '14.12.2014T12:12:12'], function (err, row) { + //db.query('INSERT INTO test (ID, NAME, CREATED) VALUES(?, ?, ?) RETURNING ID', [5, 'Firebird 5', '14.12.2014T12:12:12'], function (err, row) { + assert.ok(!err, err); + assert.equal(row['id'], 5); + done(); + }); + }); + describe('verify', function () { it('should select data from inserts', function (done) { db.query('SELECT * FROM test', function (err, rows) { @@ -282,8 +291,8 @@ describe('Database', function () { db.execute('SELECT COUNT(*), SUM(ID) FROM test', function (err, rows) { assert.ok(!err, err); var row = rows[0]; - assert.equal(row[0], 4); - assert.equal(row[1], 10); + assert.equal(row[0], 5); + assert.equal(row[1], 15); done(); }); }); @@ -292,8 +301,8 @@ describe('Database', function () { db.query('SELECT COUNT(*), SUM(ID) FROM test', function (err, rows) { assert.ok(!err, err); var row = rows[0]; - assert.equal(row.count, 4); - assert.equal(row.sum, 10); + assert.equal(row.count, 5); + assert.equal(row.sum, 15); done(); }); }); @@ -303,7 +312,7 @@ describe('Database', function () { db.sequentially('SELECT Id FROM test', function (row) { sum += row[0]; }, function () { - assert.equal(sum, 10); + assert.equal(sum, 15); done(); }, true); }); @@ -313,7 +322,7 @@ describe('Database', function () { db.sequentially('SELECT Id FROM test', function (row) { sum += row.id; }, function () { - assert.equal(sum, 10); + assert.equal(sum, 15); done(); }); }); @@ -324,15 +333,15 @@ describe('Database', function () { it('should rollback', function (done) { db.transaction(function (err, transaction) { assert(!err, err); - transaction.query('INSERT INTO test (ID, NAME) VALUES(?, ?)', [5, 'Transaction 1'], function (err) { + transaction.query('INSERT INTO test (ID, NAME) VALUES(?, ?)', [6, 'Transaction 1'], function (err) { assert.ok(!err, err); - transaction.query('INSERT INTO test (ID, NAME) VALUES(?, ?)', [6, 'Transaction 2'], function (err) { + transaction.query('INSERT INTO test (ID, NAME) VALUES(?, ?)', [7, 'Transaction 2'], function (err) { assert.ok(!err, err); - transaction.query('INSERT INTO test_fail (ID, NAME) VALUES(?, ?)', [7, 'Transaction 3'], function (err) { + transaction.query('INSERT INTO test_fail (ID, NAME) VALUES(?, ?)', [8, 'Transaction 3'], function (err) { assert.ok(err); transaction.rollback(function (err) { assert.ok(!err, err); - verify(done, 4); + verify(done, 5); }); }); }); @@ -343,15 +352,15 @@ describe('Database', function () { it('should commit', function (done) { db.transaction(function (err, transaction) { assert(!err, err); - transaction.query('INSERT INTO test (ID, NAME) VALUES(?, ?)', [5, 'Transaction 1'], function (err) { + transaction.query('INSERT INTO test (ID, NAME) VALUES(?, ?)', [6, 'Transaction 1'], function (err) { assert.ok(!err, err); - transaction.query('INSERT INTO test (ID, NAME) VALUES(?, ?)', [6, 'Transaction 2'], function (err) { + transaction.query('INSERT INTO test (ID, NAME) VALUES(?, ?)', [7, 'Transaction 2'], function (err) { assert.ok(!err, err); - transaction.query('INSERT INTO test (ID, NAME) VALUES(?, ?)', [7, 'Transaction 3'], function (err) { + transaction.query('INSERT INTO test (ID, NAME) VALUES(?, ?)', [8, 'Transaction 3'], function (err) { assert.ok(!err, err); transaction.commit(function (err) { assert.ok(!err, err); - verify(done, 7); + verify(done, 8); }); }); });