php-sqlsrv/test/functional/sqlsrv/TC64_TransactionProc.phpt

111 lines
3.4 KiB
Plaintext
Raw Normal View History

2017-05-04 01:00:31 +02:00
--TEST--
Transaction with Stored Procedure Test
--DESCRIPTION--
Verifies the basic transaction behavior in the context of an
INSERT query performed within a stored procedure.
Two types of sequences are explored.
--ENV--
PHPT_EXEC=true
--SKIPIF--
2017-10-27 18:32:57 +02:00
<?php require('skipif_versions_old.inc'); ?>
2017-05-04 01:00:31 +02:00
--FILE--
<?php
require_once('MsCommon.inc');
2017-05-04 01:00:31 +02:00
function transaction($minType, $maxType)
2017-05-04 01:00:31 +02:00
{
$testName = "Transaction - Stored Proc";
startTest($testName);
2017-05-04 01:00:31 +02:00
setup();
$tableName = 'TC64test';
$procName = "TC64test_proc";
$conn1 = AE\connect();
2017-05-04 01:00:31 +02:00
$colName = "c1";
2017-10-26 19:48:36 +02:00
$dataSize = 512;
for ($k = $minType; $k <= $maxType; $k++) {
switch ($k) {
2017-05-04 01:00:31 +02:00
case 20: // binary
case 21: // varbinary
case 22: // varbinary(max)
$data = null;
break;
default:
$data = getSampleData($k);
2017-05-04 01:00:31 +02:00
break;
}
if ($data != null) {
$sqlType = getSqlType($k);
2017-10-26 19:48:36 +02:00
$driverType = getSqlsrvSqlType($k, $dataSize);
2017-05-04 01:00:31 +02:00
2017-10-26 21:46:45 +02:00
if ($k == 10 || $k == 11) {
// do not encrypt money type -- ODBC restrictions
$noEncrypt = true;
} else {
$noEncrypt = false;
}
$columns = array(new AE\ColumnMeta($sqlType, $colName, null, true, $noEncrypt));
AE\createTable($conn1, $tableName, $columns);
createTransactionProc($conn1, $tableName, $colName, $procName, $sqlType);
2017-05-04 01:00:31 +02:00
$noRows = execTransactionProc($conn1, $procName, $data, $driverType, true);
if ($noRows != 1) {
2017-05-04 01:00:31 +02:00
die("$sqlType: Incorrect row count after commit: $noRows");
}
$noRows = execTransactionProc($conn1, $procName, $data, $driverType, false);
if ($noRows != 2) {
2017-05-04 01:00:31 +02:00
die("$sqlType: Incorrect row count after rollback: $noRows");
}
$noRows = numRows($conn1, $tableName);
if ($noRows != 1) {
2017-05-04 01:00:31 +02:00
die("$sqlType: Incorrect total row count: $noRows");
}
dropProc($conn1, $procName);
dropTable($conn1, $tableName);
2017-05-04 01:00:31 +02:00
}
}
2017-05-04 01:00:31 +02:00
sqlsrv_close($conn1);
endTest($testName);
2017-05-04 01:00:31 +02:00
}
function createTransactionProc($conn, $tableName, $colName, $procName, $sqlType)
2017-05-04 01:00:31 +02:00
{
$procArgs = "@p1 $sqlType, @p2 INT OUTPUT";
$procCode = "SET NOCOUNT ON; INSERT INTO [$tableName] ($colName) VALUES (@p1) SET @p2 = (SELECT COUNT(*) FROM [$tableName])";
createProc($conn, $procName, $procArgs, $procCode);
2017-05-04 01:00:31 +02:00
}
function execTransactionProc($conn, $procName, $data, $driverType, $commitMode)
2017-05-04 01:00:31 +02:00
{
// Always Encrypted feature requires SQL Types to be specified for sqlsrv_query
// https://github.com/Microsoft/msphpsql/wiki/Features#aelimitation
if (AE\isColEncrypted()) {
$inType = $driverType;
} else {
$inType = null;
}
2017-05-04 01:00:31 +02:00
$retValue = -1;
$callArgs = array(array($data, SQLSRV_PARAM_IN, null, $inType),
array(&$retValue, SQLSRV_PARAM_OUT, null, SQLSRV_SQLTYPE_INT));
2017-05-04 01:00:31 +02:00
sqlsrv_begin_transaction($conn);
$stmt = callProc($conn, $procName, "?, ?", $callArgs);
if ($commitMode === true) { // commit
2017-05-04 01:00:31 +02:00
sqlsrv_commit($conn);
} else { // rollback
2017-05-04 01:00:31 +02:00
sqlsrv_rollback($conn);
}
return ($retValue);
}
try {
transaction(1, 28);
} catch (Exception $e) {
echo $e->getMessage();
2017-05-04 01:00:31 +02:00
}
?>
--EXPECT--
Test "Transaction - Stored Proc" completed successfully.