Merge pull request #590 from yitam/sqlsrvBuffer

Refactor sqlsrv tests with buffer or cursor
This commit is contained in:
Jenny Tam 2017-11-15 11:02:59 -08:00 committed by GitHub
commit 04a1637f22
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
27 changed files with 1062 additions and 1204 deletions

View file

@ -1,7 +1,9 @@
--TEST--
scrollable results with no rows.
--DESCRIPTION--
this test is very similar to test_scrollable.phpt... might consider removing this test as a duplicate
--SKIPIF--
<?php require('skipif.inc'); ?>
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
sqlsrv_configure('WarningsReturnAsErrors', 0);
@ -9,23 +11,42 @@ scrollable results with no rows.
require_once('MsCommon.inc');
$conn = connect();
if ($conn === false) {
die(print_r(sqlsrv_errors(), true));
}
$conn = AE\connect();
$tableName = 'ScrollTest';
$stmt = sqlsrv_query($conn, "IF OBJECT_ID('ScrollTest', 'U') IS NOT NULL DROP TABLE ScrollTest");
if ($stmt !== false) {
sqlsrv_free_stmt($stmt);
}
$stmt = sqlsrv_query($conn, "CREATE TABLE ScrollTest (id int, value char(10))");
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
$columns = array(new AE\ColumnMeta('int', 'id'),
new AE\ColumnMeta('char(10)', 'value'));
$stmt = AE\createTable($conn, $tableName, $columns);
if (!$stmt) {
fatalError("Failed to create table for the test]n");
}
sqlsrv_free_stmt($stmt);
// Always Encrypted feature only supports SQLSRV_CURSOR_FORWARD or
// SQLSRV_CURSOR_CLIENT_BUFFERED
$query = "SELECT * FROM $tableName";
if (AE\isColEncrypted()) {
$options = array('Scrollable' => SQLSRV_CURSOR_FORWARD);
} else {
$options = array('Scrollable' => 'static');
}
$stmt = sqlsrv_query($conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'static' ));
$stmt = sqlsrv_query($conn, $query, array(), $options);
$rows = sqlsrv_has_rows($stmt);
if ($rows != false) {
fatalError("Should be no rows present");
};
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
$row = sqlsrv_fetch_array($stmt);
print_r($row);
if ($row === false) {
print_r(sqlsrv_errors(), true);
}
$stmt = sqlsrv_query($conn, $query);
$rows = sqlsrv_has_rows($stmt);
if ($rows != false) {
fatalError("Should be no rows present");
@ -40,23 +61,7 @@ scrollable results with no rows.
print_r(sqlsrv_errors(), true);
}
$stmt = sqlsrv_query($conn, "SELECT * FROM ScrollTest");
$rows = sqlsrv_has_rows($stmt);
if ($rows != false) {
fatalError("Should be no rows present");
};
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
$row = sqlsrv_fetch_array($stmt);
print_r($row);
if ($row === false) {
print_r(sqlsrv_errors(), true);
}
$stmt = sqlsrv_query($conn, "DROP TABLE ScrollTest");
dropTable($conn, $tableName);
echo "Test succeeded.\n";
?>

View file

@ -1,25 +0,0 @@
<?php
function getKSPpath()
{
$name = 'myKSP';
$dir_name = realpath(dirname(__FILE__));
$ksp = $dir_name . DIRECTORY_SEPARATOR . $name;
if ( strtoupper( substr( php_uname( 's' ), 0, 3 ) ) == 'WIN' ) {
$arch = 'x64';
if ( PHP_INT_SIZE == 4 ) // running 32 bit
$arch = '';
$ksp .= $arch . '.dll';
}
else
$ksp .= '.so';
return $ksp;
}
$ksp_name = 'MyCustomKSPName';
$encrypt_key = 'LPKCWVD07N3RG98J0MBLG4H2';
$ksp_test_table = 'CustomKSPTestTable';
?>

View file

@ -22,6 +22,9 @@ const INSERT_PREPARE = 2;
const INSERT_QUERY_PARAMS = 3;
const INSERT_PREPARE_PARAMS = 4;
const KSP_NAME = 'MyCustomKSPName';
const ENCRYPT_KEY = 'LPKCWVD07N3RG98J0MBLG4H2';
const KSP_TEST_TABLE = 'CustomKSPTestTable';
/**
* class for encapsulating column metadata needed for creating a table
@ -71,10 +74,10 @@ class ColumnMeta
// https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/always-encrypted-database-engine
$unsupported = array("xml", "timestamp", "image", "ntext", "text", "sql_variant", "hierarchyid", "geography", "geometry", "alias");
if (stripos($this->options, "identity") !== false) {
$this->encryptable = false;
} elseif (in_array($this->dataType, $unsupported)) {
} elseif (in_array(strtolower($this->dataType), $unsupported)) {
$this->encryptable = false;
} else {
$this->encryptable = true;
@ -210,6 +213,29 @@ function getCekName()
return $cekName;
}
/**
* @return the path to the KSP dll/so file
*/
function getKSPpath()
{
$name = 'myKSP';
$dir_name = realpath(dirname(__FILE__));
$ksp = $dir_name . DIRECTORY_SEPARATOR . $name;
if (strtoupper(substr(php_uname('s'), 0, 3)) == 'WIN') {
$arch = 'x64';
if (PHP_INT_SIZE == 4) {
// running 32 bit
$arch = '';
}
$ksp .= $arch . '.dll';
} else {
$ksp .= '.so';
}
return $ksp;
}
/**
* @return string default column name when a name is not provided in the ColumnMeta class
*/
@ -346,11 +372,10 @@ function connect($options = array(), $disableCE = false)
$connectionOptions = array_merge($connectionOptions, array("ColumnEncryption" => "Enabled"));
}
if ($keystore == "ksp") {
require('AE_Ksp.inc');
$ksp_path = getKSPPath();
$ksp_options = array("CEKeystoreProvider"=>$ksp_path,
"CEKeystoreName"=>$ksp_name,
"CEKeystoreEncryptKey"=>$encrypt_key);
"CEKeystoreName"=>KSP_NAME,
"CEKeystoreEncryptKey"=>ENCRYPT_KEY);
$connectionOptions = array_merge($connectionOptions, $ksp_options);
}
}
@ -419,19 +444,20 @@ function insertRow($conn, $tbname, $inputs, &$r = null, $api = INSERT_QUERY)
array_push($params, $inputs[$key]);
}
}
// use prepare for inserts when AE is enabled
if (isColEncrypted() || $api == INSERT_PREPARE_PARAMS) {
$stmt = sqlsrv_prepare($conn, $insertSql, $params);
if ($stmt) {
$r = sqlsrv_execute($stmt);
} else {
fatalError("insertRow: failed to prepare insert query!");
fatalError("insertRow: failed to prepare insert query!");
}
} else {
$stmt = sqlsrv_query($conn, $insertSql, $params);
}
}
return $stmt;
}
@ -454,10 +480,11 @@ function selectFromTable($conn, $tbname, $conds = null, $values = null)
* @param resource $conn : connection resource
* @param string $sql : T-SQL query
* @param string $conds : string of condition(s) possibly with placeholders, null by default
* @param array $values : array of parameters, null by default
* @param array $values : array of parameters for placeholders in $conds, null by default
* @param array $options : array of query options, null by default
* @return resource sqlsrv statement upon success or false otherwise
*/
function executeQuery($conn, $sql, $conds = null, $values = null)
function executeQuery($conn, $sql, $conds = null, $values = null, $options = null)
{
if (!isColEncrypted()) {
// if not encrypted replace placeholders ('?') with values, if array not empty
@ -475,17 +502,19 @@ function executeQuery($conn, $sql, $conds = null, $values = null)
$sql = $sql . " WHERE $clause ";
} elseif (!empty($conds)) {
$sql = $sql . " WHERE $conds ";
}
$stmt = sqlsrv_query($conn, $sql);
}
$stmt = sqlsrv_query($conn, $sql, null, $options);
} else {
// with AE enabled, use sqlsrv_prepare() in case there are
// with AE enabled, use sqlsrv_prepare() in case there are
// fields with unlimited size
if (empty($conds) || empty($values)) {
$stmt = sqlsrv_prepare($conn, $sql);
if (empty($conds)) {
$stmt = sqlsrv_prepare($conn, $sql, null, $options);
} else {
$sql = $sql . " WHERE $conds ";
$stmt = sqlsrv_prepare($conn, $sql, $values);
}
// pass $values to sqlsrv_prepare whether the array is null, empty or filled
$stmt = sqlsrv_prepare($conn, $sql, $values, $options);
}
if ($stmt) {
$r = sqlsrv_execute($stmt);
if (!$r) {
@ -649,13 +678,12 @@ function insertTestRow($conn, $tbname, $index)
echo("Invalid row index $index for test data!\n");
return false;
}
// get array of input values
$inputArray = getInsertArray($index);
if (empty($inputArray)) {
fatalError("getInsertSqlComplete: inputs for inserting a row cannot be empty");
}
$result = null;
if (isColEncrypted()) {
$stmt = insertRow($conn, $tbname, $inputArray, $result);
@ -667,14 +695,14 @@ function insertTestRow($conn, $tbname, $index)
$col = 1;
foreach ($inputArray as $key => $value) {
$colStr .= $key . ", ";
if (is_array($value)) {
$value = $value[0];
// this might be an input to a decimal, a numeric or a binary field
if (isBinary($col)) {
$value = "0x" . $value; // annotate the input string as a hex string
}
}
}
if (is_null($value)) {
$valStr .= "null, ";
} elseif (is_string($value) && !isBinary($col)) {

View file

@ -1,23 +1,17 @@
<?php
if(! extension_loaded( "sqlsrv" ) )
die( "skip extension not loaded" );
if (!extension_loaded("sqlsrv"))
die("skip extension not loaded");
require_once( 'MsSetup.inc' );
require_once('MsCommon.inc');
if ($keystore != 'ksp')
die ( 'skip - this test requires a custom keystore provider.' );
if ($keystore != AE\KEYSTORE_KSP)
die('skip - this test requires a custom keystore provider.');
require_once( 'MsCommon.inc' );
$conn = Connect();
if( ! $conn )
{
echo( "Error: could not connect during SKIPIF!" );
$conn = AE\connect();
if (! $conn) {
echo("Error: could not connect during SKIPIF!");
} elseif (AE\isColEncrypted() && !AE\isQualified($conn)) {
die("skip - AE feature not supported in the current environment.");
}
else if(! IsAEQualified( $conn ) )
{
die( "skip - AE feature not supported in the current environment." );
}
?>

View file

@ -1,46 +1,80 @@
--TEST--
Read, Update, Insert from a SQLSRV stream with buffered query
--SKIPIF--
<?php require('skipif.inc'); ?>
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
require_once('MsCommon.inc');
$conn = connect();
if (!$conn) {
fatalError("Could not connect");
function insertOneRow($conn, $tableName)
{
$result = null;
if (AE\isColEncrypted()) {
$data = array("Field2" => "This is field 2.",
"Field3" => array("010203", null, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR), SQLSRV_SQLTYPE_IMAGE),
"Field4" => "This is field 4.",
"Field5" => array("040506", null, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR), SQLSRV_SQLTYPE_VARBINARY('max')),
"Field6" => "This is field 6.",
"Field7" => "This is field 7.");
$query = AE\getInsertSqlPlaceholders($tableName, $data);
$stmt = sqlsrv_prepare($conn, $query, array_values($data), array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
} else {
$query = "INSERT INTO $tableName ([Field2], [Field3], [Field4], [Field5], [Field6], [Field7]) VALUES ('This is field 2.', 0x010203, 'This is field 4.', 0x040506, 'This is field 6.', 'This is field 7.' )";
$stmt = sqlsrv_prepare($conn, $query, array(), array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
}
if (!$stmt) {
fatalError("insertOneRow: query could not be prepared.\n");
}
$result = sqlsrv_execute($stmt);
if ($result === false) {
fatalError("insertOneRow: failed to insert data!\n");
}
return $stmt;
}
$query = "IF OBJECT_ID('PhpCustomerTable', 'U') IS NOT NULL DROP TABLE [PhpCustomerTable]";
$stmt = sqlsrv_prepare($conn, $query, array(), array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
function updateRow($conn, $tableName, $updateField, $params)
{
$condField = 'Field7';
$condition = 'This is field 7.';
if (AE\isColEncrypted()) {
$query = "UPDATE $tableName SET $updateField=? WHERE $condField = ?";
array_push($params, array($condition, SQLSRV_PARAM_IN, null, SQLSRV_SQLTYPE_NVARCHAR('max')));
} else {
$query = "UPDATE $tableName SET $updateField=? WHERE $condField = '$condition'";
}
$stmt = sqlsrv_prepare($conn, $query, $params, array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
if (!$stmt) {
fatalError("updateRow: query could not be prepared.\n");
}
$result = sqlsrv_execute($stmt);
if ($result === false) {
fatalError("updateRow: failed to update $updateField!\n");
}
sqlsrv_free_stmt($stmt);
}
$conn = AE\connect();
$tableName = 'PhpCustomerTable';
// Create the test table and insert one row
$columns = array(new AE\ColumnMeta('int', 'Id', 'NOT NULL Identity (100,2) PRIMARY KEY'),
new AE\ColumnMeta('text', 'Field2'),
new AE\ColumnMeta('image', 'Field3'),
new AE\ColumnMeta('ntext', 'Field4'),
new AE\ColumnMeta('varbinary(max)', 'Field5'),
new AE\ColumnMeta('varchar(max)', 'Field6'),
new AE\ColumnMeta('nvarchar(max)', 'Field7'));
$stmt = AE\createTable($conn, $tableName, $columns);
if (!$stmt) {
echo "Statement could not be prepared.\n";
die(print_r(sqlsrv_errors(), true));
fatalError("Failed to create table for the test\n");
}
sqlsrv_execute($stmt);
$query = "CREATE TABLE [PhpCustomerTable] ([Id] int NOT NULL Identity (100,2) PRIMARY KEY, [Field2] text, [Field3] image, [Field4] ntext, [Field5] varbinary(max), [Field6] varchar(max), [Field7] nvarchar(max))";
$stmt = sqlsrv_prepare($conn, $query, array(), array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
if (!$stmt) {
echo "Statement could not be prepared.\n";
die(print_r(sqlsrv_errors(), true));
}
sqlsrv_execute($stmt);
$query = "INSERT [PhpCustomerTable] ([Field2], [Field3], [Field4], [Field5], [Field6], [Field7]) VALUES ('This is field 2.', 0x010203, 'This is field 4.', 0x040506, 'This is field 6.', 'This is field 7.' )";
$stmt = sqlsrv_prepare($conn, $query, array(), array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
if (!$stmt) {
echo "Statement could not be prepared.\n";
die(print_r(sqlsrv_errors(), true));
}
sqlsrv_execute($stmt);
$stmt = insertOneRow($conn, $tableName);
$f2 = fopen('php://memory', 'a');
fwrite($f2, 'Update field 2.');
@ -61,88 +95,27 @@ $f7 = fopen('php://memory', 'a');
fwrite($f7, 'Update field 7.');
rewind($f7);
$query = "UPDATE [PhpCustomerTable] SET [Field2]=? WHERE [Field7]='This is field 7.'";
// Update data in the table
$params = array(array(&$f2, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_CHAR), SQLSRV_SQLTYPE_TEXT));
$stmt = sqlsrv_prepare($conn, $query, $params, array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
updateRow($conn, $tableName, 'Field2', $params);
if (!$stmt) {
echo "Statement could not be prepared.\n";
die(print_r(sqlsrv_errors(), true));
}
sqlsrv_execute($stmt);
sqlsrv_free_stmt($stmt);
$query = "UPDATE [PhpCustomerTable] SET [Field3]=? WHERE [Field7]='This is field 7.'";
$params = array(array(&$f3, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY), SQLSRV_SQLTYPE_IMAGE));
$stmt = sqlsrv_prepare($conn, $query, $params, array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
updateRow($conn, $tableName, 'Field3', $params);
if (!$stmt) {
echo "Statement could not be prepared.\n";
die(print_r(sqlsrv_errors(), true));
}
sqlsrv_execute($stmt);
sqlsrv_free_stmt($stmt);
$query = "UPDATE [PhpCustomerTable] SET [Field4]=? WHERE [Field7]='This is field 7.'";
$params = array(array(&$f4, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_CHAR), SQLSRV_SQLTYPE_NTEXT));
$stmt = sqlsrv_prepare($conn, $query, $params, array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
updateRow($conn, $tableName, 'Field4', $params);
if (!$stmt) {
echo "Statement could not be prepared.\n";
die(print_r(sqlsrv_errors(), true));
}
sqlsrv_execute($stmt);
sqlsrv_free_stmt($stmt);
$query = "UPDATE [PhpCustomerTable] SET [Field5]=? WHERE [Field7]='This is field 7.'";
$params = array(array(&$f5, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY), SQLSRV_SQLTYPE_VARBINARY('max')));
$stmt = sqlsrv_prepare($conn, $query, $params, array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
updateRow($conn, $tableName, 'Field5', $params);
if (!$stmt) {
echo "Statement could not be prepared.\n";
die(print_r(sqlsrv_errors(), true));
}
sqlsrv_execute($stmt);
sqlsrv_free_stmt($stmt);
$query = "UPDATE [PhpCustomerTable] SET [Field6]=? WHERE [Field7]='This is field 7.'";
$params = array(array(&$f6, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_CHAR), SQLSRV_SQLTYPE_VARCHAR('MAX')));
$stmt = sqlsrv_prepare($conn, $query, $params, array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
updateRow($conn, $tableName, 'Field6', $params);
if (!$stmt) {
echo "Statement could not be prepared.\n";
die(print_r(sqlsrv_errors(), true));
}
sqlsrv_execute($stmt);
sqlsrv_free_stmt($stmt);
$query = "UPDATE [PhpCustomerTable] SET [Field7]=? WHERE [Field7]='This is field 7.'";
$params = array(array(&$f7, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_CHAR), SQLSRV_SQLTYPE_NVARCHAR('MAX')));
$stmt = sqlsrv_prepare($conn, $query, $params, array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
updateRow($conn, $tableName, 'Field7', $params);
if (!$stmt) {
echo "Statement could not be prepared.\n";
die(print_r(sqlsrv_errors(), true));
}
sqlsrv_execute($stmt);
sqlsrv_free_stmt($stmt);
$stmt = sqlsrv_query($conn, "SELECT * FROM [PhpCustomerTable]", array(), array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
if (!$stmt) {
echo "Statement could not be prepared.\n";
die(print_r(sqlsrv_errors(), true));
}
// Fetch data from the table
$stmt = AE\executeQueryEx($conn, "SELECT * FROM [PhpCustomerTable]", array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
sqlsrv_fetch($stmt);
$field = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR));
@ -195,7 +168,7 @@ if (!$field) {
print("$field\n");
}
sqlsrv_query($conn, "DROP TABLE [PhpCustomerTable]");
dropTable($conn, $tableName);
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);

View file

@ -1,40 +1,33 @@
--TEST--
Fetch array of extended ASCII data using a scrollable buffered cursor
--SKIPIF--
<?php require('skipif.inc'); ?>
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
require_once("MsCommon.inc");
require_once('MsCommon.inc');
// Connect
$conn = connect(array( 'CharacterSet'=>'UTF-8' ));
if (!$conn) {
die(print_r(sqlsrv_errors(), true));
}
$conn = AE\connect(array('CharacterSet'=>'UTF-8'));
// Create table
$tableName = '#exAsciiTest';
$query = "CREATE TABLE $tableName (ID CHAR(10))";
$stmt = sqlsrv_query($conn, $query);
$tableName = 'exAsciiTest';
$columns = array(new AE\ColumnMeta('CHAR(10)', 'ID'));
AE\createTable($conn, $tableName, $columns);
// Insert data
$query = "INSERT INTO $tableName VALUES ('Aå_Ð×Æ×Ø_B')";
$stmt = sqlsrv_query($conn, $query);
if (! $stmt) {
die(print_r(sqlsrv_errors(), true));
}
$res = null;
$stmt = AE\insertRow($conn, $tableName, array('ID' => 'Aå_Ð×Æ×Ø_B'));
// Fetch data
$query = "SELECT * FROM $tableName";
$stmt = sqlsrv_query($conn, $query, [], array("Scrollable"=>"buffered"));
if (! $stmt) {
die(print_r(sqlsrv_errors(), true));
}
// Fetch
$row = sqlsrv_fetch_array($stmt);
var_dump($row);
dropTable($conn, $tableName);
// Close connection
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);

View file

@ -4,46 +4,31 @@ Fetch data from a prepopulated test table given a custom keystore provider
<?php require('skipif_not_ksp.inc'); ?>
--FILE--
<?php
sqlsrv_configure( 'WarningsReturnAsErrors', 1 );
sqlsrv_configure( 'LogSeverity', SQLSRV_LOG_SEVERITY_ALL );
sqlsrv_configure('WarningsReturnAsErrors', 1);
sqlsrv_configure('LogSeverity', SQLSRV_LOG_SEVERITY_ALL);
require( 'MsSetup.inc' );
require( 'AE_Ksp.inc' );
$ksp_path = getKSPpath();
$connectionInfo = array( "Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"ColumnEncryption"=>"enabled",
"CEKeystoreProvider"=>$ksp_path,
"CEKeystoreName"=>$ksp_name,
"CEKeystoreEncryptKey"=>$encrypt_key,
'ReturnDatesAsStrings'=>true);
$conn = sqlsrv_connect( $server, $connectionInfo );
if( $conn === false )
{
require_once('MsHelper.inc');
$conn = AE\connect(array('ReturnDatesAsStrings'=>true));
if ($conn === false) {
echo "Failed to connect.\n";
print_r( sqlsrv_errors() );
}
else
{
print_r(sqlsrv_errors());
} else {
echo "Connected successfully with ColumnEncryption enabled.\n";
}
$ksp_test_table = AE\KSP_TEST_TABLE;
$tsql = "SELECT * FROM $ksp_test_table";
$stmt = sqlsrv_prepare($conn, $tsql);
if (! sqlsrv_execute($stmt) )
{
if (!sqlsrv_execute($stmt)) {
echo "Failed to fetch data.\n";
print_r( sqlsrv_errors() );
print_r(sqlsrv_errors());
}
// fetch data
while ($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC ))
{
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_NUMERIC)) {
echo "c1=" . $row[0] . "\tc2=" . $row[1] . "\tc3=" . $row[2] . "\tc4=" . $row[3] . "\n" ;
}
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
@ -61,4 +46,4 @@ c1=67 c2=Sample data 6 for column 2 c3=ghi c4=2017-08-16
c1=78 c2=Sample data 7 for column 2 c3=hij c4=2017-08-17
c1=89 c2=Sample data 8 for column 2 c3=ijk c4=2017-08-18
c1=100 c2=Sample data 9 for column 2 c3=jkl c4=2017-08-19
Done
Done

View file

@ -4,50 +4,34 @@ Fetch encrypted data from a prepopulated test table given a custom keystore prov
<?php require('skipif_not_ksp.inc'); ?>
--FILE--
<?php
sqlsrv_configure( 'WarningsReturnAsErrors', 1 );
sqlsrv_configure( 'LogSeverity', SQLSRV_LOG_SEVERITY_ALL );
sqlsrv_configure('WarningsReturnAsErrors', 1);
sqlsrv_configure('LogSeverity', SQLSRV_LOG_SEVERITY_ALL);
require( 'MsSetup.inc' );
require( 'AE_Ksp.inc' );
$ksp_path = getKSPpath();
$connectionInfo = array( "Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"CEKeystoreProvider"=>$ksp_path,
"CEKeystoreName"=>$ksp_name,
"CEKeystoreEncryptKey"=>$encrypt_key,
'ReturnDatesAsStrings'=>true);
$conn = sqlsrv_connect( $server, $connectionInfo );
if( $conn === false )
{
echo "Failed to connect.\n";
print_r( sqlsrv_errors() );
}
else
{
require_once('MsHelper.inc');
$conn = AE\connect(array('ReturnDatesAsStrings'=>true));
if ($conn === false) {
fatalError("Failed to connect.\n");
} else {
echo "Connected successfully with ColumnEncryption disabled.\n";
}
$ksp_test_table = AE\KSP_TEST_TABLE;
$tsql = "SELECT * FROM $ksp_test_table";
$stmt = sqlsrv_prepare($conn, $tsql);
if (! sqlsrv_execute($stmt) )
{
echo "Failed to fetch data.\n";
print_r( sqlsrv_errors() );
if (!sqlsrv_execute($stmt)) {
fatalError("Failed to fetch data.\n");
}
// fetch data
while ($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC ))
{
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_NUMERIC)) {
// all columns should return binary data except the first column
echo "c1=" . $row[0];
echo "\tc2=" . bin2hex($row[1]);
echo "\tc3=" . bin2hex($row[2]);
echo "\tc3=" . bin2hex($row[2]);
echo "\tc4=" . bin2hex($row[3]);
echo "\n" ;
}
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);

View file

@ -5,91 +5,88 @@ Connect using a custom keystore provider with some required inputs missing
--FILE--
<?php
function connect( $server, $connectionInfo )
function connect($server, $connectionInfo)
{
$conn = sqlsrv_connect( $server, $connectionInfo );
if( $conn === false )
{
$conn = sqlsrv_connect($server, $connectionInfo);
if ($conn === false) {
echo "Failed to connect.\n";
$errors = sqlsrv_errors();
foreach ( $errors[0] as $key => $error )
{
if( is_string( $key ) )
foreach ($errors[0] as $key => $error) {
if(is_string($key)) {
echo "[$key] => $error\n";
}
}
echo "\n";
}
else
{
} else {
echo "Connected successfully with ColumnEncryption enabled.\n";
}
return $conn;
}
sqlsrv_configure( 'LogSeverity', SQLSRV_LOG_SEVERITY_ALL );
require( 'MsSetup.inc' );
require( 'AE_Ksp.inc' );
$ksp_path = getKSPpath();
sqlsrv_configure('LogSeverity', SQLSRV_LOG_SEVERITY_ALL);
echo("Connecting... with column encryption\n");
$connectionInfo = array( "Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"ColumnEncryption"=>"enabled");
require_once('MsHelper.inc');
$ksp_path = AE\getKSPpath();
$ksp_name = AE\KSP_NAME;
$encrypt_key = AE\ENCRYPT_KEY;
connect( $server, $connectionInfo );
echo("Connecting... with an invalid input to CEKeystoreProvider\n");
$connectionInfo = array( "Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"ColumnEncryption"=>"enabled",
"CEKeystoreProvider"=>1);
echo "Connecting... with column encryption\n";
$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"ColumnEncryption"=>"enabled");
connect( $server, $connectionInfo );
connect($server, $connectionInfo);
echo("Connecting... with an empty path\n");
$connectionInfo = array( "Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"ColumnEncryption"=>"enabled",
"CEKeystoreProvider"=>"",
"CEKeystoreName"=>$ksp_name,
"CEKeystoreEncryptKey"=>$encrypt_key);
echo "Connecting... with an invalid input to CEKeystoreProvider\n";
$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"ColumnEncryption"=>"enabled",
"CEKeystoreProvider"=>1);
connect( $server, $connectionInfo );
echo("Connecting... without a name\n");
$connectionInfo = array( "Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"ColumnEncryption"=>"enabled",
"CEKeystoreProvider"=>$ksp_path,
"CEKeystoreEncryptKey"=>$encrypt_key);
connect($server, $connectionInfo);
connect( $server, $connectionInfo );
echo "Connecting... with an empty path\n";
$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"ColumnEncryption"=>"enabled",
"CEKeystoreProvider"=>"",
"CEKeystoreName"=>$ksp_name,
"CEKeystoreEncryptKey"=>$encrypt_key);
echo("Connecting... with an empty name\n");
$connectionInfo = array( "Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"ColumnEncryption"=>"enabled",
"CEKeystoreProvider"=>$ksp_path,
"CEKeystoreName"=>"",
"CEKeystoreEncryptKey"=>$encrypt_key);
connect($server, $connectionInfo);
connect( $server, $connectionInfo );
echo "Connecting... without a name\n";
$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"ColumnEncryption"=>"enabled",
"CEKeystoreProvider"=>$ksp_path,
"CEKeystoreEncryptKey"=>$encrypt_key);
echo("Connecting... without a key\n");
$connectionInfo = array( "Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"ColumnEncryption"=>"enabled",
"CEKeystoreProvider"=>$ksp_path,
"CEKeystoreName"=>$ksp_name);
connect( $server, $connectionInfo );
connect($server, $connectionInfo);
echo "Connecting... with an empty name\n";
$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"ColumnEncryption"=>"enabled",
"CEKeystoreProvider"=>$ksp_path,
"CEKeystoreName"=>"",
"CEKeystoreEncryptKey"=>$encrypt_key);
connect($server, $connectionInfo);
echo "Connecting... without a key\n";
$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"ColumnEncryption"=>"enabled",
"CEKeystoreProvider"=>$ksp_path,
"CEKeystoreName"=>$ksp_name);
connect($server, $connectionInfo);
echo "Connecting... with all required inputs\n";
$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"ColumnEncryption"=>"enabled",
"CEKeystoreProvider"=>$ksp_path,
"CEKeystoreName"=>$ksp_name,
"CEKeystoreEncryptKey"=>$encrypt_key);
connect($server, $connectionInfo);
echo("Connecting... with all required inputs\n");
$connectionInfo = array( "Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"ColumnEncryption"=>"enabled",
"CEKeystoreProvider"=>$ksp_path,
"CEKeystoreName"=>$ksp_name,
"CEKeystoreEncryptKey"=>$encrypt_key);
connect( $server, $connectionInfo );
echo "Done\n";
?>
--EXPECT--

View file

@ -4,205 +4,168 @@ Test simple insert, fetch and update with ColumnEncryption enabled and a custome
<?php require('skipif_not_ksp.inc'); ?>
--FILE--
<?php
function CreatePatientsTable()
function createPatientsTable()
{
global $conn;
$tablename = 'Patients';
$stmt = sqlsrv_query( $conn, "IF OBJECT_ID('$tablename', 'U') IS NOT NULL DROP TABLE $tablename" );
sqlsrv_free_stmt( $stmt );
$tableName = 'Patients';
$tsql = "CREATE TABLE $tablename (
[PatientId] [int] IDENTITY(1,1) NOT NULL,
[SSN] [char](11) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = CustomCEK, ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
[FirstName] [nvarchar](50) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = CustomCEK, ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL,
[LastName] [nvarchar](50) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = CustomCEK, ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL,
[BirthDate] [date] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = CustomCEK, ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL)";
$stmt = sqlsrv_query( $conn, $tsql );
if (! $stmt )
{
echo "Failed to create test table!\n";
die( print_r( sqlsrv_errors(), true ));
$columns = array(new AE\ColumnMeta('int', 'PatientId', 'IDENTITY(1,1) NOT NULL'),
new AE\ColumnMeta('char(11)', 'SSN'),
new AE\ColumnMeta('nvarchar(50)', 'FirstName'),
new AE\ColumnMeta('nvarchar(50)', 'LastName'),
new AE\ColumnMeta('date', 'BirthDate'));
$stmt = AE\createTable($conn, $tableName, $columns);
if (!$stmt) {
fatalError("Failed to create test table!\n");
}
return $tablename;
return $tableName;
}
function InsertData($ssn, $fname, $lname, $date)
function insertData($ssn, $fname, $lname, $date)
{
global $conn, $tablename;
global $conn, $tableName;
$params = array(
array($ssn, null, null, SQLSRV_SQLTYPE_CHAR(11)), array($fname, null, null, SQLSRV_SQLTYPE_NVARCHAR(50)), array($lname, null, null, SQLSRV_SQLTYPE_NVARCHAR(50)), array($date, null, null, SQLSRV_SQLTYPE_DATE)
);
$tsql = "INSERT INTO $tablename (SSN, FirstName, LastName, BirthDate) VALUES (?, ?, ?, ?)";
if (! $stmt = sqlsrv_prepare($conn, $tsql, $params))
{
echo "Failed to prepare statement.\n";
print_r( sqlsrv_errors() );
array($ssn, null, null, SQLSRV_SQLTYPE_CHAR(11)), array($fname, null, null, SQLSRV_SQLTYPE_NVARCHAR(50)), array($lname, null, null, SQLSRV_SQLTYPE_NVARCHAR(50)), array($date, null, null, SQLSRV_SQLTYPE_DATE)
);
$tsql = "INSERT INTO $tableName (SSN, FirstName, LastName, BirthDate) VALUES (?, ?, ?, ?)";
if (! $stmt = sqlsrv_prepare($conn, $tsql, $params)) {
fatalError("Failed to prepare statement.\n");
}
if (! sqlsrv_execute($stmt))
{
echo "Failed to insert a new record.\n";
print_r( sqlsrv_errors() );
if (! sqlsrv_execute($stmt)) {
fatalError("Failed to insert a new record.\n");
}
}
function SelectData()
{
global $conn, $tablename;
$stmt = sqlsrv_query($conn, "SELECT * FROM $tablename");
while ($obj = sqlsrv_fetch_object( $stmt ))
{
function selectData()
{
global $conn, $tableName;
$stmt = sqlsrv_query($conn, "SELECT * FROM $tableName");
while ($obj = sqlsrv_fetch_object($stmt)) {
echo $obj->PatientId . "\n";
echo $obj->SSN . "\n";
echo $obj->FirstName . "\n";
echo $obj->LastName . "\n";
echo $obj->BirthDate . "\n\n";
}
echo $obj->BirthDate . "\n\n";
}
}
function SelectDataBuffered()
function selectDataBuffered()
{
global $conn, $tablename;
$stmt = sqlsrv_query($conn, "SELECT * FROM $tablename", array(), array("Scrollable"=>"buffered"));
global $conn, $tableName;
$stmt = sqlsrv_query($conn, "SELECT * FROM $tableName", array(), array("Scrollable"=>"buffered"));
$row_count = sqlsrv_num_rows($stmt);
echo "\nRow count for result set is $row_count\n";
echo "First record=>\t";
$row = sqlsrv_fetch($stmt, SQLSRV_SCROLL_FIRST);
$SSN = sqlsrv_get_field( $stmt, 1);
echo "SSN = $SSN \n";
$row = sqlsrv_fetch($stmt, SQLSRV_SCROLL_FIRST);
$SSN = sqlsrv_get_field($stmt, 1);
echo "SSN = $SSN\n";
echo "Next record=>\t";
$row = sqlsrv_fetch($stmt, SQLSRV_SCROLL_NEXT);
$BirthDate = sqlsrv_get_field( $stmt, 4);
echo "BirthDate = $BirthDate \n";
$row = sqlsrv_fetch($stmt, SQLSRV_SCROLL_NEXT);
$BirthDate = sqlsrv_get_field($stmt, 4);
echo "BirthDate = $BirthDate\n";
echo "Last record=>\t";
$row = sqlsrv_fetch($stmt, SQLSRV_SCROLL_LAST);
$LastName = sqlsrv_get_field( $stmt, 3);
echo "LastName = $LastName \n";
$row = sqlsrv_fetch($stmt, SQLSRV_SCROLL_LAST);
$LastName = sqlsrv_get_field($stmt, 3);
echo "LastName = $LastName\n";
}
sqlsrv_configure( 'WarningsReturnAsErrors', 1 );
sqlsrv_configure( 'LogSeverity', SQLSRV_LOG_SEVERITY_ALL );
require_once( 'MsSetup.inc' );
require_once( 'AE_Ksp.inc' );
sqlsrv_configure('WarningsReturnAsErrors', 1);
sqlsrv_configure('LogSeverity', SQLSRV_LOG_SEVERITY_ALL);
$ksp_path = getKSPpath();
$connectionInfo = array( "Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"ReturnDatesAsStrings"=>true, "ColumnEncryption"=>'Enabled',
"CEKeystoreProvider"=>$ksp_path,
"CEKeystoreName"=>$ksp_name,
"CEKeystoreEncryptKey"=>$encrypt_key);
$conn = sqlsrv_connect( $server, $connectionInfo );
if( $conn === false )
{
echo "Failed to connect.\n";
print_r( sqlsrv_errors() );
}
else
{
require_once('MsHelper.inc');
$conn = AE\connect(array('ReturnDatesAsStrings'=>true));
if ($conn === false) {
fatalError( "Failed to connect.\n");
} else {
echo "Connected successfully with ColumnEncryption enabled.\n";
}
$tablename = CreatePatientsTable();
InsertData('748-68-0245', 'Jeannette', 'McDonald', '2002-11-28');
InsertData('795-73-9838', 'John', 'Doe', '2001-05-29');
InsertData('456-12-5486', 'Jonathan', 'Wong', '1999-12-20');
InsertData('156-45-5486', 'Marianne', 'Smith', '1997-03-04');
SelectData();
$tableName = createPatientsTable();
insertData('748-68-0245', 'Jeannette', 'McDonald', '2002-11-28');
insertData('795-73-9838', 'John', 'Doe', '2001-05-29');
insertData('456-12-5486', 'Jonathan', 'Wong', '1999-12-20');
insertData('156-45-5486', 'Marianne', 'Smith', '1997-03-04');
selectData();
///////////////////////////////////////////
echo "Update Patient Jonathan Wong...\n";
$params = array(array('1999-12-31', null, null, SQLSRV_SQLTYPE_DATE), array('Chang', null, null, SQLSRV_SQLTYPE_NVARCHAR(50)), array('456-12-5486', null, null, SQLSRV_SQLTYPE_CHAR(11)));
$tsql = "UPDATE Patients SET BirthDate = ?, LastName = ? WHERE SSN = ?";
$params = array(array('1999-12-31', null, null, SQLSRV_SQLTYPE_DATE),
array('Chang', null, null, SQLSRV_SQLTYPE_NVARCHAR(50)),
array('456-12-5486', null, null, SQLSRV_SQLTYPE_CHAR(11)));
$tsql = "UPDATE $tableName SET BirthDate = ?, LastName = ? WHERE SSN = ?";
$stmt = sqlsrv_query($conn, $tsql, $params);
if (! $stmt)
{
echo "Failed to update record\n";
print_r( sqlsrv_errors() );
if (!$stmt) {
fatalError("Failed to update record\n");
}
echo "Update his birthdate too...\n";
$params = array(array('456-12-5486', null, null, SQLSRV_SQLTYPE_CHAR(11)));
$tsql = "SELECT SSN, FirstName, LastName, BirthDate FROM Patients WHERE SSN = ?";
$params = array(array('456-12-5486', null, null, SQLSRV_SQLTYPE_CHAR(11)));
$tsql = "SELECT SSN, FirstName, LastName, BirthDate FROM $tableName WHERE SSN = ?";
$stmt = sqlsrv_query($conn, $tsql, $params);
if (! $stmt)
{
echo "Failed to select with a WHERE clause\n";
print_r( sqlsrv_errors() );
}
else
{
$obj = sqlsrv_fetch_object( $stmt );
echo "BirthDate updated for $obj->FirstName:\n";
if (!$stmt) {
fatalError("Failed to select with a WHERE clause\n");
} else {
$obj = sqlsrv_fetch_object($stmt);
echo "BirthDate updated for $obj->FirstName:\n";
echo $obj->SSN . "\n";
echo $obj->FirstName . "\n";
echo $obj->LastName . "\n";
echo $obj->BirthDate . "\n\n";
echo $obj->BirthDate . "\n\n";
}
///////////////////////////////////////////
$procName = '#phpAEProc1';
$spArgs = "@p1 INT, @p2 DATE OUTPUT";
$spCode = "SET @p2 = ( SELECT [BirthDate] FROM Patients WHERE [PatientId] = @p1 )";
$spCode = "SET @p2 = (SELECT [BirthDate] FROM $tableName WHERE [PatientId] = @p1)";
$stmt = sqlsrv_query($conn, "CREATE PROC [$procName] ($spArgs) AS BEGIN $spCode END");
sqlsrv_free_stmt($stmt);
$callResult = '1900-01-01';
$callResult = '1900-01-01';
//when binding parameter using sqlsrv_query in a column encryption enabled connection, need to provide the sql_type in all parameters
$params = array( array( 1, SQLSRV_PARAM_IN, null, SQLSRV_SQLTYPE_INT ), array( &$callResult, SQLSRV_PARAM_OUT, null, SQLSRV_SQLTYPE_DATE));
$params = array(array(1, SQLSRV_PARAM_IN, null, SQLSRV_SQLTYPE_INT),
array(&$callResult, SQLSRV_PARAM_OUT, null, SQLSRV_SQLTYPE_DATE));
$callArgs = "?, ?";
$stmt = sqlsrv_query($conn, "{ CALL [$procName] ($callArgs)}", $params);
if (! $stmt )
{
print_r( sqlsrv_errors() );
}
else
{
if (!$stmt) {
print_r(sqlsrv_errors());
} else {
echo "BirthDate for the first record is: $callResult\n";
}
///////////////////////////////////////////
///////////////////////////////////////////
$procName = '#phpAEProc2';
$spArgs = "@p1 INT, @p2 CHAR(11) OUTPUT";
$spCode = "SET @p2 = ( SELECT [SSN] FROM Patients WHERE [PatientId] = @p1 )";
$spCode = "SET @p2 = (SELECT [SSN] FROM $tableName WHERE [PatientId] = @p1)";
$stmt = sqlsrv_query($conn, "CREATE PROC [$procName] ($spArgs) AS BEGIN $spCode END");
sqlsrv_free_stmt($stmt);
$callResult = '000-00-0000';
//when binding parameter using sqlsrv_query in a column encryption enabled connection, need to provide the sql_type in all parameters
$params = array( array( 1, SQLSRV_PARAM_IN, null, SQLSRV_SQLTYPE_INT ), array( &$callResult, SQLSRV_PARAM_OUT, null, SQLSRV_SQLTYPE_CHAR(11)));
// when binding parameter using sqlsrv_query in a column encryption enabled connection,
// need to provide the sql_type in all parameters
$params = array(array(1, SQLSRV_PARAM_IN, null, SQLSRV_SQLTYPE_INT),
array(&$callResult, SQLSRV_PARAM_OUT, null, SQLSRV_SQLTYPE_CHAR(11)));
$callArgs = "?, ?";
$stmt = sqlsrv_query($conn, "{ CALL [$procName] ($callArgs)}", $params);
if (! $stmt )
{
print_r( sqlsrv_errors() );
}
else
{
if (!$stmt) {
print_r(sqlsrv_errors());
} else {
echo "SSN for the first record is: $callResult\n";
}
SelectDataBuffered();
selectDataBuffered();
echo "\nDone\n";
?>
--EXPECT--
@ -243,8 +206,8 @@ BirthDate for the first record is: 2002-11-28
SSN for the first record is: 748-68-0245
Row count for result set is 4
First record=> SSN = 748-68-0245
Next record=> BirthDate = 2001-05-29
Last record=> LastName = Smith
First record=> SSN = 748-68-0245
Next record=> BirthDate = 2001-05-29
Last record=> LastName = Smith
Done

View file

@ -1,118 +1,96 @@
--TEST--
Test using sqlserv_query for binding parameters with ColumnEncryption enabled and a custome keystore provider
Test using sqlsrv_query for binding parameters with column encryption and a custom keystore provider
--SKIPIF--
<?php require('skipif_not_ksp.inc'); ?>
--FILE--
<?php
function CreatePatientsTable()
function createPatientsTable()
{
global $conn;
$tablename = 'Patients';
$stmt = sqlsrv_query( $conn, "IF OBJECT_ID('$tablename', 'U') IS NOT NULL DROP TABLE $tablename" );
sqlsrv_free_stmt( $stmt );
$tableName = 'Patients';
$tsql = "CREATE TABLE $tablename (
[PatientId] [int] IDENTITY(1,1) NOT NULL,
[SSN] [char](11) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = CustomCEK, ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
[FirstName] [nvarchar](50) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = CustomCEK, ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL,
[LastName] [nvarchar](50) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = CustomCEK, ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL,
[BirthDate] [date] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = CustomCEK, ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL)";
$stmt = sqlsrv_query( $conn, $tsql );
if (! $stmt )
{
echo "Failed to create test table!\n";
die( print_r( sqlsrv_errors(), true ));
$columns = array(new AE\ColumnMeta('int', 'PatientId', 'IDENTITY(1,1) NOT NULL'),
new AE\ColumnMeta('char(11)', 'SSN'),
new AE\ColumnMeta('nvarchar(50)', 'FirstName'),
new AE\ColumnMeta('nvarchar(50)', 'LastName'),
new AE\ColumnMeta('date', 'BirthDate'));
$stmt = AE\createTable($conn, $tableName, $columns);
if (!$stmt) {
fatalError("Failed to create test table!\n");
}
return $tablename;
return $tableName;
}
function SelectData()
{
global $conn, $tablename;
$stmt = sqlsrv_query($conn, "SELECT * FROM $tablename");
while ($obj = sqlsrv_fetch_object( $stmt ))
{
function selectData()
{
global $conn, $tableName;
$stmt = sqlsrv_query($conn, "SELECT * FROM $tableName");
while ($obj = sqlsrv_fetch_object($stmt)) {
echo $obj->PatientId . "\n";
echo $obj->SSN . "\n";
echo $obj->FirstName . "\n";
echo $obj->LastName . "\n";
echo $obj->BirthDate . "\n\n";
}
}
function PrintError()
{
$errors = sqlsrv_errors();
foreach ( $errors as $error )
{
echo " SQLSTATE: " . $error['SQLSTATE'] . "\n";
echo " code: " . $error['code'] . "\n";
echo " message: " . $error['message'] . "\n\n";
echo $obj->BirthDate . "\n\n";
}
}
sqlsrv_configure( 'WarningsReturnAsErrors', 1 );
sqlsrv_configure( 'LogSeverity', SQLSRV_LOG_SEVERITY_ALL );
require_once( 'MsSetup.inc' );
require_once( 'AE_Ksp.inc' );
$ksp_path = getKSPpath();
$connectionInfo = array( "Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd,
"ReturnDatesAsStrings"=>true, "ColumnEncryption"=>'Enabled',
"CEKeystoreProvider"=>$ksp_path,
"CEKeystoreName"=>$ksp_name,
"CEKeystoreEncryptKey"=>$encrypt_key);
$conn = sqlsrv_connect( $server, $connectionInfo );
if( $conn === false )
function printError()
{
echo "Failed to connect.\n";
PrintError();
$errors = sqlsrv_errors();
foreach ($errors as $error) {
echo " SQLSTATE: " . $error['SQLSTATE'] . "\n";
echo " code: " . $error['code'] . "\n";
echo " message: " . $error['message'] . "\n\n";
}
}
else
{
sqlsrv_configure('WarningsReturnAsErrors', 1);
sqlsrv_configure('LogSeverity', SQLSRV_LOG_SEVERITY_ALL);
require_once('MsHelper.inc');
$conn = AE\connect(array('ReturnDatesAsStrings'=>true));
if ($conn === false) {
echo "Failed to connect.\n";
printError();
} else {
echo "Connected successfully with ColumnEncryption enabled.\n\n";
}
$tablename = CreatePatientsTable();
$tsql = "INSERT INTO $tablename (SSN, FirstName, LastName, BirthDate) VALUES (?, ?, ?, ?)";
$inputs = array( '748-68-0245', 'Jeannette', 'McDonald', '2002-11-28' );
//expects an error in Column Encryption enabled connection
print_r( "Using sqlsrv_query and binding parameters with literal values:\n" );
$stmt = sqlsrv_query( $conn, $tsql, $inputs );
if ( !$stmt)
PrintError();
//expects an error in Column Encryption enabled connection
print_r( "Using sqlsrv_query and binding parameters with parameter arrays and no sqltypes provided:\n" );
$stmt = sqlsrv_query( $conn, $tsql, array( array( $inputs[0], SQLSRV_PARAM_IN ),
array( $inputs[1], SQLSRV_PARAM_IN ),
array( $inputs[2], SQLSRV_PARAM_IN ),
array( $inputs[3], SQLSRV_PARAM_IN )));
if ( !$stmt)
PrintError();
//no error is expected
print_r( "Using sqlsrv_query and binding parameters with parameter arrays and sqltypes provided:\n" );
$stmt = sqlsrv_query( $conn, $tsql, array( array( $inputs[0], null, null, SQLSRV_SQLTYPE_CHAR(11) ),
array( $inputs[1], null, null, SQLSRV_SQLTYPE_NVARCHAR(50) ),
array( $inputs[2], null, null, SQLSRV_SQLTYPE_NVARCHAR(50) ),
array( $inputs[3], null, null, SQLSRV_SQLTYPE_DATE ) ));
if ( !$stmt)
PrintError();
SelectData();
$tableName = createPatientsTable();
$tsql = "INSERT INTO $tableName (SSN, FirstName, LastName, BirthDate) VALUES (?, ?, ?, ?)";
$inputs = array('748-68-0245', 'Jeannette', 'McDonald', '2002-11-28');
// expects an error in Column Encryption enabled connection
print_r("Using sqlsrv_query and binding parameters with literal values:\n");
$stmt = sqlsrv_query($conn, $tsql, $inputs);
if (!$stmt) {
printError();
}
// expects an error in Column Encryption enabled connection
print_r("Using sqlsrv_query and binding parameters with parameter arrays and no sqltypes provided:\n");
$stmt = sqlsrv_query($conn, $tsql, array(array($inputs[0], SQLSRV_PARAM_IN),
array($inputs[1], SQLSRV_PARAM_IN),
array($inputs[2], SQLSRV_PARAM_IN),
array($inputs[3], SQLSRV_PARAM_IN)));
if (!$stmt) {
printError();
}
// no error is expected
print_r("Using sqlsrv_query and binding parameters with parameter arrays and sqltypes provided:\n");
$stmt = sqlsrv_query($conn, $tsql, array(array($inputs[0], null, null, SQLSRV_SQLTYPE_CHAR(11)),
array($inputs[1], null, null, SQLSRV_SQLTYPE_NVARCHAR(50)),
array($inputs[2], null, null, SQLSRV_SQLTYPE_NVARCHAR(50)),
array($inputs[3], null, null, SQLSRV_SQLTYPE_DATE)));
if (!$stmt) {
printError();
}
selectData();
echo "Done\n";
?>
--EXPECT--

View file

@ -1,24 +1,27 @@
--TEST--
Test with static cursor and select different rows in some random order
--SKIPIF--
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
require_once('MsCommon.inc');
function FetchRow_Query($conn)
function fetchRowQuery($conn)
{
$tableName = GetTempTableName();
$tableName = 'testScrollCursor';
$stmt = sqlsrv_query($conn, "CREATE TABLE $tableName ([c1_int] int, [c2_varchar] varchar(10))");
sqlsrv_free_stmt($stmt);
$columns = array(new AE\ColumnMeta('int', 'c1_int'),
new AE\ColumnMeta('varchar(10)', 'c2_varchar'));
AE\createTable($conn, $tableName, $columns);
// insert data
$numRows = 10;
InsertData($conn, $tableName, $numRows);
insertData($conn, $tableName, $numRows);
// select table
$stmt = sqlsrv_query($conn, "SELECT * FROM $tableName", array(), array('Scrollable' => 'static'));
HasRows($stmt);
hasRows($stmt);
$numRowsFetched = 0;
while ($obj = sqlsrv_fetch_object($stmt)) {
echo $obj->c1_int . ", " . $obj->c2_varchar . "\n";
@ -29,25 +32,27 @@ function FetchRow_Query($conn)
echo "Number of rows fetched $numRowsFetched is wrong! Expected $numRows\n";
}
GetFirstRow($stmt);
GetNextRow($stmt);
GetLastRow($stmt);
GetPriorRow($stmt);
GetAbsoluteRow($stmt, 7);
GetAbsoluteRow($stmt, 2);
GetRelativeRow($stmt, 3);
GetPriorRow($stmt);
GetRelativeRow($stmt, -4);
GetAbsoluteRow($stmt, 0);
GetNextRow($stmt);
GetRelativeRow($stmt, 5);
GetAbsoluteRow($stmt, -1);
GetNextRow($stmt);
GetLastRow($stmt);
GetRelativeRow($stmt, 1);
getFirstRow($stmt);
getNextRow($stmt);
getLastRow($stmt);
getPriorRow($stmt);
getAbsoluteRow($stmt, 7);
getAbsoluteRow($stmt, 2);
getRelativeRow($stmt, 3);
getPriorRow($stmt);
getRelativeRow($stmt, -4);
getAbsoluteRow($stmt, 0);
getNextRow($stmt);
getRelativeRow($stmt, 5);
getAbsoluteRow($stmt, -1);
getNextRow($stmt);
getLastRow($stmt);
getRelativeRow($stmt, 1);
dropTable($conn, $tableName);
}
function InsertData($conn, $tableName, $numRows)
function insertData($conn, $tableName, $numRows)
{
$stmt = sqlsrv_prepare($conn, "INSERT INTO $tableName (c1_int, c2_varchar) VALUES (?, ?)", array(&$v1, &$v2));
@ -59,7 +64,7 @@ function InsertData($conn, $tableName, $numRows)
}
}
function GetFirstRow($stmt)
function getFirstRow($stmt)
{
echo "\nfirst row: ";
$result = sqlsrv_fetch($stmt, SQLSRV_SCROLL_FIRST);
@ -70,7 +75,7 @@ function GetFirstRow($stmt)
}
}
function GetNextRow($stmt)
function getNextRow($stmt)
{
echo "\nnext row: ";
$result = sqlsrv_fetch($stmt, SQLSRV_SCROLL_NEXT);
@ -81,7 +86,7 @@ function GetNextRow($stmt)
}
}
function GetPriorRow($stmt)
function getPriorRow($stmt)
{
echo "\nprior row: ";
$obj = sqlsrv_fetch_object($stmt, null, null, SQLSRV_SCROLL_PRIOR);
@ -90,7 +95,7 @@ function GetPriorRow($stmt)
}
}
function GetLastRow($stmt)
function getLastRow($stmt)
{
echo "\nlast row: ";
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_NUMERIC, SQLSRV_SCROLL_LAST);
@ -99,7 +104,7 @@ function GetLastRow($stmt)
}
}
function GetRelativeRow($stmt, $offset)
function getRelativeRow($stmt, $offset)
{
echo "\nrow $offset from the current row: ";
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_RELATIVE, $offset);
@ -108,7 +113,7 @@ function GetRelativeRow($stmt, $offset)
}
}
function GetAbsoluteRow($stmt, $offset)
function getAbsoluteRow($stmt, $offset)
{
echo "\nabsolute row with offset $offset: ";
$obj = sqlsrv_fetch_object($stmt, null, null, SQLSRV_SCROLL_ABSOLUTE, $offset);
@ -117,7 +122,7 @@ function GetAbsoluteRow($stmt, $offset)
}
}
function HasRows($stmt)
function hasRows($stmt)
{
$rows = sqlsrv_has_rows($stmt);
if ($rows != true) {
@ -125,36 +130,18 @@ function HasRows($stmt)
}
}
//--------------------------------------------------------------------
// RunTest
//
//--------------------------------------------------------------------
function RunTest()
{
startTest("sqlsrv_fetch_cursor_static_scroll");
try {
set_time_limit(0);
sqlsrv_configure('WarningsReturnAsErrors', 1);
set_time_limit(0);
sqlsrv_configure('WarningsReturnAsErrors', 1);
echo "\nTest begins...\n";
echo "\nTest begins...\n";
// Connect
$conn = connect();
if (!$conn) {
fatalError("Could not connect.\n");
}
// Connect
$conn = AE\connect();
fetchRowQuery($conn);
FetchRow_Query($conn);
sqlsrv_close($conn);
} catch (Exception $e) {
echo $e->getMessage();
}
echo "\nDone\n";
endTest("sqlsrv_fetch_cursor_static_scroll");
}
RunTest();
sqlsrv_close($conn);
echo "\nDone\n";
endTest("sqlsrv_fetch_cursor_static_scroll");
?>
--EXPECT--

View file

@ -1,25 +1,28 @@
--TEST--
Test various cursor types and whether they reflect changes in the database
--SKIPIF--
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
<?php
require_once('MsCommon.inc');
function Fetch_WithCursor($conn, $cursorType)
function fetchWithCursor($conn, $cursorType)
{
$tableName = GetTempTableName();
$stmt = sqlsrv_query($conn, "CREATE TABLE $tableName ([c1_int] int, [c2_char] char(10))");
sqlsrv_free_stmt($stmt);
$tableName = "table_$cursorType";
$columns = array(new AE\ColumnMeta('int', 'c1_int'),
new AE\ColumnMeta('char(10)', 'c2_char'));
$stmt = AE\createTable($conn, $tableName, $columns);
// insert four rows
$numRows = 4;
InsertData($conn, $tableName, 0, $numRows);
insertData($conn, $tableName, 0, $numRows);
// select table
$stmt = sqlsrv_prepare($conn, "SELECT * FROM $tableName", array(), array('Scrollable' => $cursorType));
sqlsrv_execute($stmt);
GetNumRows($stmt, $cursorType);
getNumRows($stmt, $cursorType);
$numRowsFetched = 0;
while ($obj = sqlsrv_fetch_object($stmt)) {
echo $obj->c1_int . "\n";
@ -30,10 +33,12 @@ function Fetch_WithCursor($conn, $cursorType)
echo "Number of rows fetched $numRowsFetched is wrong! Expected $numRows\n";
}
DeleteThenFetchLastRow($conn, $stmt, $tableName, 4);
deleteThenFetchLastRow($conn, $stmt, $tableName, 4);
dropTable($conn, $tableName);
}
function InsertData($conn, $tableName, $start, $count)
function insertData($conn, $tableName, $start, $count)
{
$stmt = sqlsrv_prepare($conn, "INSERT INTO $tableName (c1_int, c2_char) VALUES (?, ?)", array(&$v1, &$v2));
@ -46,13 +51,10 @@ function InsertData($conn, $tableName, $start, $count)
}
}
function DeleteThenFetchLastRow($conn, $stmt, $tableName, $id)
function deleteThenFetchLastRow($conn, $stmt, $tableName, $id)
{
echo "\nNow delete the last row then try to fetch it...\n";
$stmt2 = sqlsrv_query($conn, "DELETE FROM $tableName WHERE [c1_int] = 4");
if ($stmt2 !== false) {
sqlsrv_free_stmt($stmt2);
}
$stmt2 = AE\executeQuery($conn, "DELETE FROM $tableName", "[c1_int] = ?", array(4));
$result = sqlsrv_fetch($stmt, SQLSRV_SCROLL_LAST);
if ($result) {
@ -65,7 +67,7 @@ function DeleteThenFetchLastRow($conn, $stmt, $tableName, $id)
}
}
function GetNumRows($stmt, $cursorType)
function getNumRows($stmt, $cursorType)
{
$expectedToFail = false;
if ($cursorType == SQLSRV_CURSOR_FORWARD || $cursorType == SQLSRV_CURSOR_DYNAMIC) {
@ -89,48 +91,31 @@ function GetNumRows($stmt, $cursorType)
}
}
//--------------------------------------------------------------------
// RunTest
//
//--------------------------------------------------------------------
function RunTest()
{
startTest("sqlsrv_fetch_cursor_types");
try {
set_time_limit(0);
sqlsrv_configure('WarningsReturnAsErrors', 1);
try {
set_time_limit(0);
sqlsrv_configure('WarningsReturnAsErrors', 1);
echo "\nTest begins...\n";
// Connect
$conn = AE\connect();
// Connect
$conn = connect();
if (!$conn) {
fatalError("Could not connect.\n");
}
echo "\nUsing SQLSRV_CURSOR_FORWARD...\n";
fetchWithCursor($conn, SQLSRV_CURSOR_FORWARD);
echo "\nUsing SQLSRV_CURSOR_DYNAMIC...\n";
fetchWithCursor($conn, SQLSRV_CURSOR_DYNAMIC);
echo "\nUsing SQLSRV_CURSOR_KEYSET...\n";
fetchWithCursor($conn, SQLSRV_CURSOR_KEYSET);
echo "\nUsing SQLSRV_CURSOR_STATIC...\n";
fetchWithCursor($conn, SQLSRV_CURSOR_STATIC);
echo "\nUsing SQLSRV_CURSOR_FORWARD...\n";
Fetch_WithCursor($conn, SQLSRV_CURSOR_FORWARD);
echo "\nUsing SQLSRV_CURSOR_DYNAMIC...\n";
Fetch_WithCursor($conn, SQLSRV_CURSOR_DYNAMIC);
echo "\nUsing SQLSRV_CURSOR_KEYSET...\n";
Fetch_WithCursor($conn, SQLSRV_CURSOR_KEYSET);
echo "\nUsing SQLSRV_CURSOR_STATIC...\n";
Fetch_WithCursor($conn, SQLSRV_CURSOR_STATIC);
sqlsrv_close($conn);
} catch (Exception $e) {
echo $e->getMessage();
}
echo "\nDone\n";
endTest("sqlsrv_fetch_cursor_types");
sqlsrv_close($conn);
} catch (Exception $e) {
echo $e->getMessage();
}
RunTest();
echo "\nDone\n";
endTest("sqlsrv_fetch_cursor_types");
?>
--EXPECT--

Test begins...
Using SQLSRV_CURSOR_FORWARD...
Error occurred in sqlsrv_num_rows, which is expected

View file

@ -1,26 +1,23 @@
--TEST--
Fetch missing row
--SKIPIF--
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
<?php
require_once('MsCommon.inc');
function MissingRow_Fetch()
function missingRowFetch()
{
set_time_limit(0);
sqlsrv_configure('WarningsReturnAsErrors', 1);
// Connect
$conn = connect();
if (!$conn) {
fatalError("Could not connect.\n");
}
$conn = AE\connect();
$tableName = 'missingRow';
$tableName = GetTempTableName();
AE\createTestTable($conn, $tableName);
$stmt = sqlsrv_query($conn, "CREATE TABLE $tableName ([c1_int] int, [c2_tinyint] tinyint, [c3_smallint] smallint, [c4_bigint] bigint, [c5_bit] bit, [c6_float] float, [c7_real] real, [c8_decimal] decimal(28,4), [c9_numeric] numeric(32,4), [c10_money] money, [c11_smallmoney] smallmoney, [c12_char] char(512), [c13_varchar] varchar(512), [c14_varchar_max] varchar(max), [c15_nchar] nchar(512), [c16_nvarchar] nvarchar(512), [c17_nvarchar_max] nvarchar(max), [c18_text] text, [c19_ntext] ntext, [c20_binary] binary(512), [c21_varbinary] varbinary(512), [c22_varbinary_max] varbinary(max), [c23_image] image, [c24_uniqueidentifier] uniqueidentifier, [c25_datetime] datetime, [c26_smalldatetime] smalldatetime, [c27_timestamp] timestamp, [c28_xml] xml, [c29_time] time, [c30_date] date, [c31_datetime2] datetime2, [c32_datetimeoffset] datetimeoffset)");
sqlsrv_free_stmt($stmt);
$stmt = sqlsrv_query($conn, "SELECT * FROM $tableName");
$stmt = AE\selectFromTable($conn, $tableName);
$result1 = sqlsrv_fetch($stmt);
$result2 = sqlsrv_fetch($stmt);
@ -33,32 +30,18 @@ function MissingRow_Fetch()
$value3 = $e['SQLSTATE'];
print "$value3\n";
dropTable($conn, $tableName);
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
}
function Repro()
{
startTest("sqlsrv_fetch_missing_row");
echo "\nTest begins...\n";
try {
MissingRow_Fetch();
} catch (Exception $e) {
echo $e->getMessage();
}
echo "\nDone\n";
endTest("sqlsrv_fetch_missing_row");
}
Repro();
missingRowFetch();
endTest("sqlsrv_fetch_missing_row");
?>
--EXPECT--

Test begins...
There are no more rows in the active result set. Since this result set is not scrollable, no more data may be retrieved.
-22
IMSSP
Done
Test "sqlsrv_fetch_missing_row" completed successfully.

View file

@ -1,7 +1,7 @@
--TEST--
Test for fetch_object
--SKIPIF--
<?php require('skipif.inc'); ?>
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
@ -41,28 +41,22 @@ class foo_noargs
} // end class foo_noargs
sqlsrv_configure( 'WarningsReturnAsErrors', 0 );
require( 'MsCommon.inc' );
require_once('MsCommon.inc');
$conn = Connect();
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true ));
}
$stmt = sqlsrv_prepare( $conn, "IF OBJECT_ID('test_params', 'U') IS NOT NULL DROP TABLE test_params" );
sqlsrv_execute( $stmt );
sqlsrv_free_stmt( $stmt );
$stmt = sqlsrv_prepare( $conn, "CREATE TABLE test_params (id tinyint, name char(10), [double] float, stuff varchar(max))" );
sqlsrv_execute( $stmt );
sqlsrv_free_stmt( $stmt );
$conn = AE\connect();
$tableName = 'test_params';
$columns = array(new AE\ColumnMeta('tinyint', 'id'),
new AE\ColumnMeta('char(10)', 'name'),
new AE\ColumnMeta('float', 'double'),
new AE\ColumnMeta('varchar(max)', 'stuff'));
AE\createTable($conn, $tableName, $columns);
$f1 = 1;
$f2 = "testtestte";
$f3 = 12.0;
$f4 = fopen( "data://text/plain,This%20is%20some%20text%20meant%20to%20test%20binding%20parameters%20to%20streams", "r" );
$stmt = sqlsrv_prepare( $conn, "INSERT INTO test_params (id, name, [double], stuff) VALUES (?, ?, ?, ?)", array( &$f1, "testtestte", &$f3, &$f4 )); //,
//~ array( SQLSRV_SQLTYPE_INTEGER, SQLSRV_SQLTYPE_CHAR(10), SQLSRV_SQLTYPE_DOUBLE, SQLSRV_SQLTYPE_VARBINARY(4000)));
$stmt = sqlsrv_prepare( $conn, "INSERT INTO $tableName (id, name, [double], stuff) VALUES (?, ?, ?, ?)", array( &$f1, "testtestte", &$f3, &$f4 ));
if( !$stmt ) {
var_dump( sqlsrv_errors() );
die( "sqlsrv_prepare failed." );
@ -147,7 +141,7 @@ if( !is_null( $success )) {
sqlsrv_free_stmt( $stmt );
$stmt = sqlsrv_prepare( $conn, "SELECT id, [double], name, stuff FROM test_params" );
$stmt = sqlsrv_prepare( $conn, "SELECT id, [double], name, stuff FROM $tableName" );
$success = sqlsrv_execute( $stmt );
if( !$success ) {
var_dump( sqlsrv_errors() );
@ -239,7 +233,7 @@ else {
print_r( $obj );
}
sqlsrv_query( $conn, "DROP TABLE test_params" );
dropTable($conn, $tableName);
sqlsrv_free_stmt( $stmt );
sqlsrv_close( $conn );

View file

@ -1,7 +1,7 @@
--TEST--
Test for fetch_object
--SKIPIF--
<?php require('skipif.inc'); ?>
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
@ -41,29 +41,22 @@ class foo_noargs
} // end class foo_noargs
sqlsrv_configure( 'WarningsReturnAsErrors', 0 );
require_once('MsCommon.inc');
require( 'MsCommon.inc' );
$conn = Connect();
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true ));
}
$stmt = sqlsrv_prepare( $conn, "IF OBJECT_ID('test_params', 'U') IS NOT NULL DROP TABLE test_params" );
sqlsrv_execute( $stmt );
sqlsrv_free_stmt( $stmt );
$stmt = sqlsrv_prepare( $conn, "CREATE TABLE test_params (id tinyint, name char(10), [double] float, stuff varchar(max))" );
sqlsrv_execute( $stmt );
sqlsrv_free_stmt( $stmt );
$conn = AE\connect();
$tableName = 'test_params';
$columns = array(new AE\ColumnMeta('tinyint', 'id'),
new AE\ColumnMeta('char(10)', 'name'),
new AE\ColumnMeta('float', 'double'),
new AE\ColumnMeta('varchar(max)', 'stuff'));
AE\createTable($conn, $tableName, $columns);
$f1 = 1;
$f2 = "testtestte";
$f3 = 12.0;
$f4 = fopen( "data://text/plain,This%20is%20some%20text%20meant%20to%20test%20binding%20parameters%20to%20streams", "r" );
$stmt = sqlsrv_prepare( $conn, "INSERT INTO test_params (id, name, [double], stuff) VALUES (?, ?, ?, ?)", array( &$f1, "testtestte", &$f3, &$f4 )); //,
//~ array( SQLSRV_SQLTYPE_INTEGER, SQLSRV_SQLTYPE_CHAR(10), SQLSRV_SQLTYPE_DOUBLE, SQLSRV_SQLTYPE_VARBINARY(4000)));
$stmt = sqlsrv_prepare( $conn, "INSERT INTO $tableName (id, name, [double], stuff) VALUES (?, ?, ?, ?)", array( &$f1, "testtestte", &$f3, &$f4 ));
if( !$stmt ) {
var_dump( sqlsrv_errors() );
die( "sqlsrv_prepare failed." );
@ -85,7 +78,7 @@ if( !is_null( $success )) {
$f1 = 2;
$f3 = 13.0;
$f4 = fopen( "data://text/plain,This%20is%20some%20more%20text%20meant%20to%20test%20binding%20parameters%20to%20streams", "r" );
$stmt2 = sqlsrv_prepare( $conn, "INSERT INTO test_params (id, name, [double], stuff) VALUES (?, ?, ?, ?)", array( &$f1, "testtestte", &$f3, &$f4 ));
$stmt2 = sqlsrv_prepare( $conn, "INSERT INTO $tableName (id, name, [double], stuff) VALUES (?, ?, ?, ?)", array( &$f1, "testtestte", &$f3, &$f4 ));
$success = sqlsrv_execute( $stmt2 );
if( !$success ) {
var_dump( sqlsrv_errors() );
@ -102,7 +95,7 @@ if( !is_null( $success )) {
$f1 = 3;
$f3 = 14.0;
$f4 = fopen( "data://text/plain,This%20is%20some%20more%20text%20meant%20to%20test%20binding%20parameters%20to%20streams", "r" );
$stmt3 = sqlsrv_prepare( $conn, "INSERT INTO test_params (id, name, [double], stuff) VALUES (?, ?, ?, ?)", array( &$f1, "testtestte", &$f3, &$f4 ));
$stmt3 = sqlsrv_prepare( $conn, "INSERT INTO $tableName (id, name, [double], stuff) VALUES (?, ?, ?, ?)", array( &$f1, "testtestte", &$f3, &$f4 ));
$success = sqlsrv_execute( $stmt3 );
if( !$success ) {
var_dump( sqlsrv_errors() );
@ -119,7 +112,7 @@ if( !is_null( $success )) {
$f1 = 4;
$f3 = 15.0;
$f4 = fopen( "data://text/plain,This%20is%20some%20more%20text%20meant%20to%20test%20binding%20parameters%20to%20streams", "r" );
$stmt4 = sqlsrv_prepare( $conn, "INSERT INTO test_params (id, name, [double], stuff) VALUES (?, ?, ?, ?)", array( &$f1, "testtestte", &$f3, &$f4 ));
$stmt4 = sqlsrv_prepare( $conn, "INSERT INTO $tableName (id, name, [double], stuff) VALUES (?, ?, ?, ?)", array( &$f1, "testtestte", &$f3, &$f4 ));
$success = sqlsrv_execute( $stmt4 );
if( !$success ) {
var_dump( sqlsrv_errors() );
@ -136,7 +129,7 @@ if( !is_null( $success )) {
$f1 = 5;
$f3 = 16.0;
$f4 = fopen( "data://text/plain,This%20is%20some%20more%20text%20meant%20to%20test%20binding%20parameters%20to%20streams", "r" );
$stmt5 = sqlsrv_prepare( $conn, "INSERT INTO test_params (id, name, [double], stuff) VALUES (?, ?, ?, ?)", array( &$f1, "testtestte", &$f3, &$f4 ));
$stmt5 = sqlsrv_prepare( $conn, "INSERT INTO $tableName (id, name, [double], stuff) VALUES (?, ?, ?, ?)", array( &$f1, "testtestte", &$f3, &$f4 ));
$success = sqlsrv_execute( $stmt5 );
if( !$success ) {
var_dump( sqlsrv_errors() );
@ -152,7 +145,7 @@ if( !is_null( $success )) {
sqlsrv_free_stmt( $stmt );
$stmt = sqlsrv_prepare( $conn, "SELECT id, [double], name, stuff FROM test_params" );
$stmt = sqlsrv_prepare( $conn, "SELECT id, [double], name, stuff FROM $tableName" );
$success = sqlsrv_execute( $stmt );
if( !$success ) {
var_dump( sqlsrv_errors() );
@ -244,7 +237,7 @@ else {
print_r( $obj );
}
sqlsrv_query( $conn, "DROP TABLE test_params" );
dropTable($conn, $tableName);
sqlsrv_free_stmt( $stmt );
sqlsrv_close( $conn );

View file

@ -1,7 +1,7 @@
--TEST--
Test for fetch_object with Unicode column name
--SKIPIF--
<?php require('skipif.inc'); ?>
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
@ -41,28 +41,23 @@ class foo_noargs
} // end class foo_noargs
sqlsrv_configure('WarningsReturnAsErrors', 0);
//sqlsrv_configure( 'LogSeverity', SQLSRV_LOG_SEVERITY_ALL );
//sqlsrv_configure( 'LogSubsystems', SQLSRV_LOG_SYSTEM_ALL );
require_once('MsCommon.inc');
$conn = connect(array( 'CharacterSet'=>'UTF-8' ));
$conn = AE\connect(array( 'CharacterSet'=>'UTF-8' ));
$tableName = 'test_params';
$stmt = sqlsrv_prepare($conn, "IF OBJECT_ID('test_params', 'U') IS NOT NULL DROP TABLE test_params");
sqlsrv_execute($stmt);
sqlsrv_free_stmt($stmt);
$stmt = sqlsrv_prepare($conn, "CREATE TABLE test_params (id tinyint, 吉安而來 char(10), [此是後話Κοντάוְאַתָּה第十四章BiałopioБунтевсемужирафиtest是أي بزمام الإنذارהნომინავიiałopioБунтевсемужирафиtest父親回衙 汗流如雨 吉安而來. 關雎 誨€¥É§é] float, stuff varchar(max))");
sqlsrv_execute($stmt);
sqlsrv_free_stmt($stmt);
$columns = array(new AE\ColumnMeta('tinyint', 'id'),
new AE\ColumnMeta('char(10)', '吉安而來'),
new AE\ColumnMeta('float', '此是後話Κοντάוְאַתָּה第十四章BiałopioБунтевсемужирафиtest是أي بزمام الإنذارהნომინავიiałopioБунтевсемужирафиtest父親回衙 汗流如雨 吉安而來. 關雎 誨€¥É§é'),
new AE\ColumnMeta('varchar(max)', 'stuff'));
AE\createTable($conn, $tableName, $columns);
$f1 = 1;
$f2 = "testtestte";
$f3 = 12.0;
$f4 = fopen("data://text/plain,This%20is%20some%20text%20meant%20to%20test%20binding%20parameters%20to%20streams", "r");
$stmt = sqlsrv_prepare($conn, "INSERT INTO test_params (id, 吉安而來, [此是後話Κοντάוְאַתָּה第十四章BiałopioБунтевсемужирафиtest是أي بزمام الإنذارהნომინავიiałopioБунтевсемужирафиtest父親回衙 汗流如雨 吉安而來. 關雎 誨€¥É§é], stuff) VALUES (?, ?, ?, ?)", array( &$f1, "testtestte", &$f3, &$f4 )); //,
//~ array( SQLSRV_SQLTYPE_INTEGER, SQLSRV_SQLTYPE_CHAR(10), SQLSRV_SQLTYPE_此是後話Κοντάוְאַתָּה第十四章BiałopioБунтевсемужирафиtest是أي بزمام الإنذارהნომინავიiałopioБунтевсемужирафиtest父親回衙 汗流如雨 吉安而來. 關雎 誨€¥É§é, SQLSRV_SQLTYPE_VARBINARY(4000)));
$stmt = sqlsrv_prepare($conn, "INSERT INTO $tableName (id, 吉安而來, [此是後話Κοντάוְאַתָּה第十四章BiałopioБунтевсемужирафиtest是أي بزمام الإنذارהნომინავიiałopioБунтевсемужирафиtest父親回衙 汗流如雨 吉安而來. 關雎 誨€¥É§é], stuff) VALUES (?, ?, ?, ?)", array( &$f1, "testtestte", &$f3, &$f4 ));
if (!$stmt) {
var_dump(sqlsrv_errors());
die("sqlsrv_prepare failed.");
@ -147,7 +142,7 @@ if (!is_null($success)) {
sqlsrv_free_stmt($stmt);
$stmt = sqlsrv_prepare($conn, "SELECT id, [此是後話Κοντάוְאַתָּה第十四章BiałopioБунтевсемужирафиtest是أي بزمام الإنذارהნომინავიiałopioБунтевсемужирафиtest父親回衙 汗流如雨 吉安而來. 關雎 誨€¥É§é], 吉安而來, stuff FROM test_params");
$stmt = sqlsrv_prepare($conn, "SELECT id, [此是後話Κοντάוְאַתָּה第十四章BiałopioБунтевсемужирафиtest是أي بزمام الإنذارהნომინავიiałopioБунтевсемужирафиtest父親回衙 汗流如雨 吉安而來. 關雎 誨€¥É§é], 吉安而來, stuff FROM $tableName");
$success = sqlsrv_execute($stmt);
if (!$success) {
var_dump(sqlsrv_errors());
@ -234,6 +229,11 @@ if (is_null($obj)) {
print_r($obj);
}
dropTable($conn, $tableName);
sqlsrv_free_stmt( $stmt );
sqlsrv_close( $conn );
?>
--EXPECTREGEX--
Fetch a stdClass object \(1\)

View file

@ -1,10 +1,11 @@
--TEST--
sqlsrv_fetch_object() into a class with Unicode column name
--SKIPIF--
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
/* Define the Product class. */
// Define the Product class
class Product
{
public function __construct($ID, $UID)
@ -56,72 +57,153 @@ class Sample extends Product
}
}
function getInputData1($inputs)
{
return array('ID' => $inputs[0],
'личное_имя'=> $inputs[1],
'SafetyStockLevel' => $inputs[2],
'StockedQty' => $inputs[3],
'UnitPrice' => $inputs[4],
'DueDate' => $inputs[5],
'Color' => $inputs[6]);
}
function getInputData2($inputs)
{
return array('SerialNumber' => $inputs[0],
'Code'=> $inputs[1]);
}
require_once('MsCommon.inc');
$tableName = "UnicodeColNameTest";
include 'MsSetup.inc';
$conn = connect(array( 'CharacterSet'=>'UTF-8' ));
$tableName = "UnicodeColNameTest";
$conn = AE\connect(array('CharacterSet'=>'UTF-8'));
// Create table Purchasing
$tableName1 = "Purchasing";
$tableName2 = "Country";
dropTable($conn, $tableName1);
dropTable($conn, $tableName2);
$sql = "create table $tableName1 (ID CHAR(4), личное_имя VARCHAR(128), SafetyStockLevel SMALLINT,
StockedQty INT, UnitPrice FLOAT, DueDate datetime, Color VARCHAR(20))";
sqlsrv_query($conn, $sql) ?: die(print_r(sqlsrv_errors(), true));
$columns = array(new AE\ColumnMeta('CHAR(4)', 'ID'),
new AE\ColumnMeta('VARCHAR(128)', 'личное_имя'),
new AE\ColumnMeta('SMALLINT', 'SafetyStockLevel'),
new AE\ColumnMeta('INT', 'StockedQty'),
new AE\ColumnMeta('FLOAT', 'UnitPrice'),
new AE\ColumnMeta('datetime', 'DueDate'),
new AE\ColumnMeta('VARCHAR(20)', 'Color'));
AE\createTable($conn, $tableName1, $columns);
// Insert data
$sql = "INSERT INTO $tableName1 VALUES
('P001','Pencil 2B','102','24','0.24','2016-02-01','Red'),
('P002','Notepad','102','12','3.87', '2016-02-21',Null),
('P001','Mirror 2\"','652','3','15.99', '2016-02-01',NULL),
('P003','USB connector','1652','31','9.99','2016-02-01',NULL)";
sqlsrv_query($conn, $sql) ?: die(print_r(sqlsrv_errors(), true));
// Create table Country
$sql = "create table $tableName2 (SerialNumber CHAR(4), Code VARCHAR(2))";
sqlsrv_query($conn, $sql) ?: die(print_r(sqlsrv_errors(), true));
// Insert data
$sql = "INSERT INTO $tableName2 VALUES ('P001','FR'),('P002','UK'),('P003','DE')";
sqlsrv_query($conn, $sql) ?: die(print_r(sqlsrv_errors(), true));
/* Define the query. */
$sql = "SELECT личное_имя, SafetyStockLevel, StockedQty, UnitPrice, Color, Code
FROM $tableName1 AS Purchasing
JOIN $tableName2 AS Country
ON Purchasing.ID = Country.SerialNumber
WHERE Purchasing.StockedQty < ?
AND Purchasing.UnitPrice < ?
AND Purchasing.DueDate= ?";
/* Set the parameter values. */
$params = array(100, '10.5', '2016-02-01');
/* Execute the query. */
$stmt = sqlsrv_query($conn, $sql, $params, array("Scrollable"=>"static")); //, array("Scrollable"=>"buffered")
if (AE\isColEncrypted()) {
$sql = "INSERT INTO $tableName1 VALUES
(?, ?, ?, ?, ?, ?, ?),
(?, ?, ?, ?, ?, ?, ?),
(?, ?, ?, ?, ?, ?, ?),
(?, ?, ?, ?, ?, ?, ?)";
$stmt = sqlsrv_query($conn, $sql, array(array('P001', null, null, SQLSRV_SQLTYPE_CHAR(4)),
array('Pencil 2B', null, null, SQLSRV_SQLTYPE_VARCHAR(128)),
array('102', null, null, SQLSRV_SQLTYPE_SMALLINT),
array('24', null, null, SQLSRV_SQLTYPE_INT),
array('0.24', null, null, SQLSRV_SQLTYPE_FLOAT),
array('2016-02-01', null, null, SQLSRV_SQLTYPE_DATETIME),
array('Red', null, null, SQLSRV_SQLTYPE_VARCHAR(20)),
array('P002', null, null, SQLSRV_SQLTYPE_CHAR(4)),
array('Notepad', null, null, SQLSRV_SQLTYPE_VARCHAR(128)),
array('102', null, null, SQLSRV_SQLTYPE_SMALLINT),
array('12', null, null, SQLSRV_SQLTYPE_INT),
array('3.87', null, null, SQLSRV_SQLTYPE_FLOAT),
array('2016-02-21', null, null, SQLSRV_SQLTYPE_DATETIME),
array(null, null, null, SQLSRV_SQLTYPE_VARCHAR(20)),
array('P001', null, null, SQLSRV_SQLTYPE_CHAR(4)),
array('Mirror 2\"', null, null, SQLSRV_SQLTYPE_VARCHAR(128)),
array('652', null, null, SQLSRV_SQLTYPE_SMALLINT),
array('3', null, null, SQLSRV_SQLTYPE_INT),
array('15.99', null, null, SQLSRV_SQLTYPE_FLOAT),
array('2016-02-01', null, null, SQLSRV_SQLTYPE_DATETIME),
array(null, null, null, SQLSRV_SQLTYPE_VARCHAR(20)),
array('P003', null, null, SQLSRV_SQLTYPE_CHAR(4)),
array('USB connector', null, null, SQLSRV_SQLTYPE_VARCHAR(128)),
array('1652', null, null, SQLSRV_SQLTYPE_SMALLINT),
array('31', null, null, SQLSRV_SQLTYPE_INT),
array('9.99', null, null, SQLSRV_SQLTYPE_FLOAT),
array('2016-02-01', null, null, SQLSRV_SQLTYPE_DATETIME),
array(null, null, null, SQLSRV_SQLTYPE_VARCHAR(20))));
} else {
$sql = "INSERT INTO $tableName1 VALUES
('P001', 'Pencil 2B', '102', '24', '0.24', '2016-02-01', 'Red'),
('P002', 'Notepad', '102', '12', '3.87', '2016-02-21', Null),
('P001', 'Mirror 2\"', '652', '3', '15.99', '2016-02-01', NULL),
('P003', 'USB connector', '1652', '31', '9.99', '2016-02-01', NULL)";
$stmt = sqlsrv_query($conn, $sql);
}
if (!$stmt) {
echo "Error in statement execution.\n";
die(print_r(sqlsrv_errors(), true));
fatalError("Failed to insert test data into $tableName1\n");
}
// Iterate through the result set.
// $product is an instance of the Product class.
$i=0; $hasNext = true;
// Create table Country
$columns = array(new AE\ColumnMeta('CHAR(4)', 'SerialNumber'),
new AE\ColumnMeta('VARCHAR(2)', 'Code'));
AE\createTable($conn, $tableName2, $columns);
// Insert data
if (AE\isColEncrypted()) {
$sql = "INSERT INTO $tableName2 VALUES (?, ?), (?, ?), (?, ?)";
$stmt = sqlsrv_query($conn, $sql, array(array('P001', null, null, SQLSRV_SQLTYPE_CHAR(4)),
array('FR', null, null, SQLSRV_SQLTYPE_VARCHAR(2)),
array('P002', null, null, SQLSRV_SQLTYPE_CHAR(4)),
array('UK', null, null, SQLSRV_SQLTYPE_VARCHAR(2)),
array('P003', null, null, SQLSRV_SQLTYPE_CHAR(4)),
array('DE', null, null, SQLSRV_SQLTYPE_VARCHAR(2))));
} else {
$sql = "INSERT INTO $tableName2 VALUES ('P001', 'FR'), ('P002', 'UK'), ('P003', 'DE')";
$stmt = sqlsrv_query($conn, $sql);
}
if (!$stmt) {
fatalError("Failed to insert test data into $tableName2\n");
}
// With AE enabled, we cannot do comparisons with encrypted columns
// Also, only forward cursor or client buffer is supported
if (AE\isColEncrypted()) {
$sql = "SELECT личное_имя, SafetyStockLevel, StockedQty, UnitPrice, Color, Code
FROM $tableName1 AS Purchasing
JOIN $tableName2 AS Country
ON Purchasing.ID = Country.SerialNumber
WHERE Purchasing.личное_имя != ?
AND Purchasing.StockedQty != ?
AND Purchasing.DueDate= ?";
$params = array('Notepad', 3, '2016-02-01');
$stmt = sqlsrv_prepare($conn, $sql, $params, array("Scrollable"=>"buffered"));
if ($stmt) {
$res = sqlsrv_execute($stmt);
if (!$res) {
fatalError("Error in statement execution.\n");
}
} else {
fatalError("Error in preparing statement.\n");
}
} else {
$sql = "SELECT личное_имя, SafetyStockLevel, StockedQty, UnitPrice, Color, Code
FROM $tableName1 AS Purchasing
JOIN $tableName2 AS Country
ON Purchasing.ID = Country.SerialNumber
WHERE Purchasing.StockedQty < ?
AND Purchasing.UnitPrice < ?
AND Purchasing.DueDate= ?";
$params = array(100, '10.5', '2016-02-01');
$stmt = sqlsrv_query($conn, $sql, $params, array("Scrollable"=>"static"));
if (!$stmt) {
fatalError("Error in statement execution.\n");
}
}
// Iterate through the result set
// $product is an instance of the Product class
$i=0;
$hasNext = true;
while ($hasNext) {
$sample = sqlsrv_fetch_object($stmt, "Sample", array($i+1000), SQLSRV_SCROLL_ABSOLUTE, $i);
// DEBUG: uncomment to see the SQL_SERVER ERROR
// if(!$sample) die( print_r( sqlsrv_errors(), true));
if (!$sample) {
$hasNext = false;
} else {
@ -130,12 +212,10 @@ while ($hasNext) {
}
}
// DROP database
// $stmt = sqlsrv_query($conn,"DROP DATABASE ". $dbName);
//echo $dbName;
dropTable($conn, $tableName1);
dropTable($conn, $tableName2);
// Free statement and connection resources.s
dropTable($conn, $tableName1);
dropTable($conn, $tableName2);
// Free statement and connection resources
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);

View file

@ -1,30 +1,30 @@
--TEST--
Test sqlsrv_num_rows method.
--SKIPIF--
<?php require('skipif.inc'); ?>
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
sqlsrv_configure('WarningsReturnAsErrors', 0);
sqlsrv_configure('LogSeverity', SQLSRV_LOG_SEVERITY_ALL);
require_once('MsCommon.inc');
$conn = connect();
$conn = AE\connect();
$tableName = 'testNumRows';
if (!$conn) {
fatalError("Failed to connect.");
$columns = array(new AE\ColumnMeta('int', 'id', 'identity'),
new AE\ColumnMeta('nvarchar(100)', 'c1'));
AE\createTable($conn, $tableName, $columns);
$stmt = AE\insertRow($conn, $tableName, array("c1" => 'TEST'));
// Always Encrypted feature only supports SQLSRV_CURSOR_FORWARD or
// SQLSRV_CURSOR_CLIENT_BUFFERED
if (AE\isColEncrypted()) {
$options = array('Scrollable' => SQLSRV_CURSOR_CLIENT_BUFFERED);
} else {
$options = array('Scrollable' => SQLSRV_CURSOR_KEYSET);
}
dropTable($conn, 'utf16invalid');
$stmt = sqlsrv_query($conn, "CREATE TABLE utf16invalid (id int identity, c1 nvarchar(100))");
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
$stmt = sqlsrv_query($conn, "INSERT INTO utf16invalid (c1) VALUES ('TEST')");
if ($stmt === false) {
die(print_r(sqlsrv_errors()));
}
$stmt = sqlsrv_query($conn, "SELECT * FROM utf16invalid", array(), array("Scrollable" => SQLSRV_CURSOR_KEYSET ));
$stmt = sqlsrv_query($conn, "SELECT * FROM $tableName", array(), $options);
$row_nums = sqlsrv_num_rows($stmt);
echo $row_nums;

View file

@ -1,30 +1,27 @@
--TEST--
sqlsrv_fetch_array() using a scrollable cursor
--SKIPIF--
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
require_once("MsCommon.inc");
require_once('MsCommon.inc');
// connect
$conn = connect();
if (!$conn) {
fatalError("Connection could not be established.\n");
}
$tableName = GetTempTableName();
$conn = AE\connect();
$tableName = 'test012';
// Create table
$query = "CREATE TABLE $tableName (ID VARCHAR(10))";
$stmt = sqlsrv_query($conn, $query);
$columns = array(new AE\ColumnMeta('VARCHAR(10)', 'ID'));
AE\createTable($conn, $tableName, $columns);
$query = "INSERT INTO $tableName VALUES ('1998.1'),('-2004'),('2016'),('4.2EUR')";
$stmt = sqlsrv_query($conn, $query) ?: die(print_r(sqlsrv_errors(), true));
AE\insertRow($conn, $tableName, array("ID" => '1998.1'));
AE\insertRow($conn, $tableName, array("ID" => '-2004'));
AE\insertRow($conn, $tableName, array("ID" => '2016'));
AE\insertRow($conn, $tableName, array("ID" => '4.2EUR'));
// Fetch data
$query = "SELECT ID FROM $tableName";
$stmt = sqlsrv_query($conn, $query, [], array("Scrollable"=>"buffered"))
?: die(print_r(sqlsrv_errors(), true));
$stmt = AE\executeQueryEx($conn, $query, array("Scrollable"=>"buffered"));
// Fetch first row
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_NEXT);
@ -38,6 +35,8 @@ echo $row['ID']."\n";
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_LAST);
echo $row['ID']."\n";
dropTable($conn, $tableName);
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
print "Done"

View file

@ -5,30 +5,27 @@ This test calls sqlsrv_has_rows multiple times. Previously, multiple calls
with a forward cursor would advance the cursor. Subsequent fetch calls
would then fail.
--SKIPIF--
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
require_once("MsCommon.inc");
require_once('MsCommon.inc');
// connect
$conn = connect();
if (!$conn) {
fatalError("Connection could not be established.\n");
}
$tableName = GetTempTableName();
$conn = AE\connect();
$tableName = 'test037';
// Create table
$query = "CREATE TABLE $tableName (ID VARCHAR(10))";
$stmt = sqlsrv_query($conn, $query);
$columns = array(new AE\ColumnMeta('VARCHAR(10)', 'ID'));
AE\createTable($conn, $tableName, $columns);
$query = "INSERT INTO $tableName VALUES ('1998.1'),('-2004'),('2016'),('4.2EUR')";
$stmt = sqlsrv_query($conn, $query) ?: die(print_r(sqlsrv_errors(), true));
AE\insertRow($conn, $tableName, array("ID" => '1998.1'));
AE\insertRow($conn, $tableName, array("ID" => '-2004'));
AE\insertRow($conn, $tableName, array("ID" => '2016'));
AE\insertRow($conn, $tableName, array("ID" => '4.2EUR'));
// Fetch data using forward only cursor
$query = "SELECT ID FROM $tableName";
$stmt = sqlsrv_query($conn, $query)
?: die(print_r(sqlsrv_errors(), true));
$stmt = AE\executeQuery($conn, $query);
// repeated calls should return true and fetch should work.
echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n";
@ -43,8 +40,7 @@ if (sqlsrv_has_rows($stmt)) {
}
// Fetch data using a scrollable cursor
$stmt = sqlsrv_query($conn, $query, [], array("Scrollable"=>"buffered"))
?: die(print_r(sqlsrv_errors(), true));
$stmt = sqlsrv_query($conn, $query, [], array("Scrollable"=>"buffered"));
echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n";
echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n";
@ -57,22 +53,21 @@ if (sqlsrv_has_rows($stmt)) {
}
}
$query = "SELECT ID FROM $tableName where ID='nomatch'";
$stmt = sqlsrv_query($conn, $query)
?: die(print_r(sqlsrv_errors(), true));
// $query = "SELECT ID FROM $tableName where ID='nomatch'";
$stmt = AE\executeQuery($conn, $query, "ID = ?", array('nomatch'));
// repeated calls should return false if there are no rows.
echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n";
echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n";
// Fetch data using a scrollable cursor
$stmt = sqlsrv_query($conn, $query, [], array("Scrollable"=>"buffered"))
?: die(print_r(sqlsrv_errors(), true));
$stmt = AE\executeQuery($conn, $query, "ID = ?", array('nomatch'), array("Scrollable"=>"buffered"));
// repeated calls should return false if there are no rows.
echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n";
echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n";
dropTable($conn, $tableName);
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);

View file

@ -1,38 +1,27 @@
--TEST--
GitHub issue #69 - fetching an empty nvarchar using client buffer
--SKIPIF--
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
function print_errors()
{
die( print_r( sqlsrv_errors(), true));
}
require_once('MsCommon.inc');
function test()
{
require_once("MsCommon.inc");
// Connect
$conn = Connect();
if( !$conn ) { print_errors(); }
$sql = "EXEC dbo.sp_executesql
N'DECLARE @x nvarchar(max)
SET @x = '''' -- empty string
SELECT @x AS [Empty_Nvarchar_Max]'";
// Connect
$conn = AE\connect();
$stmt = sqlsrv_query($conn, $sql, [], ["Scrollable" => 'buffered']);
if (! $stmt) { print_errors(); }
$sql = "EXEC dbo.sp_executesql
N'DECLARE @x nvarchar(max)
SET @x = '''' -- empty string
SELECT @x AS [Empty_Nvarchar_Max]'";
$return = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
print_r($return);
// Free the statement and connection resources.
sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn);
}
test();
$stmt = AE\executeQueryEx($conn, $sql, ["Scrollable" => 'buffered']);
$return = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
print_r($return);
// Free the statement and connection resources.
sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn);
print "Done";
?>

View file

@ -1,61 +1,53 @@
--TEST--
sqlsrv_fetch() with SQLSRV_SCROLL_ABSOLUTE using out of range offset
--SKIPIF--
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
require_once('MsCommon.inc');
function test()
{
require_once("MsCommon.inc");
// connect
$conn = AE\connect();
// connect
$conn = connect();
if (!$conn) {
printErrors("Connection could not be established.\n");
}
// Prepare the statement
$sql = "select * from cd_info";
$stmt = sqlsrv_prepare($conn, $sql, array(), array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
if ($stmt === false) {
printErrors();
}
sqlsrv_execute($stmt);
// Prepare the statement
$sql = "select * from cd_info";
$stmt = sqlsrv_prepare($conn, $sql, array(), array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
if ($stmt === false) {
printErrors();
}
sqlsrv_execute($stmt);
// Get row count
$row_count = sqlsrv_num_rows($stmt);
if ($row_count == 0) {
printErrors("There should be at least one row!\n");
}
sqlsrv_execute($stmt);
$row = sqlsrv_fetch($stmt, SQLSRV_SCROLL_FIRST);
$field = sqlsrv_get_field($stmt, 0);
if (! $field) {
printErrors();
}
$row = sqlsrv_fetch($stmt, SQLSRV_SCROLL_LAST);
$field = sqlsrv_get_field($stmt, 0);
if (! $field) {
printErrors();
}
// this should return false
$row = sqlsrv_fetch($stmt, SQLSRV_SCROLL_ABSOLUTE, $row_count);
if ($row) {
printErrors("This should return false!");
}
$field = sqlsrv_get_field($stmt, 0);
if ($field !== false) {
printErrors("This should have resulted in error!");
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
// Get row count
$row_count = sqlsrv_num_rows($stmt);
if ($row_count == 0) {
printErrors("There should be at least one row!\n");
}
test();
sqlsrv_execute($stmt);
$row = sqlsrv_fetch($stmt, SQLSRV_SCROLL_FIRST);
$field = sqlsrv_get_field($stmt, 0);
if (! $field) {
printErrors();
}
$row = sqlsrv_fetch($stmt, SQLSRV_SCROLL_LAST);
$field = sqlsrv_get_field($stmt, 0);
if (! $field) {
printErrors();
}
// this should return false
$row = sqlsrv_fetch($stmt, SQLSRV_SCROLL_ABSOLUTE, $row_count);
if ($row) {
printErrors("This should return false!");
}
$field = sqlsrv_get_field($stmt, 0);
if ($field !== false) {
printErrors("This should have resulted in error!");
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
print "Done";
?>

View file

@ -1,10 +1,11 @@
--TEST--
sqlsrv_has_rows() using a forward and scrollable cursor
--SKIPIF--
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
require_once("MsCommon.inc");
require_once('MsCommon.inc');
function fetchData($conn, $table, $size)
{
@ -27,21 +28,26 @@ function fetchData($conn, $table, $size)
}
// connect
$conn = connect();
if (!$conn) {
printErrors("Connection could not be established.\n");
}
$conn = AE\connect();
$tableName1 = GetTempTableName('php_test_table_1');
$tableName2 = GetTempTableName('php_test_table_2');
$tableName1 = 'php_test_table_1';
$tableName2 = 'php_test_table_2';
// Create table
$stmt = sqlsrv_query($conn, "CREATE TABLE $tableName1 ([c1_int] int, [c2_varchar_max] varchar(max))");
$stmt = sqlsrv_query($conn, "CREATE TABLE $tableName2 ([c1_int] int, [c2_varchar_1036] varchar(1036))");
// Create tables
$columns = array(new AE\ColumnMeta('int', 'c1_int'),
new AE\ColumnMeta('varchar(max)', 'c2_varchar_max'));
$stmt = AE\createTable($conn, $tableName1, $columns);
unset($columns);
$columns = array(new AE\ColumnMeta('int', 'c1_int'),
new AE\ColumnMeta('varchar(1036)', 'c2_varchar_1036'));
$stmt = AE\createTable($conn, $tableName2, $columns);
// insert > 1KB into c2_varchar_max & c2_varchar_1036 (1036 characters).
$stmt = sqlsrv_query($conn, "INSERT INTO $tableName1 (c1_int, c2_varchar_max) VALUES (1, 'This is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a test')");
$stmt = sqlsrv_query($conn, "INSERT INTO $tableName2 (c1_int, c2_varchar_1036) VALUES (1, 'This is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a test')");
$longString = 'This is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a testThis is a test';
$stmt = AE\insertRow($conn, $tableName1, array('c1_int' => 1, 'c2_varchar_max' => $longString));
$stmt = AE\insertRow($conn, $tableName2, array('c1_int' => 1, 'c2_varchar_1036' => $longString));
// set client buffer size to 0KB returns false
$ret = sqlsrv_configure('ClientBufferMaxKBSize', 0);

View file

@ -3,16 +3,28 @@ Read numeric types from SQLSRV with buffered query.
--DESCRIPTION--
Test numeric conversion (number to string, string to number) functionality for buffered queries with SQLSRV.
--SKIPIF--
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
require_once("MsCommon.inc");
$conn = connect(array("CharacterSet"=>"utf-8"));
if (!$conn) {
printErrors("Connection could not be established.\n");
function getInputData($inputs)
{
return array('a' => $inputs[0],
'neg_a'=> $inputs[1],
'b' => $inputs[2],
'neg_b' => $inputs[3],
'c' => $inputs[4],
'neg_c' => $inputs[5],
'zero' => $inputs[6],
'zerof' => $inputs[7],
'zerod' => $inputs[8]);
}
require_once('MsCommon.inc');
$conn = AE\connect(array("CharacterSet"=>"utf-8"));
$tableName = 'test230';
$sample = 1234567890.1234;
$sample1 = -1234567890.1234;
$sample2 = 1;
@ -20,34 +32,35 @@ $sample3 = -1;
$sample4 = 0.5;
$sample5 = -0.55;
$query = 'CREATE TABLE #TESTTABLE (a float(53), neg_a float(53), b int, neg_b int, c decimal(16, 6), neg_c decimal(16, 6), zero int, zerof float(53), zerod decimal(16,6))';
// Create table
$stmt = sqlsrv_query($conn, $query);
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
$columns = array(new AE\ColumnMeta('float(53)', 'a'),
new AE\ColumnMeta('float(53)', 'neg_a'),
new AE\ColumnMeta('int', 'b'),
new AE\ColumnMeta('int', 'neg_b'),
new AE\ColumnMeta('decimal(16, 6)', 'c'),
new AE\ColumnMeta('decimal(16, 6)', 'neg_c'),
new AE\ColumnMeta('int', 'zero'),
new AE\ColumnMeta('float(53)', 'zerof'),
new AE\ColumnMeta('decimal(16, 6)', 'zerod'));
AE\createTable($conn, $tableName, $columns);
$query = 'INSERT INTO #TESTTABLE (a, neg_a, b, neg_b, c, neg_c, zero, zerof, zerod) VALUES(?, ?, ?, ?, ?, ?, 0, 0, 0)';
$params = array($sample, $sample1, $sample2, $sample3, $sample4, $sample5);
$stmt = sqlsrv_query($conn, $query, $params);
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
$params = array($sample4, $sample5, 100000, -1234567, $sample, $sample1);
$stmt = sqlsrv_query($conn, $query, $params);
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
$query = 'SELECT TOP 2 * FROM #TESTTABLE';
$stmt = sqlsrv_query($conn, $query, array(), array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
$res = null;
$params = array($sample, $sample1, $sample2, $sample3, $sample4, $sample5, 0, 0, 0);
$data = getInputData($params);
$stmt = AE\insertRow($conn, $tableName, $data, $res, AE\INSERT_QUERY_PARAMS);
if (!$stmt) {
echo "Statement could not be prepared.\n";
die(print_r(sqlsrv_errors(), true));
fatalError("Failed to insert into $tableName!");
}
sqlsrv_execute($stmt);
$params = array($sample4, $sample5, 100000, -1234567, $sample, $sample1, 0, 0, 0);
$data = getInputData($params);
$stmt = AE\insertRow($conn, $tableName, $data, $res, AE\INSERT_QUERY_PARAMS);
if (!$stmt) {
fatalError("Failed to insert into $tableName!");
}
$query = "SELECT TOP 2 * FROM $tableName";
$stmt = sqlsrv_query($conn, $query, array(), array("Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED));
$array = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_NUMERIC);
var_dump($array);
@ -73,6 +86,8 @@ for ($i = 0; $i < $rowcount; $i++) {
}
}
dropTable($conn, $tableName);
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);

View file

@ -3,12 +3,13 @@ GitHub issue #330 - get numrow of null buffered result set
--DESCRIPTION--
A variation of the example in GitHub issue 330. A -1 value returned as numrow of a null buffered result set.
--SKIPIF--
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
require_once("MsCommon.inc");
require_once('MsCommon.inc');
// connect
$conn = connect() ?: fatalError("Failed to connect");
$conn = AE\connect();
$stmt = sqlsrv_query($conn, "IF EXISTS (SELECT * FROM [sys].[objects] WHERE (name LIKE 'non_existent_table_name%') AND type in (N'U'))
BEGIN

View file

@ -1,249 +1,213 @@
--TEST--
scrollable result sets.
--SKIPIF--
<?php require('skipif.inc'); ?>
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
sqlsrv_configure( 'WarningsReturnAsErrors', false );
sqlsrv_configure( 'LogSeverity', SQLSRV_LOG_SEVERITY_ALL );
sqlsrv_configure('WarningsReturnAsErrors', false);
sqlsrv_configure('LogSeverity', SQLSRV_LOG_SEVERITY_ALL);
require( 'MsCommon.inc' );
require_once('MsCommon.inc');
$conn = Connect();
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true ));
}
$stmt = sqlsrv_query( $conn, "IF OBJECT_ID('ScrollTest', 'U') IS NOT NULL DROP TABLE ScrollTest" );
if( $stmt !== false ) { sqlsrv_free_stmt( $stmt ); }
$stmt = sqlsrv_query( $conn, "CREATE TABLE ScrollTest (id int, value char(10))" );
if( $stmt === false ) {
die( print_r( sqlsrv_errors(), true ));
}
$rows = sqlsrv_has_rows( $stmt );
if( $rows == true ) {
die( "Shouldn't have rows" );
}
sqlsrv_free_stmt( $stmt );
$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 1, "Row 1" ));
if( $stmt === false ) {
die( print_r( sqlsrv_errors(), true ));
}
$rows = sqlsrv_has_rows( $stmt );
if( $rows == true ) {
die( "Shouldn't have rows" );
}
$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 2, "Row 2" ));
if( $stmt === false ) {
die( print_r( sqlsrv_errors(), true ));
}
$rows = sqlsrv_has_rows( $stmt );
if( $rows == true ) {
die( "Shouldn't have rows" );
}
$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 3, "Row 3" ));
if( $stmt === false ) {
die( print_r( sqlsrv_errors(), true ));
}
$rows = sqlsrv_has_rows( $stmt );
if( $rows == true ) {
die( "Shouldn't have rows" );
}
$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 4, "Row 4" ));
if( $stmt === false ) {
die( print_r( sqlsrv_errors(), true ));
}
$rows = sqlsrv_has_rows( $stmt );
if( $rows == true ) {
die( "Shouldn't have rows" );
}
$stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'static' ));
$result = sqlsrv_fetch( $stmt, SQLSRV_SCROLL_ABSOLUTE, 4 );
if( $result !== null ) {
die( "Should have failed with an invalid row number" );
}
$rows = sqlsrv_has_rows( $stmt );
if( $rows != true ) {
die( "Should have rows" );
}
print_r( sqlsrv_errors() );
$result = sqlsrv_fetch( $stmt, SQLSRV_SCROLL_ABSOLUTE, -1 );
if( $result !== null ) {
die( "Should have failed with an invalid row number" );
}
print_r( sqlsrv_errors() );
$rows = sqlsrv_rows_affected( $stmt );
print_r( sqlsrv_errors() );
$rows = sqlsrv_num_rows( $stmt );
echo "Query returned $rows rows\n";
$row = 3;
$result = sqlsrv_fetch( $stmt, SQLSRV_SCROLL_ABSOLUTE, $row );
do {
$result = sqlsrv_fetch( $stmt, SQLSRV_SCROLL_ABSOLUTE, $row );
if( $result === false ) {
die( print_r( sqlsrv_errors(), true ));
function hasRows($stmt, $expectedFail)
{
$rows = sqlsrv_has_rows($stmt);
if ($expectedFail) {
if ($rows == true) {
die("Shouldn't have rows");
}
} else {
if ($rows != true) {
die("Should have rows");
}
}
$field1 = sqlsrv_get_field( $stmt, 0 );
$field2 = sqlsrv_get_field( $stmt, 1 );
echo "$field1 $field2\n";
$row = $row - 1;
} while( $row >= 0 );
sqlsrv_free_stmt( $stmt );
$stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => SQLSRV_CURSOR_FORWARD ));
$rows = sqlsrv_has_rows( $stmt );
if( $rows != true ) {
die( "Should have rows" );
}
$row_count = 0;
while( $row = sqlsrv_fetch( $stmt )) {
function countRows($stmt, $numRows, $cursorType, $initialCount = 0)
{
$row_count = $initialCount;
while ($row = sqlsrv_fetch($stmt)) {
++$row_count;
}
if( $row === false ) {
die( print_r( sqlsrv_errors(), true ));
}
echo "$row_count rows retrieved on the forward only cursor\n";
sqlsrv_free_stmt( $stmt );
$stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'static' ));
$rows = sqlsrv_has_rows( $stmt );
if( $rows != true ) {
die( "Should have rows" );
}
$row_count = 0;
while( $row = sqlsrv_fetch( $stmt )) {
++$row_count;
}
if( $row === false ) {
die( print_r( sqlsrv_errors(), true ));
}
echo "$row_count rows retrieved on the static cursor\n";
sqlsrv_free_stmt( $stmt );
$stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'dynamic' ));
sqlsrv_fetch( $stmt );
sqlsrv_fetch( $stmt );
$stmt2 = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 5, "Row 5" ));
if( $stmt2 === false ) {
die( print_r( sqlsrv_errors(), true ));
}
$stmt2 = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 6, "Row 6" ));
if( $stmt2 === false ) {
die( print_r( sqlsrv_errors(), true ));
}
if($row === false) {
die(print_r(sqlsrv_errors(), true));
}
if ($row_count != $numRows) {
echo "ERROR: $row_count rows retrieved on the $cursorType cursor\n";
}
}
$row_count = 2; // for the two fetches above
while( sqlsrv_fetch( $stmt )) {
++$row_count;
}
echo "$row_count rows retrieved on the dynamic cursor\n";
sqlsrv_free_stmt( $stmt );
function insertOneRow($conn, $tableName, $idx, $expectedFail)
{
$res = null;
$stmt = AE\insertRow($conn, $tableName, array('id' => $idx, 'value' => 'Row ' . $idx), $res, AE\INSERT_QUERY_PARAMS);
$stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => SQLSRV_CURSOR_STATIC ));
$row_count = sqlsrv_num_rows( $stmt );
if( $row_count != 6 ) {
die( "sqlsrv_num_rows should have returned 6 rows in the static cursor\n" );
}
$row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_ABSOLUTE, -1 );
if( $row !== null ) {
die( "sqlsrv_fetch_array should have returned null\n" );
if (!$stmt || $res === false) {
fatalError("failed to insert row $idx!\n");
}
hasRows($stmt, $expectedFail);
sqlsrv_free_stmt($stmt);
}
$row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_ABSOLUTE, 6 );
if( $row !== null ) {
die( "sqlsrv_fetch_array should have returned null\n" );
$conn = AE\connect();
$tableName = 'ScrollTest';
$numRows = 4;
$columns = array(new AE\ColumnMeta('int', 'id'),
new AE\ColumnMeta('char(10)', 'value'));
$stmt = AE\createTable($conn, $tableName, $columns);
$rows = sqlsrv_has_rows($stmt);
if($rows == true) {
die("Shouldn't have rows");
}
sqlsrv_free_stmt($stmt);
for ($i = 1; $i <= $numRows; $i++) {
insertOneRow($conn, $tableName, $i, true);
}
$stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => SQLSRV_CURSOR_DYNAMIC ));
// Always Encrypted feature only supports SQLSRV_CURSOR_FORWARD, so skip the rest of the test
// when AE is enabled
// https://github.com/Microsoft/msphpsql/wiki/Features#aelimitation
$query = "SELECT * FROM $tableName";
$options = array('Scrollable' => SQLSRV_CURSOR_FORWARD);
$stmt = sqlsrv_query($conn, $query, array(), $options);
$result = sqlsrv_num_rows( $stmt );
if( $result !== false ) {
die( "sqlsrv_num_rows should have failed for a dynamic cursor." );
}
sqlsrv_fetch( $stmt );
sqlsrv_fetch( $stmt );
hasRows($stmt, false);
countRows($stmt, $numRows, 'forward only');
sqlsrv_free_stmt($stmt);
$stmt2 = sqlsrv_query( $conn, "DELETE FROM ScrollTest WHERE id = 2" );
if( $stmt2 === false ) {
die( print_r( sqlsrv_errors(), true ));
}
if (! AE\isColEncrypted()) {
$options = array('Scrollable' => 'static');
$stmt = sqlsrv_query($conn, $query, array(), $options);
$row = sqlsrv_get_field( $stmt, 0 );
if( $row !== false ) {
die( "Should have returned false retrieving a field deleted by another query\n" );
}
echo "sqlsrv_get_field returned false when retrieving a field deleted by another query\n";
print_r( sqlsrv_errors() );
$result = sqlsrv_fetch($stmt, SQLSRV_SCROLL_ABSOLUTE, 4);
if($result !== null) {
die("Should have failed with an invalid row number");
}
hasRows($stmt, false);
// this is empty
print_r(sqlsrv_errors());
$result = sqlsrv_fetch($stmt, SQLSRV_SCROLL_ABSOLUTE, -1);
if($result !== null) {
die("Should have failed with an invalid row number");
}
// this is empty
print_r(sqlsrv_errors());
// verify the sqlsrv_fetch_object is working
$obj = sqlsrv_fetch_object( $stmt, null, array(null), SQLSRV_SCROLL_LAST, 1 );
// expected an error here
$rows = sqlsrv_rows_affected($stmt);
$message = !empty(sqlsrv_errors()) ? sqlsrv_errors()[0]['message'] : '';
$expected = 'This function only works with statements that are not scrollable.';
if (strcmp($message, $expected)) {
echo "Expected this error message: \'$expected\'\nbut it is: \'$message\'\n";
}
if( $obj === false ) {
$rows = sqlsrv_num_rows($stmt);
if ($rows != $numRows) {
echo "Error: Query returned $rows rows\n";
}
print_r( sqlsrv_errors() );
$row = 3;
$result = sqlsrv_fetch($stmt, SQLSRV_SCROLL_ABSOLUTE, $row);
do {
$result = sqlsrv_fetch($stmt, SQLSRV_SCROLL_ABSOLUTE, $row);
if($result === false) {
die(print_r(sqlsrv_errors(), true));
}
$field1 = sqlsrv_get_field($stmt, 0);
$field2 = sqlsrv_get_field($stmt, 1);
$idx = $row + 1;
if ($field1 != $idx || trim($field2) != "Row $idx")
echo "Field values unexpected $field1 $field2!\n";
$row = $row - 1;
} while($row >= 0);
sqlsrv_free_stmt($stmt);
$options = array('Scrollable' => 'static');
$stmt = sqlsrv_query($conn, $query, array(), $options);
hasRows($stmt, false);
countRows($stmt, $numRows, 'static');
sqlsrv_free_stmt($stmt);
$options = array('Scrollable' => 'dynamic');
$stmt = sqlsrv_query($conn, $query, array(), $options);
sqlsrv_fetch($stmt);
sqlsrv_fetch($stmt);
insertOneRow($conn, $tableName, 5, true);
insertOneRow($conn, $tableName, 6, true);
$numRows = 6;
// to account for the two fetches above
countRows($stmt, $numRows, 'dynamic', 2);
sqlsrv_free_stmt($stmt);
$options = array('Scrollable' => SQLSRV_CURSOR_STATIC);
$stmt = sqlsrv_query($conn, $query, array(), $options);
$row_count = sqlsrv_num_rows($stmt);
if($row_count != $numRows) {
die("sqlsrv_num_rows should have returned 6 rows in the static cursor\n");
}
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_ABSOLUTE, -1);
if($row !== null) {
die("sqlsrv_fetch_array should have returned null\n");
}
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_ABSOLUTE, 6);
if($row !== null) {
die("sqlsrv_fetch_array should have returned null\n");
}
$options = array('Scrollable' => SQLSRV_CURSOR_DYNAMIC);
$stmt = sqlsrv_query($conn, $query, array(), $options);
$result = sqlsrv_num_rows($stmt);
if($result !== false) {
die("sqlsrv_num_rows should have failed for a dynamic cursor.");
}
sqlsrv_fetch($stmt);
sqlsrv_fetch($stmt);
$stmt2 = sqlsrv_query($conn, "DELETE FROM ScrollTest WHERE id = 2");
if($stmt2 === false) {
die(print_r(sqlsrv_errors(), true));
}
$row = sqlsrv_get_field($stmt, 0);
if($row !== false) {
die("sqlsrv_get_field should have returned false retrieving a field deleted by another query");
}
$error = sqlsrv_errors()[0];
$message = $error['message'];
$sqlstate = $error['SQLSTATE'];
if (strcmp($sqlstate, 'HY109') || strpos($message, 'Invalid cursor position') === false) {
die("Unexpected SQL state $sqlstate or error \'$message\'");
}
// verify the sqlsrv_fetch_object is working
$obj = sqlsrv_fetch_object($stmt, null, array(null), SQLSRV_SCROLL_LAST, 1);
if($obj === false) {
print_r(sqlsrv_errors());
} else {
if ($obj->id != $numRows || trim($obj->value) != "Row $numRows")
echo "Field values unexpected $obj->id $obj->value!\n";
}
sqlsrv_free_stmt($stmt);
}
print_r( $obj );
sqlsrv_query( $conn, "DROP TABLE ScrollTest" );
sqlsrv_free_stmt( $stmt );
sqlsrv_close( $conn );
dropTable($conn, $tableName);
sqlsrv_close($conn);
echo "Test succeeded.\n";
?>
--EXPECTREGEX--
Array
\(
\[0\] => Array
\(
\[0\] => IMSSP
\[SQLSTATE\] => IMSSP
\[1\] => \-51
\[code\] => \-51
\[2\] => This function only works with statements that are not scrollable\.
\[message\] => This function only works with statements that are not scrollable\.
\)
\)
Query returned 4 rows
4 Row 4
3 Row 3
2 Row 2
1 Row 1
4 rows retrieved on the forward only cursor
4 rows retrieved on the static cursor
6 rows retrieved on the dynamic cursor
sqlsrv_get_field returned false when retrieving a field deleted by another query
Array
\(
\[0\] => Array
\(
\[0\] => HY109
\[SQLSTATE\] => HY109
\[1\] => 0
\[code\] => 0
\[2\] => \[Microsoft\]\[ODBC Driver 1[1-9] for SQL Server\]Invalid cursor position
\[message\] => \[Microsoft\]\[ODBC Driver 1[1-9] for SQL Server\]Invalid cursor position
\)
\)
stdClass Object
\(
\[id\] => 6
\[value\] => Row 6
\)
Test succeeded\.
--EXPECT--
Test succeeded.