ibm_db
Version:
IBM DB2 and IBM Informix bindings for node
168 lines (151 loc) • 6.81 kB
JavaScript
var common = require("./common")
, ibmdb = require("../")
, assert = require("assert")
;
// Test row-wise array insert feature (issue #698)
// This allows users to pass data as rows instead of column-wise arrays.
console.log("\n Test 1: Row-wise array insert using querySync\n ==============================================\n");
ibmdb.open(common.connectionString, function(err, conn) {
if(err) {
console.log(err);
return;
}
// Clean up any leftover tables from previous failed runs
conn.querySync("drop table rowarrtab");
conn.querySync("drop table rowarrtab2");
conn.querySync("drop table rowarrtab3");
conn.querySync("drop table rowarrtab4");
// Create test table
err = conn.querySync("create table rowarrtab (c1 int, c2 double, c3 varchar(10))");
if(err.length) { console.log(err); return; }
conn.querySync("insert into rowarrtab values (9, 4.5, 'existing')");
// Row-wise array insert using querySync with rows option
var queryOptions = {
sql: "insert into rowarrtab values (?, ?, ?)",
rows: [
[1, 10.5, "Row 1"],
[2, 20.3, "Row 2"],
[3, 30.7, "Row 3"]
]
};
conn.querySync(queryOptions);
var data = conn.querySync("select * from rowarrtab order by c1");
console.log("Selected data after row-wise querySync =\n", data);
var expectedData = [
{ C1: 1, C2: 10.5, C3: 'Row 1' },
{ C1: 2, C2: 20.3, C3: 'Row 2' },
{ C1: 3, C2: 30.7, C3: 'Row 3' },
{ C1: 9, C2: 4.5, C3: 'existing' }
];
assert.deepEqual(data, expectedData);
console.log("Test 1 passed: querySync with rows option works!\n");
// Test 2: Row-wise array insert using query (async) with rows option
console.log(" Test 2: Row-wise array insert using async query\n ================================================\n");
var queryOptions2 = {
sql: "insert into rowarrtab values (?, ?, ?)",
rows: [
[4, 40.1, "Row 4"],
[5, 50.2, "Row 5"]
]
};
conn.query(queryOptions2, function(err, result) {
if(err) { console.log("Error in async query:", err); return; }
var data2 = conn.querySync("select * from rowarrtab order by c1");
console.log("Selected data after async row-wise query =\n", data2);
assert.equal(data2.length, 6); // 1 existing + 3 from test1 + 2 from test2
assert.equal(data2[3].C1, 4);
assert.equal(data2[4].C1, 5);
console.log("Test 2 passed: async query with rows option works!\n");
// Test 3: Row-wise insert with columns metadata
console.log(" Test 3: Row-wise insert with columns metadata\n ==============================================\n");
conn.querySync("create table rowarrtab2 (c1 int, c2 varchar(20))");
var queryOptions3 = {
sql: "insert into rowarrtab2 values (?, ?)",
columns: [
{ DataType: "INTEGER" },
{ DataType: "VARCHAR", Length: 20 }
],
rows: [
[100, "Hello World"],
[200, "Goodbye World"]
]
};
conn.querySync(queryOptions3);
var data3 = conn.querySync("select * from rowarrtab2 order by c1");
console.log("Selected data with columns metadata =\n", data3);
assert.deepEqual(data3, [
{ C1: 100, C2: 'Hello World' },
{ C1: 200, C2: 'Goodbye World' }
]);
console.log("Test 3 passed: rows with columns metadata works!\n");
// Test 4: Row-wise insert with null values
console.log(" Test 4: Row-wise insert with null values\n =========================================\n");
conn.querySync("create table rowarrtab3 (c1 int, c2 varchar(10))");
var queryOptions4 = {
sql: "insert into rowarrtab3 values (?, ?)",
rows: [
[1, null],
[null, "notnull"],
[3, "three"]
]
};
conn.querySync(queryOptions4);
var data4 = conn.querySync("select * from rowarrtab3 order by c1");
console.log("Selected data with null values =\n", data4);
assert.equal(data4.length, 3);
console.log("Test 4 passed: rows with null values works!\n");
// Test 5: convertRowsToColumns utility function
console.log(" Test 5: convertRowsToColumns utility\n =====================================\n");
var converted = ibmdb.convertRowsToColumns(
[[10, "a"], [20, "b"], [30, "c"]],
[{ DataType: 1 }, { DataType: "VARCHAR", Length: 5 }]
);
assert.ok(!converted.error, "No error expected");
assert.equal(converted.ArraySize, 3);
assert.equal(converted.params.length, 2);
assert.equal(converted.params[0].ParamType, "ARRAY");
assert.deepEqual(converted.params[0].Data, [10, 20, 30]);
assert.deepEqual(converted.params[1].Data, ["a", "b", "c"]);
assert.equal(converted.params[1].Length, 5);
console.log("Converted result =", JSON.stringify(converted, null, 2));
console.log("Test 5 passed: convertRowsToColumns utility works!\n");
// Test 6: Error handling - mismatched row lengths
console.log(" Test 6: Error handling\n ======================\n");
var bad1 = ibmdb.convertRowsToColumns([[1, 2], [3]]);
assert.ok(bad1.error, "Expected error for mismatched row lengths");
console.log("Mismatched rows error:", bad1.error);
var bad2 = ibmdb.convertRowsToColumns([]);
assert.ok(bad2.error, "Expected error for empty rows");
console.log("Empty rows error:", bad2.error);
var bad3 = ibmdb.convertRowsToColumns([[1, 2]], [{ DataType: 1 }]);
assert.ok(bad3.error, "Expected error for columns/rows mismatch");
console.log("Columns mismatch error:", bad3.error);
console.log("Test 6 passed: Error handling works!\n");
// Test 7: prepare/bind/execute with convertRowsToColumns
console.log(" Test 7: prepare/bind/execute with convertRowsToColumns\n ======================================================\n");
conn.querySync("create table rowarrtab4 (c1 int, c2 varchar(10))");
var converted2 = ibmdb.convertRowsToColumns(
[[10, "ten"], [20, "twenty"], [30, "thirty"]]
);
var stmt = conn.prepareSync("insert into rowarrtab4 values (?, ?)");
stmt.bindSync(converted2.params);
stmt.setAttrSync(ibmdb.SQL_ATTR_PARAMSET_SIZE, converted2.ArraySize);
var result = stmt.executeSync();
stmt.closeSync();
var data7 = conn.querySync("select * from rowarrtab4 order by c1");
console.log("Selected data from prepare/bind/execute =\n", data7);
assert.deepEqual(data7, [
{ C1: 10, C2: 'ten' },
{ C1: 20, C2: 'twenty' },
{ C1: 30, C2: 'thirty' }
]);
console.log("Test 7 passed: prepare/bind/execute with convertRowsToColumns works!\n");
// Cleanup
conn.querySync("drop table rowarrtab");
conn.querySync("drop table rowarrtab2");
conn.querySync("drop table rowarrtab3");
conn.querySync("drop table rowarrtab4");
conn.closeSync();
console.log("\nAll row-wise array insert tests passed!\n");
});
});