2017-09-14 02:46:44 +02:00
--TEST--
2017-09-15 00:04:55 +02:00
Test for inserting and retrieving encrypted data of datetime types
2017-09-26 01:37:27 +02:00
--DESCRIPTION--
2017-09-14 02:46:44 +02:00
Bind params using sqlsrv_prepare with all sql_type
--SKIPIF--
2017-09-14 18:47:40 +02:00
<?php require('skipif_versions_old.inc'); ?>
2017-09-14 02:46:44 +02:00
--FILE--
<?php
2017-10-04 23:22:56 +02:00
require_once('MsCommon.inc');
require_once('AEData.inc');
2017-09-14 02:46:44 +02:00
2017-09-18 19:05:36 +02:00
date_default_timezone_set("Canada/Pacific");
2017-09-14 02:46:44 +02:00
$dataTypes = array( "date", "datetime", "datetime2", "smalldatetime", "time", "datetimeoffset" );
2017-10-04 23:22:56 +02:00
2017-09-22 00:48:48 +02:00
// this is a list of implicit datatype conversion that SQL Server allows (https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-conversion-database-engine)
2017-09-20 01:38:12 +02:00
$compatList = array( "date" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DATE", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_DATETIME2" ),
"datetime" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DATE", "SQLSRV_SQLTYPE_TIME", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_DATETIME2" ),
"datetime2" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DATE", "SQLSRV_SQLTYPE_TIME", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_DATETIME2" ),
"smalldatetime" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DATE", "SQLSRV_SQLTYPE_TIME", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_DATETIME2" ),
"time" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_TIME", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_DATETIME2" ),
2017-10-04 22:54:52 +02:00
"datetimeoffset" => array("SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIMEOFFSET") );
2017-09-14 02:46:44 +02:00
2017-10-04 23:22:56 +02:00
$conn = AE\connect();
2017-09-14 02:46:44 +02:00
2017-10-04 23:22:56 +02:00
foreach ($dataTypes as $dataType) {
2017-09-14 02:46:44 +02:00
echo "\nTesting $dataType: \n";
$success = true;
2017-10-04 23:22:56 +02:00
2017-09-14 02:46:44 +02:00
// create table
2017-10-04 23:22:56 +02:00
$tbname = GetTempTableName("", false);
2017-10-05 01:51:15 +02:00
$colMetaArr = array( new AE\ColumnMeta($dataType, "c_det"), new AE\ColumnMeta($dataType, "c_rand", null, false));
2017-10-04 23:22:56 +02:00
AE\createTable($conn, $tbname, $colMetaArr);
2017-09-14 02:46:44 +02:00
// test each SQLSRV_SQLTYPE_ constants
2017-10-04 23:22:56 +02:00
foreach ($sqlTypes as $sqlType) {
2017-09-14 02:46:44 +02:00
// insert a row
2017-10-04 23:22:56 +02:00
$inputValues = array_slice(${explode("(", $dataType)[0] . "_params"}, 1, 2);
$sqlType = get_default_size_prec($sqlType);
2017-10-05 01:51:15 +02:00
$inputs = array(new AE\BindParamOption($inputValues[0], null, null, $sqlType), new AE\BindParamOption($inputValues[1], null, null, $sqlType));
2017-09-14 02:46:44 +02:00
$r;
2017-10-05 01:51:15 +02:00
$stmt = AE\insertRow($conn, $tbname, array( $colMetaArr[0]->colName => $inputs[0], $colMetaArr[1]->colName => $inputs[1] ), $r, AE\INSERT_PREPARE_PARAMS);
2017-10-04 23:22:56 +02:00
2017-12-13 00:32:39 +01:00
if (!AE\isDataEncrypted()) {
2017-10-04 23:22:56 +02:00
if ($r === false) {
2017-09-25 21:29:15 +02:00
$isCompatible = false;
2017-10-04 23:22:56 +02:00
foreach ($compatList[$dataType] as $compatType) {
if ($compatType == $sqlType) {
2017-09-25 21:29:15 +02:00
$isCompatible = true;
2017-10-04 23:22:56 +02:00
}
2017-09-14 02:46:44 +02:00
}
2017-09-22 00:48:48 +02:00
// 22018 is the SQLSTATE for any incompatible conversion errors
2017-10-04 23:22:56 +02:00
if ($isCompatible && sqlsrv_errors()[0]['SQLSTATE'] == 22018) {
2017-09-14 02:46:44 +02:00
echo "$sqlType should be compatible with $dataType\n";
2017-10-04 22:54:52 +02:00
var_dump(sqlsrv_errors());
2017-09-14 02:46:44 +02:00
$success = false;
}
2017-10-04 23:22:56 +02:00
}
} else {
if ($r === false) {
2017-09-22 00:48:48 +02:00
// always encrypted only allow sqlType that is identical to the encrypted column datatype
2017-10-04 23:22:56 +02:00
if ("SQLSRV_SQLTYPE_" . strtoupper($dataType) == $sqlType) {
2017-09-14 02:46:44 +02:00
echo "$sqlType should be compatible with $dataType\n";
2017-10-04 22:54:52 +02:00
var_dump(sqlsrv_errors());
2017-09-14 02:46:44 +02:00
$success = false;
}
2017-10-04 23:22:56 +02:00
} else {
2017-09-14 02:46:44 +02:00
$sql = "SELECT * FROM $tbname";
2017-10-04 23:22:56 +02:00
$stmt = sqlsrv_query($conn, $sql);
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
if ($row["c_det"] != new DateTime($inputValues[0]) || $row["c_rand"] != new DateTime($inputValues[1])) {
2017-09-14 02:46:44 +02:00
echo "Incorrect output retrieved for datatype $dataType and sqlType $sqlType.\n";
2017-10-04 23:22:56 +02:00
var_dump($inputValues);
var_dump($row);
2017-09-14 02:46:44 +02:00
$success = false;
}
2017-10-04 23:22:56 +02:00
}
2017-09-14 02:46:44 +02:00
}
2017-10-04 23:22:56 +02:00
sqlsrv_query($conn, "TRUNCATE TABLE $tbname");
2017-09-14 02:46:44 +02:00
}
2017-10-04 23:22:56 +02:00
if ($success) {
2017-09-15 00:04:55 +02:00
echo "Test successfully done.\n";
2017-10-04 23:22:56 +02:00
}
dropTable($conn, $tbname);
2017-09-14 02:46:44 +02:00
}
2017-10-04 23:22:56 +02:00
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
2017-09-14 02:46:44 +02:00
?>
--EXPECT--
2017-10-05 17:30:23 +02:00
Testing date:
2017-09-15 00:04:55 +02:00
Test successfully done.
2017-09-14 02:46:44 +02:00
2017-10-05 17:30:23 +02:00
Testing datetime:
2017-09-15 00:04:55 +02:00
Test successfully done.
2017-09-14 02:46:44 +02:00
2017-10-05 17:30:23 +02:00
Testing datetime2:
2017-09-15 00:04:55 +02:00
Test successfully done.
2017-09-14 02:46:44 +02:00
2017-10-05 17:30:23 +02:00
Testing smalldatetime:
2017-09-15 00:04:55 +02:00
Test successfully done.
2017-09-14 02:46:44 +02:00
2017-10-05 17:30:23 +02:00
Testing time:
2017-09-15 00:04:55 +02:00
Test successfully done.
2017-09-14 02:46:44 +02:00
2017-10-05 17:30:23 +02:00
Testing datetimeoffset:
2017-09-26 01:37:27 +02:00
Test successfully done.