From 208cc4a078cc26d5f81701d1900fa77053f492dd Mon Sep 17 00:00:00 2001 From: v-kaywon Date: Wed, 7 Jun 2017 13:53:04 -0700 Subject: [PATCH] Add TNIR conn option and tests --- source/pdo_sqlsrv/pdo_dbh.cpp | 10 ++++++ source/shared/core_sqlsrv.h | 2 ++ source/sqlsrv/conn.cpp | 10 ++++++ test/pdo_sqlsrv/pdo_TNIR.phpt | 60 +++++++++++++++++++++++++++++++++++ test/sqlsrv/sqlsrv_TNIR.phpt | 60 +++++++++++++++++++++++++++++++++++ 5 files changed, 142 insertions(+) create mode 100644 test/pdo_sqlsrv/pdo_TNIR.phpt create mode 100644 test/sqlsrv/sqlsrv_TNIR.phpt diff --git a/source/pdo_sqlsrv/pdo_dbh.cpp b/source/pdo_sqlsrv/pdo_dbh.cpp index 10cc9b7c..34d9449a 100644 --- a/source/pdo_sqlsrv/pdo_dbh.cpp +++ b/source/pdo_sqlsrv/pdo_dbh.cpp @@ -57,6 +57,7 @@ const char TraceFile[] = "TraceFile"; const char TraceOn[] = "TraceOn"; const char TrustServerCertificate[] = "TrustServerCertificate"; const char TransactionIsolation[] = "TransactionIsolation"; +const char TransparentNetworkIPResolution[] = "TransparentNetworkIPResolution"; const char WSID[] = "WSID"; } @@ -338,6 +339,15 @@ const connection_option PDO_CONN_OPTS[] = { CONN_ATTR_BOOL, pdo_bool_conn_str_func::func }, + { + PDOConnOptionNames::TransparentNetworkIPResolution, + sizeof(PDOConnOptionNames::TransparentNetworkIPResolution), + SQLSRV_CONN_OPTION_TRANSPARANT_NETWORK_IP_RESOLUTION, + ODBCConnOptions::TransparentNetworkIPResolution, + sizeof(ODBCConnOptions::TransparentNetworkIPResolution), + CONN_ATTR_STRING, + conn_str_append_func::func + }, { PDOConnOptionNames::WSID, sizeof( PDOConnOptionNames::WSID ), diff --git a/source/shared/core_sqlsrv.h b/source/shared/core_sqlsrv.h index dd3c3bbc..052ad745 100644 --- a/source/shared/core_sqlsrv.h +++ b/source/shared/core_sqlsrv.h @@ -1100,6 +1100,7 @@ const char TraceFile[] = "TraceFile"; const char TraceOn[] = "TraceOn"; const char TrustServerCertificate[] = "TrustServerCertificate"; const char TransactionIsolation[] = "TransactionIsolation"; +const char TransparentNetworkIPResolution[] = "TransparentNetworkIPResolution"; const char WSID[] = "WSID"; const char UID[] = "UID"; const char PWD[] = "PWD"; @@ -1128,6 +1129,7 @@ enum SQLSRV_CONN_OPTIONS { SQLSRV_CONN_OPTION_APPLICATION_INTENT, SQLSRV_CONN_OPTION_MULTI_SUBNET_FAILOVER, SQLSRV_CONN_OPTION_AUTHENTICATION, + SQLSRV_CONN_OPTION_TRANSPARANT_NETWORK_IP_RESOLUTION, #ifdef _WIN32 SQLSRV_CONN_OPTION_CONN_RETRY_COUNT, SQLSRV_CONN_OPTION_CONN_RETRY_INTERVAL, diff --git a/source/sqlsrv/conn.cpp b/source/sqlsrv/conn.cpp index b23761b4..e0ac8245 100644 --- a/source/sqlsrv/conn.cpp +++ b/source/sqlsrv/conn.cpp @@ -205,6 +205,7 @@ const char TraceFile[] = "TraceFile"; const char TraceOn[] = "TraceOn"; const char TrustServerCertificate[] = "TrustServerCertificate"; const char TransactionIsolation[] = "TransactionIsolation"; +const char TransparentNetworkIPResolution[] = "TransparentNetworkIPResolution"; const char UID[] = "UID"; const char WSID[] = "WSID"; @@ -420,6 +421,15 @@ const connection_option SS_CONN_OPTS[] = { CONN_ATTR_BOOL, bool_conn_str_func::func }, + { + SSConnOptionNames::TransparentNetworkIPResolution, + sizeof(SSConnOptionNames::TransparentNetworkIPResolution), + SQLSRV_CONN_OPTION_TRANSPARANT_NETWORK_IP_RESOLUTION, + ODBCConnOptions::TransparentNetworkIPResolution, + sizeof(ODBCConnOptions::TransparentNetworkIPResolution), + CONN_ATTR_STRING, + conn_str_append_func::func + }, { SSConnOptionNames::WSID, sizeof( SSConnOptionNames::WSID ), diff --git a/test/pdo_sqlsrv/pdo_TNIR.phpt b/test/pdo_sqlsrv/pdo_TNIR.phpt new file mode 100644 index 00000000..ec922861 --- /dev/null +++ b/test/pdo_sqlsrv/pdo_TNIR.phpt @@ -0,0 +1,60 @@ +--TEST-- +Test the TNIR keyword with enabled and disabled options and the MultiSubnetFailover keyword with true and false options +--SKIPIF-- + +--FILE-- + PDO::ERRMODE_EXCEPTION)); + echo "Connection successful with TNIR $TNIRValue and MultiSubnetFailover $MSFValueStr.\n"; + $connect_time = round(microtime(true) - $start, 2); + echo "Time to connect is $connect_time sec.\n\n"; + $conn = NULL; + } + catch(PDOException $e) { + echo "Connection failed with TNIR $TNIRValue and MultiSubnetFailover $MSFValueStr.\n"; + print_r($e->errorInfo); + } +} + +test_tnir("Enabled", false); // case temd (TNIR enabled; MultiSubnetFailover disabled) +test_tnir("Enabled", true); // case teme +test_tnir("Disabled", false); // case tdmd +test_tnir("Disabled", true); // case tdme + +// Interpreting output +// If the first resolved IP address can be connected, then the time to connect for all these cases is similar +// else if the second resolved IP address can be connected, then temd ~= tdmd > teme ~= tdme +// else tdmd > temd > teme ~= tdme +// note: the first test takes a bit longer since time is needed for the DNS to resolve the IP addresses of the server host name +?> + +--EXPECTREGEX-- +Connection successful with TNIR Enabled and MultiSubnetFailover false\. +Time to connect is [0-9]+\.[0-9]+ sec\. + +Connection successful with TNIR Enabled and MultiSubnetFailover true\. +Time to connect is [0-9]+\.[0-9]+ sec\. + +Connection successful with TNIR Disabled and MultiSubnetFailover false\. +Time to connect is [0-9]+\.[0-9]+ sec\. + +Connection successful with TNIR Disabled and MultiSubnetFailover true\. +Time to connect is [0-9]+\.[0-9]+ sec\. \ No newline at end of file diff --git a/test/sqlsrv/sqlsrv_TNIR.phpt b/test/sqlsrv/sqlsrv_TNIR.phpt new file mode 100644 index 00000000..dc4c3cba --- /dev/null +++ b/test/sqlsrv/sqlsrv_TNIR.phpt @@ -0,0 +1,60 @@ +--TEST-- +Test the TNIR keyword with enabled and disabled options and the MultiSubnetFailover keyword with true and false options +--SKIPIF-- + +--FILE-- + $GLOBALS['uid'], "PWD" => $GLOBALS['pwd'], "TransparentNetworkIPResolution" => $TNIRValue, "MultiSubnetFailover" => $MSFValue]; + $MSFValueStr = ($MSFValue) ? 'true' : 'false'; + $start = microtime(true); + $conn = sqlsrv_connect($GLOBALS['server'], $connectionInfo); + if ($conn === false) { + echo "Connection failed with TNIR $TNIRValue and MultiSubnetFailover $MSFValueStr.\n"; + print_r(sqlsrv_errors()); + } + else { + echo "Connection successful with TNIR $TNIRValue and MultiSubnetFailover $MSFValueStr.\n"; + $connect_time = round(microtime(true) - $start, 2); + echo "Time to connect is $connect_time sec.\n\n"; + } + sqlsrv_close($conn); +} + +test_tnir("Enabled", false); // case temd (TNIR enabled; MultiSubnetFailover disabled) +test_tnir("Enabled", true); // case teme +test_tnir("Disabled", false); // case tdmd +test_tnir("Disabled", true); // case tdme + +// Interpreting output +// If the first resolved IP address can be connected, then the time to connect for all these cases is similar +// else if the second resolved IP address can be connected, then temd ~= tdmd > teme ~= tdme +// else tdmd > temd > teme ~= tdme +// note: the first test takes a bit longer since time is needed for the DNS to resolve the IP addresses of the server host name +?> + +--EXPECTREGEX-- +Connection successful with TNIR Enabled and MultiSubnetFailover false\. +Time to connect is [0-9]+\.[0-9]+ sec\. + +Connection successful with TNIR Enabled and MultiSubnetFailover true\. +Time to connect is [0-9]+\.[0-9]+ sec\. + +Connection successful with TNIR Disabled and MultiSubnetFailover false\. +Time to connect is [0-9]+\.[0-9]+ sec\. + +Connection successful with TNIR Disabled and MultiSubnetFailover true\. +Time to connect is [0-9]+\.[0-9]+ sec\. \ No newline at end of file