mysql5/mysql-5.7.27/storage/ndb/nodejs/test/spi/InsertDuplicateTest.js

257 lines
7.3 KiB
JavaScript

/*
Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights
reserved.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2 of
the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
02110-1301 USA
*/
"use strict";
try {
require("./suite_config.js");
} catch(e) {}
var spi_lib = require("./lib.js");
var dbtablehandler = require(mynode.common.DBTableHandler);
var udebug = unified_debug.getLogger("InsertDuplicateTest.js");
var TableMapping = require(mynode.api.TableMapping).TableMapping;
var dbSession = null;
var table = null;
var dbt = null;
var mapping = new TableMapping("test.tbl4");
mapping.mapField("id", "i");
mapping.mapField("uk", "k");
mapping.mapField("name", "c");
var t1 = new harness.SerialTest("Insert1"),
t2 = new harness.SerialTest("Insert1_DupPK"),
t3 = new harness.SerialTest("Insert1_DupUK"),
t4 = new harness.SerialTest("Insert2_OK_dupPK"),
t5 = new harness.SerialTest("Insert2_OK_dupUK"),
t6 = new harness.SerialTest("Insert2_dupPK_dupUK"),
t7 = new harness.SerialTest("Delete"),
close = new harness.SerialTest("CloseSession");
/// Common prep
function prepare(testCase, runTestMethod, testObj) {
var connection = null;
if(dbSession && table) { // already set up
runTestMethod(testCase, testObj);
return;
}
function onTable(err, dbTable) {
udebug.log("prepare onTable");
table = dbTable; // set global
if(err) {
testCase.fail(err);
}
else { /* set global dbt */
dbt = new dbtablehandler.DBTableHandler(table, mapping, null);
runTestMethod(testCase, testObj); }
}
function onSession(err, sess) {
udebug.log("prepare onSession");
dbSession = sess; // set global
if(err) { testCase.fail(err); }
else {
dbSession.getConnectionPool().getTableMetadata("test", "tbl4", dbSession, onTable);
}
}
function onConnect(err, conn) {
udebug.log("prepare onConnect");
connection = conn;
connection.getDBSession(spi_lib.allocateSessionSlot(), onSession);
}
spi_lib.getConnectionPool(onConnect);
}
function do_insert_op(testCase, dataObj) {
udebug.log("do_insert_op for", testCase.name);
var tx = dbSession.getTransactionHandler();
var op = dbSession.buildInsertOperation(dbt, dataObj, tx, null);
tx.execute([ op ], testCase.checkResult);
}
function insert_two_rows(testCase, data) {
udebug.log("insert_two_rows for", testCase.name);
var tx = dbSession.getTransactionHandler();
var op1 = dbSession.buildInsertOperation(dbt, data[0], tx, null);
var op2 = dbSession.buildInsertOperation(dbt, data[1], tx, null);
tx.execute([ op1 , op2 ], testCase.checkResult);
}
function do_delete_op(testCase, keyObj) {
udebug.log("do_delete_op for", testCase.name);
var tx = dbSession.getTransactionHandler();
var dbix = dbt.getIndexHandler(keyObj);
var op = dbSession.buildDeleteOperation(dbix, keyObj, tx, null);
tx.execute([ op ], testCase.checkResult);
}
// INSERT
t1.run = function() {
var insertObj = { id : 501 , uk: 511, name : "Henry" };
prepare(t1, do_insert_op, insertObj);
};
t1.checkResult = function(err, tx) {
if (err) {
t1.appendErrorMessage("t1 unexpected error" + err);
}
t1.failOnError();
};
// INSERT; DUPLICATE VALUE FOR PRIMARY KEY
t2.run = function() {
var insertObj = { id : 501 , uk: 999 , name : "Henry II" };
prepare(t2, do_insert_op, insertObj);
};
t2.checkResult = function(err, tx) {
try {
t2.errorIfNotEqual("t2 cause.sqlstate", '23000', err.cause.sqlstate);
t2.errorIfNotEqual("t2 operation error sqlstate", '23000', tx.executedOperations[0].result.error.sqlstate);
}
catch(e) {
t2.appendErrorMessage("t2 exception " + e.message);
}
t2.failOnError();
};
// INSERT; DUPLICATE VALUE FOR UNIQUE KEY
t3.run = function() {
var insertObj = { id : 999 , uk: 511 , name : "Henry II" };
prepare(t3, do_insert_op, insertObj);
};
t3.checkResult = function(err, tx) {
try {
t3.errorIfNotEqual("t3 operation error sqlstate", '23000', tx.executedOperations[0].result.error.sqlstate);
}
catch(e) {
t3.appendErrorMessage('t3 exception ' + e.message);
}
t3.failOnError();
};
// INSERT. Row1 is OK; Row2 is duplicate PK.
t4.run = function() {
var data = [];
data[0] = { id : 502, uk: 512 , name : "George" };
data[1] = { id : 501, uk: 515 , name : "Edward" };
prepare(t4, insert_two_rows, data);
};
t4.checkResult = function(err, tx) {
// The transaction and second op must have errors.
// We make no claim on the status of the first operation
try {
t4.errorIfNotEqual("t4 Transaction Error Sqlstate", "23000", err.cause.sqlstate);
t4.errorIfNotEqual("t4 operation sqlstate", "23000",
tx.executedOperations[1].result.error.sqlstate);
}
catch(e) {
t4.appendErrorMessage("t4 exception " + e.message);
}
t4.failOnError();
};
// INSERT. Row1 is OK; Row2 is duplicate unique key
t5.run = function() {
var data = [];
data[0] = { id : 503, uk: 513 , name : "George" };
data[1] = { id : 505, uk: 511 , name : "Edward" };
prepare(t5, insert_two_rows , data);
};
t5.checkResult = function(err, tx) {
// The Transaction & second op must have errors
// We make no claim on the status of the first operation
try {
t5.errorIfNotEqual("t5 Transaction Error Sqlstate", "23000", err.cause.sqlstate);
t5.errorIfNotEqual("t5 Operation Error Sqlstate", "23000",
tx.executedOperations[1].result.error.sqlstate);
}
catch(e) {
t5.appendErrorMessage("t5 exception " + e.message);
}
t5.failOnError();
};
// INSERT. Row1 is duplicate PK; Row2 is duplicate unique key
t6.run = function() {
var data = [];
data[0] = { id : 501, uk: 513, name : "George" };
data[1] = { id : 505, uk: 511, name : "Edward" };
prepare(t6, insert_two_rows , data);
};
t6.checkResult = function(err, tx) {
// Transaction and both operations must have an error
try {
t6.errorIfNotEqual("t6 Transaction ErrorSqlstate", "23000", err.cause.sqlstate);
if (!tx.executedOperations[0].result.error) {
t6.appendErrorMessage("t6 operation 0 error did not occur.");
}
if (!tx.executedOperations[1].result.error) {
t6.appendErrorMessage("t6 operation 1 error did not occur.");
}
}
catch(e) {
t6.appendErrorMessage("t6 exception " + e.message);
}
t6.failOnError();
};
// DELETE BY PK
t7.run = function() {
var deleteKey = { id : 501 };
prepare(t7 , do_delete_op , deleteKey);
};
t7.checkResult = function(err, tx) {
if (err) {
t7.appendErrorMessage("t7 ExecuteCommit failed: " + err);
}
t7.failOnError();
};
/** This test function must be the last in the test file.
*/
close.run = function() {
dbSession.close(function(err) {
if (err) {
close.fail("Close got error: " + err);
} else {
close.pass();
}
});
};
exports.tests = [ t1, t2, t3, t4, t5, t6, t7, close ];