From d1980d357089f5303a1313164cad079e43c0e77b Mon Sep 17 00:00:00 2001 From: Sicong Date: Fri, 27 Jan 2023 11:31:35 -0800 Subject: [PATCH 1/5] Set preview for beta release (#1429) --- source/shared/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/shared/version.h b/source/shared/version.h index 5303b3ce..c49495ab 100644 --- a/source/shared/version.h +++ b/source/shared/version.h @@ -31,7 +31,7 @@ #define SQLVERSION_BUILD 0 // For previews, set this constant to 1, 2 and so on. Otherwise, set it to 0 -#define PREVIEW 0 +#define PREVIEW 1 #define SEMVER_PRERELEASE // Semantic versioning build metadata, build meta data is not counted in precedence order. From e1eb5aa56b1cb56c8903b3e8d6baaf8e4fbea2f1 Mon Sep 17 00:00:00 2001 From: Sicong Date: Mon, 6 Feb 2023 10:20:03 -0800 Subject: [PATCH 2/5] Delete media, files uploaded to Wiki already (#1432) --- media/os_development.PNG | Bin 93138 -> 0 bytes media/os_production.PNG | Bin 109997 -> 0 bytes media/php_versions.PNG | Bin 49498 -> 0 bytes media/sql_server.PNG | Bin 68412 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 media/os_development.PNG delete mode 100644 media/os_production.PNG delete mode 100644 media/php_versions.PNG delete mode 100644 media/sql_server.PNG diff --git a/media/os_development.PNG b/media/os_development.PNG deleted file mode 100644 index 07bde7c38095b75c412197727e90564874acab09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93138 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 z 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 diff --git a/media/os_production.PNG b/media/os_production.PNG deleted file mode 100644 index c90fdea5cfc85b3e6152644be2fd5995792fde29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109997 zcmagFbyQn#@c&r~1&ULOQ-V9i-Mx5=1d6*9cMonwQrxA*N^y60fGHPIi{6tFSKFkZZPfvxyKR^!Esmmx1+Af2J3BEGq; zT-`%_Ah~HMNWZ9@px8$opjb<(O1*ed1IBzXeT6uF?fl`h+lv=O^#9&SiW+pMFJ3$s zDauM|c^e%)hMQ9ewKfH>1@3~bMfUuyy{sZhz0f?VM#3`w-xq1l0+)=}^55SDC-a|t zkJH}_DPD{*X&1doQ@Xn>`vrei5TyhU!Opxz|I!(u`~J^Cdx1CgAH-LPGw1PJ;raia zr<@e|N*waP7c>1IFIM^CNsxG=&D6C|m4LTGl8Wm4$KgA<62gFT zpEk>3W}NM}^5^}wf?{aNeV1OdQ{JScq>H9Ok1L}9?6XoQcajIiP&W+IQ!oz1g_ETI zK3j*EV);+~i|0S}GqbaK%E-Lp&T58^JE#wQ6qau1GqoXyxZAMe&DUA&g_{ncJ?^rFqdUXSc}5|$o(!T?+_56(mL%E8Zqnor!!`GO;D~+gMqyO6Xff_ zo9pNXpAV3O6i!@fM)lQ@3zVGt=6X)u*^q3I>@`*m4wQC9^t9}=IFbmw$8n7*c=A=7 z{pfDoXCr8mceCMW7)TYDy@fnfA2S&Ghj(G#&*-pUNUSPgEbgyx+8^_+<_XwYyU^PY z=<@3i!s*ViHvK82U_q>pCsYH#*_l&}&6$~*S~S0@de;#56;XWC*1valpsymPZMF*c z2@(3h>vq2*wYh22`dE9HN{LIYQ=O7Oox4SweC!?@gK=sy%f{2y$@-8VLypToC93Jm zPgsv&=w*9~$h`4J>J;yP@RyOY6Lg1)Y`ie9LL)gGs1E zo=tuBH%-9`%zYcmhtrprvlS@ji?h<4Vb9tOtiJ4W!C7}G!vSM5^-QwH7-mIoYBwIE%ri{f`u@uQN?fHkFual3?=-r8>4#N# zv#GoBWT_i9$jt1=xP%0rF{CQq+#~;X2jwx^@6)o*p{l_ZU+xv|gsnc)O&P6`JBfgk z0NYd80P_K^y%4azoNP@s#(&lSg~VuZ*KU!mtJ*A3qNC}@?9BPMS^g!kzm3Surwapj zy;fY`av#myKdw^(TGa}$;&(X$@vi%wcS%GqweEu=runZBeo6GI7TvYZxC>+zE?-gv2Cb#e%_~Z3DEaiE_D~T)?kTS35FBqw60Z$6 z$j0to@he9XkFS&j3XCLI%;%5y*R0-tV6#xi(@C<)}7GIRBT;pb$j@Gk*` zNR!H;j=-Y>53=tWp`{$uoea)UNc z)u$U6ZU(E(Bq-@1U@05E2CpZ0t^P#iuIw=2OswELVFN{3_AT8)$Wm3zFvE;v&JySqvE$wx-x z{7vN}yQGaB)a)8bVuW-(U2^z!y?9zem876}sxKO(<(M+x>K_;on=c^~aAd2{Z;Gb~ zpFVAUH4bs;vQf(xG@WJ9ERM}V{^P}CJyE|G1)jaSM64<5t2ZGkyM2+kY49Bgq*Swn zrgM@&EXa9mBR@3F?;}wGieaYRM&U}w)_lqT%s}ec&&9YP14hsq)duVaeY{S

4#QiiV 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⪻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

&+1ob$#XAm504@ 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 T(eL#u;E%ktveXX=qk#Vf+lYpB diff --git a/media/sql_server.PNG b/media/sql_server.PNG deleted file mode 100644 index 976c2ddee98f3040255cdb63307f5b8ce09281aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68412 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 HCISBo6hUBM From 11509df4d3f50f2e8339f5647b98a90a8a05557c Mon Sep 17 00:00:00 2001 From: Sicong Date: Mon, 27 Feb 2023 15:01:16 -0800 Subject: [PATCH 3/5] CodeQL warnings fix (#1439) --- source/pdo_sqlsrv/pdo_dbh.cpp | 274 +++++++++++++------------- source/pdo_sqlsrv/pdo_parser.cpp | 130 ++++++------- source/pdo_sqlsrv/pdo_stmt.cpp | 194 +++++++++---------- source/shared/core_conn.cpp | 20 +- source/shared/core_results.cpp | 142 +++++++------- source/shared/core_sqlsrv.h | 78 ++++---- source/shared/core_stmt.cpp | 206 ++++++++++---------- source/shared/core_stream.cpp | 40 ++-- source/shared/core_util.cpp | 60 +++--- source/sqlsrv/conn.cpp | 318 +++++++++++++++---------------- source/sqlsrv/php_sqlsrv_int.h | 84 ++++---- source/sqlsrv/stmt.cpp | 60 +++--- source/sqlsrv/util.cpp | 214 ++++++++++----------- 13 files changed, 910 insertions(+), 910 deletions(-) diff --git a/source/pdo_sqlsrv/pdo_dbh.cpp b/source/pdo_sqlsrv/pdo_dbh.cpp index 6473b2e3..8991c7f8 100644 --- a/source/pdo_sqlsrv/pdo_dbh.cpp +++ b/source/pdo_sqlsrv/pdo_dbh.cpp @@ -7,13 +7,13 @@ // Copyright(c) Microsoft Corporation // All rights reserved. // MIT License -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), -// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), +// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, // and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions : // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. //--------------------------------------------------------------------------------------------------------------------------------- @@ -34,7 +34,7 @@ namespace { const char LAST_INSERT_ID_QUERY[] = "SELECT @@IDENTITY;"; const size_t LAST_INSERT_ID_BUFF_LEN = 50; // size of the buffer to hold the string value of the last inserted id, which may be an int, bigint, decimal(p,0) or numeric(p,0) -const char SEQUENCE_CURRENT_VALUE_QUERY[] = "SELECT current_value FROM sys.sequences WHERE name=N'%s'"; +const char SEQUENCE_CURRENT_VALUE_QUERY[] = "SELECT current_value FROM sys.sequences WHERE name=N'%s'"; const int LAST_INSERT_ID_QUERY_MAX_LEN = sizeof( SEQUENCE_CURRENT_VALUE_QUERY ) + SQL_MAX_SQLSERVERNAME + 2; // include the quotes // List of PDO supported connection options. @@ -95,7 +95,7 @@ enum PDO_STMT_OPTIONS { // List of all the statement options supported by this driver. const stmt_option PDO_STMT_OPTS[] = { - + { NULL, 0, SQLSRV_STMT_OPTION_QUERY_TIMEOUT, std::unique_ptr( new stmt_option_query_timeout ) }, { NULL, 0, SQLSRV_STMT_OPTION_SCROLLABLE, std::unique_ptr( new stmt_option_pdo_scrollable ) }, { NULL, 0, PDO_STMT_OPTION_ENCODING, std::unique_ptr( new stmt_option_encoding ) }, @@ -113,12 +113,12 @@ const stmt_option PDO_STMT_OPTS[] = { }; // boolean connection string -struct pdo_bool_conn_str_func +struct pdo_bool_conn_str_func { static void func( _In_ connection_option const* option, _Inout_ zval* value, sqlsrv_conn* /*conn*/, _Out_ std::string& conn_str ); }; -struct pdo_txn_isolation_conn_attr_func +struct pdo_txn_isolation_conn_attr_func { static void func( connection_option const* /*option*/, _In_ zval* value_z, _Inout_ sqlsrv_conn* conn, std::string& /*conn_str*/ ); }; @@ -130,7 +130,7 @@ struct pdo_int_conn_str_func { SQLSRV_ASSERT(Z_TYPE_P(value) == IS_STRING, "Wrong zval type for this keyword"); std::string val_str = Z_STRVAL_P( value ); - + conn_str += option->odbc_name; conn_str += "={"; conn_str += val_str; @@ -180,9 +180,9 @@ struct pdo_int_conn_attr_func { static void func( connection_option const* /*option*/, _In_ zval* value, _Inout_ sqlsrv_conn* conn, std::string& /*conn_str*/ ) { try { - + SQLSRV_ASSERT( Z_TYPE_P( value ) == IS_STRING, "pdo_int_conn_attr_func: Unexpected zval type." ); - + size_t val = static_cast( atoi( Z_STRVAL_P( value )) ); core::SQLSetConnectAttr( conn, Attr, reinterpret_cast( val ), SQL_IS_UINTEGER ); } @@ -198,8 +198,8 @@ struct pdo_bool_conn_attr_func { static void func( connection_option const* /*option*/, _Inout_ zval* value, _Inout_ sqlsrv_conn* conn, std::string& /*conn_str*/ ) { try { - - core::SQLSetConnectAttr( conn, Attr, reinterpret_cast( core_str_zval_is_true( value )), + + core::SQLSetConnectAttr( conn, Attr, reinterpret_cast( core_str_zval_is_true( value )), SQL_IS_UINTEGER ); } catch( core::CoreException& ) { @@ -209,7 +209,7 @@ struct pdo_bool_conn_attr_func { }; // statement options related functions -void add_stmt_option_key( _Inout_ sqlsrv_context& ctx, _In_ size_t key, _Inout_ HashTable* options_ht, +void add_stmt_option_key( _Inout_ sqlsrv_context& ctx, _In_ size_t key, _Inout_ HashTable* options_ht, _Inout_ zval** data ); void validate_stmt_options( _Inout_ sqlsrv_context& ctx, _Inout_ zval* stmt_options, _Inout_ HashTable* pdo_stmt_options_ht ); @@ -218,50 +218,50 @@ void validate_stmt_options( _Inout_ sqlsrv_context& ctx, _Inout_ zval* stmt_opti // List of all connection options supported by this driver. const connection_option PDO_CONN_OPTS[] = { - { + { PDOConnOptionNames::Server, sizeof( PDOConnOptionNames::Server ), PDO_CONN_OPTION_SERVER, NULL, 0, CONN_ATTR_STRING, - conn_str_append_func::func + conn_str_append_func::func }, - { + { PDOConnOptionNames::APP, sizeof( PDOConnOptionNames::APP ), SQLSRV_CONN_OPTION_APP, ODBCConnOptions::APP, sizeof( ODBCConnOptions::APP ), CONN_ATTR_STRING, - conn_str_append_func::func + conn_str_append_func::func }, { PDOConnOptionNames::AccessToken, sizeof( PDOConnOptionNames::AccessToken ), SQLSRV_CONN_OPTION_ACCESS_TOKEN, ODBCConnOptions::AccessToken, - sizeof( ODBCConnOptions::AccessToken), + sizeof( ODBCConnOptions::AccessToken), CONN_ATTR_STRING, access_token_set_func::func }, - { + { PDOConnOptionNames::ApplicationIntent, sizeof( PDOConnOptionNames::ApplicationIntent ), SQLSRV_CONN_OPTION_APPLICATION_INTENT, ODBCConnOptions::ApplicationIntent, sizeof( ODBCConnOptions::ApplicationIntent ), CONN_ATTR_STRING, - conn_str_append_func::func + conn_str_append_func::func }, - { + { PDOConnOptionNames::AttachDBFileName, sizeof( PDOConnOptionNames::AttachDBFileName ), SQLSRV_CONN_OPTION_ATTACHDBFILENAME, ODBCConnOptions::AttachDBFileName, sizeof( ODBCConnOptions::AttachDBFileName ), CONN_ATTR_STRING, - conn_str_append_func::func + conn_str_append_func::func }, { PDOConnOptionNames::Authentication, @@ -339,17 +339,17 @@ const connection_option PDO_CONN_OPTS[] = { PDOConnOptionNames::Encrypt, sizeof( PDOConnOptionNames::Encrypt ), SQLSRV_CONN_OPTION_ENCRYPT, - ODBCConnOptions::Encrypt, + ODBCConnOptions::Encrypt, sizeof( ODBCConnOptions::Encrypt ), CONN_ATTR_MIXED, pdo_encrypt_set_func::func }, - { + { PDOConnOptionNames::Failover_Partner, sizeof( PDOConnOptionNames::Failover_Partner ), SQLSRV_CONN_OPTION_FAILOVER_PARTNER, ODBCConnOptions::Failover_Partner, - sizeof( ODBCConnOptions::Failover_Partner ), + sizeof( ODBCConnOptions::Failover_Partner ), CONN_ATTR_STRING, conn_str_append_func::func }, @@ -360,7 +360,7 @@ const connection_option PDO_CONN_OPTS[] = { ODBCConnOptions::KeyStoreAuthentication, sizeof( ODBCConnOptions::KeyStoreAuthentication ), CONN_ATTR_STRING, - ce_akv_str_set_func::func + ce_akv_str_set_func::func }, { PDOConnOptionNames::KeyStorePrincipalId, @@ -369,7 +369,7 @@ const connection_option PDO_CONN_OPTS[] = { ODBCConnOptions::KeyStorePrincipalId, sizeof( ODBCConnOptions::KeyStorePrincipalId ), CONN_ATTR_STRING, - ce_akv_str_set_func::func + ce_akv_str_set_func::func }, { PDOConnOptionNames::KeyStoreSecret, @@ -387,7 +387,7 @@ const connection_option PDO_CONN_OPTS[] = { ODBCConnOptions::LoginTimeout, sizeof( ODBCConnOptions::LoginTimeout ), CONN_ATTR_INT, - pdo_int_conn_attr_func::func + pdo_int_conn_attr_func::func }, { PDOConnOptionNames::MARS_Option, @@ -421,9 +421,9 @@ const connection_option PDO_CONN_OPTS[] = { sizeof( PDOConnOptionNames::TraceFile ), SQLSRV_CONN_OPTION_TRACE_FILE, ODBCConnOptions::TraceFile, - sizeof( ODBCConnOptions::TraceFile ), + sizeof( ODBCConnOptions::TraceFile ), CONN_ATTR_STRING, - str_conn_attr_func::func + str_conn_attr_func::func }, { PDOConnOptionNames::TraceOn, @@ -467,7 +467,7 @@ const connection_option PDO_CONN_OPTS[] = { SQLSRV_CONN_OPTION_WSID, ODBCConnOptions::WSID, sizeof( ODBCConnOptions::WSID ), - CONN_ATTR_STRING, + CONN_ATTR_STRING, conn_str_append_func::func }, { @@ -597,7 +597,7 @@ pdo_sqlsrv_dbh::pdo_sqlsrv_dbh( _In_ SQLHANDLE h, _In_ error_callback e, _In_ vo fetch_numeric( false ), fetch_datetime( false ), format_decimals( false ), - decimal_places( NO_CHANGE_DECIMAL_PLACES ), + decimal_places( NO_CHANGE_DECIMAL_PLACES ), use_national_characters(CHARSET_PREFERENCE_NOT_SPECIFIED), emulate_prepare(false) { @@ -608,11 +608,11 @@ pdo_sqlsrv_dbh::pdo_sqlsrv_dbh( _In_ SQLHANDLE h, _In_ error_callback e, _In_ vo } // pdo_sqlsrv_db_handle_factory -// Maps to PDO::__construct. +// Maps to PDO::__construct. // Factory method called by the PDO driver manager to create a SQLSRV PDO connection. // Does the following things: -// 1.Sets the error handling temporarily to PDO_ERRMODE_EXCEPTION. -// (If an error occurs in this function, the PDO specification mandates that +// 1.Sets the error handling temporarily to PDO_ERRMODE_EXCEPTION. +// (If an error occurs in this function, the PDO specification mandates that // an exception be thrown, regardless of the error mode setting.) // 2. Processes the driver options. // 3. Creates a core_conn object by calling core_sqlsrv_connect. @@ -623,7 +623,7 @@ pdo_sqlsrv_dbh::pdo_sqlsrv_dbh( _In_ SQLHANDLE h, _In_ error_callback e, _In_ vo // driver_options - A HashTable (within the zval) of options to use when creating the connection. // Return: // 0 for failure, 1 for success. -int pdo_sqlsrv_db_handle_factory( _Inout_ pdo_dbh_t *dbh, _In_opt_ zval *driver_options) +int pdo_sqlsrv_db_handle_factory( _Inout_ pdo_dbh_t *dbh, _In_opt_ zval *driver_options) { PDO_LOG_DBH_ENTRY; @@ -640,7 +640,7 @@ int pdo_sqlsrv_db_handle_factory( _Inout_ pdo_dbh_t *dbh, _In_opt_ zval *driver_ ZVAL_UNDEF( &server_z ); try { - + // no matter what the error mode, we want exceptions thrown if the connection fails // to happen (per the PDO spec) dbh->error_mode = PDO_ERRMODE_EXCEPTION; @@ -656,23 +656,23 @@ int pdo_sqlsrv_db_handle_factory( _Inout_ pdo_dbh_t *dbh, _In_opt_ zval *driver_ dbh->refcount--; throw pdo::PDOException(); } - + // Initialize the options array to be passed to the core layer ALLOC_HASHTABLE( pdo_conn_options_ht ); - core::sqlsrv_zend_hash_init( *g_pdo_henv_cp, pdo_conn_options_ht, 10 /* # of buckets */, + core::sqlsrv_zend_hash_init( *g_pdo_henv_cp, pdo_conn_options_ht, 10 /* # of buckets */, ZVAL_PTR_DTOR, 0 /*persistent*/ ); // Either of g_pdo_henv_cp or g_pdo_henv_ncp can be used to propogate the error. - dsn_parser = new ( sqlsrv_malloc( sizeof( conn_string_parser ))) conn_string_parser( *g_pdo_henv_cp, dbh->data_source, + dsn_parser = new ( sqlsrv_malloc( sizeof( conn_string_parser ))) conn_string_parser( *g_pdo_henv_cp, dbh->data_source, static_cast( dbh->data_source_len ), pdo_conn_options_ht ); dsn_parser->parse_conn_string(); - + // Extract the server name temp_server_z = zend_hash_index_find( pdo_conn_options_ht, PDO_CONN_OPTION_SERVER ); CHECK_CUSTOM_ERROR(( temp_server_z == NULL ), g_pdo_henv_cp, PDO_SQLSRV_ERROR_SERVER_NOT_SPECIFIED ) { - + throw pdo::PDOException(); } @@ -682,13 +682,13 @@ int pdo_sqlsrv_db_handle_factory( _Inout_ pdo_dbh_t *dbh, _In_opt_ zval *driver_ zval_add_ref( &server_z ); zend_hash_index_del( pdo_conn_options_ht, PDO_CONN_OPTION_SERVER ); - sqlsrv_conn* conn = core_sqlsrv_connect( *g_pdo_henv_cp, *g_pdo_henv_ncp, core::allocate_conn, Z_STRVAL( server_z ), - dbh->username, dbh->password, pdo_conn_options_ht, pdo_sqlsrv_handle_dbh_error, + sqlsrv_conn* conn = core_sqlsrv_connect( *g_pdo_henv_cp, *g_pdo_henv_ncp, core::allocate_conn, Z_STRVAL( server_z ), + dbh->username, dbh->password, pdo_conn_options_ht, pdo_sqlsrv_handle_dbh_error, PDO_CONN_OPTS, dbh, "pdo_sqlsrv_db_handle_factory" ); // Free the string in server_z after being used zend_string_release( Z_STR( server_z )); - + SQLSRV_ASSERT( conn != NULL, "Invalid connection returned. Exception should have been thrown." ); // set the driver_data and methods to complete creation of the PDO object @@ -699,13 +699,13 @@ int pdo_sqlsrv_db_handle_factory( _Inout_ pdo_dbh_t *dbh, _In_opt_ zval *driver_ } catch( core::CoreException& ) { - + if ( Z_TYPE( server_z ) == IS_STRING ) { zend_string_release( Z_STR( server_z )); } dbh->error_mode = prev_err_mode; // reset the error mode g_pdo_henv_cp->last_error().reset(); // reset the last error; callee will check if last_error exist before freeing it and setting it to NULL - + return 0; } catch( ... ) { @@ -719,8 +719,8 @@ int pdo_sqlsrv_db_handle_factory( _Inout_ pdo_dbh_t *dbh, _In_opt_ zval *driver_ // pdo_sqlsrv_dbh_close // Maps to PDO::__destruct. // Called when a PDO object is to be destroyed. -// By the time this function is called, PDO has already made sure that -// all statements are disposed and the PDO object is the last item destroyed. +// By the time this function is called, PDO has already made sure that +// all statements are disposed and the PDO object is the last item destroyed. // Parameters: // dbh - The PDO managed connection object. // Return: @@ -788,7 +788,7 @@ bool pdo_sqlsrv_dbh_prepare(_Inout_ pdo_dbh_t *dbh, _In_ zend_string *sql_zstr, try { - // assign the methods for the statement object. This is necessary even if the + // assign the methods for the statement object. This is necessary even if the // statement fails so the user can retrieve the error information. stmt->methods = &pdo_sqlsrv_stmt_methods; // if not emulate_prepare, we support parameterized queries with ?, not names @@ -796,20 +796,20 @@ bool pdo_sqlsrv_dbh_prepare(_Inout_ pdo_dbh_t *dbh, _In_ zend_string *sql_zstr, // Initialize the options array to be passed to the core layer ALLOC_HASHTABLE( pdo_stmt_options_ht ); - core::sqlsrv_zend_hash_init( *driver_dbh , pdo_stmt_options_ht, 3 /* # of buckets */, + core::sqlsrv_zend_hash_init( *driver_dbh , pdo_stmt_options_ht, 3 /* # of buckets */, ZVAL_PTR_DTOR, 0 /*persistent*/ ); - + // Either of g_pdo_henv_cp or g_pdo_henv_ncp can be used to propogate the error. validate_stmt_options( *driver_dbh, driver_options, pdo_stmt_options_ht ); driver_stmt = static_cast( core_sqlsrv_create_stmt( driver_dbh, core::allocate_stmt, - pdo_stmt_options_ht, PDO_STMT_OPTS, + pdo_stmt_options_ht, PDO_STMT_OPTS, pdo_sqlsrv_handle_stmt_error, stmt )); // if the user didn't set anything in the prepare options, then set the buffer limit // to the value set on the connection. if( driver_stmt->buffered_query_limit== sqlsrv_buffered_result_set::BUFFERED_QUERY_LIMIT_INVALID ) { - + driver_stmt->buffered_query_limit = driver_dbh->client_buffer_max_size; } @@ -888,7 +888,7 @@ bool pdo_sqlsrv_dbh_prepare(_Inout_ pdo_dbh_t *dbh, _In_ zend_string *sql_zstr, } stmt->driver_data = driver_stmt; - driver_stmt.transferred(); + driver_stmt.transferred(); } // everything is cleaned up by this point // catch everything so the exception doesn't spill into the calling PDO code @@ -903,7 +903,7 @@ bool pdo_sqlsrv_dbh_prepare(_Inout_ pdo_dbh_t *dbh, _In_ zend_string *sql_zstr, // connection with the error's SQLSTATE. if( driver_dbh->last_error() ) { - strcpy_s( dbh->error_code, sizeof( dbh->error_code ), + strcpy_s( dbh->error_code, sizeof( dbh->error_code ), reinterpret_cast( driver_dbh->last_error()->sqlstate )); } @@ -930,7 +930,7 @@ bool pdo_sqlsrv_dbh_prepare(_Inout_ pdo_dbh_t *dbh, _In_ zend_string *sql_zstr, // pdo_sqlsrv_dbh_do // Maps to PDO::exec. -// Execute a SQL statement, such as an insert, update or delete, and return +// Execute a SQL statement, such as an insert, update or delete, and return // the number of rows affected. // Parameters: // dbh - the PDO connection object, which contains the ODBC handle @@ -958,7 +958,7 @@ zend_long pdo_sqlsrv_dbh_do(_Inout_ pdo_dbh_t *dbh, _In_ const zend_string *sql) SQLSRV_STATIC_ASSERT( sizeof( rows ) == sizeof( SQLLEN )); try { - + SQLSRV_ASSERT( sql != NULL, "NULL or empty SQL string passed." ); SQLSRV_ASSERT( driver_dbh != NULL, "pdo_sqlsrv_dbh_do: driver_data object was NULL."); @@ -966,7 +966,7 @@ zend_long pdo_sqlsrv_dbh_do(_Inout_ pdo_dbh_t *dbh, _In_ const zend_string *sql) pdo_stmt_t temp_stmt; temp_stmt.dbh = dbh; // allocate a full driver statement to take advantage of the error handling - driver_stmt = core_sqlsrv_create_stmt( driver_dbh, core::allocate_stmt, NULL /*options_ht*/, + driver_stmt = core_sqlsrv_create_stmt( driver_dbh, core::allocate_stmt, NULL /*options_ht*/, NULL /*valid_stmt_opts*/, pdo_sqlsrv_handle_stmt_error, &temp_stmt ); driver_stmt->set_func( __FUNCTION__ ); @@ -1004,11 +1004,11 @@ zend_long pdo_sqlsrv_dbh_do(_Inout_ pdo_dbh_t *dbh, _In_ const zend_string *sql) strcpy_s( dbh->error_code, sizeof( dbh->error_code ), reinterpret_cast( driver_stmt->last_error()->sqlstate )); driver_dbh->set_last_error( driver_stmt->last_error() ); - + if( driver_stmt ) { driver_stmt->~sqlsrv_stmt(); } - + return -1; } catch( ... ) { @@ -1028,7 +1028,7 @@ zend_long pdo_sqlsrv_dbh_do(_Inout_ pdo_dbh_t *dbh, _In_ const zend_string *sql) // pdo_sqlsrv_dbh_begin // Maps to PDO::beginTransaction. -// Begins a transaction. Turns off auto-commit mode. The pdo_dbh_t::in_txn +// Begins a transaction. Turns off auto-commit mode. The pdo_dbh_t::in_txn // flag is maintained by PDO so we dont have to worry about it. // Parameters: // dbh - The PDO managed connection object. @@ -1046,17 +1046,17 @@ bool pdo_sqlsrv_dbh_begin(_Inout_ pdo_dbh_t *dbh) PDO_LOG_DBH_ENTRY; try { - + SQLSRV_ASSERT( dbh != NULL, "pdo_sqlsrv_dbh_begin: pdo_dbh_t object was null" ); sqlsrv_conn* driver_conn = reinterpret_cast( dbh->driver_data ); - + SQLSRV_ASSERT( driver_conn != NULL, "pdo_sqlsrv_dbh_begin: driver_data object was null" ); DEBUG_SQLSRV_ASSERT( !dbh->in_txn, "pdo_sqlsrv_dbh_begin: Already in transaction" ); core_sqlsrv_begin_transaction( driver_conn ); - + #if PHP_VERSION_ID < 80100 return 1; #else @@ -1071,7 +1071,7 @@ bool pdo_sqlsrv_dbh_begin(_Inout_ pdo_dbh_t *dbh) #endif } catch( ... ) { - + DIE ("pdo_sqlsrv_dbh_begin: Uncaught exception occurred."); } // Should not have reached here but adding this due to compilation warnings @@ -1088,7 +1088,7 @@ bool pdo_sqlsrv_dbh_begin(_Inout_ pdo_dbh_t *dbh) // Maps to PDO::commit. // Commits a transaction. Returns the connection to auto-commit mode. // PDO throws error if PDO::commit is called on a connection that is not in an active -// transaction. The pdo_dbh_t::in_txn flag is maintained by PDO so we dont have +// transaction. The pdo_dbh_t::in_txn flag is maintained by PDO so we dont have // to worry about it here. // Parameters: // dbh - The PDO managed connection object. @@ -1106,17 +1106,17 @@ bool pdo_sqlsrv_dbh_commit(_Inout_ pdo_dbh_t *dbh) PDO_LOG_DBH_ENTRY; try { - + SQLSRV_ASSERT( dbh != NULL, "pdo_sqlsrv_dbh_commit: pdo_dbh_t object was null" ); - + sqlsrv_conn* driver_conn = reinterpret_cast( dbh->driver_data ); - + SQLSRV_ASSERT( driver_conn != NULL, "pdo_sqlsrv_dbh_commit: driver_data object was null" ); - + DEBUG_SQLSRV_ASSERT( dbh->in_txn, "pdo_sqlsrv_dbh_commit: Not in transaction" ); - + core_sqlsrv_commit( driver_conn ); - + #if PHP_VERSION_ID < 80100 return 1; #else @@ -1131,7 +1131,7 @@ bool pdo_sqlsrv_dbh_commit(_Inout_ pdo_dbh_t *dbh) #endif } catch( ... ) { - + DIE ("pdo_sqlsrv_dbh_commit: Uncaught exception occurred."); } @@ -1147,7 +1147,7 @@ bool pdo_sqlsrv_dbh_commit(_Inout_ pdo_dbh_t *dbh) // Maps to PDO::rollback. // Rolls back a transaction. Returns the connection in auto-commit mode. // PDO throws error if PDO::rollBack is called on a connection that is not in an active -// transaction. The pdo_dbh_t::in_txn flag is maintained by PDO so we dont have +// transaction. The pdo_dbh_t::in_txn flag is maintained by PDO so we dont have // to worry about it here. // Parameters: // dbh - The PDO managed connection object. @@ -1166,15 +1166,15 @@ bool pdo_sqlsrv_dbh_rollback(_Inout_ pdo_dbh_t *dbh) try { SQLSRV_ASSERT( dbh != NULL, "pdo_sqlsrv_dbh_rollback: pdo_dbh_t object was null" ); - + sqlsrv_conn* driver_conn = reinterpret_cast( dbh->driver_data ); - + SQLSRV_ASSERT( driver_conn != NULL, "pdo_sqlsrv_dbh_rollback: driver_data object was null" ); - + DEBUG_SQLSRV_ASSERT( dbh->in_txn, "pdo_sqlsrv_dbh_rollback: Not in transaction" ); - + core_sqlsrv_rollback( driver_conn ); - + #if PHP_VERSION_ID < 80100 return 1; #else @@ -1190,7 +1190,7 @@ bool pdo_sqlsrv_dbh_rollback(_Inout_ pdo_dbh_t *dbh) #endif } catch( ... ) { - + DIE ("pdo_sqlsrv_dbh_rollback: Uncaught exception occurred."); } // Should not have reached here but adding this due to compilation warnings @@ -1204,7 +1204,7 @@ bool pdo_sqlsrv_dbh_rollback(_Inout_ pdo_dbh_t *dbh) // pdo_sqlsrv_dbh_set_attr // Maps to PDO::setAttribute. Sets an attribute on the PDO connection object. // PDO driver manager calls this function directly after calling the factory -// method for PDO, for any attribute which is specified in the PDO constructor. +// method for PDO, for any attribute which is specified in the PDO constructor. // Parameters: // dbh - The PDO connection object maintained by PDO. // attr - The attribute to be set. @@ -1260,7 +1260,7 @@ bool pdo_sqlsrv_dbh_set_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout case SQLSRV_ATTR_QUERY_TIMEOUT: if( Z_TYPE_P( val ) != IS_LONG || Z_LVAL_P( val ) < 0 ) { convert_to_string( val ); - THROW_PDO_ERROR( driver_dbh, SQLSRV_ERROR_INVALID_QUERY_TIMEOUT_VALUE, Z_STRVAL_P( val )); + THROW_PDO_ERROR( driver_dbh, SQLSRV_ERROR_INVALID_QUERY_TIMEOUT_VALUE, Z_STRVAL_P( val ), NULL); } driver_dbh->query_timeout = static_cast( Z_LVAL_P( val ) ); break; @@ -1268,7 +1268,7 @@ bool pdo_sqlsrv_dbh_set_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout case SQLSRV_ATTR_CLIENT_BUFFER_MAX_KB_SIZE: if( Z_TYPE_P( val ) != IS_LONG || Z_LVAL_P( val ) <= 0 ) { convert_to_string( val ); - THROW_PDO_ERROR( driver_dbh, SQLSRV_ERROR_INVALID_BUFFER_LIMIT, Z_STRVAL_P( val )); + THROW_PDO_ERROR( driver_dbh, SQLSRV_ERROR_INVALID_BUFFER_LIMIT, Z_STRVAL_P( val ), NULL); } driver_dbh->client_buffer_max_size = Z_LVAL_P( val ); break; @@ -1324,11 +1324,11 @@ bool pdo_sqlsrv_dbh_set_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout #endif // Not supported - case PDO_ATTR_FETCH_TABLE_NAMES: - case PDO_ATTR_FETCH_CATALOG_NAMES: + case PDO_ATTR_FETCH_TABLE_NAMES: + case PDO_ATTR_FETCH_CATALOG_NAMES: case PDO_ATTR_PREFETCH: case PDO_ATTR_MAX_COLUMN_LEN: - case PDO_ATTR_CURSOR_NAME: + case PDO_ATTR_CURSOR_NAME: case PDO_ATTR_AUTOCOMMIT: case PDO_ATTR_PERSISTENT: case PDO_ATTR_TIMEOUT: @@ -1338,10 +1338,10 @@ bool pdo_sqlsrv_dbh_set_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout // Read-only case PDO_ATTR_SERVER_VERSION: - case PDO_ATTR_SERVER_INFO: + case PDO_ATTR_SERVER_INFO: case PDO_ATTR_CLIENT_VERSION: case PDO_ATTR_DRIVER_NAME: - case PDO_ATTR_CONNECTION_STATUS: + case PDO_ATTR_CONNECTION_STATUS: { THROW_PDO_ERROR( driver_dbh, PDO_SQLSRV_ERROR_READ_ONLY_DBH_ATTR ); } @@ -1356,7 +1356,7 @@ bool pdo_sqlsrv_dbh_set_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout break; // Statement level only case PDO_ATTR_CURSOR: - case SQLSRV_ATTR_CURSOR_SCROLL_TYPE: + case SQLSRV_ATTR_CURSOR_SCROLL_TYPE: case SQLSRV_ATTR_DATA_CLASSIFICATION: { THROW_PDO_ERROR( driver_dbh, PDO_SQLSRV_ERROR_STMT_LEVEL_ATTR ); @@ -1411,8 +1411,8 @@ int pdo_sqlsrv_dbh_get_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout_ switch( attr ) { // Not supported - case PDO_ATTR_FETCH_TABLE_NAMES: - case PDO_ATTR_FETCH_CATALOG_NAMES: + case PDO_ATTR_FETCH_TABLE_NAMES: + case PDO_ATTR_FETCH_CATALOG_NAMES: case PDO_ATTR_PREFETCH: case PDO_ATTR_MAX_COLUMN_LEN: case PDO_ATTR_CURSOR_NAME: @@ -1420,7 +1420,7 @@ int pdo_sqlsrv_dbh_get_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout_ case PDO_ATTR_TIMEOUT: { #if PHP_VERSION_ID < 80100 - // PDO does not throw "not supported" error message for these attributes. + // PDO does not throw "not supported" error message for these attributes. THROW_PDO_ERROR(driver_dbh, PDO_SQLSRV_ERROR_UNSUPPORTED_DBH_ATTR); #else return 0; @@ -1435,12 +1435,12 @@ int pdo_sqlsrv_dbh_get_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout_ // Statement level only case PDO_ATTR_CURSOR: - case SQLSRV_ATTR_CURSOR_SCROLL_TYPE: + case SQLSRV_ATTR_CURSOR_SCROLL_TYPE: case SQLSRV_ATTR_DATA_CLASSIFICATION: { THROW_PDO_ERROR( driver_dbh, PDO_SQLSRV_ERROR_STMT_LEVEL_ATTR ); } - + case PDO_ATTR_STRINGIFY_FETCHES: { // For this attribute, if we dont set the return_value than PDO returns NULL. @@ -1453,13 +1453,13 @@ int pdo_sqlsrv_dbh_get_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout_ core_sqlsrv_get_server_info( driver_dbh, return_value ); break; } - + case PDO_ATTR_SERVER_VERSION: { core_sqlsrv_get_server_version( driver_dbh, return_value ); break; } - + case PDO_ATTR_CLIENT_VERSION: { core_sqlsrv_get_client_info( driver_dbh, return_value ); @@ -1473,13 +1473,13 @@ int pdo_sqlsrv_dbh_get_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout_ } case SQLSRV_ATTR_ENCODING: - { + { ZVAL_LONG( return_value, driver_dbh->encoding() ); break; } case SQLSRV_ATTR_QUERY_TIMEOUT: - { + { ZVAL_LONG( return_value, ( driver_dbh->query_timeout == QUERY_TIMEOUT_INVALID ? 0 : driver_dbh->query_timeout )); break; } @@ -1491,7 +1491,7 @@ int pdo_sqlsrv_dbh_get_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout_ } case SQLSRV_ATTR_CLIENT_BUFFER_MAX_KB_SIZE: - { + { ZVAL_LONG( return_value, driver_dbh->client_buffer_max_size ); break; } @@ -1515,7 +1515,7 @@ int pdo_sqlsrv_dbh_get_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout_ } case SQLSRV_ATTR_DECIMAL_PLACES: - { + { ZVAL_LONG( return_value, driver_dbh->decimal_places ); break; } @@ -1528,7 +1528,7 @@ int pdo_sqlsrv_dbh_get_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout_ } #endif - default: + default: { THROW_PDO_ERROR( driver_dbh, PDO_SQLSRV_ERROR_INVALID_DBH_ATTR ); break; @@ -1573,7 +1573,7 @@ void pdo_sqlsrv_dbh_return_error(_In_ pdo_dbh_t *dbh, _In_opt_ pdo_stmt_t *stmt, else { ctx_error = static_cast( dbh->driver_data )->last_error(); } - + pdo_sqlsrv_retrieve_context_error( ctx_error, info ); #if PHP_VERSION_ID < 80100 @@ -1629,7 +1629,7 @@ zend_string * pdo_sqlsrv_dbh_last_id(_Inout_ pdo_dbh_t *dbh, _In_ const zend_str #endif wsql_string = utf16_string_from_mbcs_string(SQLSRV_ENCODING_CHAR, buffer, sizeof(buffer), &wsql_len); } - CHECK_CUSTOM_ERROR(wsql_string == 0, driver_stmt, SQLSRV_ERROR_QUERY_STRING_ENCODING_TRANSLATE, get_last_error_message()) { + CHECK_CUSTOM_ERROR(wsql_string == 0, driver_stmt, SQLSRV_ERROR_QUERY_STRING_ENCODING_TRANSLATE, get_last_error_message(), NULL) { throw core::CoreException(); } @@ -1661,7 +1661,7 @@ zend_string * pdo_sqlsrv_dbh_last_id(_Inout_ pdo_dbh_t *dbh, _In_ const zend_str strcpy_s( dbh->error_code, sizeof( dbh->error_code ), reinterpret_cast( driver_stmt->last_error()->sqlstate )); driver_dbh->set_last_error( driver_stmt->last_error() ); - + if( driver_stmt ) { driver_stmt->~sqlsrv_stmt(); } @@ -1755,7 +1755,7 @@ zend_string* pdo_sqlsrv_dbh_quote(_Inout_ pdo_dbh_t* dbh, _In_ const zend_string } // get the placeholder at the current position in driver_stmt->placeholders ht - // Normally it's not a good idea to alter the internal pointer in a hashed array + // Normally it's not a good idea to alter the internal pointer in a hashed array // (see pull request 634 on GitHub) but in this case this is for internal use only zval* placeholder = NULL; if ((placeholder = zend_hash_get_current_data(driver_stmt->placeholders)) != NULL && zend_hash_move_forward(driver_stmt->placeholders) == SUCCESS && stmt->bound_params != NULL) { @@ -1798,7 +1798,7 @@ zend_string* pdo_sqlsrv_dbh_quote(_Inout_ pdo_dbh_t* dbh, _In_ const zend_string for (size_t index = 0; index < unquoted_len && unquoted[index] != '\0'; ++index) { // On success, snprintf returns the total number of characters written // On failure, a negative number is returned - // The generated string has a length of at most len - 1, so + // The generated string has a length of at most len - 1, so // len is 3 (2 hex digits + 1) // Requires "& 0x000000FF", or snprintf will translate "0x90" to "0xFFFFFF90" int n = snprintf((char*)(*quoted + pos), 3, "%02X", unquoted[index] & 0x000000FF); @@ -1827,7 +1827,7 @@ zend_string* pdo_sqlsrv_dbh_quote(_Inout_ pdo_dbh_t* dbh, _In_ const zend_string for (size_t index = 0; index < unquoted_len && unquoted_str[index] != '\0'; ++index) { // On success, snprintf returns the total number of characters written // On failure, a negative number is returned - // The generated string has a length of at most len - 1, so + // The generated string has a length of at most len - 1, so // len is 3 (2 hex digits + 1) // Requires "& 0x000000FF", or snprintf will translate "0x90" to "0xFFFFFF90" int n = snprintf((char*)(p + pos), 3, "%02X", unquoted_str[index] & 0x000000FF); @@ -1907,14 +1907,14 @@ pdo_sqlsrv_function_entry *pdo_sqlsrv_get_driver_methods( _Inout_ pdo_dbh_t *dbh // As per documentation, simply return false if the method does not exist // https://www.php.net/manual/en/function.is-callable.php // But user can call PDO::errorInfo() to check the error message if necessary - CHECK_CUSTOM_WARNING_AS_ERROR(true, driver_conn, PDO_SQLSRV_ERROR_FUNCTION_NOT_IMPLEMENTED); + CHECK_CUSTOM_WARNING_AS_ERROR(true, driver_conn, PDO_SQLSRV_ERROR_FUNCTION_NOT_IMPLEMENTED, NULL); return NULL; // return NULL for PDO to take care of the rest } namespace { -// Maps the PDO driver specific statement option/attribute constants to the core layer +// Maps the PDO driver specific statement option/attribute constants to the core layer // statement option/attribute constants. void add_stmt_option_key(_Inout_ sqlsrv_context& ctx, _In_ size_t key, _Inout_ HashTable* options_ht, _Inout_ zval* data) @@ -1990,19 +1990,19 @@ void add_stmt_option_key(_Inout_ sqlsrv_context& ctx, _In_ size_t key, _Inout_ H // validate_stmt_options -// Iterates through the list of statement options provided by the user and validates them +// Iterates through the list of statement options provided by the user and validates them // against the list of statement options provided by this driver. After validation // creates a Hashtable of statement options to be sent to the core layer for processing. // Parameters: // ctx - The current context. // stmt_options - The user provided list of statement options. -// pdo_stmt_options_ht - Output hashtable of statement options. +// pdo_stmt_options_ht - Output hashtable of statement options. void validate_stmt_options( _Inout_ sqlsrv_context& ctx, _Inout_ zval* stmt_options, _Inout_ HashTable* pdo_stmt_options_ht ) { try { - + if( stmt_options ) { - + HashTable* options_ht = Z_ARRVAL_P( stmt_options ); size_t int_key = -1; zend_string *key = NULL; @@ -2029,71 +2029,71 @@ void validate_stmt_options( _Inout_ sqlsrv_context& ctx, _Inout_ zval* stmt_opti void pdo_bool_conn_str_func::func( _In_ connection_option const* option, _Inout_ zval* value, sqlsrv_conn* /*conn*/, _Out_ std::string& conn_str ) { char const* val_str = "no"; - + if( core_str_zval_is_true( value ) ) { - + val_str = "yes"; } - + conn_str += option->odbc_name; conn_str += "={"; conn_str += val_str; conn_str += "};"; } -void pdo_txn_isolation_conn_attr_func::func( connection_option const* /*option*/, _In_ zval* value_z, _Inout_ sqlsrv_conn* conn, +void pdo_txn_isolation_conn_attr_func::func( connection_option const* /*option*/, _In_ zval* value_z, _Inout_ sqlsrv_conn* conn, std::string& /*conn_str*/ ) { try { - + SQLSRV_ASSERT( Z_TYPE_P( value_z ) == IS_STRING, "pdo_txn_isolation_conn_attr_func: Unexpected zval type." ); const char* val = Z_STRVAL_P( value_z ); size_t val_len = Z_STRLEN_P( value_z ); zend_long out_val = SQL_TXN_READ_COMMITTED; // READ_COMMITTED - if(( val_len == ( sizeof( PDOTxnIsolationValues::READ_COMMITTED ) - 1 ) + if(( val_len == ( sizeof( PDOTxnIsolationValues::READ_COMMITTED ) - 1 ) && !strcasecmp( val, PDOTxnIsolationValues::READ_COMMITTED ))) { - - out_val = SQL_TXN_READ_COMMITTED; + + out_val = SQL_TXN_READ_COMMITTED; } // READ_UNCOMMITTED - else if(( val_len == ( sizeof( PDOTxnIsolationValues::READ_UNCOMMITTED ) - 1 ) + else if(( val_len == ( sizeof( PDOTxnIsolationValues::READ_UNCOMMITTED ) - 1 ) && !strcasecmp( val, PDOTxnIsolationValues::READ_UNCOMMITTED ))) { - + out_val = SQL_TXN_READ_UNCOMMITTED; } // REPEATABLE_READ - else if(( val_len == ( sizeof( PDOTxnIsolationValues::REPEATABLE_READ ) - 1 ) + else if(( val_len == ( sizeof( PDOTxnIsolationValues::REPEATABLE_READ ) - 1 ) && !strcasecmp( val, PDOTxnIsolationValues::REPEATABLE_READ ))) { - + out_val = SQL_TXN_REPEATABLE_READ; } - + // SERIALIZABLE - else if(( val_len == ( sizeof( PDOTxnIsolationValues::SERIALIZABLE ) - 1 ) + else if(( val_len == ( sizeof( PDOTxnIsolationValues::SERIALIZABLE ) - 1 ) && !strcasecmp( val, PDOTxnIsolationValues::SERIALIZABLE ))) { - + out_val = SQL_TXN_SERIALIZABLE; } // SNAPSHOT - else if(( val_len == ( sizeof( PDOTxnIsolationValues::SNAPSHOT ) - 1 ) + else if(( val_len == ( sizeof( PDOTxnIsolationValues::SNAPSHOT ) - 1 ) && !strcasecmp( val, PDOTxnIsolationValues::SNAPSHOT ))) { - + out_val = SQL_TXN_SS_SNAPSHOT; } - + else { - - CHECK_CUSTOM_ERROR( true, conn, PDO_SQLSRV_ERROR_INVALID_DSN_VALUE, PDOConnOptionNames::TransactionIsolation ) { + + CHECK_CUSTOM_ERROR( true, conn, PDO_SQLSRV_ERROR_INVALID_DSN_VALUE, PDOConnOptionNames::TransactionIsolation, NULL) { throw core::CoreException(); } } - + core::SQLSetConnectAttr( conn, SQL_COPT_SS_TXN_ISOLATION, reinterpret_cast( out_val ), SQL_IS_UINTEGER ); } diff --git a/source/pdo_sqlsrv/pdo_parser.cpp b/source/pdo_sqlsrv/pdo_parser.cpp index 759ad94e..b80eb16b 100644 --- a/source/pdo_sqlsrv/pdo_parser.cpp +++ b/source/pdo_sqlsrv/pdo_parser.cpp @@ -2,20 +2,20 @@ // File: pdo_parser.cpp // // Contents: Implements a parser to parse the PDO DSN. -// +// // Copyright Microsoft Corporation // // Microsoft Drivers 5.11 for PHP for SQL Server // Copyright(c) Microsoft Corporation // All rights reserved. // MIT License -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), -// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), +// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, // and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions : // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. //--------------------------------------------------------------------------------------------------------------------------------- @@ -34,7 +34,7 @@ conn_string_parser:: conn_string_parser( _In_ sqlsrv_context& ctx, _In_ const ch this->pos = -1; this->ctx = &ctx; this->current_key = 0; - this->current_key_name = NULL; + this->current_key_name = NULL; } sql_string_parser:: sql_string_parser( _In_ sqlsrv_context& ctx, _In_ const char* sql_str, _In_ int len, _In_ HashTable* placeholders_ht ) @@ -55,16 +55,16 @@ inline bool string_parser::next( void ) return false; } - + SQLSRV_ASSERT( this->pos < len, "Unexpected cursor position in conn_string_parser::next" ); - this->pos++; + this->pos++; if ( this->is_eos() ) { - + return false; } - + return true; } @@ -77,12 +77,12 @@ inline bool string_parser::is_eos( void ) } SQLSRV_ASSERT(this->pos < len, "Unexpected cursor position in conn_string_parser::is_eos" ); - + return false; } -// Check for white space. -inline bool string_parser::is_white_space( _In_ char c ) +// Check for white space. +inline bool string_parser::is_white_space( _In_ char c ) { if( c == ' ' || c == '\r' || c == '\n' || c == '\t' ) { return true; @@ -94,9 +94,9 @@ inline bool string_parser::is_white_space( _In_ char c ) int conn_string_parser::discard_trailing_white_spaces( _In_reads_(len) const char* str, _Inout_ int len ) { const char* end = str + ( len - 1 ); - + while(( this->is_white_space( *end ) ) && (len > 0) ) { - + len--; end--; } @@ -108,16 +108,16 @@ int conn_string_parser::discard_trailing_white_spaces( _In_reads_(len) const cha bool string_parser::discard_white_spaces() { if( this->is_eos() ) { - + return false; } while( this->is_white_space( this->orig_str[pos] )) { - + if( !next() ) return false; - } - + } + return true; } @@ -128,22 +128,22 @@ void string_parser::add_key_value_pair( _In_reads_(len) const char* value, _In_ ZVAL_UNDEF( &value_z ); if( len == 0 ) { - + ZVAL_STRINGL( &value_z, "", 0); } else { ZVAL_STRINGL( &value_z, const_cast( value ), len ); - } + } - core::sqlsrv_zend_hash_index_update( *ctx, this->element_ht, this->current_key, &value_z ); + core::sqlsrv_zend_hash_index_update( *ctx, this->element_ht, this->current_key, &value_z ); } // Add a key-value pair to the hashtable with int value void sql_string_parser::add_key_int_value_pair( _In_ unsigned int value ) { zval value_z; ZVAL_LONG( &value_z, value ); - + core::sqlsrv_zend_hash_index_update( *ctx, this->element_ht, this->current_key, &value_z ); } @@ -168,9 +168,9 @@ void conn_string_parser::validate_key( _In_reads_(key_len) const char *key, _Ino key_name = static_cast( sqlsrv_malloc( new_len + 1 )); memcpy_s( key_name, new_len + 1 ,key, new_len ); - key_name[new_len] = '\0'; + key_name[new_len] = '\0'; - THROW_PDO_ERROR( this->ctx, PDO_SQLSRV_ERROR_INVALID_DSN_KEY, static_cast( key_name ) ); + THROW_PDO_ERROR( this->ctx, PDO_SQLSRV_ERROR_INVALID_DSN_KEY, static_cast( key_name ), NULL ); } inline bool sql_string_parser::is_placeholder_char( char c ) @@ -183,7 +183,7 @@ inline bool sql_string_parser::is_placeholder_char( char c ) } // Primary function which parses the connection string/DSN. -void conn_string_parser:: parse_conn_string( void ) +void conn_string_parser:: parse_conn_string( void ) { States state = FirstKeyValuePair; // starting state int start_pos = -1; @@ -191,17 +191,17 @@ void conn_string_parser:: parse_conn_string( void ) try { while( !this->is_eos() ) { - + switch( state ) { - + case FirstKeyValuePair: { // discard leading spaces if( !next() || !discard_white_spaces() ) { - + THROW_PDO_ERROR( this->ctx, PDO_SQLSRV_ERROR_INVALID_DSN_STRING ); //EOS } - + state = Key; break; } @@ -212,15 +212,15 @@ void conn_string_parser:: parse_conn_string( void ) // read the key name while( this->orig_str[pos] != '=' ) { - - if( !next() ) { - - THROW_PDO_ERROR( this->ctx, PDO_SQLSRV_ERROR_DSN_STRING_ENDED_UNEXPECTEDLY ); //EOS - } - } - this->validate_key( &( this->orig_str[start_pos] ), ( pos - start_pos ) ); - + if( !next() ) { + + THROW_PDO_ERROR( this->ctx, PDO_SQLSRV_ERROR_DSN_STRING_ENDED_UNEXPECTEDLY ); //EOS + } + } + + this->validate_key( &( this->orig_str[start_pos] ), ( pos - start_pos ) ); + state = Value; break; @@ -239,23 +239,23 @@ void conn_string_parser:: parse_conn_string( void ) add_key_value_pair( NULL, 0 ); if( this->is_eos() ) { - + break; // EOS } else { - // this->orig_str[pos] == ';' + // this->orig_str[pos] == ';' state = NextKeyValuePair; } } - + // if LCB else if( this->orig_str[pos] == '{' ) { - + start_pos = this->pos; // starting character is LCB state = ValueContent1; } - + // If NonSP-LCB-SC else { @@ -269,10 +269,10 @@ void conn_string_parser:: parse_conn_string( void ) case ValueContent1: { while ( this->orig_str[pos] != '}' ) { - + if ( ! next() ) { - THROW_PDO_ERROR( this->ctx, PDO_SQLSRV_ERROR_RCB_MISSING_IN_DSN_VALUE, this->current_key_name ); + THROW_PDO_ERROR( this->ctx, PDO_SQLSRV_ERROR_RCB_MISSING_IN_DSN_VALUE, this->current_key_name, NULL ); } } @@ -287,20 +287,20 @@ void conn_string_parser:: parse_conn_string( void ) while( this->orig_str[pos] != ';' ) { if( ! next() ) { - + break; //EOS } } if( !this->is_eos() && this->orig_str[pos] == ';' ) { - + // semi-colon encountered, so go to next key-value pair state = NextKeyValuePair; } - + add_key_value_pair( &( this->orig_str[start_pos] ), this->pos - start_pos ); - - SQLSRV_ASSERT((( state == NextKeyValuePair ) || ( this->is_eos() )), + + SQLSRV_ASSERT((( state == NextKeyValuePair ) || ( this->is_eos() )), "conn_string_parser::parse_conn_string: Invalid state encountered " ); break; @@ -308,7 +308,7 @@ void conn_string_parser:: parse_conn_string( void ) case RCBEncountered: { - + // Read the next character after RCB. if( !next() ) { @@ -321,11 +321,11 @@ void conn_string_parser:: parse_conn_string( void ) // if second RCB encountered than go back to ValueContent1 if( this->orig_str[pos] == '}' ) { - + if( !next() ) { // EOS after a second RCB is error - THROW_PDO_ERROR( this->ctx, SQLSRV_ERROR_UNESCAPED_RIGHT_BRACE_IN_DSN, this->current_key_name ); + THROW_PDO_ERROR( this->ctx, SQLSRV_ERROR_UNESCAPED_RIGHT_BRACE_IN_DSN, this->current_key_name, NULL ); } state = ValueContent1; @@ -336,9 +336,9 @@ void conn_string_parser:: parse_conn_string( void ) // discard any trailing white-spaces. if( this->is_white_space( this->orig_str[pos] )) { - + if( ! this->discard_white_spaces() ) { - + //EOS add_key_value_pair( &( this->orig_str[start_pos] ), end_pos - start_pos ); break; @@ -347,32 +347,32 @@ void conn_string_parser:: parse_conn_string( void ) // if semi-colon than go to next key-value pair if ( this->orig_str[pos] == ';' ) { - + add_key_value_pair( &( this->orig_str[start_pos] ), end_pos - start_pos ); state = NextKeyValuePair; break; } // Non - (RCB, SP*, SC, EOS) character. Any other character after an RCB is an error. - THROW_PDO_ERROR( this->ctx, PDO_SQLSRV_ERROR_INVALID_DSN_VALUE, this->current_key_name ); - break; + THROW_PDO_ERROR( this->ctx, PDO_SQLSRV_ERROR_INVALID_DSN_VALUE, this->current_key_name, NULL ); + break; } case NextKeyValuePair: { - SQLSRV_ASSERT(( this->orig_str[pos] == ';' ), + SQLSRV_ASSERT(( this->orig_str[pos] == ';' ), "conn_string_parser::parse_conn_string: semi-colon was expected." ); // Call next() to skip the semi-colon. if( !next() || !this->discard_white_spaces() ) { - + // EOS break; } - + if( this->orig_str[pos] == ';' ) { - + // a second semi-colon is error case. - THROW_PDO_ERROR( this->ctx, PDO_SQLSRV_ERROR_EXTRA_SEMI_COLON_IN_DSN_STRING, this->pos ); + THROW_PDO_ERROR( this->ctx, PDO_SQLSRV_ERROR_EXTRA_SEMI_COLON_IN_DSN_STRING, this->pos, NULL ); } else { @@ -384,7 +384,7 @@ void conn_string_parser:: parse_conn_string( void ) } //case NextKeyValuePair } // switch } //while - } + } catch( pdo::PDOException& ) { throw; diff --git a/source/pdo_sqlsrv/pdo_stmt.cpp b/source/pdo_sqlsrv/pdo_stmt.cpp index b6a75045..c545d9e7 100644 --- a/source/pdo_sqlsrv/pdo_stmt.cpp +++ b/source/pdo_sqlsrv/pdo_stmt.cpp @@ -7,13 +7,13 @@ // Copyright(c) Microsoft Corporation // All rights reserved. // MIT License -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), -// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), +// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, // and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions : // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. //--------------------------------------------------------------------------------------------------------------------------------- @@ -57,7 +57,7 @@ SQLSRV_PHPTYPE pdo_type_to_sqlsrv_php_type( _Inout_ sqlsrv_stmt* driver_stmt, _I { pdo_sqlsrv_stmt *pdo_stmt = static_cast(driver_stmt); SQLSRV_ASSERT(pdo_stmt != NULL, "pdo_type_to_sqlsrv_php_type: pdo_stmt object was null"); - + switch( pdo_type ) { case PDO_PARAM_BOOL: @@ -66,10 +66,10 @@ SQLSRV_PHPTYPE pdo_type_to_sqlsrv_php_type( _Inout_ sqlsrv_stmt* driver_stmt, _I case PDO_PARAM_STR: return SQLSRV_PHPTYPE_STRING; - + case PDO_PARAM_NULL: return SQLSRV_PHPTYPE_NULL; - + case PDO_PARAM_LOB: if (pdo_stmt->fetch_datetime) { return SQLSRV_PHPTYPE_DATETIME; @@ -84,8 +84,8 @@ SQLSRV_PHPTYPE pdo_type_to_sqlsrv_php_type( _Inout_ sqlsrv_stmt* driver_stmt, _I default: DIE( "pdo_type_to_sqlsrv_php_type: Unexpected pdo_param_type encountered" ); } - - return SQLSRV_PHPTYPE_INVALID; // to prevent compiler warning + + return SQLSRV_PHPTYPE_INVALID; // to prevent compiler warning } // Returns a pdo type for a given SQL type. See pdo_param_type @@ -104,7 +104,7 @@ inline pdo_param_type sql_type_to_pdo_type( _In_ SQLSMALLINT sql_type ) case SQL_BINARY: case SQL_CHAR: case SQL_DECIMAL: - case SQL_DOUBLE: + case SQL_DOUBLE: case SQL_FLOAT: case SQL_GUID: case SQL_LONGVARBINARY: @@ -159,9 +159,9 @@ void set_stmt_cursors( _Inout_ sqlsrv_stmt* stmt, _In_ zval* value_z ) default: THROW_PDO_ERROR( stmt, PDO_SQLSRV_ERROR_INVALID_CURSOR_TYPE ); - } + } - core_sqlsrv_set_scrollable( stmt, odbc_cursor_type ); + core_sqlsrv_set_scrollable( stmt, odbc_cursor_type ); } void set_stmt_cursor_scroll_type( _Inout_ sqlsrv_stmt* stmt, _In_ zval* value_z ) @@ -178,12 +178,12 @@ void set_stmt_cursor_scroll_type( _Inout_ sqlsrv_stmt* stmt, _In_ zval* value_z long odbc_cursor_type = static_cast( Z_LVAL_P( value_z ) ); - core_sqlsrv_set_scrollable( stmt, odbc_cursor_type ); + core_sqlsrv_set_scrollable( stmt, odbc_cursor_type ); return; } -// Sets the statement encoding. Default encoding on the statement +// Sets the statement encoding. Default encoding on the statement // implies use the connection's encoding. void set_stmt_encoding( _Inout_ sqlsrv_stmt* stmt, _In_ zval* value_z ) { @@ -192,9 +192,9 @@ void set_stmt_encoding( _Inout_ sqlsrv_stmt* stmt, _In_ zval* value_z ) THROW_PDO_ERROR( stmt, PDO_SQLSRV_ERROR_INVALID_ENCODING ); } - + zend_long attr_value = Z_LVAL_P( value_z ); - + switch( attr_value ) { // when the default encoding is applied to a statement, it means use the creating connection's encoding @@ -269,7 +269,7 @@ zval convert_to_zval(_Inout_ sqlsrv_stmt* stmt, _In_ SQLSRV_PHPTYPE sqlsrv_php_t return out_zval; } -} // namespace +} // namespace int pdo_sqlsrv_stmt_dtor( _Inout_ pdo_stmt_t *stmt ); int pdo_sqlsrv_stmt_execute( _Inout_ pdo_stmt_t *stmt ); @@ -309,7 +309,7 @@ struct pdo_stmt_methods pdo_sqlsrv_stmt_methods = { void stmt_option_pdo_scrollable:: operator()( _Inout_ sqlsrv_stmt* stmt, stmt_option const* /*opt*/, _In_ zval* value_z ) { - set_stmt_cursors( stmt, value_z ); + set_stmt_cursors( stmt, value_z ); } void stmt_option_encoding:: operator()( _Inout_ sqlsrv_stmt* stmt, stmt_option const* /*opt*/, _In_ zval* value_z ) @@ -391,7 +391,7 @@ int pdo_sqlsrv_stmt_close_cursor( _Inout_ pdo_stmt_t *stmt ) SQLSRV_ASSERT( driver_stmt != NULL, "pdo_sqlsrv_stmt_close_cursor: driver_data object was null" ); - // to "close the cursor" means we make the statement ready for execution again. To do this, we + // to "close the cursor" means we make the statement ready for execution again. To do this, we // skip all the result sets on the current statement. // If the statement has not been executed there are no next results to iterate over. if ( driver_stmt && driver_stmt->executed == true ) @@ -414,7 +414,7 @@ int pdo_sqlsrv_stmt_close_cursor( _Inout_ pdo_stmt_t *stmt ) } // pdo_sqlsrv_stmt_describe_col -// Gets the metadata for a column based on the column number. +// Gets the metadata for a column based on the column number. // Calls the core_sqlsrv_field_metadata function present in the core layer. // Parameters: // *stmt - pointer to current statement @@ -433,7 +433,7 @@ int pdo_sqlsrv_stmt_describe_col( _Inout_ pdo_stmt_t *stmt, _In_ int colno) sqlsrv_malloc_auto_ptr core_meta_data; try { - + core_meta_data = core_sqlsrv_field_metadata( reinterpret_cast( stmt->driver_data ), colno ); } @@ -448,20 +448,20 @@ int pdo_sqlsrv_stmt_describe_col( _Inout_ pdo_stmt_t *stmt, _In_ int colno) pdo_column_data* column_data = &(stmt->columns[colno]); SQLSRV_ASSERT( column_data != NULL, "pdo_sqsrv_stmt_describe_col: pdo_column_data was null" ); - + // Set the name column_data->name = zend_string_init( (const char*)core_meta_data->field_name.get(), core_meta_data->field_name_len, 0 ); // Set the maxlen column_data->maxlen = ( core_meta_data->field_precision > 0 ) ? core_meta_data->field_precision : core_meta_data->field_size; - + // Set the precision column_data->precision = core_meta_data->field_scale; #if PHP_VERSION_ID < 80100 - // Set the param_type - column_data->param_type = PDO_PARAM_ZVAL; -#endif + // Set the param_type + column_data->param_type = PDO_PARAM_ZVAL; +#endif // store the field data for use by pdo_sqlsrv_stmt_get_col_data pdo_sqlsrv_stmt* driver_stmt = reinterpret_cast( stmt->driver_data ); SQLSRV_ASSERT( driver_stmt != NULL, "Invalid driver statement in pdo_sqlsrv_stmt_describe_col" ); @@ -474,7 +474,7 @@ int pdo_sqlsrv_stmt_describe_col( _Inout_ pdo_stmt_t *stmt, _In_ int colno) // pdo_sqlsrv_stmt_dtor -// Maps to PDOStatement::__destruct. Destructor for the PDO Statement. +// Maps to PDOStatement::__destruct. Destructor for the PDO Statement. // Parameters: // *stmt - pointer to current statement // Return: @@ -512,7 +512,7 @@ int pdo_sqlsrv_stmt_dtor( _Inout_ pdo_stmt_t *stmt ) } // pdo_sqlsrv_stmt_execute -// Maps to PDOStatement::Execute. Executes the prepared statement. +// Maps to PDOStatement::Execute. Executes the prepared statement. // Parameters: // *stmt - pointer to the current statement. // Return: @@ -537,7 +537,7 @@ int pdo_sqlsrv_stmt_execute( _Inout_ pdo_stmt_t *stmt ) core_sqlsrv_next_result( driver_stmt, false ); } } - + const char* query = NULL; unsigned int query_len = 0; @@ -548,11 +548,11 @@ int pdo_sqlsrv_stmt_execute( _Inout_ pdo_stmt_t *stmt ) query_len = static_cast( driver_stmt->direct_query_subst_string_len ); } - // if the user is using prepare emulation (PDO::ATTR_EMULATE_PREPARES), set the query to the + // if the user is using prepare emulation (PDO::ATTR_EMULATE_PREPARES), set the query to the // subtituted query provided by PDO if (stmt->supports_placeholders == PDO_PLACEHOLDER_NONE) { // reset the placeholders hashtable internal in case the user reexecutes a statement - // Normally it's not a good idea to alter the internal pointer in a hashed array + // Normally it's not a good idea to alter the internal pointer in a hashed array // (see pull request 634 on GitHub) but in this case this is for internal use only zend_hash_internal_pointer_reset(driver_stmt->placeholders); @@ -567,10 +567,10 @@ int pdo_sqlsrv_stmt_execute( _Inout_ pdo_stmt_t *stmt ) } // The query timeout setting is inherited from the corresponding connection attribute, but - // the user may have changed the query timeout setting again before this via + // the user may have changed the query timeout setting again before this via // PDOStatement::setAttribute() driver_stmt->set_query_timeout(); - + SQLRETURN execReturn = core_sqlsrv_execute( driver_stmt, query, query_len ); if ( execReturn == SQL_NO_DATA ) { @@ -598,13 +598,13 @@ int pdo_sqlsrv_stmt_execute( _Inout_ pdo_stmt_t *stmt ) } } - // workaround for a bug in the PDO driver manager. It is fairly simple to crash the PDO driver manager with + // workaround for a bug in the PDO driver manager. It is fairly simple to crash the PDO driver manager with // the following sequence: // 1) Prepare and execute a statement (that has some results with it) // 2) call PDOStatement::nextRowset until there are no more results // 3) execute the statement again // 4) call PDOStatement::getColumnMeta - // It crashes from what I can tell because there is no metadata because there was no call to + // It crashes from what I can tell because there is no metadata because there was no call to // pdo_stmt_sqlsrv_describe_col and stmt->columns is NULL on the second call to // PDO::execute. My guess is that because stmt->executed is true, it optimizes away a necessary call to // pdo_sqlsrv_stmt_describe_col. By setting the stmt->executed flag to 0, this call is not optimized away @@ -632,8 +632,8 @@ int pdo_sqlsrv_stmt_execute( _Inout_ pdo_stmt_t *stmt ) // pdo_sqlsrv_stmt_fetch // Maps to PDOStatement::fetch -// Move the cursor to the record indicated. If the cursor is moved off the end, -// or before the beginning if a scrollable cursor is created, then FAILURE is returned. +// Move the cursor to the record indicated. If the cursor is moved off the end, +// or before the beginning if a scrollable cursor is created, then FAILURE is returned. // Parameters: // *stmt - pointer to current statement for which the cursor should be moved. // ori - cursor orientation. Maps to the list of PDO::FETCH_ORI_* constants @@ -648,7 +648,7 @@ int pdo_sqlsrv_stmt_fetch( _Inout_ pdo_stmt_t *stmt, _In_ enum pdo_fetch_orienta PDO_LOG_STMT_ENTRY; try { - + SQLSRV_ASSERT( stmt != NULL, "pdo_sqlsrv_stmt_fetch: pdo_stmt object was null" ); pdo_sqlsrv_stmt* driver_stmt = reinterpret_cast( stmt->driver_data ); @@ -678,7 +678,7 @@ int pdo_sqlsrv_stmt_fetch( _Inout_ pdo_stmt_t *stmt, _In_ enum pdo_fetch_orienta } for( long i = 0; i < stmt->column_count; ++i ) { - + #if PHP_VERSION_ID < 80100 if (NULL== (bind_data = reinterpret_cast(zend_hash_index_find_ptr(stmt->bound_columns, i))) && (NULL == (bind_data = reinterpret_cast(zend_hash_find_ptr(stmt->bound_columns, stmt->columns[i].name))))) { @@ -709,8 +709,8 @@ int pdo_sqlsrv_stmt_fetch( _Inout_ pdo_stmt_t *stmt, _In_ enum pdo_fetch_orienta // support for the PDO rowCount method. Since rowCount doesn't call a // method, PDO relies on us to fill the pdo_stmt_t::row_count member - // The if condition was changed from - // `driver_stmt->past_fetch_end || driver_stmt->cursor_type != SQL_CURSOR_FORWARD_ONLY` + // The if condition was changed from + // `driver_stmt->past_fetch_end || driver_stmt->cursor_type != SQL_CURSOR_FORWARD_ONLY` // because it caused SQLRowCount to be called at each fetch if using a non-forward cursor // which is unnecessary and a performance hit if( driver_stmt->past_fetch_end || driver_stmt->cursor_type == SQL_CURSOR_DYNAMIC) { @@ -738,7 +738,7 @@ int pdo_sqlsrv_stmt_fetch( _Inout_ pdo_stmt_t *stmt, _In_ enum pdo_fetch_orienta return 0; } catch( ... ) { - + DIE ("pdo_sqlsrv_stmt_fetch: Unexpected exception occurred."); } // Should not have reached here but adding this due to compilation warnings @@ -747,9 +747,9 @@ int pdo_sqlsrv_stmt_fetch( _Inout_ pdo_stmt_t *stmt, _In_ enum pdo_fetch_orienta // pdo_sqlsrv_stmt_get_col_data // Called by the set of PDO Fetch functions. -// Retrieves a single column. PDO driver manager is responsible for freeing the -// returned buffer. Because PDO can request fields out of order and ODBC does not -// support out of order field requests, this function should also cache fields. +// Retrieves a single column. PDO driver manager is responsible for freeing the +// returned buffer. Because PDO can request fields out of order and ODBC does not +// support out of order field requests, this function should also cache fields. // Parameters: // stmt - Statement to retrive the column for. // colno - Index of the column that needs to be retrieved. Starts with 0. @@ -770,7 +770,7 @@ int pdo_sqlsrv_stmt_get_col_data(_Inout_ pdo_stmt_t *stmt, _In_ int colno, _Inou PDO_RESET_STMT_ERROR; PDO_VALIDATE_STMT; PDO_LOG_STMT_ENTRY; - + try { SQLSRV_ASSERT(stmt != NULL, "pdo_sqlsrv_stmt_get_col_data: pdo_stmt object was null"); @@ -784,7 +784,7 @@ int pdo_sqlsrv_stmt_get_col_data(_Inout_ pdo_stmt_t *stmt, _In_ int colno, _Inou } #if PHP_VERSION_ID < 80100 - // Let PDO free the memory after use. + // Let PDO free the memory after use. * caller_frees = 1; #endif @@ -801,7 +801,7 @@ int pdo_sqlsrv_stmt_get_col_data(_Inout_ pdo_stmt_t *stmt, _In_ int colno, _Inou true); driver_stmt->current_meta_data[colno]->sqlsrv_php_type = sqlsrv_php_type; - // if a column is bound to a type different than the column type, figure out a way to convert it to the + // if a column is bound to a type different than the column type, figure out a way to convert it to the // type they want #if PHP_VERSION_ID < 80100 if (stmt->bound_columns && driver_stmt->bound_column_param_types[colno] != PDO_PARAM_ZVAL) { @@ -822,13 +822,13 @@ int pdo_sqlsrv_stmt_get_col_data(_Inout_ pdo_stmt_t *stmt, _In_ int colno, _Inou if (bind_data != NULL && !Z_ISUNDEF(bind_data->driver_params)) { CHECK_CUSTOM_ERROR(Z_TYPE(bind_data->driver_params) != IS_LONG, driver_stmt, - PDO_SQLSRV_ERROR_INVALID_COLUMN_DRIVER_DATA, colno + 1) { + PDO_SQLSRV_ERROR_INVALID_COLUMN_DRIVER_DATA, colno + 1, NULL) { throw pdo::PDOException(); } CHECK_CUSTOM_ERROR(driver_stmt->bound_column_param_types[colno] != PDO_PARAM_STR && driver_stmt->bound_column_param_types[colno] != PDO_PARAM_LOB, driver_stmt, - PDO_SQLSRV_ERROR_COLUMN_TYPE_DOES_NOT_SUPPORT_ENCODING, colno + 1) { + PDO_SQLSRV_ERROR_COLUMN_TYPE_DOES_NOT_SUPPORT_ENCODING, colno + 1, NULL) { throw pdo::PDOException(); } @@ -841,7 +841,7 @@ int pdo_sqlsrv_stmt_get_col_data(_Inout_ pdo_stmt_t *stmt, _In_ int colno, _Inou case SQLSRV_ENCODING_UTF8: break; default: - THROW_PDO_ERROR(driver_stmt, PDO_SQLSRV_ERROR_INVALID_DRIVER_COLUMN_ENCODING, colno); + THROW_PDO_ERROR(driver_stmt, PDO_SQLSRV_ERROR_INVALID_DRIVER_COLUMN_ENCODING, colno, NULL); break; } } @@ -870,7 +870,7 @@ int pdo_sqlsrv_stmt_get_col_data(_Inout_ pdo_stmt_t *stmt, _In_ int colno, _Inou } #endif return 1; - } + } catch ( core::CoreException& ) { return 0; } @@ -909,11 +909,11 @@ int pdo_sqlsrv_stmt_set_attr( _Inout_ pdo_stmt_t *stmt, _In_ zend_long attr, _In case SQLSRV_ATTR_ENCODING: set_stmt_encoding( driver_stmt, val ); break; - + case PDO_ATTR_CURSOR: THROW_PDO_ERROR( driver_stmt, PDO_SQLSRV_ERROR_CURSOR_ATTR_AT_PREPARE_ONLY ); break; - + case SQLSRV_ATTR_QUERY_TIMEOUT: core_sqlsrv_set_query_timeout( driver_stmt, val ); break; @@ -976,7 +976,7 @@ int pdo_sqlsrv_stmt_get_attr( _Inout_ pdo_stmt_t *stmt, _In_ zend_long attr, _In PDO_RESET_STMT_ERROR; PDO_VALIDATE_STMT; PDO_LOG_STMT_ENTRY; - + pdo_sqlsrv_stmt* driver_stmt = static_cast( stmt->driver_data ); SQLSRV_ASSERT(( driver_stmt != NULL ), "pdo_sqlsrv_stmt_get_attr: stmt->driver_data was null" ); @@ -991,27 +991,27 @@ int pdo_sqlsrv_stmt_get_attr( _Inout_ pdo_stmt_t *stmt, _In_ zend_long attr, _In } case SQLSRV_ATTR_ENCODING: - { + { ZVAL_LONG( return_value, driver_stmt->encoding() ); break; } - + case PDO_ATTR_CURSOR: { - ZVAL_LONG( return_value, ( driver_stmt->cursor_type != SQL_CURSOR_FORWARD_ONLY ? - PDO_CURSOR_SCROLL : PDO_CURSOR_FWDONLY )); + ZVAL_LONG( return_value, ( driver_stmt->cursor_type != SQL_CURSOR_FORWARD_ONLY ? + PDO_CURSOR_SCROLL : PDO_CURSOR_FWDONLY )); break; } case SQLSRV_ATTR_CURSOR_SCROLL_TYPE: { - ZVAL_LONG( return_value, driver_stmt->cursor_type ); + ZVAL_LONG( return_value, driver_stmt->cursor_type ); break; } case SQLSRV_ATTR_CLIENT_BUFFER_MAX_KB_SIZE: { - ZVAL_LONG( return_value, driver_stmt->buffered_query_limit ); + ZVAL_LONG( return_value, driver_stmt->buffered_query_limit ); break; } @@ -1041,7 +1041,7 @@ int pdo_sqlsrv_stmt_get_attr( _Inout_ pdo_stmt_t *stmt, _In_ zend_long attr, _In case SQLSRV_ATTR_DECIMAL_PLACES: { - ZVAL_LONG( return_value, driver_stmt->decimal_places ); + ZVAL_LONG( return_value, driver_stmt->decimal_places ); break; } @@ -1069,9 +1069,9 @@ int pdo_sqlsrv_stmt_get_attr( _Inout_ pdo_stmt_t *stmt, _In_ zend_long attr, _In } // pdo_sqlsrv_stmt_get_col_meta -// Maps to PDOStatement::getColumnMeta. Return extra metadata. -// Though we don't return any extra metadata, PDO relies on us to -// create the associative array that holds the standard information, +// Maps to PDOStatement::getColumnMeta. Return extra metadata. +// Though we don't return any extra metadata, PDO relies on us to +// create the associative array that holds the standard information, // so we create one and return it for PDO's use. // Parameters: // stmt - Current statement. @@ -1092,9 +1092,9 @@ int pdo_sqlsrv_stmt_get_col_meta( _Inout_ pdo_stmt_t *stmt, _In_ zend_long colno sqlsrv_stmt* driver_stmt = static_cast( stmt->driver_data ); SQLSRV_ASSERT( driver_stmt != NULL, "pdo_sqlsrv_stmt_get_col_meta: stmt->driver_data was null"); - // Based on PDOStatement::getColumnMeta API, this should return FALSE - // if the requested column does not exist in the result set, or if - // no result set exists. Thus, do not use SQLSRV_ASSERT, which causes + // Based on PDOStatement::getColumnMeta API, this should return FALSE + // if the requested column does not exist in the result set, or if + // no result set exists. Thus, do not use SQLSRV_ASSERT, which causes // the script to fail right away. Instead, log this warning if logging // is enabled if (colno < 0 || colno >= stmt->column_count || stmt->columns == NULL) { @@ -1110,12 +1110,12 @@ int pdo_sqlsrv_stmt_get_col_meta( _Inout_ pdo_stmt_t *stmt, _In_ zend_long colno // metadata should have been saved earlier SQLSRV_ASSERT(colno < driver_stmt->current_meta_data.size(), "pdo_sqlsrv_stmt_get_col_meta: Metadata vector out of sync with column numbers"); core_meta_data = driver_stmt->current_meta_data[colno]; - + // add the following fields: flags, native_type, driver:decl_type, table if (driver_stmt->data_classification) { core_sqlsrv_sensitivity_metadata(driver_stmt); - // initialize the column data classification array + // initialize the column data classification array zval data_classification; ZVAL_UNDEF(&data_classification); array_init(&data_classification); @@ -1136,7 +1136,7 @@ int pdo_sqlsrv_stmt_get_col_meta( _Inout_ pdo_stmt_t *stmt, _In_ zend_long colno sizeof( field_type_name ), &out_buff_len, ¬_used ); add_assoc_string( return_value, "sqlsrv:decl_type", field_type_name ); - // get the PHP type of the column. The types returned here mirror the types returned by debug_zval_dump when + // get the PHP type of the column. The types returned here mirror the types returned by debug_zval_dump when // given a variable of the same type. However, debug_zval_dump also gives the length of a string, and we only // say string, since the length is given in another field of the metadata array. long pdo_type = sql_type_to_pdo_type( core_meta_data->field_type ); @@ -1179,7 +1179,7 @@ int pdo_sqlsrv_stmt_get_col_meta( _Inout_ pdo_stmt_t *stmt, _In_ zend_long colno zval_ptr_dtor(return_value); DIE( "pdo_sqlsrv_stmt_get_col_meta: Unknown exception occurred while retrieving metadata." ); } - + return SUCCESS; } @@ -1187,7 +1187,7 @@ int pdo_sqlsrv_stmt_get_col_meta( _Inout_ pdo_stmt_t *stmt, _In_ zend_long colno // pdo_sqlsrv_stmt_next_rowset // Maps to PDOStatement::nextRowset. // Move the cursor to the beginning of the next rowset in a multi-rowset result. -// Clears the field cache from the last row retrieved using pdo_sqlsrv_stmt_get_col_data. +// Clears the field cache from the last row retrieved using pdo_sqlsrv_stmt_get_col_data. // Calls core_sqlsrv_next_result using the core_stmt found within stmt->driver_data. // If another result set is available, this function returns 1. Otherwise it returns 0. // Parameters: @@ -1222,7 +1222,7 @@ int pdo_sqlsrv_stmt_next_rowset( _Inout_ pdo_stmt_t *stmt ) // return the row count regardless if there are any rows or not stmt->row_count = core::SQLRowCount( driver_stmt ); - + driver_stmt->column_count = stmt->column_count; driver_stmt->row_count = stmt->row_count; } @@ -1240,16 +1240,16 @@ int pdo_sqlsrv_stmt_next_rowset( _Inout_ pdo_stmt_t *stmt ) // pdo_sqlsrv_stmt_param_hook // Maps to PDOStatement::bindColumn. -// Called by PDO driver manager to bind a parameter or column. -// This function pulls several duties for binding parameters and columns. -// It takes an event as a parameter that explains what the function should do on -// behalf of a parameter or column. We only use one of these events, +// Called by PDO driver manager to bind a parameter or column. +// This function pulls several duties for binding parameters and columns. +// It takes an event as a parameter that explains what the function should do on +// behalf of a parameter or column. We only use one of these events, // PDO_PARAM_EVT_EXEC_PRE, the remainder simply return. // Paramters: // stmt - PDO Statement object to bind a parameter. // param - paramter to bind. // event_type - Event to bind a parameter -// Return: +// Return: // Returns 0 for failure, 1 for success. int pdo_sqlsrv_stmt_param_hook( _Inout_ pdo_stmt_t *stmt, _Inout_ struct pdo_bound_param_data *param, _In_ enum pdo_param_event event_type) @@ -1310,7 +1310,7 @@ int pdo_sqlsrv_stmt_param_hook( _Inout_ pdo_stmt_t *stmt, // that means they want output, and if they include the flag, then it's input/output. // It's invalid to specify the input/output flag but not specify a length CHECK_CUSTOM_ERROR( (param->param_type & PDO_PARAM_INPUT_OUTPUT) && (param->max_value_len == 0), - driver_stmt, PDO_SQLSRV_ERROR_INVALID_PARAM_DIRECTION, param->paramno + 1 ) { + driver_stmt, PDO_SQLSRV_ERROR_INVALID_PARAM_DIRECTION, param->paramno + 1, NULL) { throw pdo::PDOException(); } // if the parameter is output or input/output, translate the type between the PDO::PARAM_* constant @@ -1328,7 +1328,7 @@ int pdo_sqlsrv_stmt_param_hook( _Inout_ pdo_stmt_t *stmt, } } - // check if the user has specified the character set to use, take it off but ignore + // check if the user has specified the character set to use, take it off but ignore #if PHP_VERSION_ID >= 70200 if ((pdo_type & PDO_PARAM_STR_NATL) == PDO_PARAM_STR_NATL) { pdo_type = pdo_type & ~PDO_PARAM_STR_NATL; @@ -1357,7 +1357,7 @@ int pdo_sqlsrv_stmt_param_hook( _Inout_ pdo_stmt_t *stmt, { zval null_zval; php_out_type = SQLSRV_PHPTYPE_NULL; - + ZVAL_NULL( &null_zval ); zval_ptr_dtor( ¶m->parameter ); param->parameter = null_zval; @@ -1396,8 +1396,8 @@ int pdo_sqlsrv_stmt_param_hook( _Inout_ pdo_stmt_t *stmt, break; case SQLSRV_PHPTYPE_STRING: { - CHECK_CUSTOM_ERROR( param->max_value_len <= 0, driver_stmt, - PDO_SQLSRV_ERROR_INVALID_OUTPUT_STRING_SIZE, param->paramno + 1 ) { + CHECK_CUSTOM_ERROR( param->max_value_len <= 0, driver_stmt, + PDO_SQLSRV_ERROR_INVALID_OUTPUT_STRING_SIZE, param->paramno + 1, NULL) { throw pdo::PDOException(); } column_size = param->max_value_len; @@ -1409,14 +1409,14 @@ int pdo_sqlsrv_stmt_param_hook( _Inout_ pdo_stmt_t *stmt, } } // block all objects from being bound as input or input/output parameters since there is a - // weird case: - // $obj = date_create(); + // weird case: + // $obj = date_create(); // $s->bindParam( n, $obj, PDO::PARAM_INT ); // anything different than PDO::PARAM_STR // that succeeds since the core layer implements DateTime object handling for the sqlsrv // 2.0 driver. To be consistent and avoid surprises of one object type working and others // not, we block all objects here. CHECK_CUSTOM_ERROR( direction != SQL_PARAM_OUTPUT && Z_TYPE( param->parameter ) == IS_OBJECT, - driver_stmt, SQLSRV_ERROR_INVALID_PARAMETER_PHPTYPE, param->paramno + 1 ) { + driver_stmt, SQLSRV_ERROR_INVALID_PARAMETER_PHPTYPE, param->paramno + 1, NULL) { throw pdo::PDOException(); } @@ -1428,15 +1428,15 @@ int pdo_sqlsrv_stmt_param_hook( _Inout_ pdo_stmt_t *stmt, } // Beginning with PHP7.2 the user can specify whether to use PDO_PARAM_STR_CHAR or PDO_PARAM_STR_NATL - // But this extended type will be ignored in real prepared statements, so the encoding deliberately + // But this extended type will be ignored in real prepared statements, so the encoding deliberately // set in the statement or driver options will still take precedence if( !Z_ISUNDEF(param->driver_params) ) { - CHECK_CUSTOM_ERROR( Z_TYPE( param->driver_params ) != IS_LONG, driver_stmt, + CHECK_CUSTOM_ERROR( Z_TYPE( param->driver_params ) != IS_LONG, driver_stmt, PDO_SQLSRV_ERROR_INVALID_DRIVER_PARAM ) { throw pdo::PDOException(); } CHECK_CUSTOM_ERROR( pdo_type != PDO_PARAM_STR && pdo_type != PDO_PARAM_LOB, driver_stmt, - PDO_SQLSRV_ERROR_INVALID_DRIVER_PARAM_TYPE, param->paramno + 1 ) { + PDO_SQLSRV_ERROR_INVALID_DRIVER_PARAM_TYPE, param->paramno + 1, NULL) { throw pdo::PDOException(); } encoding = static_cast( Z_LVAL( param->driver_params )); @@ -1448,7 +1448,7 @@ int pdo_sqlsrv_stmt_param_hook( _Inout_ pdo_stmt_t *stmt, break; default: THROW_PDO_ERROR( driver_stmt, PDO_SQLSRV_ERROR_INVALID_DRIVER_PARAM_ENCODING, - param->paramno + 1 ); + param->paramno + 1, NULL ); break; } } @@ -1500,7 +1500,7 @@ sqlsrv_phptype pdo_sqlsrv_stmt::sql_type_to_php_type( _In_ SQLINTEGER sql_type, local_encoding = conn->encoding(); SQLSRV_ASSERT( conn->encoding() != SQLSRV_ENCODING_DEFAULT || conn->encoding() == SQLSRV_ENCODING_INVALID, "Invalid encoding on the connection. Must not be invalid or default." ); - } + } sqlsrv_phptype.typeinfo.encoding = local_encoding; @@ -1514,7 +1514,7 @@ sqlsrv_phptype pdo_sqlsrv_stmt::sql_type_to_php_type( _In_ SQLINTEGER sql_type, } else { sqlsrv_phptype.typeinfo.type = SQLSRV_PHPTYPE_STRING; - sqlsrv_phptype.typeinfo.encoding = SQLSRV_ENCODING_CHAR; + sqlsrv_phptype.typeinfo.encoding = SQLSRV_ENCODING_CHAR; } break; case SQL_FLOAT: @@ -1524,7 +1524,7 @@ sqlsrv_phptype pdo_sqlsrv_stmt::sql_type_to_php_type( _In_ SQLINTEGER sql_type, } else { sqlsrv_phptype.typeinfo.type = SQLSRV_PHPTYPE_STRING; - sqlsrv_phptype.typeinfo.encoding = SQLSRV_ENCODING_CHAR; + sqlsrv_phptype.typeinfo.encoding = SQLSRV_ENCODING_CHAR; } break; case SQL_TYPE_DATE: @@ -1542,7 +1542,7 @@ sqlsrv_phptype pdo_sqlsrv_stmt::sql_type_to_php_type( _In_ SQLINTEGER sql_type, case SQL_DECIMAL: case SQL_NUMERIC: sqlsrv_phptype.typeinfo.type = SQLSRV_PHPTYPE_STRING; - sqlsrv_phptype.typeinfo.encoding = SQLSRV_ENCODING_CHAR; + sqlsrv_phptype.typeinfo.encoding = SQLSRV_ENCODING_CHAR; break; case SQL_CHAR: case SQL_GUID: @@ -1567,6 +1567,6 @@ sqlsrv_phptype pdo_sqlsrv_stmt::sql_type_to_php_type( _In_ SQLINTEGER sql_type, sqlsrv_phptype.typeinfo.encoding = SQLSRV_ENCODING_INVALID; break; } - + return sqlsrv_phptype; } diff --git a/source/shared/core_conn.cpp b/source/shared/core_conn.cpp index 5133ede4..23212f06 100644 --- a/source/shared/core_conn.cpp +++ b/source/shared/core_conn.cpp @@ -160,7 +160,7 @@ sqlsrv_conn* core_sqlsrv_connect( _In_ sqlsrv_context& henv_cp, _In_ sqlsrv_cont // In Windows, we try to connect with ODBC driver first and rely on the returned error code to try connecting with other supported ODBC drivers if (conn->driver_version != ODBC_DRIVER::VER_UNKNOWN) { // if column encryption is enabled, must use ODBC driver 17 or above - CHECK_CUSTOM_ERROR(conn->ce_option.enabled && conn->driver_version == ODBC_DRIVER::VER_13, conn, SQLSRV_ERROR_CE_DRIVER_REQUIRED, get_processor_arch()) { + CHECK_CUSTOM_ERROR(conn->ce_option.enabled && conn->driver_version == ODBC_DRIVER::VER_13, conn, SQLSRV_ERROR_CE_DRIVER_REQUIRED, get_processor_arch(), NULL) { throw core::CoreException(); } @@ -182,7 +182,7 @@ sqlsrv_conn* core_sqlsrv_connect( _In_ sqlsrv_context& henv_cp, _In_ sqlsrv_cont #endif } else { - // ODBC driver not specified, so check ODBC 17 first then ODBC 18 and/or ODBC 13 + // ODBC driver not specified, so check ODBC 17 first then ODBC 18 and/or ODBC 13 // If column encryption is enabled, check up to ODBC 18 ODBC_DRIVER drivers[] = { ODBC_DRIVER::VER_17, ODBC_DRIVER::VER_18, ODBC_DRIVER::VER_13 }; ODBC_DRIVER last_version = (conn->ce_option.enabled) ? ODBC_DRIVER::VER_18 : ODBC_DRIVER::VER_13; @@ -208,12 +208,12 @@ sqlsrv_conn* core_sqlsrv_connect( _In_ sqlsrv_context& henv_cp, _In_ sqlsrv_cont #endif else if (d == last_version) { // if column encryption is enabled, throw the exception related to column encryption - CHECK_CUSTOM_ERROR(conn->ce_option.enabled, conn, SQLSRV_ERROR_CE_DRIVER_REQUIRED, get_processor_arch()) { + CHECK_CUSTOM_ERROR(conn->ce_option.enabled, conn, SQLSRV_ERROR_CE_DRIVER_REQUIRED, get_processor_arch(), NULL) { throw core::CoreException(); } - // here it means that none of the supported ODBC drivers is found - CHECK_CUSTOM_ERROR(true, conn, SQLSRV_ERROR_DRIVER_NOT_INSTALLED, get_processor_arch()) { + // here it means that none of the supported ODBC drivers is found + CHECK_CUSTOM_ERROR(true, conn, SQLSRV_ERROR_DRIVER_NOT_INSTALLED, get_processor_arch(), NULL) { throw core::CoreException(); } } @@ -230,7 +230,7 @@ sqlsrv_conn* core_sqlsrv_connect( _In_ sqlsrv_context& henv_cp, _In_ sqlsrv_cont throw core::CoreException(); } - CHECK_SQL_WARNING_AS_ERROR( r, conn ) { + CHECK_SQL_WARNING_AS_ERROR( r, conn, NULL ) { throw core::CoreException(); } @@ -324,7 +324,7 @@ SQLRETURN core_odbc_connect( _Inout_ sqlsrv_conn* conn, _Inout_ std::string& con // Convert our UTF-8 connection string to UTF-16 before connecting with SQLDriverConnnectW wconn_string = utf16_string_from_mbcs_string( SQLSRV_ENCODING_UTF8, conn_str.c_str(), static_cast( conn_str.length() ), &wconn_len, true ); - CHECK_CUSTOM_ERROR( wconn_string == 0, conn, SQLSRV_ERROR_CONNECT_STRING_ENCODING_TRANSLATE, get_last_error_message()) + CHECK_CUSTOM_ERROR( wconn_string == 0, conn, SQLSRV_ERROR_CONNECT_STRING_ENCODING_TRANSLATE, get_last_error_message(), NULL) { throw core::CoreException(); } @@ -487,7 +487,7 @@ void core_sqlsrv_prepare( _Inout_ sqlsrv_stmt* stmt, _In_reads_bytes_(sql_len) c SQLSRV_ENCODING encoding = (( stmt->encoding() == SQLSRV_ENCODING_DEFAULT ) ? stmt->conn->encoding() : stmt->encoding() ); wsql_string = utf16_string_from_mbcs_string( encoding, reinterpret_cast( sql ), static_cast( sql_len ), &wsql_len ); - CHECK_CUSTOM_ERROR( wsql_string == 0, stmt, SQLSRV_ERROR_QUERY_STRING_ENCODING_TRANSLATE, get_last_error_message() ) { + CHECK_CUSTOM_ERROR( wsql_string == 0, stmt, SQLSRV_ERROR_QUERY_STRING_ENCODING_TRANSLATE, get_last_error_message(), NULL) { throw core::CoreException(); } } @@ -796,7 +796,7 @@ void build_connection_string_and_set_conn_attr( _Inout_ sqlsrv_conn* conn, _Inou DEBUG_SQLSRV_ASSERT(( type == HASH_KEY_IS_LONG ), "build_connection_string_and_set_conn_attr: invalid connection option key type." ); conn_opt = get_connection_option( conn, index, valid_conn_opts ); - + if (conn_opt == NULL) throw; if( index == SQLSRV_CONN_OPTION_MARS ) { mars_mentioned = true; } @@ -1051,7 +1051,7 @@ void driver_set_func::func(_In_ connection_option const* option, _In_ zval* valu } } - CHECK_CUSTOM_ERROR(conn->driver_version == ODBC_DRIVER::VER_UNKNOWN, conn, SQLSRV_ERROR_CONNECT_INVALID_DRIVER, Z_STRVAL_P(value)) { + CHECK_CUSTOM_ERROR(conn->driver_version == ODBC_DRIVER::VER_UNKNOWN, conn, SQLSRV_ERROR_CONNECT_INVALID_DRIVER, Z_STRVAL_P(value), NULL) { throw core::CoreException(); } diff --git a/source/shared/core_results.cpp b/source/shared/core_results.cpp index 447b1202..1ddb0ea7 100644 --- a/source/shared/core_results.cpp +++ b/source/shared/core_results.cpp @@ -7,13 +7,13 @@ // Copyright(c) Microsoft Corporation // All rights reserved. // MIT License -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), -// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), +// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, // and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions : // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. //--------------------------------------------------------------------------------------------------------------------------------- @@ -48,7 +48,7 @@ const int INITIAL_LOB_FIELD_LEN = 2048; // base allocation size when retrie template T align_to( _In_ T number ) { - DEBUG_SQLSRV_ASSERT( (number + align) > number, "Number to align overflowed" ); + DEBUG_SQLSRV_ASSERT( (number + align) > number, "Number to align overflowed" ); return ((number % align) == 0) ? number : (number + align - (number % align)); } @@ -92,7 +92,7 @@ size_t get_float_precision( _In_ SQLLEN buffer_length, _In_ size_t unitsize) // use the display size to determine the sql type. And if it is a double, set the precision accordingly // the display sizes are set by the ODBC driver based on the precision of the sql type - // otherwise we can just use the default precision + // otherwise we can just use the default precision size_t real_display_size = 14; size_t float_display_size = 24; size_t real_precision = 7; @@ -206,14 +206,14 @@ SQLRETURN number_to_string( _In_ Number* number_data, _Out_writes_bytes_to_opt_( { std::basic_string str; - + for (const auto &mb : str_num ) { size_t cch = SystemLocale::NextChar( CP_ACP, &mb ) - &mb; if ( cch > 0 ) { WCHAR ch16; - DWORD rc; + DWORD rc; size_t cchActual = SystemLocale::ToUtf16( CP_ACP, &mb, cch, &ch16, 1, &rc); if (cchActual > 0) { @@ -242,8 +242,8 @@ std::string getUTF8StringFromString( _In_z_ const SQLWCHAR* source ) SQLLEN i = 0; std::string str; while ( source[i] ) - { - memset( c_str, 0, sizeof( c_str ) ); + { + memset( c_str, 0, sizeof( c_str ) ); int cch = 0; errno_t err = mplat_wctomb_s( &cch, c_str, sizeof( c_str ), source[i++] ); if ( cch > 0 && err == ERROR_SUCCESS ) @@ -271,7 +271,7 @@ struct row_dtor_closure { row_dtor_closure( _In_ sqlsrv_buffered_result_set* st, _In_ BYTE* row ) : results( st ), row_data( row ) { - } + } }; sqlsrv_error* odbc_get_diag_rec( _In_ sqlsrv_stmt* odbc, _In_ SQLSMALLINT record_number ) @@ -280,9 +280,9 @@ sqlsrv_error* odbc_get_diag_rec( _In_ sqlsrv_stmt* odbc, _In_ SQLSMALLINT record SQLWCHAR wnative_message[SQL_MAX_ERROR_MESSAGE_LENGTH + 1] = {L'\0'}; SQLINTEGER native_code; SQLSMALLINT wnative_message_len = 0; - + SQLSRV_ASSERT(odbc != NULL, "odbc_get_diag_rec: sqlsrv_stmt* odbc was null."); - SQLRETURN r = SQLGetDiagRecW( SQL_HANDLE_STMT, odbc->handle(), record_number, wsql_state, &native_code, wnative_message, + SQLRETURN r = SQLGetDiagRecW( SQL_HANDLE_STMT, odbc->handle(), record_number, wsql_state, &native_code, wnative_message, SQL_MAX_ERROR_MESSAGE_LENGTH + 1, &wnative_message_len ); if( !SQL_SUCCEEDED( r ) || r == SQL_NO_DATA ) { return NULL; @@ -300,14 +300,14 @@ sqlsrv_error* odbc_get_diag_rec( _In_ sqlsrv_stmt* odbc, _In_ SQLSMALLINT record if ( !convert_string_from_utf16( enc, wsql_state, SQL_SQLSTATE_BUFSIZE, (char**)&sql_state, sql_state_len )) { return NULL; } - + sqlsrv_malloc_auto_ptr native_message; SQLLEN native_message_len = 0; if (!convert_string_from_utf16( enc, wnative_message, wnative_message_len, (char**)&native_message, native_message_len )) { return NULL; } - return new (sqlsrv_malloc( sizeof( sqlsrv_error ))) sqlsrv_error( (SQLCHAR*) sql_state, (SQLCHAR*) native_message, + return new (sqlsrv_malloc( sizeof( sqlsrv_error ))) sqlsrv_error( (SQLCHAR*) sql_state, (SQLCHAR*) native_message, native_code ); } @@ -324,7 +324,7 @@ sqlsrv_result_set::sqlsrv_result_set( _In_ sqlsrv_stmt* stmt ) : // ODBC result set // This object simply wraps ODBC function calls -sqlsrv_odbc_result_set::sqlsrv_odbc_result_set( _In_ sqlsrv_stmt* stmt ) : +sqlsrv_odbc_result_set::sqlsrv_odbc_result_set( _In_ sqlsrv_stmt* stmt ) : sqlsrv_result_set( stmt ) { } @@ -347,12 +347,12 @@ SQLRETURN sqlsrv_odbc_result_set::get_data( _In_ SQLUSMALLINT field_index, _In_ return core::SQLGetData( odbc, field_index, target_type, buffer, buffer_length, out_buffer_length, handle_warning ); } -SQLRETURN sqlsrv_odbc_result_set::get_diag_field( _In_ SQLSMALLINT record_number, _In_ SQLSMALLINT diag_identifier, +SQLRETURN sqlsrv_odbc_result_set::get_diag_field( _In_ SQLSMALLINT record_number, _In_ SQLSMALLINT diag_identifier, _Inout_updates_(buffer_length) SQLPOINTER diag_info_buffer, _In_ SQLSMALLINT buffer_length, _Inout_ SQLSMALLINT* out_buffer_length ) { SQLSRV_ASSERT( odbc != NULL, "Invalid statement handle" ); - return core::SQLGetDiagField( odbc, record_number, diag_identifier, diag_info_buffer, buffer_length, + return core::SQLGetDiagField( odbc, record_number, diag_identifier, diag_info_buffer, buffer_length, out_buffer_length ); } @@ -388,7 +388,7 @@ sqlsrv_buffered_result_set::sqlsrv_buffered_result_set( _Inout_ sqlsrv_stmt* stm } SQLULEN null_bytes = ( col_count / 8 ) + 1; // number of bits to reserve at the beginning of each row for NULL flags - meta = static_cast( sqlsrv_malloc( col_count * + meta = static_cast( sqlsrv_malloc( col_count * sizeof( sqlsrv_buffered_result_set::meta_data ))); SQLSRV_ENCODING encoding = (( stmt->encoding() == SQLSRV_ENCODING_DEFAULT ) ? stmt->conn->encoding() : @@ -397,7 +397,7 @@ sqlsrv_buffered_result_set::sqlsrv_buffered_result_set( _Inout_ sqlsrv_stmt* stm // get the meta data and calculate the size of a row buffer SQLULEN offset = null_bytes; for( SQLSMALLINT i = 0; i < col_count; ++i ) { - + core::SQLDescribeColW( stmt, i + 1, NULL, 0, NULL, &meta[i].type, &meta[i].length, &meta[i].scale, NULL ); offset = align_to( offset ); @@ -423,7 +423,7 @@ sqlsrv_buffered_result_set::sqlsrv_buffered_result_set( _Inout_ sqlsrv_stmt* stm } else { // If encoding is set to UTF-8, the following types are not necessarily column size. - // We need to call SQLGetData with c_type SQL_C_WCHAR and set the size accordingly. + // We need to call SQLGetData with c_type SQL_C_WCHAR and set the size accordingly. if ( encoding == SQLSRV_ENCODING_UTF8 ) { meta[i].length *= sizeof( WCHAR ); meta[i].length += sizeof( SQLULEN ) + sizeof( WCHAR ); // length plus null terminator space @@ -477,7 +477,7 @@ sqlsrv_buffered_result_set::sqlsrv_buffered_result_set( _Inout_ sqlsrv_stmt* stm case SQL_SS_TIME2: case SQL_SS_TIMESTAMPOFFSET: case SQL_TYPE_TIMESTAMP: - core::SQLColAttributeW( stmt, i + 1, SQL_DESC_DISPLAY_SIZE, NULL, 0, NULL, + core::SQLColAttributeW( stmt, i + 1, SQL_DESC_DISPLAY_SIZE, NULL, 0, NULL, reinterpret_cast( &meta[i].length ) ); meta[i].length += sizeof(char) + sizeof( SQLULEN ); // null terminator space offset += meta[i].length; @@ -517,13 +517,13 @@ sqlsrv_buffered_result_set::sqlsrv_buffered_result_set( _Inout_ sqlsrv_stmt* stm case SQL_TYPE_TIMESTAMP: meta[i].c_type = SQL_C_CHAR; break; - + case SQL_CHAR: case SQL_VARCHAR: case SQL_SS_VARIANT: case SQL_LONGVARCHAR: // If encoding is set to UTF-8, the following types are not necessarily column size. - // We need to call SQLGetData with c_type SQL_C_WCHAR and set the size accordingly. + // We need to call SQLGetData with c_type SQL_C_WCHAR and set the size accordingly. if ( encoding == SQLSRV_ENCODING_UTF8 ) { meta[i].c_type = SQL_C_WCHAR; } @@ -531,7 +531,7 @@ sqlsrv_buffered_result_set::sqlsrv_buffered_result_set( _Inout_ sqlsrv_stmt* stm meta[i].c_type = SQL_C_CHAR; } break; - + case SQL_SS_UDT: case SQL_LONGVARBINARY: case SQL_BINARY: @@ -574,7 +574,7 @@ sqlsrv_buffered_result_set::sqlsrv_buffered_result_set( _Inout_ sqlsrv_stmt* stm try { while( core::SQLFetchScroll( stmt, SQL_FETCH_NEXT, 0 ) != SQL_NO_DATA ) { - + // allocate the row buffer sqlsrv_malloc_auto_ptr rowAuto; rowAuto = static_cast( sqlsrv_malloc( offset )); @@ -610,15 +610,15 @@ sqlsrv_buffered_result_set::sqlsrv_buffered_result_set( _Inout_ sqlsrv_stmt* stm else { mem_used += meta[i].length; - CHECK_CUSTOM_ERROR( mem_used > stmt->buffered_query_limit * 1024, stmt, - SQLSRV_ERROR_BUFFER_LIMIT_EXCEEDED, stmt->buffered_query_limit ) { + CHECK_CUSTOM_ERROR( mem_used > stmt->buffered_query_limit * 1024, stmt, + SQLSRV_ERROR_BUFFER_LIMIT_EXCEEDED, stmt->buffered_query_limit, NULL) { throw core::CoreException(); } buffer = row + meta[i].offset + sizeof( SQLULEN ); out_buffer_length = reinterpret_cast( row + meta[i].offset ); - core::SQLGetData( stmt, i + 1, meta[i].c_type, buffer, meta[i].length, out_buffer_length, + core::SQLGetData( stmt, i + 1, meta[i].c_type, buffer, meta[i].length, out_buffer_length, false ); } break; @@ -627,17 +627,17 @@ sqlsrv_buffered_result_set::sqlsrv_buffered_result_set( _Inout_ sqlsrv_stmt* stm case SQL_C_DOUBLE: { mem_used += meta[i].length; - CHECK_CUSTOM_ERROR( mem_used > stmt->buffered_query_limit * 1024, stmt, - SQLSRV_ERROR_BUFFER_LIMIT_EXCEEDED, stmt->buffered_query_limit ) { + CHECK_CUSTOM_ERROR( mem_used > stmt->buffered_query_limit * 1024, stmt, + SQLSRV_ERROR_BUFFER_LIMIT_EXCEEDED, stmt->buffered_query_limit, NULL) { throw core::CoreException(); } buffer = row + meta[i].offset; out_buffer_length = &out_buffer_temp; - core::SQLGetData( stmt, i + 1, meta[i].c_type, buffer, meta[i].length, out_buffer_length, + core::SQLGetData( stmt, i + 1, meta[i].c_type, buffer, meta[i].length, out_buffer_length, false ); } - break; + break; default: SQLSRV_ASSERT( false, "Unknown C type" ); @@ -656,8 +656,8 @@ sqlsrv_buffered_result_set::sqlsrv_buffered_result_set( _Inout_ sqlsrv_stmt* stm row_dtor_closure cl( this, row ); sqlsrv_zend_hash_next_index_insert_mem( *stmt, cache, &cl, sizeof(row_dtor_closure) ); rowAuto.transferred(); - } - } + } + } catch( core::CoreException& ) { // free the rows if( cache ) { @@ -753,7 +753,7 @@ SQLRETURN sqlsrv_buffered_result_set::get_data( _In_ SQLUSMALLINT field_index, _ *out_buffer_length = SQL_NULL_DATA; return SQL_SUCCESS; } - + // check to make sure the conversion type is valid switch (meta[field_index].c_type) { case SQL_C_CHAR: @@ -817,21 +817,21 @@ SQLRETURN sqlsrv_buffered_result_set::get_data( _In_ SQLUSMALLINT field_index, _ return SQL_ERROR; } -SQLRETURN sqlsrv_buffered_result_set::get_diag_field( _In_ SQLSMALLINT record_number, _In_ SQLSMALLINT diag_identifier, +SQLRETURN sqlsrv_buffered_result_set::get_diag_field( _In_ SQLSMALLINT record_number, _In_ SQLSMALLINT diag_identifier, _Inout_updates_(buffer_length) SQLPOINTER diag_info_buffer, _In_ SQLSMALLINT buffer_length, _Inout_ SQLSMALLINT* out_buffer_length ) { SQLSRV_ASSERT( record_number == 1, "Only record number 1 can be fetched by sqlsrv_buffered_result_set::get_diag_field" ); - SQLSRV_ASSERT( diag_identifier == SQL_DIAG_SQLSTATE, + SQLSRV_ASSERT( diag_identifier == SQL_DIAG_SQLSTATE, "Only SQL_DIAG_SQLSTATE can be fetched by sqlsrv_buffered_result_set::get_diag_field" ); - SQLSRV_ASSERT( buffer_length >= SQL_SQLSTATE_BUFSIZE, + SQLSRV_ASSERT( buffer_length >= SQL_SQLSTATE_BUFSIZE, "Buffer not big enough to return SQLSTATE in sqlsrv_buffered_result_set::get_diag_field" ); if( last_error == 0 ) { return SQL_NO_DATA; } - SQLSRV_ASSERT( last_error->sqlstate != NULL, + SQLSRV_ASSERT( last_error->sqlstate != NULL, "Must have a SQLSTATE in a valid last_error in sqlsrv_buffered_result_set::get_diag_field" ); SQLSMALLINT bufsize = ( buffer_length < SQL_SQLSTATE_BUFSIZE ) ? buffer_length : SQL_SQLSTATE_BUFSIZE; @@ -858,8 +858,8 @@ sqlsrv_error* sqlsrv_buffered_result_set::get_diag_rec( _In_ SQLSMALLINT record_ if( record_number > 1 ) { return NULL; } - - return new (sqlsrv_malloc( sizeof( sqlsrv_error ))) + + return new (sqlsrv_malloc( sizeof( sqlsrv_error ))) sqlsrv_error( last_error->sqlstate, last_error->native_message, last_error->native_code ); } @@ -879,7 +879,7 @@ SQLLEN sqlsrv_buffered_result_set::row_count( void ) // private functions template SQLRETURN binary_to_string( _Inout_ SQLCHAR* field_data, _Inout_ SQLLEN& read_so_far, _Out_writes_z_(*out_buffer_length) void* buffer, - _In_ SQLLEN buffer_length, _Inout_ SQLLEN* out_buffer_length, + _In_ SQLLEN buffer_length, _Inout_ SQLLEN* out_buffer_length, _Inout_ sqlsrv_error_auto_ptr& out_error ) { // The hex characters for the conversion loop below @@ -892,7 +892,7 @@ SQLRETURN binary_to_string( _Inout_ SQLCHAR* field_data, _Inout_ SQLLEN& read_so // Set the amount of space necessary for null characters at the end of the data. SQLSMALLINT extra = sizeof(Char); - // TO convert a binary to a system string or a binary to a wide string, the buffer size minus + // TO convert a binary to a system string or a binary to a wide string, the buffer size minus // 'extra' is ideally multiples of 2 or 4 (depending on Char), but calculating to_copy_hex below // takes care of this. @@ -900,7 +900,7 @@ SQLRETURN binary_to_string( _Inout_ SQLCHAR* field_data, _Inout_ SQLLEN& read_so // the entire length of the string is returned the first // call in out_buffer_len. Successive calls return how much is // left minus how much has already been read by previous reads - // *2 is for each byte to hex conversion and * extra is for either system + // *2 is for each byte to hex conversion and * extra is for either system // or wide string allocation *out_buffer_length = (*reinterpret_cast( field_data - sizeof( SQLULEN )) - read_so_far) * 2 * extra; @@ -908,7 +908,7 @@ SQLRETURN binary_to_string( _Inout_ SQLCHAR* field_data, _Inout_ SQLLEN& read_so SQLLEN to_copy; if( buffer_length < *out_buffer_length + extra ) { to_copy = (buffer_length - extra); - out_error = new ( sqlsrv_malloc( sizeof( sqlsrv_error ))) + out_error = new ( sqlsrv_malloc( sizeof( sqlsrv_error ))) sqlsrv_error( (SQLCHAR*) "01004", (SQLCHAR*) "String data, right truncated", -1 ); r = SQL_SUCCESS_WITH_INFO; } @@ -990,13 +990,13 @@ SQLRETURN sqlsrv_buffered_result_set::double_to_long( _In_ SQLSMALLINT field_ind LONG* long_data = reinterpret_cast( buffer ); if( *double_data < double( LONG_MIN ) || *double_data > double( LONG_MAX )) { - last_error = new (sqlsrv_malloc( sizeof( sqlsrv_error ))) sqlsrv_error( (SQLCHAR*) "22003", + last_error = new (sqlsrv_malloc( sizeof( sqlsrv_error ))) sqlsrv_error( (SQLCHAR*) "22003", (SQLCHAR*) "Numeric value out of range", 0 ); return SQL_ERROR; } if( *double_data != floor( *double_data )) { - last_error = new (sqlsrv_malloc( sizeof( sqlsrv_error ))) sqlsrv_error( (SQLCHAR*) "01S07", + last_error = new (sqlsrv_malloc( sizeof( sqlsrv_error ))) sqlsrv_error( (SQLCHAR*) "01S07", (SQLCHAR*) "Fractional truncation", 0 ); return SQL_SUCCESS_WITH_INFO; } @@ -1024,7 +1024,7 @@ SQLRETURN sqlsrv_buffered_result_set::double_to_system_string( _In_ SQLSMALLINT return r; } -SQLRETURN sqlsrv_buffered_result_set::long_to_double( _In_ SQLSMALLINT field_index, _Out_writes_bytes_(*out_buffer_length) void* buffer, _In_ SQLLEN buffer_length, +SQLRETURN sqlsrv_buffered_result_set::long_to_double( _In_ SQLSMALLINT field_index, _Out_writes_bytes_(*out_buffer_length) void* buffer, _In_ SQLLEN buffer_length, _Out_ SQLLEN* out_buffer_length ) { SQLSRV_ASSERT( meta[field_index].c_type == SQL_C_LONG, "Invalid conversion to long" ); @@ -1148,7 +1148,7 @@ SQLRETURN sqlsrv_buffered_result_set::wstring_to_long( _In_ SQLSMALLINT field_in return SQL_SUCCESS; } -SQLRETURN sqlsrv_buffered_result_set::system_to_wide_string( _In_ SQLSMALLINT field_index, _Out_writes_z_(*out_buffer_length) void* buffer, _In_ SQLLEN buffer_length, +SQLRETURN sqlsrv_buffered_result_set::system_to_wide_string( _In_ SQLSMALLINT field_index, _Out_writes_z_(*out_buffer_length) void* buffer, _In_ SQLLEN buffer_length, _Out_ SQLLEN* out_buffer_length ) { SQLSRV_ASSERT( last_error == 0, "Pending error for sqlsrv_buffered_results_set::system_to_wide_string" ); @@ -1184,7 +1184,7 @@ SQLRETURN sqlsrv_buffered_result_set::system_to_wide_string( _In_ SQLSMALLINT fi if( (size_t) buffer_length < (field_len - read_so_far + sizeof(char)) * sizeof(WCHAR)) { to_copy = (buffer_length - sizeof(WCHAR)) / sizeof(WCHAR); // to_copy is the number of characters - last_error = new ( sqlsrv_malloc( sizeof( sqlsrv_error ))) + last_error = new ( sqlsrv_malloc( sizeof( sqlsrv_error ))) sqlsrv_error( (SQLCHAR*) "01004", (SQLCHAR*) "String data, right truncated", -1 ); r = SQL_SUCCESS_WITH_INFO; } @@ -1204,20 +1204,20 @@ SQLRETURN sqlsrv_buffered_result_set::system_to_wide_string( _In_ SQLSMALLINT fi } #ifndef _WIN32 - int ch_space = SystemLocale::ToUtf16( CP_ACP, (LPCSTR) field_data, static_cast(to_copy), + int ch_space = SystemLocale::ToUtf16( CP_ACP, (LPCSTR) field_data, static_cast(to_copy), static_cast(buffer), static_cast(to_copy)); - + #else - int ch_space = MultiByteToWideChar( CP_ACP, MB_ERR_INVALID_CHARS, (LPCSTR) field_data, static_cast(to_copy), + int ch_space = MultiByteToWideChar( CP_ACP, MB_ERR_INVALID_CHARS, (LPCSTR) field_data, static_cast(to_copy), static_cast(buffer), static_cast(to_copy)); #endif // !_WIN32 - + if( ch_space == 0 ) { switch( GetLastError() ) { case ERROR_NO_UNICODE_TRANSLATION: - // the theory here is the conversion failed because the end of the buffer we provided contained only + // the theory here is the conversion failed because the end of the buffer we provided contained only // half a character at the end if( !tried_again ) { to_copy--; @@ -1295,7 +1295,7 @@ SQLRETURN sqlsrv_buffered_result_set::to_same_string( _In_ SQLSMALLINT field_ind SQLLEN to_copy; if( buffer_length < *out_buffer_length + extra ) { to_copy = buffer_length - extra; - last_error = new ( sqlsrv_malloc( sizeof( sqlsrv_error ))) + last_error = new ( sqlsrv_malloc( sizeof( sqlsrv_error ))) sqlsrv_error( (SQLCHAR*) "01004", (SQLCHAR*) "String data, right truncated", -1 ); r = SQL_SUCCESS_WITH_INFO; } @@ -1355,17 +1355,17 @@ SQLRETURN sqlsrv_buffered_result_set::wide_to_system_string( _In_ SQLSMALLINT fi // allocate enough to handle WC -> DBCS conversion if it happens temp_string = reinterpret_cast( sqlsrv_malloc( field_len, sizeof(char), sizeof(char))); - -#ifndef _WIN32 + +#ifndef _WIN32 temp_length = SystemLocale::FromUtf16( CP_ACP, (LPCWSTR) field_data, static_cast(field_len / sizeof(WCHAR)), (LPSTR) temp_string.get(), static_cast(field_len) ); -#else +#else BOOL default_char_used = FALSE; char default_char = '?'; temp_length = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR) field_data, static_cast(field_len / sizeof(WCHAR)), (LPSTR) temp_string.get(), static_cast(field_len), &default_char, &default_char_used ); -#endif // !_WIN32 +#endif // !_WIN32 if( temp_length == 0 ) { switch( GetLastError() ) { @@ -1390,7 +1390,7 @@ SQLRETURN sqlsrv_buffered_result_set::wide_to_system_string( _In_ SQLSMALLINT fi if( (size_t) buffer_length < (temp_length - read_so_far + sizeof(char))) { to_copy = buffer_length - sizeof(char); - last_error = new ( sqlsrv_malloc( sizeof( sqlsrv_error ))) + last_error = new ( sqlsrv_malloc( sizeof( sqlsrv_error ))) sqlsrv_error( (SQLCHAR*) "01004", (SQLCHAR*) "String data, right truncated", -1 ); r = SQL_SUCCESS_WITH_INFO; } @@ -1469,7 +1469,7 @@ void cache_row_dtor( _In_ zval* data ) sqlsrv_free( cl ); } -SQLPOINTER read_lob_field( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT field_index, _In_ sqlsrv_buffered_result_set::meta_data& meta, +SQLPOINTER read_lob_field( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT field_index, _In_ sqlsrv_buffered_result_set::meta_data& meta, _In_ zend_long mem_used ) { SQLSMALLINT extra = 0; @@ -1515,8 +1515,8 @@ SQLPOINTER read_lob_field( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT field_in // if the last read was successful, we're done if( r == SQL_SUCCESS ) { // check to make sure we haven't overflown our memory limit - CHECK_CUSTOM_ERROR( mem_used + last_field_len > stmt->buffered_query_limit * 1024, stmt, - SQLSRV_ERROR_BUFFER_LIMIT_EXCEEDED, stmt->buffered_query_limit ) { + CHECK_CUSTOM_ERROR( mem_used + last_field_len > stmt->buffered_query_limit * 1024, stmt, + SQLSRV_ERROR_BUFFER_LIMIT_EXCEEDED, stmt->buffered_query_limit, NULL) { throw core::CoreException(); } @@ -1525,7 +1525,7 @@ SQLPOINTER read_lob_field( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT field_in // else if it wasn't the truncated warning (01004) then we're done else if( r == SQL_SUCCESS_WITH_INFO ) { SQLSMALLINT len; - core::SQLGetDiagField( stmt, 1, SQL_DIAG_SQLSTATE, state, SQL_SQLSTATE_BUFSIZE, &len + core::SQLGetDiagField( stmt, 1, SQL_DIAG_SQLSTATE, state, SQL_SQLSTATE_BUFSIZE, &len ); if( !is_truncated_warning( state )) { @@ -1539,8 +1539,8 @@ SQLPOINTER read_lob_field( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT field_in // if the type of the field returns the total to be read, we use that and preallocate the buffer if( last_field_len != SQL_NO_TOTAL ) { - CHECK_CUSTOM_ERROR( mem_used + last_field_len > stmt->buffered_query_limit * 1024, stmt, - SQLSRV_ERROR_BUFFER_LIMIT_EXCEEDED, stmt->buffered_query_limit ) { + CHECK_CUSTOM_ERROR( mem_used + last_field_len > stmt->buffered_query_limit * 1024, stmt, + SQLSRV_ERROR_BUFFER_LIMIT_EXCEEDED, stmt->buffered_query_limit, NULL) { throw core::CoreException(); } @@ -1554,8 +1554,8 @@ SQLPOINTER read_lob_field( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT field_in // otherwise allocate another chunk of memory to read in else { to_read *= 2; - CHECK_CUSTOM_ERROR( mem_used + to_read > stmt->buffered_query_limit * 1024, stmt, - SQLSRV_ERROR_BUFFER_LIMIT_EXCEEDED, stmt->buffered_query_limit ) { + CHECK_CUSTOM_ERROR( mem_used + to_read > stmt->buffered_query_limit * 1024, stmt, + SQLSRV_ERROR_BUFFER_LIMIT_EXCEEDED, stmt->buffered_query_limit, NULL) { throw core::CoreException(); } diff --git a/source/shared/core_sqlsrv.h b/source/shared/core_sqlsrv.h index 8a6661b7..6b56dc46 100644 --- a/source/shared/core_sqlsrv.h +++ b/source/shared/core_sqlsrv.h @@ -375,7 +375,7 @@ inline void sqlsrv_free_trace( _Inout_ void* ptr, _In_ const char* file, _In_ in #else // Unlike their C standard library's counterparts the Zend Engine's memory management functions -// emalloc or erealloc won't return NULL in case of an problem while allocating the requested +// emalloc or erealloc won't return NULL in case of an problem while allocating the requested // memory but bail out and terminate the current request. // Check www.phpinternalsbook.com/php7/memory_management/zend_memory_manager.html for details inline void* sqlsrv_malloc( _In_ size_t size ) @@ -1060,7 +1060,7 @@ enum SERVER_VERSION { // supported driver versions. // ODBC 17 is the default enum class ODBC_DRIVER : int -{ +{ VER_17 = 17, VER_18 = 18, VER_13 = 13, @@ -1416,7 +1416,7 @@ struct sqlsrv_param zval* param_ptr_z; // NULL by default - points to the original parameter or its reference std::size_t num_bytes_read; // 0 by default - number of bytes processed so far (for an empty PHP stream, an empty string is sent to the server) php_stream* param_stream; // NULL by default - used to send stream data from an input parameter to the server - + sqlsrv_param(_In_ SQLUSMALLINT param_num, _In_ SQLSMALLINT dir, _In_ SQLSRV_ENCODING enc, _In_ SQLSMALLINT sql_type, _In_ SQLULEN col_size, _In_ SQLSMALLINT dec_digits) : c_data_type(0), buffer(NULL), buffer_length(0), strlen_or_indptr(0), param_pos(param_num), direction(dir), encoding(enc), sql_data_type(sql_type), column_size(col_size), decimal_digits(dec_digits), param_php_type(0), was_null(false), param_ptr_z(NULL), num_bytes_read(0), param_stream(NULL) @@ -1445,7 +1445,7 @@ struct sqlsrv_param virtual void process_string_param(_Inout_ sqlsrv_stmt* stmt, _Inout_ zval* param_z); virtual void process_resource_param(_Inout_ zval* param_z); virtual void process_object_param(_Inout_ sqlsrv_stmt* stmt, _Inout_ zval* param_z); - + virtual void bind_param(_Inout_ sqlsrv_stmt* stmt); // The following methods are used to supply data to the server via SQLPutData @@ -1479,7 +1479,7 @@ struct sqlsrv_param_inout : public sqlsrv_param // Resize the output string buffer based on its properties and whether it is a numeric type void resize_output_string_buffer(_Inout_ zval* param_z, _In_ bool is_numeric_type); - + // A helper method called by finalize_output_value() to finalize output string parameters void finalize_output_string(); }; @@ -1493,7 +1493,7 @@ struct sqlsrv_param_inout : public sqlsrv_param struct sqlsrv_param_tvp : public sqlsrv_param { std::map tvp_columns; // The constituent columns of the table-valued parameter - + sqlsrv_param_tvp* parent_tvp; // For a TVP column to reference to the table-valued parameter. NULL if this is the TVP itself. int num_rows; // The total number of rows int current_row; // A counter to keep track of which row is to be processed @@ -1514,7 +1514,7 @@ struct sqlsrv_param_tvp : public sqlsrv_param // Change the column encoding based on the sql data type static void sql_type_to_encoding(_In_ SQLSMALLINT sql_type, _Inout_ SQLSRV_ENCODING* encoding); - + // The following methods are only applicable to a table-valued parameter or its individual columns int parse_tv_param_arrays(_Inout_ sqlsrv_stmt* stmt, _Inout_ zval* param_z); void get_tvp_metadata(_In_ sqlsrv_stmt* stmt, _In_ zend_string* table_type_name, _In_ zend_string* schema_name); @@ -2208,7 +2208,7 @@ namespace core { // regular error handling return; } - CHECK_SQL_ERROR_OR_WARNING( rtemp, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( rtemp, stmt, NULL ) { throw CoreException(); } @@ -2239,7 +2239,7 @@ namespace core { SQLRETURN r = ::SQLGetDiagField( ctx->handle_type(), ctx->handle(), record_number, diag_identifier, diag_info_buffer, buffer_length, out_buffer_length ); - CHECK_SQL_ERROR_OR_WARNING( r, ctx ) { + CHECK_SQL_ERROR_OR_WARNING( r, ctx, NULL) { throw CoreException(); } @@ -2251,7 +2251,7 @@ namespace core { { SQLRETURN r; r = ::SQLAllocHandle( HandleType, InputHandle.handle(), OutputHandlePtr ); - CHECK_SQL_ERROR_OR_WARNING( r, InputHandle ) { + CHECK_SQL_ERROR_OR_WARNING( r, InputHandle, NULL ) { throw CoreException(); } } @@ -2272,7 +2272,7 @@ namespace core { r = ::SQLBindParameter( stmt->handle(), ParameterNumber, InputOutputType, ValueType, ParameterType, ColumnSize, DecimalDigits, ParameterValuePtr, BufferLength, StrLen_Or_IndPtr ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } } @@ -2281,7 +2281,7 @@ namespace core { { SQLRETURN r = ::SQLCloseCursor( stmt->handle() ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } } @@ -2293,7 +2293,7 @@ namespace core { SQLRETURN r = ::SQLColAttribute( stmt->handle(), field_index, field_identifier, field_type_char, buffer_length, out_buffer_length, field_type_num ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } } @@ -2305,7 +2305,7 @@ namespace core { SQLRETURN r = ::SQLColAttributeW( stmt->handle(), field_index, field_identifier, field_type_char, buffer_length, out_buffer_length, field_type_num ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } } @@ -2318,7 +2318,7 @@ namespace core { r = ::SQLDescribeCol( stmt->handle(), colno, col_name, col_name_length, col_name_length_out, data_type, col_size, decimal_digits, nullable); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } } @@ -2331,7 +2331,7 @@ namespace core { r = ::SQLDescribeColW( stmt->handle(), colno, col_name, col_name_length, col_name_length_out, data_type, col_size, decimal_digits, nullable ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } } @@ -2342,7 +2342,7 @@ namespace core { SQLRETURN r; r = ::SQLDescribeParam( stmt->handle(), paramno, data_type, col_size, decimal_digits, nullable ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } } @@ -2352,7 +2352,7 @@ namespace core { SQLRETURN r; r = ::SQLNumParams( stmt->handle(), num_params ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } } @@ -2361,7 +2361,7 @@ namespace core { { SQLRETURN r = ::SQLEndTran( handleType, conn->handle(), completionType ); - CHECK_SQL_ERROR_OR_WARNING( r, conn ) { + CHECK_SQL_ERROR_OR_WARNING( r, conn, NULL ) { throw CoreException(); } } @@ -2373,7 +2373,7 @@ namespace core { check_for_mars_error( stmt, r ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } @@ -2387,7 +2387,7 @@ namespace core { check_for_mars_error( stmt, r ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } return r; @@ -2401,7 +2401,7 @@ namespace core { check_for_mars_error( stmt, r ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } @@ -2412,7 +2412,7 @@ namespace core { { SQLRETURN r = ::SQLFetchScroll( stmt->handle(), fetch_orientation, fetch_offset ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } return r; @@ -2424,14 +2424,14 @@ namespace core { { SQLRETURN r; r = ::SQLFreeHandle( ctx.handle_type(), ctx.handle() ); - CHECK_SQL_ERROR_OR_WARNING( r, ctx ) {} + CHECK_SQL_ERROR_OR_WARNING( r, ctx, NULL ) {} } inline void SQLGetStmtAttr( _Inout_ sqlsrv_stmt* stmt, _In_ SQLINTEGER attr, _Out_writes_opt_(buf_len) void* value_ptr, _In_ SQLINTEGER buf_len, _Out_opt_ SQLINTEGER* str_len) { SQLRETURN r; r = ::SQLGetStmtAttr( stmt->handle(), attr, value_ptr, buf_len, str_len ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } } @@ -2450,7 +2450,7 @@ namespace core { } if( handle_warning ) { - CHECK_SQL_WARNING_AS_ERROR( r, stmt ) { + CHECK_SQL_WARNING_AS_ERROR( r, stmt, NULL ) { throw CoreException(); } } @@ -2465,7 +2465,7 @@ namespace core { SQLRETURN r; r = ::SQLGetInfo( conn->handle(), info_type, info_value, buffer_len, str_len ); - CHECK_SQL_ERROR_OR_WARNING( r, conn ) { + CHECK_SQL_ERROR_OR_WARNING( r, conn, NULL ) { throw CoreException(); } } @@ -2476,7 +2476,7 @@ namespace core { SQLRETURN r; r = ::SQLGetTypeInfo( stmt->handle(), data_type ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } } @@ -2487,7 +2487,7 @@ namespace core { { SQLRETURN r = ::SQLMoreResults( stmt->handle() ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } @@ -2500,7 +2500,7 @@ namespace core { SQLSMALLINT num_cols; r = ::SQLNumResultCols( stmt->handle(), &num_cols ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } @@ -2513,7 +2513,7 @@ namespace core { { SQLRETURN r; r = ::SQLParamData( stmt->handle(), value_ptr_ptr ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } return r; @@ -2523,7 +2523,7 @@ namespace core { { SQLRETURN r; r = ::SQLPrepareW( stmt->handle(), sql, sql_len ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } } @@ -2533,7 +2533,7 @@ namespace core { { SQLRETURN r; r = ::SQLPutData( stmt->handle(), data_ptr, strlen_or_ind ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } } @@ -2558,7 +2558,7 @@ namespace core { return 0; #endif // !_WIN32 - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } @@ -2571,7 +2571,7 @@ namespace core { SQLRETURN r; r = ::SQLSetConnectAttr( ctx.handle(), attr, value_ptr, str_len ); - CHECK_SQL_ERROR_OR_WARNING( r, ctx ) { + CHECK_SQL_ERROR_OR_WARNING( r, ctx, NULL ) { throw CoreException(); } } @@ -2583,7 +2583,7 @@ namespace core { core::SQLGetStmtAttr( stmt, SQL_ATTR_IMP_PARAM_DESC, &hIpd, 0, 0 ); if( value_ptr ) { r = ::SQLSetDescField( hIpd, rec_num, fld_id, value_ptr, str_len ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } } @@ -2593,7 +2593,7 @@ namespace core { { SQLRETURN r; r = ::SQLSetEnvAttr( ctx.handle(), attr, value_ptr, str_len ); - CHECK_SQL_ERROR_OR_WARNING( r, ctx ) { + CHECK_SQL_ERROR_OR_WARNING( r, ctx, NULL ) { throw CoreException(); } } @@ -2602,7 +2602,7 @@ namespace core { { SQLRETURN r = ::SQLSetConnectAttr( conn->handle(), attribute, value_ptr, value_len ); - CHECK_SQL_ERROR_OR_WARNING( r, conn ) { + CHECK_SQL_ERROR_OR_WARNING( r, conn, NULL ) { throw CoreException(); } } @@ -2611,7 +2611,7 @@ namespace core { { SQLRETURN r; r = ::SQLSetStmtAttr( stmt->handle(), attr, value_ptr, str_len ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw CoreException(); } } diff --git a/source/shared/core_stmt.cpp b/source/shared/core_stmt.cpp index 4b673e27..fe69c58a 100644 --- a/source/shared/core_stmt.cpp +++ b/source/shared/core_stmt.cpp @@ -162,7 +162,7 @@ sqlsrv_stmt::~sqlsrv_stmt( void ) // delete sensivity data clean_up_sensitivity_metadata(); - // clean up metadata + // clean up metadata clean_up_results_metadata(); invalidate(); @@ -366,7 +366,7 @@ void core_sqlsrv_bind_param( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT param_ _Inout_ SQLSMALLINT decimal_digits) { // check is only < because params are 0 based - CHECK_CUSTOM_ERROR(param_num >= SQL_SERVER_MAX_PARAMS, stmt, SQLSRV_ERROR_MAX_PARAMS_EXCEEDED, param_num + 1) { + CHECK_CUSTOM_ERROR(param_num >= SQL_SERVER_MAX_PARAMS, stmt, SQLSRV_ERROR_MAX_PARAMS_EXCEEDED, param_num + 1, NULL) { throw core::CoreException(); } @@ -395,7 +395,7 @@ void core_sqlsrv_bind_param( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT param_ stmt->params_container.insert_param(param_num, new_param); param_ptr = new_param; new_param.transferred(); - } else if (direction == SQL_PARAM_INPUT + } else if (direction == SQL_PARAM_INPUT && param_ptr->sql_data_type != SQL_SS_TABLE && param_ptr->strlen_or_indptr == SQL_NULL_DATA) { // reset the followings for regular input parameters if it was bound as a null param before @@ -408,7 +408,7 @@ void core_sqlsrv_bind_param( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT param_ bool result = param_ptr->prepare_param(param_ref, param_z); if (!result && direction == SQL_PARAM_INPUT_OUTPUT) { - CHECK_CUSTOM_ERROR(!result, stmt, SQLSRV_ERROR_INPUT_OUTPUT_PARAM_TYPE_MATCH, param_num + 1) { + CHECK_CUSTOM_ERROR(!result, stmt, SQLSRV_ERROR_INPUT_OUTPUT_PARAM_TYPE_MATCH, param_num + 1, NULL) { throw core::CoreException(); } } @@ -442,7 +442,7 @@ void core_sqlsrv_bind_param( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT param_ // For a parameter targeting a SmallDatetime column, the return values are SQL_TYPE_TIMESTAMP, 16, and 0. Inputting these values into SQLBindParameter() results in Operand type clash error. // This is because SQL_TYPE_TIMESTAMP corresponds to Datetime2 by default, and conversion of Datetime2 to Datetime and conversion of Datetime2 to SmallDatatime is not allowed with encrypted columns. // To fix the conversion problem, set the SQL_CA_SS_SERVER_TYPE field of the parameter to SQL_SS_TYPE_DATETIME and SQL_SS_TYPE_SMALLDATETIME respectively for a Datetime and Smalldatetime column. - // Note this must be called after SQLBindParameter() or SQLSetDescField() may fail. + // Note this must be called after SQLBindParameter() or SQLSetDescField() may fail. // VSO BUG 2693: how to correctly distinguish datetime from datetime2(3)? Both have the same decimal_digits and column_size if (stmt->conn->ce_option.enabled && param_ptr->sql_data_type == SQL_TYPE_TIMESTAMP) { if (param_ptr->decimal_digits == 3) { @@ -489,7 +489,7 @@ SQLRETURN core_sqlsrv_execute( _Inout_ sqlsrv_stmt* stmt, _In_reads_bytes_(sql_l wsql_string = utf16_string_from_mbcs_string( encoding, reinterpret_cast( sql ), sql_len, &wsql_len ); CHECK_CUSTOM_ERROR( wsql_string == 0, stmt, SQLSRV_ERROR_QUERY_STRING_ENCODING_TRANSLATE, - get_last_error_message() ) { + get_last_error_message(), NULL) { throw core::CoreException(); } } @@ -646,7 +646,7 @@ field_meta_data* core_sqlsrv_field_metadata( _Inout_ sqlsrv_stmt* stmt, _In_ SQL bool converted = convert_string_from_utf16( encoding, field_name_temp, field_len_temp, ( char** ) &( meta_data->field_name ), field_name_len ); - CHECK_CUSTOM_ERROR( !converted, stmt, SQLSRV_ERROR_FIELD_ENCODING_TRANSLATE, get_last_error_message() ) { + CHECK_CUSTOM_ERROR( !converted, stmt, SQLSRV_ERROR_FIELD_ENCODING_TRANSLATE, get_last_error_message(), NULL) { throw core::CoreException(); } @@ -724,7 +724,7 @@ void core_sqlsrv_sensitivity_metadata( _Inout_ sqlsrv_stmt* stmt ) // To retrieve sensitivity classfication data, the first step is to retrieve the IRD(Implementation Row Descriptor) handle by // calling SQLGetStmtAttr with SQL_ATTR_IMP_ROW_DESC statement attribute r = ::SQLGetStmtAttr(stmt->handle(), SQL_ATTR_IMP_ROW_DESC, reinterpret_cast(&ird), SQL_IS_POINTER, 0); - CHECK_SQL_ERROR_OR_WARNING(r, stmt) { + CHECK_SQL_ERROR_OR_WARNING(r, stmt, NULL) { LOG(SEV_ERROR, "core_sqlsrv_sensitivity_metadata: failed in getting Implementation Row Descriptor handle." ); throw core::CoreException(); } @@ -741,7 +741,7 @@ void core_sqlsrv_sensitivity_metadata( _Inout_ sqlsrv_stmt* stmt ) SQLSMALLINT len; rc = ::SQLGetDiagField(SQL_HANDLE_DESC, ird, 1, SQL_DIAG_SQLSTATE, state, SQL_SQLSTATE_BUFSIZE, &len); - CHECK_SQL_ERROR_OR_WARNING(rc, stmt) { + CHECK_SQL_ERROR_OR_WARNING(rc, stmt, NULL) { throw core::CoreException(); } @@ -749,7 +749,7 @@ void core_sqlsrv_sensitivity_metadata( _Inout_ sqlsrv_stmt* stmt ) throw core::CoreException(); } - CHECK_CUSTOM_ERROR(true, stmt, SQLSRV_ERROR_DATA_CLASSIFICATION_FAILED, "Check if ODBC driver or the server supports the Data Classification feature.") { + CHECK_CUSTOM_ERROR(true, stmt, SQLSRV_ERROR_DATA_CLASSIFICATION_FAILED, "Check if ODBC driver or the server supports the Data Classification feature.", NULL) { throw core::CoreException(); } } @@ -761,7 +761,7 @@ void core_sqlsrv_sensitivity_metadata( _Inout_ sqlsrv_stmt* stmt ) if (r != SQL_SUCCESS) { LOG(SEV_ERROR, "core_sqlsrv_sensitivity_metadata: failed in calling SQLGetDescFieldW again." ); - CHECK_CUSTOM_ERROR(true, stmt, SQLSRV_ERROR_DATA_CLASSIFICATION_FAILED, "SQLGetDescFieldW failed unexpectedly") { + CHECK_CUSTOM_ERROR(true, stmt, SQLSRV_ERROR_DATA_CLASSIFICATION_FAILED, "SQLGetDescFieldW failed unexpectedly", NULL) { throw core::CoreException(); } } @@ -769,7 +769,7 @@ void core_sqlsrv_sensitivity_metadata( _Inout_ sqlsrv_stmt* stmt ) // Start parsing the data (blob) using namespace data_classification; - // If make it this far, must be using ODBC 17.2 or above. Prior to ODBC 17.4, checking Data Classification version will fail. + // If make it this far, must be using ODBC 17.2 or above. Prior to ODBC 17.4, checking Data Classification version will fail. // When the function is successful and the version is right, rank info is available for retrieval bool getRankInfo = false; r = ::SQLGetDescFieldW(ird, 0, SQL_CA_SS_DATA_CLASSIFICATION_VERSION, reinterpret_cast(&dcVersion), SQL_IS_INTEGER, &dcIRD); @@ -793,7 +793,7 @@ void core_sqlsrv_sensitivity_metadata( _Inout_ sqlsrv_stmt* stmt ) unsigned char *dcend = dcbuf; dcend += dclen; - CHECK_CUSTOM_ERROR(dcptr != dcend, stmt, SQLSRV_ERROR_DATA_CLASSIFICATION_FAILED, "Metadata parsing ends unexpectedly") { + CHECK_CUSTOM_ERROR(dcptr != dcend, stmt, SQLSRV_ERROR_DATA_CLASSIFICATION_FAILED, "Metadata parsing ends unexpectedly", NULL) { throw core::CoreException(); } @@ -1084,7 +1084,7 @@ void core_sqlsrv_set_query_timeout( _Inout_ sqlsrv_stmt* stmt, _Inout_ zval* val if( Z_TYPE_P( value_z ) != IS_LONG || Z_LVAL_P( value_z ) < 0 ) { convert_to_string( value_z ); - THROW_CORE_ERROR( stmt, SQLSRV_ERROR_INVALID_QUERY_TIMEOUT_VALUE, Z_STRVAL_P( value_z ) ); + THROW_CORE_ERROR( stmt, SQLSRV_ERROR_INVALID_QUERY_TIMEOUT_VALUE, Z_STRVAL_P( value_z ), NULL ); } // Save the query timeout setting for processing later @@ -1367,7 +1367,7 @@ size_t calc_utf8_missing( _Inout_ sqlsrv_stmt* stmt, _In_reads_(buffer_end) cons break; default: THROW_CORE_ERROR( stmt, SQLSRV_ERROR_INPUT_STREAM_ENCODING_TRANSLATE, - get_last_error_message( ERROR_NO_UNICODE_TRANSLATION )); + get_last_error_message( ERROR_NO_UNICODE_TRANSLATION ), NULL); break; } @@ -1392,7 +1392,7 @@ void core_get_field_common( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT field_i // make sure that fields are not retrieved incorrectly. CHECK_CUSTOM_ERROR( stmt->last_field_index > field_index, stmt, SQLSRV_ERROR_FIELD_INDEX_ERROR, field_index, - stmt->last_field_index ) { + stmt->last_field_index, NULL) { throw core::CoreException(); } @@ -1407,11 +1407,11 @@ void core_get_field_common( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT field_i SQLRETURN r = stmt->current_results->get_data( field_index + 1, SQL_C_LONG, field_value_temp, sizeof( SQLLEN ), field_len, true /*handle_warning*/ ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw core::CoreException(); } - CHECK_CUSTOM_ERROR(( r == SQL_NO_DATA ), stmt, SQLSRV_ERROR_NO_DATA, field_index ) { + CHECK_CUSTOM_ERROR(( r == SQL_NO_DATA ), stmt, SQLSRV_ERROR_NO_DATA, field_index, NULL) { throw core::CoreException(); } @@ -1434,11 +1434,11 @@ void core_get_field_common( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT field_i SQLRETURN r = stmt->current_results->get_data( field_index + 1, SQL_C_DOUBLE, field_value_temp, sizeof( double ), field_len, true /*handle_warning*/ ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw core::CoreException(); } - CHECK_CUSTOM_ERROR(( r == SQL_NO_DATA ), stmt, SQLSRV_ERROR_NO_DATA, field_index ) { + CHECK_CUSTOM_ERROR(( r == SQL_NO_DATA ), stmt, SQLSRV_ERROR_NO_DATA, field_index, NULL) { throw core::CoreException(); } @@ -1477,7 +1477,7 @@ void core_get_field_common( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT field_i field_len_temp = 0; } - CHECK_CUSTOM_ERROR((r == SQL_NO_DATA), stmt, SQLSRV_ERROR_NO_DATA, field_index) { + CHECK_CUSTOM_ERROR((r == SQL_NO_DATA), stmt, SQLSRV_ERROR_NO_DATA, field_index, NULL) { throw core::CoreException(); } @@ -1504,7 +1504,7 @@ void core_get_field_common( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT field_i throw core::CoreException(); } - // For a sqlsrv stream, only REPORT_ERRORS may be used. For "mode", the 'b' option + // For a sqlsrv stream, only REPORT_ERRORS may be used. For "mode", the 'b' option // is ignored on POSIX systems, which treat text and binary files the same. Yet, the // 'b' option might be important in other systems. // For details check https://www.php.net/manual/en/internals2.ze1.streams.php @@ -1622,7 +1622,7 @@ void format_decimal_numbers(_In_ SQLSMALLINT decimals_places, _In_ SQLSMALLINT f if (num_decimals > scale) { last_pos = round_up_decimal_numbers(buffer, (pt - src) + offset, scale, offset, last_pos); } - } + } // Remove the extra white space if not used. For a negative number, // the first pos is always a space @@ -1634,7 +1634,7 @@ void format_decimal_numbers(_In_ SQLSMALLINT decimals_places, _In_ SQLSMALLINT f if (is_negative) { buffer[--offset] = '-'; } - + int len = last_pos - offset; memcpy_s(field_value, len, buffer + offset, len); field_value[len] = '\0'; @@ -1685,7 +1685,7 @@ void get_field_as_string(_Inout_ sqlsrv_stmt *stmt, _In_ SQLUSMALLINT field_inde } else { c_type = SQL_C_CHAR; extra = sizeof(SQLCHAR); - + // For numbers, no need to convert if (sqlsrv_php_type.typeinfo.encoding == CP_UTF8 && !is_a_numeric_type(sql_field_type)) { c_type = SQL_C_WCHAR; @@ -1696,8 +1696,8 @@ void get_field_as_string(_Inout_ sqlsrv_stmt *stmt, _In_ SQLUSMALLINT field_inde } // If this is a large type, then read the first chunk to get the actual length from SQLGetData - // The user may use "SET TEXTSIZE" to specify the size of varchar(max), nvarchar(max), - // varbinary(max), text, ntext, and image data returned by a SELECT statement. + // The user may use "SET TEXTSIZE" to specify the size of varchar(max), nvarchar(max), + // varbinary(max), text, ntext, and image data returned by a SELECT statement. // For varbinary(max), varchar(max) and nvarchar(max), sql_display_size will be 0, regardless if (sql_display_size == 0 || (sql_field_type == SQL_WLONGVARCHAR || sql_field_type == SQL_LONGVARCHAR || sql_field_type == SQL_LONGVARBINARY)) { @@ -1713,7 +1713,7 @@ void get_field_as_string(_Inout_ sqlsrv_stmt *stmt, _In_ SQLUSMALLINT field_inde r = stmt->current_results->get_data(field_index + 1, c_type, field_value_temp, sql_display_size + extra, &field_len_temp, false /*handle_warning*/); } - CHECK_CUSTOM_ERROR((r == SQL_NO_DATA), stmt, SQLSRV_ERROR_NO_DATA, field_index) { + CHECK_CUSTOM_ERROR((r == SQL_NO_DATA), stmt, SQLSRV_ERROR_NO_DATA, field_index, NULL) { throw core::CoreException(); } @@ -1763,7 +1763,7 @@ void get_field_as_string(_Inout_ sqlsrv_stmt *stmt, _In_ SQLUSMALLINT field_inde } while (r == SQL_SUCCESS_WITH_INFO && is_truncated_warning(state)); } // if (field_len_temp == SQL_NO_TOTAL) else { - // The field length (or its estimate) is returned, thus no need to double the allocation size. + // The field length (or its estimate) is returned, thus no need to double the allocation size. // Allocate field_len_temp (which is the field length retrieved from the first SQLGetData) but with some padding // because there is a chance that the estimated field_len_temp is not accurate enough SQLLEN buffer_len = 50; @@ -1775,7 +1775,7 @@ void get_field_as_string(_Inout_ sqlsrv_stmt *stmt, _In_ SQLUSMALLINT field_inde field_len_temp + buffer_len, &chunk_field_len, false /*handle_warning*/); field_len_temp = initial_field_len + chunk_field_len; - CHECK_SQL_ERROR_OR_WARNING(r, stmt) { + CHECK_SQL_ERROR_OR_WARNING(r, stmt, NULL) { throw core::CoreException(); } @@ -1785,7 +1785,7 @@ void get_field_as_string(_Inout_ sqlsrv_stmt *stmt, _In_ SQLUSMALLINT field_inde } // if (is_truncated_warning(state)) } // if (r == SQL_SUCCESS_WITH_INFO) - CHECK_SQL_ERROR_OR_WARNING(r, stmt) { + CHECK_SQL_ERROR_OR_WARNING(r, stmt, NULL) { throw core::CoreException(); } @@ -1793,7 +1793,7 @@ void get_field_as_string(_Inout_ sqlsrv_stmt *stmt, _In_ SQLUSMALLINT field_inde bool converted = convert_string_from_utf16_inplace(static_cast(sqlsrv_php_type.typeinfo.encoding), &field_value_temp, field_len_temp); - CHECK_CUSTOM_ERROR(!converted, stmt, SQLSRV_ERROR_FIELD_ENCODING_TRANSLATE, get_last_error_message()) { + CHECK_CUSTOM_ERROR(!converted, stmt, SQLSRV_ERROR_FIELD_ENCODING_TRANSLATE, get_last_error_message(), NULL) { throw core::CoreException(); } } @@ -1892,11 +1892,11 @@ bool is_valid_sqlsrv_phptype( _In_ sqlsrv_phptype type ) return false; } -void adjustDecimalPrecision(_Inout_ zval* param_z, _In_ SQLSMALLINT decimal_digits) +void adjustDecimalPrecision(_Inout_ zval* param_z, _In_ SQLSMALLINT decimal_digits) { char* value = Z_STRVAL_P(param_z); int value_len = Z_STRLEN_P(param_z); - + // If the length is greater than maxDecimalStrLen, do not convert the string // 6 is derived from: 1 for the decimal point; 1 for sign of the number; 1 for 'e' or 'E' (scientific notation); // 1 for sign of scientific exponent; 2 for length of scientific exponent @@ -1915,7 +1915,7 @@ void adjustDecimalPrecision(_Inout_ zval* param_z, _In_ SQLSMALLINT decimal_digi return; // invalid input caused the conversion to throw an exception } if (index < value_len) { - return; // the input contains something else apart from the numerical value + return; // the input contains something else apart from the numerical value } // Navigate to the first digit or the decimal point @@ -1969,7 +1969,7 @@ void adjustDecimalPrecision(_Inout_ zval* param_z, _In_ SQLSMALLINT decimal_digi if (num_decimals > decimal_digits) { round_up_decimal_numbers(buffer, (pt - src) + offset, decimal_digits, offset, length + offset); } - } + } } else { int oldpos = 0; if (pt == NULL) { @@ -2011,7 +2011,7 @@ void adjustDecimalPrecision(_Inout_ zval* param_z, _In_ SQLSMALLINT decimal_digi } } - // Start copying the content to the buffer until the exp sign or one more digit after decimal_digits + // Start copying the content to the buffer until the exp sign or one more digit after decimal_digits char *p = src; int idx = offset; int lastpos = newpos + decimal_digits + 1; @@ -2031,7 +2031,7 @@ void adjustDecimalPrecision(_Inout_ zval* param_z, _In_ SQLSMALLINT decimal_digi if (num_decimals > decimal_digits) { round_up_decimal_numbers(buffer, newpos, decimal_digits, offset, idx); } - } + } } // Set the minus sign if negative @@ -2080,7 +2080,7 @@ int round_up_decimal_numbers(_Inout_ char* buffer, _In_ int decimal_pos, _In_ in buffer[pos] = '\0'; return pos; } - } + } // Do nothing and just return return lastpos; @@ -2130,9 +2130,9 @@ bool sqlsrv_param::prepare_param(_In_ zval* param_ref, _Inout_ zval* param_z) // If SQL type or column size is unknown, derives the appropriate values as well using the provided param zval and encoding void sqlsrv_param::process_param(_Inout_ sqlsrv_stmt* stmt, _Inout_ zval* param_z) { - // Get param php type + // Get param php type param_php_type = Z_TYPE_P(param_z); - + switch (param_php_type) { case IS_NULL: process_null_param(param_z); @@ -2158,7 +2158,7 @@ void sqlsrv_param::process_param(_Inout_ sqlsrv_stmt* stmt, _Inout_ zval* param_ break; case IS_ARRAY: default: - THROW_CORE_ERROR(stmt, SQLSRV_ERROR_INVALID_PARAMETER_PHPTYPE, param_pos + 1); + THROW_CORE_ERROR(stmt, SQLSRV_ERROR_INVALID_PARAMETER_PHPTYPE, param_pos + 1, NULL); break; } } @@ -2216,8 +2216,8 @@ void sqlsrv_param::process_long_param(_Inout_ zval* param_z) } } - // When binding any integer, the zend_long value and its length are used as the buffer - // and buffer length. When the buffer is 8 bytes use the corresponding C type for + // When binding any integer, the zend_long value and its length are used as the buffer + // and buffer length. When the buffer is 8 bytes use the corresponding C type for // 8-byte integers #ifdef ZEND_ENABLE_ZVAL_LONG64 c_data_type = SQL_C_SBIGINT; @@ -2317,7 +2317,7 @@ void sqlsrv_param::process_string_param(_Inout_ sqlsrv_stmt* stmt, _Inout_ zval* bool is_numeric = derive_string_types_sizes(param_z); // With AE, the precision of the decimal or numeric inputs have to match exactly as defined in the columns. - // Without AE, the derived default sql types will not be this specific. Thus, if sql_type is SQL_DECIMAL + // Without AE, the derived default sql types will not be this specific. Thus, if sql_type is SQL_DECIMAL // or SQL_NUMERIC, the user must have clearly specified it (using the SQLSRV driver) as SQL_DECIMAL or SQL_NUMERIC. // In either case, the input passed into SQLBindParam requires matching scale (i.e., number of decimal digits). if (sql_data_type == SQL_DECIMAL || sql_data_type == SQL_NUMERIC) { @@ -2332,7 +2332,7 @@ void sqlsrv_param::process_string_param(_Inout_ sqlsrv_stmt* stmt, _Inout_ zval* } // This changes the member placeholder_z to hold the wide string bool converted = convert_input_str_to_utf16(stmt, param_z); - CHECK_CUSTOM_ERROR(!converted, stmt, SQLSRV_ERROR_INPUT_PARAM_ENCODING_TRANSLATE, param_pos + 1, get_last_error_message()) { + CHECK_CUSTOM_ERROR(!converted, stmt, SQLSRV_ERROR_INPUT_PARAM_ENCODING_TRANSLATE, param_pos + 1, get_last_error_message(), NULL) { throw core::CoreException(); } @@ -2492,7 +2492,7 @@ void sqlsrv_param::process_object_param(_Inout_ sqlsrv_stmt* stmt, _Inout_ zval* if (succeeded) { succeeded = convert_datetime_to_string(stmt, param_z); } - CHECK_CUSTOM_ERROR(!succeeded, stmt, SQLSRV_ERROR_INVALID_PARAMETER_PHPTYPE, param_pos + 1) { + CHECK_CUSTOM_ERROR(!succeeded, stmt, SQLSRV_ERROR_INVALID_PARAMETER_PHPTYPE, param_pos + 1, NULL) { throw core::CoreException(); } @@ -2561,7 +2561,7 @@ bool sqlsrv_param::send_data_packet(_Inout_ sqlsrv_stmt* stmt) SQLWCHAR wbuffer[PHP_STREAM_BUFFER_SIZE + 1] = { L'\0' }; int wbuffer_size = static_cast(sizeof(wbuffer) / sizeof(SQLWCHAR)); DWORD last_error_code = ERROR_SUCCESS; - + // The buffer_size is the # of wchars. Set to buffer_size / 2 #ifndef _WIN32 int wsize = SystemLocale::ToUtf16Strict(encoding, buffer, static_cast(read), wbuffer, wbuffer_size, &last_error_code); @@ -2577,7 +2577,7 @@ bool sqlsrv_param::send_data_packet(_Inout_ sqlsrv_stmt* stmt) // read the missing bytes size_t new_read = php_stream_read(param_stream, static_cast(buffer) + read, need_to_read); // if the bytes couldn't be read, then we return an error - CHECK_CUSTOM_ERROR(new_read != need_to_read, stmt, SQLSRV_ERROR_INPUT_STREAM_ENCODING_TRANSLATE, get_last_error_message(ERROR_NO_UNICODE_TRANSLATION)) { + CHECK_CUSTOM_ERROR(new_read != need_to_read, stmt, SQLSRV_ERROR_INPUT_STREAM_ENCODING_TRANSLATE, get_last_error_message(ERROR_NO_UNICODE_TRANSLATION), NULL) { throw core::CoreException(); } @@ -2588,7 +2588,7 @@ bool sqlsrv_param::send_data_packet(_Inout_ sqlsrv_stmt* stmt) wsize = MultiByteToWideChar(encoding, MB_ERR_INVALID_CHARS, buffer, static_cast(read + new_read), wbuffer, static_cast(sizeof(wbuffer) / sizeof(wchar_t))); #endif //!_WIN32 // something else must be wrong if it failed - CHECK_CUSTOM_ERROR(wsize == 0, stmt, SQLSRV_ERROR_INPUT_STREAM_ENCODING_TRANSLATE, get_last_error_message(ERROR_NO_UNICODE_TRANSLATION)) { + CHECK_CUSTOM_ERROR(wsize == 0, stmt, SQLSRV_ERROR_INPUT_STREAM_ENCODING_TRANSLATE, get_last_error_message(ERROR_NO_UNICODE_TRANSLATION), NULL) { throw core::CoreException(); } } @@ -2606,7 +2606,7 @@ bool sqlsrv_param_inout::prepare_param(_In_ zval* param_ref, _Inout_ zval* param { // Save the output param reference now param_ptr_z = param_ref; - + int type = Z_TYPE_P(param_z); was_null = (type == IS_NULL); was_bool = (type == IS_TRUE || type == IS_FALSE); @@ -2677,7 +2677,7 @@ bool sqlsrv_param_inout::prepare_param(_In_ zval* param_ref, _Inout_ zval* param // If SQL type or column size is unknown, derives the appropriate values as well using the provided param zval and encoding void sqlsrv_param_inout::process_param(_Inout_ sqlsrv_stmt* stmt, zval* param_z) { - // Get param php type NOW because the original parameter might have been converted beforehand + // Get param php type NOW because the original parameter might have been converted beforehand param_php_type = Z_TYPE_P(param_z); switch (param_php_type) { @@ -2691,7 +2691,7 @@ void sqlsrv_param_inout::process_param(_Inout_ sqlsrv_stmt* stmt, zval* param_z) process_string_param(stmt, param_z); break; default: - THROW_CORE_ERROR(stmt, SQLSRV_ERROR_INVALID_PARAMETER_PHPTYPE, param_pos + 1); + THROW_CORE_ERROR(stmt, SQLSRV_ERROR_INVALID_PARAMETER_PHPTYPE, param_pos + 1, NULL); break; } @@ -2729,7 +2729,7 @@ void sqlsrv_param_inout::process_string_param(_Inout_ sqlsrv_stmt* stmt, _Inout_ unsigned int wchar_size = 0; wide_buffer = utf16_string_from_mbcs_string(SQLSRV_ENCODING_UTF8, reinterpret_cast(buffer), static_cast(buffer_length), &wchar_size); - CHECK_CUSTOM_ERROR(wide_buffer == 0, stmt, SQLSRV_ERROR_INPUT_PARAM_ENCODING_TRANSLATE, param_pos + 1, get_last_error_message()) { + CHECK_CUSTOM_ERROR(wide_buffer == 0, stmt, SQLSRV_ERROR_INPUT_PARAM_ENCODING_TRANSLATE, param_pos + 1, get_last_error_message(), NULL) { throw core::CoreException(); } wide_buffer[wchar_size] = L'\0'; @@ -2737,7 +2737,7 @@ void sqlsrv_param_inout::process_string_param(_Inout_ sqlsrv_stmt* stmt, _Inout_ buffer = Z_STRVAL_P(param_z); buffer_length = Z_STRLEN_P(param_z); } - } + } strlen_or_indptr = buffer_length; @@ -2805,7 +2805,7 @@ void sqlsrv_param_inout::finalize_output_value() throw core::CoreException(); } } - // Even if the output param is a boolean, still convert to a long + // Even if the output param is a boolean, still convert to a long // integer first to take care of rounding convert_to_long(value_z); if (was_bool) { @@ -2858,7 +2858,7 @@ void sqlsrv_param_inout::finalize_output_string() break; } - CHECK_CUSTOM_ERROR(str_len > (buffer_length - null_size), stmt, SQLSRV_ERROR_OUTPUT_PARAM_TRUNCATED, param_pos + 1) { + CHECK_CUSTOM_ERROR(str_len > (buffer_length - null_size), stmt, SQLSRV_ERROR_OUTPUT_PARAM_TRUNCATED, param_pos + 1, NULL) { throw core::CoreException(); } @@ -2885,7 +2885,7 @@ void sqlsrv_param_inout::finalize_output_string() SQLLEN outLen = 0; bool result = convert_string_from_utf16(encoding, reinterpret_cast(str), int(str_len / sizeof(SQLWCHAR)), &outString, outLen); - CHECK_CUSTOM_ERROR(!result, stmt, SQLSRV_ERROR_OUTPUT_PARAM_ENCODING_TRANSLATE, get_last_error_message()) { + CHECK_CUSTOM_ERROR(!result, stmt, SQLSRV_ERROR_OUTPUT_PARAM_ENCODING_TRANSLATE, get_last_error_message(), NULL) { throw core::CoreException(); } @@ -2910,20 +2910,20 @@ void sqlsrv_param_inout::finalize_output_string() void sqlsrv_param_inout::resize_output_string_buffer(_Inout_ zval* param_z, _In_ bool is_numeric_type) { - // Prerequisites: buffer, buffer_length, column_size, and strlen_or_indptr have been set to a known value - // Purpose: + // Prerequisites: buffer, buffer_length, column_size, and strlen_or_indptr have been set to a known value + // Purpose: // Verify there is enough space to hold the output string parameter, and allocate if necessary. The param_z - // is updated to contain the new buffer with the correct size and its reference is incremented, and all required - // values for SQLBindParameter will also be updated. + // is updated to contain the new buffer with the correct size and its reference is incremented, and all required + // values for SQLBindParameter will also be updated. SQLLEN original_len = buffer_length; SQLLEN expected_len; SQLLEN buffer_null_extra; SQLLEN elem_size; - // Calculate the size of each 'element' represented by column_size. WCHAR is the size of a wide char (2), and so is + // Calculate the size of each 'element' represented by column_size. WCHAR is the size of a wide char (2), and so is // a N(VAR)CHAR/NTEXT field being returned as a binary field. - elem_size = (c_data_type == SQL_C_WCHAR || - (c_data_type == SQL_C_BINARY && + elem_size = (c_data_type == SQL_C_WCHAR || + (c_data_type == SQL_C_BINARY && (sql_data_type == SQL_WCHAR || sql_data_type == SQL_WVARCHAR || sql_data_type == SQL_WLONGVARCHAR))) ? sizeof(SQLWCHAR) : sizeof(SQLCHAR); // account for the NULL terminator returned by ODBC and needed by Zend to avoid a "String not null terminated" debug warning @@ -3029,7 +3029,7 @@ void sqlsrv_param_tvp::get_tvp_metadata(_In_ sqlsrv_stmt* stmt, _In_ zend_string core::SQLAllocHandle(SQL_HANDLE_STMT, *(stmt->conn), &chstmt); rc = SQLSetStmtAttr(chstmt, SQL_SOPT_SS_NAME_SCOPE, (SQLPOINTER)SQL_SS_NAME_SCOPE_TABLE_TYPE, SQL_IS_UINTEGER); - CHECK_CUSTOM_ERROR(!SQL_SUCCEEDED(rc), stmt, SQLSRV_ERROR_TVP_FETCH_METADATA, param_pos + 1) { + CHECK_CUSTOM_ERROR(!SQL_SUCCEEDED(rc), stmt, SQLSRV_ERROR_TVP_FETCH_METADATA, param_pos + 1, NULL) { throw core::CoreException(); } @@ -3041,7 +3041,7 @@ void sqlsrv_param_tvp::get_tvp_metadata(_In_ sqlsrv_stmt* stmt, _In_ zend_string rc = SQLColumns(chstmt, NULL, 0, NULL, SQL_NTS, reinterpret_cast(table_type), SQL_NTS, NULL, 0); } - CHECK_CUSTOM_ERROR(!SQL_SUCCEEDED(rc), stmt, SQLSRV_ERROR_TVP_FETCH_METADATA, param_pos + 1) { + CHECK_CUSTOM_ERROR(!SQL_SUCCEEDED(rc), stmt, SQLSRV_ERROR_TVP_FETCH_METADATA, param_pos + 1, NULL) { throw core::CoreException(); } @@ -3056,7 +3056,7 @@ void sqlsrv_param_tvp::get_tvp_metadata(_In_ sqlsrv_stmt* stmt, _In_ zend_string while (SQL_SUCCESS == rc) { rc = SQLFetch(chstmt); if (rc == SQL_NO_DATA) { - CHECK_CUSTOM_ERROR(tvp_columns.size() == 0, stmt, SQLSRV_ERROR_TVP_FETCH_METADATA, param_pos + 1) { + CHECK_CUSTOM_ERROR(tvp_columns.size() == 0, stmt, SQLSRV_ERROR_TVP_FETCH_METADATA, param_pos + 1, NULL) { throw core::CoreException(); } break; @@ -3077,7 +3077,7 @@ void sqlsrv_param_tvp::get_tvp_metadata(_In_ sqlsrv_stmt* stmt, _In_ zend_string pos++; } } else { - THROW_CORE_ERROR(stmt, SQLSRV_ERROR_TVP_FETCH_METADATA, param_pos + 1); + THROW_CORE_ERROR(stmt, SQLSRV_ERROR_TVP_FETCH_METADATA, param_pos + 1, NULL); } SQLCloseCursor(chstmt); @@ -3115,7 +3115,7 @@ void sqlsrv_param_tvp::process_param(_Inout_ sqlsrv_stmt* stmt, _Inout_ zval* pa this->num_rows = 0; int num_columns = parse_tv_param_arrays(stmt, param_z); column_size = num_rows; - + strlen_or_indptr = (num_columns == 0)? SQL_DEFAULT_PARAM : SQL_DATA_AT_EXEC; } else { // This is one of the constituent columns of the table-valued parameter @@ -3138,7 +3138,7 @@ int sqlsrv_param_tvp::parse_tv_param_arrays(_Inout_ sqlsrv_stmt* stmt, _Inout_ z zend_string *schema_name = NULL; zval *tvp_data_z = NULL; HashPosition pos; - + zend_hash_internal_pointer_reset_ex(inputs_ht, &pos); if (zend_hash_has_more_elements_ex(inputs_ht, &pos) == SUCCESS) { @@ -3149,22 +3149,22 @@ int sqlsrv_param_tvp::parse_tv_param_arrays(_Inout_ sqlsrv_stmt* stmt, _Inout_ z if (key_type == HASH_KEY_IS_STRING) { key_len = ZSTR_LEN(tvp_name); tvp_data_z = zend_hash_get_current_data_ex(inputs_ht, &pos); - } + } - CHECK_CUSTOM_ERROR((key_type == HASH_KEY_IS_LONG || key_len == 0), stmt, SQLSRV_ERROR_TVP_INVALID_TABLE_TYPE_NAME, param_pos + 1) { + CHECK_CUSTOM_ERROR((key_type == HASH_KEY_IS_LONG || key_len == 0), stmt, SQLSRV_ERROR_TVP_INVALID_TABLE_TYPE_NAME, param_pos + 1, NULL) { throw core::CoreException(); } - } + } // TODO: Find the docs page somewhere that says a TVP can not be null but it may have null columns?? - CHECK_CUSTOM_ERROR(tvp_data_z == NULL || Z_TYPE_P(tvp_data_z) == IS_NULL || Z_TYPE_P(tvp_data_z) != IS_ARRAY, stmt, SQLSRV_ERROR_TVP_INVALID_INPUTS, param_pos + 1) { + CHECK_CUSTOM_ERROR(tvp_data_z == NULL || Z_TYPE_P(tvp_data_z) == IS_NULL || Z_TYPE_P(tvp_data_z) != IS_ARRAY, stmt, SQLSRV_ERROR_TVP_INVALID_INPUTS, param_pos + 1, NULL) { throw core::CoreException(); } // Save the TVP type name for SQLSetDescField later buffer = ZSTR_VAL(tvp_name); buffer_length = SQL_NTS; - + // Check if schema is provided by the user if (zend_hash_move_forward_ex(inputs_ht, &pos) == SUCCESS) { zval *schema_z = zend_hash_get_current_data_ex(inputs_ht, &pos); @@ -3175,7 +3175,7 @@ int sqlsrv_param_tvp::parse_tv_param_arrays(_Inout_ sqlsrv_stmt* stmt, _Inout_ z } // Save the TVP multi-dim array data, which should be something like this - // [ + // [ // [r1c1, r1c2, r1c3], // [r2c1, r2c2, r2c3], // [r3c1, r3c2, r3c3] @@ -3204,7 +3204,7 @@ int sqlsrv_param_tvp::parse_tv_param_arrays(_Inout_ sqlsrv_stmt* stmt, _Inout_ z // Loop through the rows to check the number of columns ZEND_HASH_FOREACH_KEY_VAL(rows_ht, id, key, row_z) { type = key ? HASH_KEY_IS_STRING : HASH_KEY_IS_LONG; - CHECK_CUSTOM_ERROR(type == HASH_KEY_IS_STRING, stmt, SQLSRV_ERROR_TVP_STRING_KEYS, param_pos + 1) { + CHECK_CUSTOM_ERROR(type == HASH_KEY_IS_STRING, stmt, SQLSRV_ERROR_TVP_STRING_KEYS, param_pos + 1, NULL) { throw core::CoreException(); } @@ -3213,13 +3213,13 @@ int sqlsrv_param_tvp::parse_tv_param_arrays(_Inout_ sqlsrv_stmt* stmt, _Inout_ z } // Individual row must be an array - CHECK_CUSTOM_ERROR(Z_TYPE_P(row_z) != IS_ARRAY, stmt, SQLSRV_ERROR_TVP_ROW_NOT_ARRAY, param_pos + 1) { + CHECK_CUSTOM_ERROR(Z_TYPE_P(row_z) != IS_ARRAY, stmt, SQLSRV_ERROR_TVP_ROW_NOT_ARRAY, param_pos + 1, NULL) { throw core::CoreException(); } // Are all the TVP's rows the same size num_columns = zend_hash_num_elements(Z_ARRVAL_P(row_z)); - CHECK_CUSTOM_ERROR(num_columns != total_num_columns, stmt, SQLSRV_ERROR_TVP_ROWS_UNEXPECTED_SIZE, param_pos + 1, total_num_columns) { + CHECK_CUSTOM_ERROR(num_columns != total_num_columns, stmt, SQLSRV_ERROR_TVP_ROWS_UNEXPECTED_SIZE, param_pos + 1, total_num_columns, NULL) { throw core::CoreException(); } } ZEND_HASH_FOREACH_END(); @@ -3231,7 +3231,7 @@ int sqlsrv_param_tvp::parse_tv_param_arrays(_Inout_ sqlsrv_stmt* stmt, _Inout_ z void sqlsrv_param_tvp::process_param_column_value(_Inout_ sqlsrv_stmt* stmt) { // This is one of the constituent columns of the table-valued parameter - // The corresponding column value of the TVP's first row is already saved in + // The corresponding column value of the TVP's first row is already saved in // the member variable param_ptr_z, which may be a NULL value zval *data_z = param_ptr_z; param_php_type = is_a_string_type(sql_data_type) ? IS_STRING : Z_TYPE_P(data_z); @@ -3254,7 +3254,7 @@ void sqlsrv_param_tvp::process_param_column_value(_Inout_ sqlsrv_stmt* stmt) } else { // If preprocessing a datetime object fails, throw an error of invalid php type bool succeeded = preprocess_datetime_object(stmt, data_z); - CHECK_CUSTOM_ERROR(!succeeded, stmt, SQLSRV_ERROR_TVP_INVALID_COLUMN_PHPTYPE, parent_tvp->param_pos + 1, param_pos + 1) { + CHECK_CUSTOM_ERROR(!succeeded, stmt, SQLSRV_ERROR_TVP_INVALID_COLUMN_PHPTYPE, parent_tvp->param_pos + 1, param_pos + 1, NULL) { throw core::CoreException(); } } @@ -3266,7 +3266,7 @@ void sqlsrv_param_tvp::process_param_column_value(_Inout_ sqlsrv_stmt* stmt) process_null_param_value(stmt); break; default: - THROW_CORE_ERROR(stmt, SQLSRV_ERROR_TVP_INVALID_COLUMN_PHPTYPE, parent_tvp->param_pos + 1, param_pos + 1); + THROW_CORE_ERROR(stmt, SQLSRV_ERROR_TVP_INVALID_COLUMN_PHPTYPE, parent_tvp->param_pos + 1, param_pos + 1, NULL); break; } @@ -3325,22 +3325,22 @@ void sqlsrv_param_tvp::bind_param(_Inout_ sqlsrv_stmt* stmt) core::SQLGetStmtAttr(stmt, SQL_ATTR_IMP_PARAM_DESC, &hIpd, 0, 0); if (buffer != NULL) { - // SQL_CA_SS_TYPE_NAME is optional for stored procedure calls, but it must be - // specified for SQL statements that are not procedure calls to enable the + // SQL_CA_SS_TYPE_NAME is optional for stored procedure calls, but it must be + // specified for SQL statements that are not procedure calls to enable the // server to determine the type of the table-valued parameter. char *tvp_name = reinterpret_cast(buffer); SQLRETURN r = ::SQLSetDescField(hIpd, param_pos + 1, SQL_CA_SS_TYPE_NAME, reinterpret_cast(tvp_name), SQL_NTS); - CHECK_SQL_ERROR_OR_WARNING(r, stmt) { + CHECK_SQL_ERROR_OR_WARNING(r, stmt, NULL) { throw core::CoreException(); } } if (Z_TYPE(placeholder_z) == IS_STRING) { - // If the table type for the table-valued parameter is defined in a different - // schema than the default, SQL_CA_SS_SCHEMA_NAME must be specified. If not, + // If the table type for the table-valued parameter is defined in a different + // schema than the default, SQL_CA_SS_SCHEMA_NAME must be specified. If not, // the server will not be able to determine the type of the table-valued parameter. char * schema_name = Z_STRVAL(placeholder_z); SQLRETURN r = ::SQLSetDescField(hIpd, param_pos + 1, SQL_CA_SS_SCHEMA_NAME, reinterpret_cast(schema_name), SQL_NTS); - CHECK_SQL_ERROR_OR_WARNING(r, stmt) { + CHECK_SQL_ERROR_OR_WARNING(r, stmt, NULL) { throw core::CoreException(); } // Free and reset the placeholder_z @@ -3353,7 +3353,7 @@ void sqlsrv_param_tvp::bind_param(_Inout_ sqlsrv_stmt* stmt) SQLHDESC desc; core::SQLGetStmtAttr(stmt, SQL_ATTR_APP_PARAM_DESC, &desc, 0, 0); SQLRETURN r = ::SQLSetDescField(desc, param_pos + 1, SQL_DESC_DATA_PTR, reinterpret_cast(this), 0); - CHECK_SQL_ERROR_OR_WARNING(r, stmt) { + CHECK_SQL_ERROR_OR_WARNING(r, stmt, NULL) { throw core::CoreException(); } @@ -3375,11 +3375,11 @@ void sqlsrv_param_tvp::bind_param(_Inout_ sqlsrv_stmt* stmt) zval* data_z = NULL; int num_columns = 0; - // In case there are null values in the first row, have to loop - // through the entire first row of column values using the Zend macros. + // In case there are null values in the first row, have to loop + // through the entire first row of column values using the Zend macros. ZEND_HASH_FOREACH_KEY_VAL(cols_ht, id, key, data_z) { int type = key ? HASH_KEY_IS_STRING : HASH_KEY_IS_LONG; - CHECK_CUSTOM_ERROR(type == HASH_KEY_IS_STRING, stmt, SQLSRV_ERROR_TVP_STRING_KEYS, param_pos + 1) { + CHECK_CUSTOM_ERROR(type == HASH_KEY_IS_STRING, stmt, SQLSRV_ERROR_TVP_STRING_KEYS, param_pos + 1, NULL) { throw core::CoreException(); } @@ -3388,8 +3388,8 @@ void sqlsrv_param_tvp::bind_param(_Inout_ sqlsrv_stmt* stmt) sqlsrv_param* column_param = tvp_columns[pos]; SQLSRV_ASSERT(column_param != NULL, "sqlsrv_param_tvp::bind_param -- column param should not be null"); - // If data_z is NULL, will need to keep looking in the subsequent rows of - // the same column until a non-null value is found. Since Zend macros must be + // If data_z is NULL, will need to keep looking in the subsequent rows of + // the same column until a non-null value is found. Since Zend macros must be // used to traverse the array items, nesting Zend macros in different directions // does not work. // Therefore, save data_z for later processing and binding. @@ -3468,10 +3468,10 @@ void sqlsrv_param_tvp::populate_cell_placeholder(_Inout_ sqlsrv_stmt* stmt, _In_ } } -// If this is the table-valued parameter, loop through each parameter column +// If this is the table-valued parameter, loop through each parameter column // and populate the cell's placeholder_z. -// If this is one of the constituent columns of the table-valued parameter, -// call SQLPutData() to send the cell value to the server (based on current_row +// If this is one of the constituent columns of the table-valued parameter, +// call SQLPutData() to send the cell value to the server (based on current_row // and param_pos) bool sqlsrv_param_tvp::send_data_packet(_Inout_ sqlsrv_stmt* stmt) { @@ -3515,7 +3515,7 @@ bool sqlsrv_param_tvp::send_data_packet(_Inout_ sqlsrv_stmt* stmt) bool succeeded = convert_datetime_to_string(stmt, value_z); // Conversion failed so assume the input was an invalid PHP type - CHECK_CUSTOM_ERROR(!succeeded, stmt, SQLSRV_ERROR_TVP_INVALID_COLUMN_PHPTYPE, parent_tvp->param_pos + 1, param_pos + 1) { + CHECK_CUSTOM_ERROR(!succeeded, stmt, SQLSRV_ERROR_TVP_INVALID_COLUMN_PHPTYPE, parent_tvp->param_pos + 1, param_pos + 1, NULL) { throw core::CoreException(); } @@ -3541,7 +3541,7 @@ bool sqlsrv_param_tvp::send_data_packet(_Inout_ sqlsrv_stmt* stmt) } // This method would change the member placeholder_z bool succeeded = convert_input_str_to_utf16(stmt, value_z); - CHECK_CUSTOM_ERROR(!succeeded, stmt, SQLSRV_ERROR_TVP_STRING_ENCODING_TRANSLATE, parent_tvp->param_pos + 1, param_pos + 1, get_last_error_message()) { + CHECK_CUSTOM_ERROR(!succeeded, stmt, SQLSRV_ERROR_TVP_STRING_ENCODING_TRANSLATE, parent_tvp->param_pos + 1, param_pos + 1, get_last_error_message(), NULL) { throw core::CoreException(); } @@ -3643,7 +3643,7 @@ bool sqlsrv_params_container::get_next_parameter(_Inout_ sqlsrv_stmt* stmt) // If no more data, all the bound parameters have been exhausted, so return false (done) if (SQL_SUCCEEDED(r) || r == SQL_NO_DATA) { - // Done now, reset current_param + // Done now, reset current_param current_param = NULL; return false; } else if (r == SQL_NEED_DATA) { @@ -3652,7 +3652,7 @@ bool sqlsrv_params_container::get_next_parameter(_Inout_ sqlsrv_stmt* stmt) SQLSRV_ASSERT(current_param != NULL, "sqlsrv_params_container::get_next_parameter - The parameter requested is missing!"); current_param->init_data_from_zval(stmt); } else { - // Do not reset current_param when param is NULL, because + // Do not reset current_param when param is NULL, because // it means that data is expected from the existing current_param } } @@ -3675,7 +3675,7 @@ bool sqlsrv_params_container::send_next_packet(_Inout_ sqlsrv_stmt* stmt) // The helper method send_stream_packet() returns false when EOF is reached if (current_param && current_param->send_data_packet(stmt) == false) { - // Now that EOF has been reached, reset current_param for next round + // Now that EOF has been reached, reset current_param for next round // Bear in mind that SQLParamData might request the same stream resource again current_param = NULL; } diff --git a/source/shared/core_stream.cpp b/source/shared/core_stream.cpp index fda74b74..81af95c2 100644 --- a/source/shared/core_stream.cpp +++ b/source/shared/core_stream.cpp @@ -7,13 +7,13 @@ // Copyright(c) Microsoft Corporation // All rights reserved. // MIT License -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), -// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), +// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, // and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions : // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. //--------------------------------------------------------------------------------------------------------------------------------- @@ -27,7 +27,7 @@ int sqlsrv_stream_close( _Inout_ php_stream* stream, int /*close_handle*/ ) { sqlsrv_stream* ss = static_cast( stream->abstract ); SQLSRV_ASSERT( ss != NULL && ss->stmt != NULL, "sqlsrv_stream_close: sqlsrv_stream* ss was null." ); - + // free the stream resources in the Zend engine php_stream_free( stream, PHP_STREAM_FREE_RELEASE_STREAM ); @@ -44,7 +44,7 @@ int sqlsrv_stream_close( _Inout_ php_stream* stream, int /*close_handle*/ ) // read from a sqlsrv stream into the buffer provided by Zend. The parameters for binary vs. char are // set when sqlsrv_get_field is called by the user specifying which field type they want. -#if PHP_VERSION_ID >= 70400 +#if PHP_VERSION_ID >= 70400 ssize_t sqlsrv_stream_read(_Inout_ php_stream* stream, _Out_writes_bytes_(count) char* buf, _Inout_ size_t count) #else size_t sqlsrv_stream_read(_Inout_ php_stream* stream, _Out_writes_bytes_(count) char* buf, _Inout_ size_t count) @@ -97,7 +97,7 @@ size_t sqlsrv_stream_read(_Inout_ php_stream* stream, _Out_writes_bytes_(count) SQLRETURN r = ss->stmt->current_results->get_data(ss->field_index + 1, c_type, get_data_buffer, count /*BufferLength*/, &read, false /*handle_warning*/); CHECK_SQL_ERROR( r, ss->stmt ) { - stream->eof = 1; + stream->eof = 1; throw core::CoreException(); } @@ -126,7 +126,7 @@ size_t sqlsrv_stream_read(_Inout_ php_stream* stream, _Out_writes_bytes_(count) "did not occur." ); } - // As per SQLGetData documentation, if the length of character data exceeds the BufferLength, + // As per SQLGetData documentation, if the length of character data exceeds the BufferLength, // SQLGetData truncates the data to BufferLength less the length of null-termination character. // But when fetching binary fields as chars (wide chars), each byte is represented as 2 hex characters, // each takes the size of a char (wide char). Note that BufferLength may not be multiples of 2 or 4. @@ -138,7 +138,7 @@ size_t sqlsrv_stream_read(_Inout_ php_stream* stream, _Out_writes_bytes_(count) if( is_truncated_warning( state ) || count < read) { #else if( is_truncated_warning( state ) ) { - #endif // !_WIN32 + #endif // !_WIN32 size_t char_size = sizeof(SQLCHAR); switch( c_type ) { @@ -168,13 +168,13 @@ size_t sqlsrv_stream_read(_Inout_ php_stream* stream, _Out_writes_bytes_(count) } } else { - CHECK_SQL_WARNING( r, ss->stmt ); + CHECK_SQL_WARNING( r, ss->stmt, NULL ); } } // If the encoding is UTF-8 if( c_type == SQL_C_WCHAR ) { - count *= 2; + count *= 2; // Undo the shift to use the full buffer // flags set to 0 by default, which means that any invalid characters are dropped rather than causing // an error. This happens only on XP. @@ -199,18 +199,18 @@ size_t sqlsrv_stream_read(_Inout_ php_stream* stream, _Out_writes_bytes_(count) static_cast(read >> 1), buf, static_cast(count), NULL, NULL ); #endif // !_WIN32 if( enc_len == 0 ) { - + stream->eof = 1; - THROW_CORE_ERROR( ss->stmt, SQLSRV_ERROR_FIELD_ENCODING_TRANSLATE, get_last_error_message() ); + THROW_CORE_ERROR( ss->stmt, SQLSRV_ERROR_FIELD_ENCODING_TRANSLATE, get_last_error_message(), NULL ); } read = enc_len; } return static_cast( read ); - } + } catch (core::CoreException&) { -#if PHP_VERSION_ID >= 70400 +#if PHP_VERSION_ID >= 70400 return -1; #else return 0; @@ -218,7 +218,7 @@ size_t sqlsrv_stream_read(_Inout_ php_stream* stream, _Out_writes_bytes_(count) } catch (...) { LOG(SEV_ERROR, "sqlsrv_stream_read: Unknown exception caught."); -#if PHP_VERSION_ID >= 70400 +#if PHP_VERSION_ID >= 70400 return -1; #else return 0; @@ -242,7 +242,7 @@ php_stream_ops sqlsrv_stream_ops = { // open a stream and return the sqlsrv_stream_ops function table as part of the // return value. There is only one valid way to open a stream, using sqlsrv_get_field on // certain field types. A sqlsrv stream may only be opened in read mode. -static php_stream* sqlsrv_stream_opener( _In_opt_ php_stream_wrapper* wrapper, _In_ const char*, _In_ const char* mode, +static php_stream* sqlsrv_stream_opener( _In_opt_ php_stream_wrapper* wrapper, _In_ const char*, _In_ const char* mode, _In_opt_ int options, _In_ zend_string **, php_stream_context* STREAMS_DC ) { @@ -259,8 +259,8 @@ static php_stream* sqlsrv_stream_opener( _In_opt_ php_stream_wrapper* wrapper, _ ss = static_cast( sqlsrv_malloc( sizeof( sqlsrv_stream ))); memset( ss, 0, sizeof( sqlsrv_stream )); - // The function core_get_field_common() is changed to pass REPORT_ERRORS for - // php_stream_open_wrapper(). Whether the error flag is toggled or cleared, + // The function core_get_field_common() is changed to pass REPORT_ERRORS for + // php_stream_open_wrapper(). Whether the error flag is toggled or cleared, // the argument "options" will be zero. // For details check this pull request: https://github.com/php/php-src/pull/6190 if (options != 0) { diff --git a/source/shared/core_util.cpp b/source/shared/core_util.cpp index 1a340f01..31f9a421 100644 --- a/source/shared/core_util.cpp +++ b/source/shared/core_util.cpp @@ -2,20 +2,20 @@ // File: core_util.cpp // // Contents: Utility functions used by both connection or statement functions for both the PDO and sqlsrv drivers -// +// // Comments: Mostly error handling and some type handling // // Microsoft Drivers 5.11 for PHP for SQL Server // Copyright(c) Microsoft Corporation // All rights reserved. // MIT License -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), -// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), +// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, // and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions : // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. //--------------------------------------------------------------------------------------------------------------------------------- @@ -38,7 +38,7 @@ char last_err_msg[2048] = {'\0'}; // 2k to hold the error messages // routine used by utf16_string_from_mbcs_string unsigned int convert_string_from_default_encoding( _In_ unsigned int php_encoding, _In_reads_bytes_(mbcs_len) char const* mbcs_in_string, - _In_ unsigned int mbcs_len, + _In_ unsigned int mbcs_len, _Out_writes_(utf16_len) __transfer( mbcs_in_string ) SQLWCHAR* utf16_out_string, _In_ unsigned int utf16_len, bool use_strict_conversion = false ); @@ -62,13 +62,13 @@ void log_activity(_In_opt_ const char* msg, _In_opt_ va_list* print_args) } -// SQLSTATE for all internal errors +// SQLSTATE for all internal errors SQLCHAR IMSSP[] = "IMSSP"; // SQLSTATE for all internal warnings SQLCHAR SSPWARN[] = "01SSP"; -// write to the php log if the severity and subsystem match the filters currently set in the INI or +// write to the php log if the severity and subsystem match the filters currently set in the INI or // the script (sqlsrv_configure). void write_to_log( _In_ unsigned int severity, _In_ const char* msg, ...) { @@ -150,7 +150,7 @@ bool convert_string_from_utf16( _In_ SQLSRV_ENCODING encoding, _In_reads_bytes_( // Allocate enough space to hold the largest possible number of bytes for UTF-8 conversion // instead of calling FromUtf16, for performance reasons cchOutLen = 4 * cchInLen; -#else +#else // flags set to 0 by default, which means that any invalid characters are dropped rather than causing // an error. This happens only on XP. DWORD flags = 0; @@ -162,10 +162,10 @@ bool convert_string_from_utf16( _In_ SQLSRV_ENCODING encoding, _In_reads_bytes_( // Calculate the number of output bytes required - no performance hit here because // WideCharToMultiByte is highly optimised cchOutLen = WideCharToMultiByte( encoding, flags, - inString, cchInLen, + inString, cchInLen, NULL, 0, NULL, NULL ); -#endif // !_WIN32 - +#endif // !_WIN32 + if( cchOutLen == 0 ) { return false; } @@ -173,7 +173,7 @@ bool convert_string_from_utf16( _In_ SQLSRV_ENCODING encoding, _In_reads_bytes_( // Create a buffer to fit the encoded string char* newString = reinterpret_cast( sqlsrv_malloc( cchOutLen + 1 /* NULL char*/ )); memset(newString, '\0', cchOutLen+1); - + #ifndef _WIN32 int rc = SystemLocale::FromUtf16Strict( encoding, inString, cchInLen, newString, static_cast(cchOutLen)); #else @@ -216,7 +216,7 @@ SQLWCHAR* utf16_string_from_mbcs_string( _In_ SQLSRV_ENCODING php_encoding, _In_ return utf16_string; } -// Converts an input (assuming a datetime string) to a zval containing a PHP DateTime object. +// Converts an input (assuming a datetime string) to a zval containing a PHP DateTime object. // If the input is null, this simply returns a NULL zval. If anything wrong occurs during conversion, // an exception will be thrown. void convert_datetime_string_to_zval(_Inout_ sqlsrv_stmt* stmt, _In_opt_ char* input, _In_ SQLLEN length, _Inout_ zval& out_zval) @@ -308,10 +308,10 @@ bool core_sqlsrv_get_odbc_error( _Inout_ sqlsrv_context& ctx, _In_ int record_nu SQLLEN sqlstate_len = 0; convert_string_from_utf16(enc, wsqlstate, wsqlstate_len, (char**)&error->sqlstate, sqlstate_len); - + SQLLEN message_len = 0; if (r == SQL_SUCCESS_WITH_INFO && wmessage_len > SQL_MAX_ERROR_MESSAGE_LENGTH) { - // note that wmessage_len is the number of characters required for the error message -- + // note that wmessage_len is the number of characters required for the error message -- // create a new buffer big enough for this lengthy error message sqlsrv_malloc_auto_ptr wnative_message_str; @@ -319,7 +319,7 @@ bool core_sqlsrv_get_odbc_error( _Inout_ sqlsrv_context& ctx, _In_ int record_nu SQLSMALLINT returned_len = 0; wnative_message_str = reinterpret_cast(sqlsrv_malloc(expected_len)); - memset(wnative_message_str, '\0', expected_len); + memset(wnative_message_str, '\0', expected_len); SQLRETURN rtemp = ::SQLGetDiagFieldW(h_type, h, record_number, SQL_DIAG_MESSAGE_TEXT, wnative_message_str, wmessage_len, &returned_len); if (!SQL_SUCCEEDED(rtemp) || returned_len != expected_len) { @@ -341,7 +341,7 @@ bool core_sqlsrv_get_odbc_error( _Inout_ sqlsrv_context& ctx, _In_ int record_nu // Only overrides 'severity' if 'check_warning' is true (false by default) if (check_warning) { - // The character string value returned for an SQLSTATE consists of a two-character class value + // The character string value returned for an SQLSTATE consists of a two-character class value // followed by a three-character subclass value. A class value of "01" indicates a warning. // https://docs.microsoft.com/sql/odbc/reference/appendixes/appendix-a-odbc-error-codes?view=sql-server-ver15 if (error->sqlstate[0] == '0' && error->sqlstate[1] == '1') { @@ -360,7 +360,7 @@ bool core_sqlsrv_get_odbc_error( _Inout_ sqlsrv_context& ctx, _In_ int record_nu } // format and return a driver specfic error -void core_sqlsrv_format_driver_error( _In_ sqlsrv_context& ctx, _In_ sqlsrv_error_const const* custom_error, +void core_sqlsrv_format_driver_error( _In_ sqlsrv_context& ctx, _In_ sqlsrv_error_const const* custom_error, _Out_ sqlsrv_error_auto_ptr& formatted_error, _In_ logging_severity severity, _In_opt_ va_list* args ) { // allocate space for the formatted message @@ -368,13 +368,13 @@ void core_sqlsrv_format_driver_error( _In_ sqlsrv_context& ctx, _In_ sqlsrv_erro formatted_error->sqlstate = reinterpret_cast( sqlsrv_malloc( SQL_SQLSTATE_BUFSIZE )); formatted_error->native_message = reinterpret_cast( sqlsrv_malloc( SQL_MAX_ERROR_MESSAGE_LENGTH + 1 )); - DWORD rc = FormatMessage( FORMAT_MESSAGE_FROM_STRING, reinterpret_cast( custom_error->native_message ), 0, 0, + DWORD rc = FormatMessage( FORMAT_MESSAGE_FROM_STRING, reinterpret_cast( custom_error->native_message ), 0, 0, reinterpret_cast( formatted_error->native_message ), SQL_MAX_ERROR_MESSAGE_LENGTH, args ); if( rc == 0 ) { strcpy_s( reinterpret_cast( formatted_error->native_message ), SQL_MAX_ERROR_MESSAGE_LENGTH, reinterpret_cast( INTERNAL_FORMAT_ERROR )); } - + strcpy_s( reinterpret_cast( formatted_error->sqlstate ), SQL_SQLSTATE_BUFSIZE, reinterpret_cast( custom_error->sqlstate )); formatted_error->native_code = custom_error->native_code; @@ -471,7 +471,7 @@ unsigned int convert_string_from_default_encoding( _In_ unsigned int php_encodin #else unsigned int required_len = MultiByteToWideChar( win_encoding, MB_ERR_INVALID_CHARS, mbcs_in_string, mbcs_len, utf16_out_string, utf16_len ); #endif // !_Win32 - + if( required_len == 0 ) { return 0; } @@ -509,7 +509,7 @@ namespace data_classification { bool converted = convert_string_from_utf16(encoding, temp_field_name, len, field_name, field_name_len); - CHECK_CUSTOM_ERROR(!converted, stmt, SQLSRV_ERROR_FIELD_ENCODING_TRANSLATE, get_last_error_message()) { + CHECK_CUSTOM_ERROR(!converted, stmt, SQLSRV_ERROR_FIELD_ENCODING_TRANSLATE, get_last_error_message(), NULL) { throw core::CoreException(); } } @@ -524,16 +524,16 @@ namespace data_classification { } sqlsrv_free(pair); } - + void parse_sensitivity_name_id_pairs(_Inout_ sqlsrv_stmt* stmt, _Inout_ USHORT& numpairs, _Inout_ std::vector>* pairs, _Inout_ unsigned char **pptr) { unsigned char *ptr = *pptr; unsigned short npairs; - numpairs = npairs = *(reinterpret_cast(ptr)); + numpairs = npairs = *(reinterpret_cast(ptr)); SQLSRV_ENCODING encoding = ((stmt->encoding() == SQLSRV_ENCODING_DEFAULT ) ? stmt->conn->encoding() : stmt->encoding()); pairs->reserve(numpairs); - + ptr += sizeof(unsigned short); while (npairs--) { int namelen, idlen; @@ -549,7 +549,7 @@ namespace data_classification { namelen = *ptr++; nameptr = ptr; - pair->name_len = namelen; + pair->name_len = namelen; convert_sensivity_field(stmt, encoding, nameptr, namelen, (char**)&name, field_len); pair->name = name; @@ -566,7 +566,7 @@ namespace data_classification { pair.transferred(); } *pptr = ptr; - } + } void parse_column_sensitivity_props(_Inout_ sensitivity_metadata* meta, _Inout_ unsigned char **pptr, _In_ bool getRankInfo) { @@ -628,7 +628,7 @@ namespace data_classification { if (meta == NULL) { return 0; } - + SQLSRV_ASSERT(colno >= 0 && colno < meta->num_columns, "fill_column_sensitivity_array: column number out of bounds"); zval data_classification; diff --git a/source/sqlsrv/conn.cpp b/source/sqlsrv/conn.cpp index d3e6cf5d..c3f661ca 100644 --- a/source/sqlsrv/conn.cpp +++ b/source/sqlsrv/conn.cpp @@ -7,13 +7,13 @@ // Copyright(c) Microsoft Corporation // All rights reserved. // MIT License -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), -// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), +// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, // and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions : // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. //--------------------------------------------------------------------------------------------------------------------------------- @@ -117,7 +117,7 @@ struct conn_char_set_func { if (!strnicmp( encoding, ss_encoding->iana, encoding_len )) { if ( ss_encoding->not_for_connection ) { - THROW_SS_ERROR( conn, SS_SQLSRV_ERROR_CONNECT_ILLEGAL_ENCODING, encoding ); + THROW_SS_ERROR( conn, SS_SQLSRV_ERROR_CONNECT_ILLEGAL_ENCODING, encoding, NULL ); } conn->set_encoding( static_cast(ss_encoding->code_page )); @@ -125,7 +125,7 @@ struct conn_char_set_func { } } ZEND_HASH_FOREACH_END(); - THROW_SS_ERROR( conn, SS_SQLSRV_ERROR_CONNECT_ILLEGAL_ENCODING, encoding ); + THROW_SS_ERROR( conn, SS_SQLSRV_ERROR_CONNECT_ILLEGAL_ENCODING, encoding, NULL ); } }; @@ -144,7 +144,7 @@ struct int_conn_str_func { static void func( _In_ connection_option const* option, _In_ zval* value, sqlsrv_conn* /*conn*/, _Out_ std::string& conn_str ) { - SQLSRV_ASSERT( Z_TYPE_P( value ) == IS_LONG, "An integer is expected for this keyword" ) + SQLSRV_ASSERT( Z_TYPE_P( value ) == IS_LONG, "An integer is expected for this keyword" ) char temp_str[MAX_CONN_VALSTRING_LEN]; @@ -159,7 +159,7 @@ struct int_conn_attr_func { static void func( connection_option const* /*option*/, _In_ zval* value, _Inout_ sqlsrv_conn* conn, std::string& /*conn_str*/ ) { try { - + core::SQLSetConnectAttr( conn, Attr, reinterpret_cast( Z_LVAL_P( value )), SQL_IS_UINTEGER ); } catch( core::CoreException& ) { @@ -175,7 +175,7 @@ struct bool_conn_attr_func { { try { core::SQLSetConnectAttr(conn, Attr, reinterpret_cast((zend_long)zend_is_true(value)), SQL_IS_UINTEGER); - + } catch( core::CoreException& ) { throw; @@ -187,13 +187,13 @@ struct bool_conn_attr_func { //// *** internal functions *** void sqlsrv_conn_close_stmts( _Inout_ ss_sqlsrv_conn* conn ); -void validate_conn_options( _Inout_ sqlsrv_context& ctx, _In_ zval* user_options_z, _Inout_ char** uid, _Inout_ char** pwd, +void validate_conn_options( _Inout_ sqlsrv_context& ctx, _In_ zval* user_options_z, _Inout_ char** uid, _Inout_ char** pwd, _Inout_ HashTable* ss_conn_options_ht ); void validate_stmt_options( _Inout_ sqlsrv_context& ctx, _Inout_ zval* stmt_options, _Inout_ HashTable* ss_stmt_options_ht ); -void add_conn_option_key( _Inout_ sqlsrv_context& ctx, _In_ zend_string* key, _In_ size_t key_len, +void add_conn_option_key( _Inout_ sqlsrv_context& ctx, _In_ zend_string* key, _In_ size_t key_len, _Inout_ HashTable* options_ht, _Inout_ zval* data ); void add_stmt_option_key( _Inout_ sqlsrv_context& ctx, _In_ zend_string* key, _In_ size_t key_len, _Inout_ HashTable* options_ht, _Inout_ zval* data ); -int get_conn_option_key( _Inout_ sqlsrv_context& ctx, _In_ zend_string* key, _In_ size_t key_len, _Inout_ zval const* value_z ); +int get_conn_option_key( _Inout_ sqlsrv_context& ctx, _In_ zend_string* key, _In_ size_t key_len, _Inout_ zval const* value_z ); int get_stmt_option_key( _In_ zend_string* key, _In_ size_t key_len ); } @@ -264,60 +264,60 @@ const char HostNameInCertificate[] = "HostNameInCertificate"; } enum SS_CONN_OPTIONS { - + SS_CONN_OPTION_DATE_AS_STRING = SQLSRV_CONN_OPTION_DRIVER_SPECIFIC, SS_CONN_OPTION_FORMAT_DECIMALS, SS_CONN_OPTION_DECIMAL_PLACES, }; //List of all statement options supported by this driver -const stmt_option SS_STMT_OPTS[] = { +const stmt_option SS_STMT_OPTS[] = { { - SSStmtOptionNames::QUERY_TIMEOUT, + SSStmtOptionNames::QUERY_TIMEOUT, sizeof( SSStmtOptionNames::QUERY_TIMEOUT ), - SQLSRV_STMT_OPTION_QUERY_TIMEOUT, + SQLSRV_STMT_OPTION_QUERY_TIMEOUT, std::unique_ptr( new stmt_option_query_timeout ) }, - { - SSStmtOptionNames::SEND_STREAMS_AT_EXEC, + { + SSStmtOptionNames::SEND_STREAMS_AT_EXEC, sizeof( SSStmtOptionNames::SEND_STREAMS_AT_EXEC ), - SQLSRV_STMT_OPTION_SEND_STREAMS_AT_EXEC, + SQLSRV_STMT_OPTION_SEND_STREAMS_AT_EXEC, std::unique_ptr( new stmt_option_send_at_exec ) }, - { - SSStmtOptionNames::SCROLLABLE, + { + SSStmtOptionNames::SCROLLABLE, sizeof( SSStmtOptionNames::SCROLLABLE ), - SQLSRV_STMT_OPTION_SCROLLABLE, + SQLSRV_STMT_OPTION_SCROLLABLE, std::unique_ptr( new stmt_option_ss_scrollable ) }, - { - SSStmtOptionNames::CLIENT_BUFFER_MAX_SIZE, + { + SSStmtOptionNames::CLIENT_BUFFER_MAX_SIZE, sizeof( SSStmtOptionNames::CLIENT_BUFFER_MAX_SIZE ), - SQLSRV_STMT_OPTION_CLIENT_BUFFER_MAX_SIZE, + SQLSRV_STMT_OPTION_CLIENT_BUFFER_MAX_SIZE, std::unique_ptr( new stmt_option_buffered_query_limit ) }, { - SSStmtOptionNames::DATE_AS_STRING, + SSStmtOptionNames::DATE_AS_STRING, sizeof( SSStmtOptionNames::DATE_AS_STRING ), - SQLSRV_STMT_OPTION_DATE_AS_STRING, + SQLSRV_STMT_OPTION_DATE_AS_STRING, std::unique_ptr( new stmt_option_date_as_string ) }, { - SSStmtOptionNames::FORMAT_DECIMALS, + SSStmtOptionNames::FORMAT_DECIMALS, sizeof( SSStmtOptionNames::FORMAT_DECIMALS ), - SQLSRV_STMT_OPTION_FORMAT_DECIMALS, + SQLSRV_STMT_OPTION_FORMAT_DECIMALS, std::unique_ptr( new stmt_option_format_decimals ) }, { - SSStmtOptionNames::DECIMAL_PLACES, + SSStmtOptionNames::DECIMAL_PLACES, sizeof( SSStmtOptionNames::DECIMAL_PLACES), - SQLSRV_STMT_OPTION_DECIMAL_PLACES, + SQLSRV_STMT_OPTION_DECIMAL_PLACES, std::unique_ptr( new stmt_option_decimal_places ) }, { - SSStmtOptionNames::DATA_CLASSIFICATION, + SSStmtOptionNames::DATA_CLASSIFICATION, sizeof( SSStmtOptionNames::DATA_CLASSIFICATION ), - SQLSRV_STMT_OPTION_DATA_CLASSIFICATION, + SQLSRV_STMT_OPTION_DATA_CLASSIFICATION, std::unique_ptr( new stmt_option_data_classification ) }, { NULL, 0, SQLSRV_STMT_OPTION_INVALID, std::unique_ptr{} }, @@ -326,32 +326,32 @@ const stmt_option SS_STMT_OPTS[] = { // List of all connection options supported by this driver. const connection_option SS_CONN_OPTS[] = { - { + { SSConnOptionNames::APP, sizeof( SSConnOptionNames::APP ), SQLSRV_CONN_OPTION_APP, ODBCConnOptions::APP, sizeof( ODBCConnOptions::APP ), CONN_ATTR_STRING, - conn_str_append_func::func + conn_str_append_func::func }, { SSConnOptionNames::AccessToken, sizeof( SSConnOptionNames::AccessToken ), SQLSRV_CONN_OPTION_ACCESS_TOKEN, ODBCConnOptions::AccessToken, - sizeof( ODBCConnOptions::AccessToken), + sizeof( ODBCConnOptions::AccessToken), CONN_ATTR_STRING, access_token_set_func::func }, - { + { SSConnOptionNames::ApplicationIntent, sizeof( SSConnOptionNames::ApplicationIntent ), SQLSRV_CONN_OPTION_APPLICATION_INTENT, ODBCConnOptions::ApplicationIntent, sizeof( ODBCConnOptions::ApplicationIntent ), CONN_ATTR_STRING, - conn_str_append_func::func + conn_str_append_func::func }, { SSConnOptionNames::AttachDBFileName, @@ -447,17 +447,17 @@ const connection_option SS_CONN_OPTS[] = { SSConnOptionNames::Encrypt, sizeof( SSConnOptionNames::Encrypt ), SQLSRV_CONN_OPTION_ENCRYPT, - ODBCConnOptions::Encrypt, + ODBCConnOptions::Encrypt, sizeof( ODBCConnOptions::Encrypt ), CONN_ATTR_MIXED, srv_encrypt_set_func::func }, - { + { SSConnOptionNames::Failover_Partner, sizeof( SSConnOptionNames::Failover_Partner ), SQLSRV_CONN_OPTION_FAILOVER_PARTNER, ODBCConnOptions::Failover_Partner, - sizeof( ODBCConnOptions::Failover_Partner ), + sizeof( ODBCConnOptions::Failover_Partner ), CONN_ATTR_STRING, conn_str_append_func::func }, @@ -468,7 +468,7 @@ const connection_option SS_CONN_OPTS[] = { ODBCConnOptions::KeyStoreAuthentication, sizeof( ODBCConnOptions::KeyStoreAuthentication ), CONN_ATTR_STRING, - ce_akv_str_set_func::func + ce_akv_str_set_func::func }, { SSConnOptionNames::KeyStorePrincipalId, @@ -477,7 +477,7 @@ const connection_option SS_CONN_OPTS[] = { ODBCConnOptions::KeyStorePrincipalId, sizeof( ODBCConnOptions::KeyStorePrincipalId ), CONN_ATTR_STRING, - ce_akv_str_set_func::func + ce_akv_str_set_func::func }, { SSConnOptionNames::KeyStoreSecret, @@ -495,7 +495,7 @@ const connection_option SS_CONN_OPTS[] = { ODBCConnOptions::LoginTimeout, sizeof( ODBCConnOptions::LoginTimeout ), CONN_ATTR_INT, - int_conn_attr_func::func + int_conn_attr_func::func }, { SSConnOptionNames::MARS_Option, @@ -529,9 +529,9 @@ const connection_option SS_CONN_OPTS[] = { sizeof( SSConnOptionNames::TraceFile ), SQLSRV_CONN_OPTION_TRACE_FILE, ODBCConnOptions::TraceFile, - sizeof( ODBCConnOptions::TraceFile ), + sizeof( ODBCConnOptions::TraceFile ), CONN_ATTR_STRING, - str_conn_attr_func::func + str_conn_attr_func::func }, { SSConnOptionNames::TraceOn, @@ -575,7 +575,7 @@ const connection_option SS_CONN_OPTS[] = { SQLSRV_CONN_OPTION_WSID, ODBCConnOptions::WSID, sizeof( ODBCConnOptions::WSID ), - CONN_ATTR_STRING, + CONN_ATTR_STRING, conn_str_append_func::func }, { @@ -643,11 +643,11 @@ const connection_option SS_CONN_OPTS[] = { // $connectionInfo [OPTIONAL]: An associative array that contains connection // attributes (for example, array("Database" => "AdventureWorks")). // -// Return Value +// Return Value // A PHP connection resource. If a connection cannot be successfully created and // opened, false is returned -PHP_FUNCTION ( sqlsrv_connect ) +PHP_FUNCTION ( sqlsrv_connect ) { LOG_FUNCTION( "sqlsrv_connect" ); g_ss_henv_cp->set_func(_FN_); @@ -664,11 +664,11 @@ PHP_FUNCTION ( sqlsrv_connect ) ZVAL_UNDEF(&conn_z); // get the server name and connection options int result = zend_parse_parameters( ZEND_NUM_ARGS(), "s|a", &server, &server_len, &options_z ); - - CHECK_CUSTOM_ERROR(( result == FAILURE ), *g_ss_henv_cp, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, "sqlsrv_connect" ) { + + CHECK_CUSTOM_ERROR(( result == FAILURE ), *g_ss_henv_cp, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, "sqlsrv_connect", NULL) { RETURN_FALSE; } - + hash_auto_ptr ss_conn_options_ht; hash_auto_ptr stmts; ss_sqlsrv_conn* conn = NULL; @@ -677,38 +677,38 @@ PHP_FUNCTION ( sqlsrv_connect ) // Initialize the options array to be passed to the core layer ALLOC_HASHTABLE( ss_conn_options_ht ); - - core::sqlsrv_zend_hash_init( *g_ss_henv_cp, ss_conn_options_ht, 10 /* # of buckets */, + + core::sqlsrv_zend_hash_init( *g_ss_henv_cp, ss_conn_options_ht, 10 /* # of buckets */, ZVAL_PTR_DTOR, 0 /*persistent*/ ); - + // Either of g_ss_henv_cp or g_ss_henv_ncp can be used to propagate the error. - ::validate_conn_options( *g_ss_henv_cp, options_z, &uid, &pwd, ss_conn_options_ht ); - - // call the core connect function + ::validate_conn_options( *g_ss_henv_cp, options_z, &uid, &pwd, ss_conn_options_ht ); + + // call the core connect function conn = static_cast( core_sqlsrv_connect( *g_ss_henv_cp, *g_ss_henv_ncp, &core::allocate_conn, - server, uid, pwd, ss_conn_options_ht, ss_error_handler, - SS_CONN_OPTS, NULL, "sqlsrv_connect" )); - + server, uid, pwd, ss_conn_options_ht, ss_error_handler, + SS_CONN_OPTS, NULL, "sqlsrv_connect" )); + SQLSRV_ASSERT( conn != NULL, "sqlsrv_connect: Invalid connection returned. Exception should have been thrown." ); - + // create a bunch of statements ALLOC_HASHTABLE( stmts ); - + core::sqlsrv_zend_hash_init( *g_ss_henv_cp, stmts, 5, NULL /* dtor */, 0 /* persistent */ ); - // register the connection with the PHP runtime - + // register the connection with the PHP runtime + ss::zend_register_resource(conn_z, conn, ss_sqlsrv_conn::descriptor, ss_sqlsrv_conn::resource_name); conn->stmts = stmts; stmts.transferred(); RETURN_RES( Z_RES(conn_z) ); } - + catch( core::CoreException& ) { - + if( conn != NULL ) { - + conn->invalidate(); } @@ -732,7 +732,7 @@ PHP_FUNCTION ( sqlsrv_connect ) // queries are automatically committed upon success unless they have been // designated as part of an explicit transaction by using // sqlsrv_begin_transaction. -// +// // If sqlsrv_begin_transaction is called after a transaction has already been // initiated on the connection but not completed by calling either sqlsrv_commit // or sqlsrv_rollback, the call returns false and an Already in Transaction @@ -744,11 +744,11 @@ PHP_FUNCTION ( sqlsrv_connect ) // Return Value // A Boolean value: true if the transaction was successfully begun. Otherwise, false. -PHP_FUNCTION( sqlsrv_begin_transaction ) -{ +PHP_FUNCTION( sqlsrv_begin_transaction ) +{ LOG_FUNCTION( "sqlsrv_begin_transaction" ); - + ss_sqlsrv_conn* conn = NULL; PROCESS_PARAMS( conn, "r", _FN_, 0 ); @@ -766,7 +766,7 @@ PHP_FUNCTION( sqlsrv_begin_transaction ) catch( core::CoreException& ) { RETURN_FALSE; - } + } catch( ... ) { DIE("sqlsrv_begin_transaction: Unknown exception caught."); @@ -793,33 +793,33 @@ PHP_FUNCTION( sqlsrv_begin_transaction ) PHP_FUNCTION( sqlsrv_close ) { LOG_FUNCTION( "sqlsrv_close" ); - + zval* conn_r = NULL; ss_sqlsrv_conn* conn = NULL; sqlsrv_context_auto_ptr error_ctx; reset_errors(); - + try { - + // dummy context to pass to the error handler error_ctx = new (sqlsrv_malloc( sizeof( sqlsrv_context ))) sqlsrv_context( 0, ss_error_handler, NULL ); error_ctx->set_func(_FN_); if( zend_parse_parameters(ZEND_NUM_ARGS(), "r", &conn_r) == FAILURE ) { - + // Check if it was a zval int zr = zend_parse_parameters( ZEND_NUM_ARGS(), "z", &conn_r ); - CHECK_CUSTOM_ERROR(( zr == FAILURE ), error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ) { + CHECK_CUSTOM_ERROR(( zr == FAILURE ), error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ , NULL) { throw ss::SSException(); - } - + } + // if sqlsrv_close was called on a non-existent connection then we just return success. if( Z_TYPE_P( conn_r ) == IS_NULL ) { RETURN_TRUE; } - else { - THROW_CORE_ERROR( error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ); + else { + THROW_CORE_ERROR( error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_, NULL ); } } SQLSRV_ASSERT( conn_r != NULL, "sqlsrv_close: conn_r was null" ); @@ -829,16 +829,16 @@ PHP_FUNCTION( sqlsrv_close ) if ( Z_RES_TYPE_P( conn_r ) == RSRC_INVALID_TYPE) { RETURN_TRUE; } - - CHECK_CUSTOM_ERROR(( conn == NULL ), error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ) { - + + CHECK_CUSTOM_ERROR(( conn == NULL ), error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_, NULL) { + throw ss::SSException(); - } + } conn->set_func(_FN_); - + // cause any variables still holding a reference to this to be invalid so they cause - // an error when passed to a sqlsrv function. There's nothing we can do if the + // an error when passed to a sqlsrv function. There's nothing we can do if the // removal fails, so we just log it and move on. #if PHP_VERSION_ID < 80000 if (zend_list_close(Z_RES_P(conn_r)) == FAILURE) { @@ -857,7 +857,7 @@ PHP_FUNCTION( sqlsrv_close ) RETURN_TRUE; } catch( core::CoreException& ) { - + RETURN_FALSE; } catch( ... ) { @@ -868,7 +868,7 @@ PHP_FUNCTION( sqlsrv_close ) void __cdecl sqlsrv_conn_dtor( _Inout_ zend_resource *rsrc ) { - // Without sqlsrv_close(), this function is invoked by php during the final clean up stage. + // Without sqlsrv_close(), this function is invoked by php during the final clean up stage. // To prevent memory/resource leaks, no more logging at this point. //LOG_FUNCTION( "sqlsrv_conn_dtor" ); @@ -883,17 +883,17 @@ void __cdecl sqlsrv_conn_dtor( _Inout_ zend_resource *rsrc ) // close the connection itself. core_sqlsrv_close( conn ); - + rsrc->ptr = NULL; } - + // sqlsrv_commit( resource $conn ) // // Commits the current transaction on the specified connection and returns the // connection to the auto-commit mode. The current transaction includes all // statements on the specified connection that were executed after the call to // sqlsrv_begin_transaction and before any calls to sqlsrv_rollback or -// sqlsrv_commit. +// sqlsrv_commit. // The SQLSRV driver is in auto-commit mode by // default. This means that all queries are automatically committed upon success @@ -902,7 +902,7 @@ void __cdecl sqlsrv_conn_dtor( _Inout_ zend_resource *rsrc ) // not in an active transaction and that was initiated with // sqlsrv_begin_transaction, the call returns false and a Not in Transaction // error is added to the error collection. -// +// // Parameters // $conn: The connection on which the transaction is active. // @@ -921,7 +921,7 @@ PHP_FUNCTION( sqlsrv_commit ) CHECK_CUSTOM_ERROR(( conn->in_transaction == false ), *conn, SS_SQLSRV_ERROR_NOT_IN_TXN ) { RETURN_FALSE; } - + try { conn->in_transaction = false; @@ -945,7 +945,7 @@ PHP_FUNCTION( sqlsrv_commit ) // statements on the specified connection that were executed after the call to // sqlsrv_begin_transaction and before any calls to sqlsrv_rollback or // sqlsrv_commit. -// +// // The SQLSRV driver is in auto-commit mode by default. This // means that all queries are automatically committed upon success unless they // have been designated as part of an explicit transaction by using @@ -955,7 +955,7 @@ PHP_FUNCTION( sqlsrv_commit ) // transaction that was initiated with sqlsrv_begin_transaction, the call // returns false and a Not in Transaction error is added to the error // collection. -// +// // Parameters // $conn: The connection on which the transaction is active. // @@ -970,14 +970,14 @@ PHP_FUNCTION( sqlsrv_rollback ) ss_sqlsrv_conn* conn = NULL; PROCESS_PARAMS( conn, "r", _FN_, 0 ); - + // Return false if not in transaction CHECK_CUSTOM_ERROR(( conn->in_transaction == false ), *conn, SS_SQLSRV_ERROR_NOT_IN_TXN ) { RETURN_FALSE; } try { - + conn->in_transaction = false; core_sqlsrv_rollback( conn ); RETURN_TRUE; @@ -1002,7 +1002,7 @@ PHP_FUNCTION( sqlsrv_client_info ) LOG_FUNCTION( "sqlsrv_client_info" ); ss_sqlsrv_conn* conn = NULL; PROCESS_PARAMS( conn, "r", _FN_, 0 ); - + try { core_sqlsrv_get_client_info(conn, return_value); @@ -1019,14 +1019,14 @@ PHP_FUNCTION( sqlsrv_client_info ) } // sqlsrv_server_info( resource $conn ) -// +// // Returns information about the server. -// +// // Parameters // $conn: The connection resource by which the client and server are connected. // // Return Value -// An associative array with the following keys: +// An associative array with the following keys: // CurrentDatabase // The database currently being targeted. // SQLServerVersion @@ -1051,7 +1051,7 @@ PHP_FUNCTION( sqlsrv_server_info ) // sqlsrv_prepare( resource $conn, string $tsql [, array $params [, array $options]]) -// +// // Creates a statement resource associated with the specified connection. A statement // resource returned by sqlsrv_prepare may be executed multiple times by sqlsrv_execute. // In between each execution, the values may be updated by changing the value of the @@ -1097,7 +1097,7 @@ PHP_FUNCTION( sqlsrv_prepare ) zval stmt_z; ZVAL_UNDEF(&stmt_z); - PROCESS_PARAMS( conn, "rs|a!a!", _FN_, 4, &sql, &sql_len, ¶ms_z, &options_z ); + PROCESS_PARAMS( conn, "rs|a!a!", _FN_, 4, &sql, &sql_len, ¶ms_z, &options_z, NULL ); try { @@ -1105,19 +1105,19 @@ PHP_FUNCTION( sqlsrv_prepare ) // Initialize the options array to be passed to the core layer ALLOC_HASHTABLE( ss_stmt_options_ht ); - core::sqlsrv_zend_hash_init( *conn , ss_stmt_options_ht, 5 /* # of buckets */, + core::sqlsrv_zend_hash_init( *conn , ss_stmt_options_ht, 5 /* # of buckets */, ZVAL_PTR_DTOR, 0 /*persistent*/ ); - + validate_stmt_options( *conn, options_z, ss_stmt_options_ht ); - + } if( params_z && Z_TYPE_P( params_z ) != IS_ARRAY ) { - THROW_SS_ERROR( conn, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ); + THROW_SS_ERROR( conn, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_, NULL ); } if( options_z && Z_TYPE_P( options_z ) != IS_ARRAY ) { - THROW_SS_ERROR( conn, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ); + THROW_SS_ERROR( conn, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_, NULL ); } if( sql == NULL ) { @@ -1125,12 +1125,12 @@ PHP_FUNCTION( sqlsrv_prepare ) DIE( "sqlsrv_prepare: sql string was null." ); } - stmt = static_cast( core_sqlsrv_create_stmt( conn, core::allocate_stmt, - ss_stmt_options_ht, SS_STMT_OPTS, + stmt = static_cast( core_sqlsrv_create_stmt( conn, core::allocate_stmt, + ss_stmt_options_ht, SS_STMT_OPTS, ss_error_handler, NULL ) ); - + core_sqlsrv_prepare( stmt, sql, sql_len ); - + if (params_z) { stmt->params_z = (zval *)sqlsrv_malloc(sizeof(zval)); ZVAL_COPY(stmt->params_z, params_z); @@ -1138,27 +1138,27 @@ PHP_FUNCTION( sqlsrv_prepare ) stmt->prepared = true; - // register the statement with the PHP runtime + // register the statement with the PHP runtime ss::zend_register_resource( stmt_z, stmt, ss_sqlsrv_stmt::descriptor, ss_sqlsrv_stmt::resource_name ); - // store the resource id with the connection so the connection + // store the resource id with the connection so the connection // can release this statement when it closes. zend_long next_index = zend_hash_next_free_element( conn->stmts ); - + core::sqlsrv_zend_hash_index_update(*conn, conn->stmts, next_index, &stmt_z); stmt->conn_index = next_index; // the statement is now registered with EG( regular_list ) stmt.transferred(); - + RETURN_RES(Z_RES(stmt_z)); } catch( core::CoreException& ) { if( stmt ) { - + stmt->conn = NULL; stmt->~ss_sqlsrv_stmt(); } @@ -1176,7 +1176,7 @@ PHP_FUNCTION( sqlsrv_prepare ) } // sqlsrv_query( resource $conn, string $tsql [, array $params [, array $options]]) -// +// // Creates a statement resource associated with the specified connection. The statement // is immediately executed and may not be executed again using sqlsrv_execute. // @@ -1215,11 +1215,11 @@ PHP_FUNCTION( sqlsrv_query ) hash_auto_ptr ss_stmt_options_ht; size_t sql_len = 0; zval* options_z = NULL; - zval* params_z = NULL; + zval* params_z = NULL; zval stmt_z; ZVAL_UNDEF(&stmt_z); - PROCESS_PARAMS( conn, "rs|a!a!", _FN_, 4, &sql, &sql_len, ¶ms_z, &options_z ); + PROCESS_PARAMS( conn, "rs|a!a!", _FN_, 4, &sql, &sql_len, ¶ms_z, &options_z, NULL ); try { @@ -1228,18 +1228,18 @@ PHP_FUNCTION( sqlsrv_query ) // Initialize the options array to be passed to the core layer ALLOC_HASHTABLE( ss_stmt_options_ht ); - core::sqlsrv_zend_hash_init( *conn , ss_stmt_options_ht, 5 /* # of buckets */, ZVAL_PTR_DTOR, + core::sqlsrv_zend_hash_init( *conn , ss_stmt_options_ht, 5 /* # of buckets */, ZVAL_PTR_DTOR, 0 /*persistent*/ ); - - validate_stmt_options( *conn, options_z, ss_stmt_options_ht ); + + validate_stmt_options( *conn, options_z, ss_stmt_options_ht ); } if( params_z && Z_TYPE_P( params_z ) != IS_ARRAY ) { - THROW_SS_ERROR( conn, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ); + THROW_SS_ERROR( conn, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_, NULL ); } if( options_z && Z_TYPE_P( options_z ) != IS_ARRAY ) { - THROW_SS_ERROR( conn, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ); + THROW_SS_ERROR( conn, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_, NULL ); } if( sql == NULL ) { @@ -1247,8 +1247,8 @@ PHP_FUNCTION( sqlsrv_query ) DIE( "sqlsrv_query: sql string was null." ); } - stmt = static_cast( core_sqlsrv_create_stmt( conn, core::allocate_stmt, - ss_stmt_options_ht, SS_STMT_OPTS, + stmt = static_cast( core_sqlsrv_create_stmt( conn, core::allocate_stmt, + ss_stmt_options_ht, SS_STMT_OPTS, ss_error_handler, NULL ) ); if( params_z ) { @@ -1262,13 +1262,13 @@ PHP_FUNCTION( sqlsrv_query ) // execute the statement core_sqlsrv_execute( stmt, sql, static_cast( sql_len ) ); - - // register the statement with the PHP runtime + + // register the statement with the PHP runtime ss::zend_register_resource(stmt_z, stmt, ss_sqlsrv_stmt::descriptor, ss_sqlsrv_stmt::resource_name); - // store the resource id with the connection so the connection + // store the resource id with the connection so the connection // can release this statement when it closes. zend_ulong next_index = zend_hash_next_free_element( conn->stmts ); - + core::sqlsrv_zend_hash_index_update(*conn, conn->stmts, next_index, &stmt_z); stmt->conn_index = next_index; stmt.transferred(); @@ -1311,7 +1311,7 @@ void free_stmt_resource( _Inout_ zval* stmt_z ) // internal connection functions -namespace { +namespace { // must close all statement handles opened by this connection before closing the connection // no errors are returned, since close should always succeed @@ -1322,8 +1322,8 @@ void sqlsrv_conn_close_stmts( _Inout_ ss_sqlsrv_conn* conn ) SQLSRV_ASSERT(( conn->handle() != NULL ), "sqlsrv_conn_close_stmts: Connection handle is NULL. Trying to destroy an " "already destroyed connection."); SQLSRV_ASSERT(( conn->stmts ), "sqlsrv_conn_close_stmts: Connection doesn't contain a statement array." ); - - // loop through the stmts hash table and destroy each stmt resource so we can close the + + // loop through the stmts hash table and destroy each stmt resource so we can close the // ODBC connection zval* rsrc_ptr = NULL; @@ -1368,16 +1368,16 @@ void sqlsrv_conn_close_stmts( _Inout_ ss_sqlsrv_conn* conn ) conn->stmts = NULL; } -int get_conn_option_key( _Inout_ sqlsrv_context& ctx, _In_ zend_string* key, _In_ size_t key_len, _Inout_ zval const* value_z ) +int get_conn_option_key( _Inout_ sqlsrv_context& ctx, _In_ zend_string* key, _In_ size_t key_len, _Inout_ zval const* value_z ) { for( int i=0; SS_CONN_OPTS[i].conn_option_key != SQLSRV_CONN_OPTION_INVALID; ++i ) { if( key_len == SS_CONN_OPTS[i].sqlsrv_len && !stricmp( ZSTR_VAL( key ), SS_CONN_OPTS[i].sqlsrv_name )) { - + switch( SS_CONN_OPTS[i].value_type ) { - case CONN_ATTR_BOOL: + case CONN_ATTR_BOOL: // bool attributes can be either strings to be appended to the connection string // as yes or no or integral connection attributes. This will have to be reworked // if we ever introduce a boolean connection option that maps to a string connection @@ -1388,7 +1388,7 @@ int get_conn_option_key( _Inout_ sqlsrv_context& ctx, _In_ zend_string* key, _In case CONN_ATTR_INT: { CHECK_CUSTOM_ERROR( (Z_TYPE_P( value_z ) != IS_LONG ), ctx, SQLSRV_ERROR_INVALID_OPTION_TYPE_INT, - SS_CONN_OPTS[i].sqlsrv_name ) + SS_CONN_OPTS[i].sqlsrv_name, NULL) { throw ss::SSException(); } @@ -1396,8 +1396,8 @@ int get_conn_option_key( _Inout_ sqlsrv_context& ctx, _In_ zend_string* key, _In } case CONN_ATTR_STRING: { - CHECK_CUSTOM_ERROR( Z_TYPE_P( value_z ) != IS_STRING, ctx, SQLSRV_ERROR_INVALID_OPTION_TYPE_STRING, - SS_CONN_OPTS[i].sqlsrv_name ) { + CHECK_CUSTOM_ERROR( Z_TYPE_P( value_z ) != IS_STRING, ctx, SQLSRV_ERROR_INVALID_OPTION_TYPE_STRING, + SS_CONN_OPTS[i].sqlsrv_name, NULL) { throw ss::SSException(); } @@ -1406,7 +1406,7 @@ int get_conn_option_key( _Inout_ sqlsrv_context& ctx, _In_ zend_string* key, _In size_t value_len = Z_STRLEN_P( value_z ); bool escaped = core_is_conn_opt_value_escaped( value, value_len ); - CHECK_CUSTOM_ERROR( !escaped, ctx, SS_SQLSRV_ERROR_CONNECT_BRACES_NOT_ESCAPED, SS_CONN_OPTS[i].sqlsrv_name ) { + CHECK_CUSTOM_ERROR( !escaped, ctx, SS_SQLSRV_ERROR_CONNECT_BRACES_NOT_ESCAPED, SS_CONN_OPTS[i].sqlsrv_name, NULL) { throw ss::SSException(); } @@ -1435,34 +1435,34 @@ int get_stmt_option_key( _In_ zend_string* key, _In_ size_t key_len ) return SQLSRV_STMT_OPTION_INVALID; } -void add_stmt_option_key( _Inout_ sqlsrv_context& ctx, _In_ zend_string* key, _In_ size_t key_len, +void add_stmt_option_key( _Inout_ sqlsrv_context& ctx, _In_ zend_string* key, _In_ size_t key_len, _Inout_ HashTable* options_ht, _Inout_ zval* data ) { - int option_key = ::get_stmt_option_key( key, key_len ); - - CHECK_CUSTOM_ERROR((option_key == SQLSRV_STMT_OPTION_INVALID ), ctx, SQLSRV_ERROR_INVALID_OPTION_KEY, ZSTR_VAL( key ) ) { + int option_key = ::get_stmt_option_key( key, key_len ); + + CHECK_CUSTOM_ERROR((option_key == SQLSRV_STMT_OPTION_INVALID ), ctx, SQLSRV_ERROR_INVALID_OPTION_KEY, ZSTR_VAL( key ), NULL) { throw ss::SSException(); - } + } Z_TRY_ADDREF_P(data); // inc the ref count since this is going into the options_ht too. core::sqlsrv_zend_hash_index_update( ctx, options_ht, option_key, data ); } -void add_conn_option_key( _Inout_ sqlsrv_context& ctx, _In_ zend_string* key, _In_ size_t key_len, +void add_conn_option_key( _Inout_ sqlsrv_context& ctx, _In_ zend_string* key, _In_ size_t key_len, _Inout_ HashTable* options_ht, _Inout_ zval* data ) { - int option_key = ::get_conn_option_key( ctx, key, key_len, data ); - CHECK_CUSTOM_ERROR((option_key == SQLSRV_STMT_OPTION_INVALID ), ctx, SS_SQLSRV_ERROR_INVALID_OPTION, ZSTR_VAL( key ) ) { + int option_key = ::get_conn_option_key( ctx, key, key_len, data ); + CHECK_CUSTOM_ERROR((option_key == SQLSRV_STMT_OPTION_INVALID ), ctx, SS_SQLSRV_ERROR_INVALID_OPTION, ZSTR_VAL( key ), NULL) { throw ss::SSException(); - } + } Z_TRY_ADDREF_P(data); // inc the ref count since this is going into the options_ht too. core::sqlsrv_zend_hash_index_update( ctx, options_ht, option_key, data ); } -// Iterates through the list of statement options provided by the user and validates them +// Iterates through the list of statement options provided by the user and validates them // against the list of supported statement options by this driver. After validation // creates a Hashtable of statement options to be sent to the core layer for processing. @@ -1470,7 +1470,7 @@ void validate_stmt_options( _Inout_ sqlsrv_context& ctx, _Inout_ zval* stmt_opti { try { if( stmt_options ) { - + HashTable* options_ht = Z_ARRVAL_P( stmt_options ); zend_ulong int_key = -1; zend_string *key = NULL; @@ -1482,7 +1482,7 @@ void validate_stmt_options( _Inout_ sqlsrv_context& ctx, _Inout_ zval* stmt_opti type = key ? HASH_KEY_IS_STRING : HASH_KEY_IS_LONG; if (type != HASH_KEY_IS_STRING) { - CHECK_CUSTOM_ERROR(true, ctx, SQLSRV_ERROR_INVALID_OPTION_KEY, std::to_string( int_key ).c_str() ) { + CHECK_CUSTOM_ERROR(true, ctx, SQLSRV_ERROR_INVALID_OPTION_KEY, std::to_string( int_key ).c_str(), NULL) { throw core::CoreException(); } } @@ -1502,7 +1502,7 @@ void validate_stmt_options( _Inout_ sqlsrv_context& ctx, _Inout_ zval* stmt_opti } } -// Iterates through the list of connection options provided by the user and validates them +// Iterates through the list of connection options provided by the user and validates them // against the predefined list of supported connection options by this driver. After validation // creates a Hashtable of connection options to be sent to the core layer for processing. @@ -1520,7 +1520,7 @@ void validate_conn_options( _Inout_ sqlsrv_context& ctx, _In_ zval* user_options int type = HASH_KEY_NON_EXISTENT; type = key ? HASH_KEY_IS_STRING : HASH_KEY_IS_LONG; - CHECK_CUSTOM_ERROR(( Z_TYPE_P( data ) == IS_NULL || Z_TYPE_P( data ) == IS_UNDEF ), ctx, SS_SQLSRV_ERROR_INVALID_OPTION, key) { + CHECK_CUSTOM_ERROR(( Z_TYPE_P( data ) == IS_NULL || Z_TYPE_P( data ) == IS_UNDEF ), ctx, SS_SQLSRV_ERROR_INVALID_OPTION, key, NULL) { throw ss::SSException(); } @@ -1548,7 +1548,7 @@ void validate_conn_options( _Inout_ sqlsrv_context& ctx, _In_ zval* user_options DIE( "validate_conn_options: key was null." ); } } ZEND_HASH_FOREACH_END(); - } + } } catch( core::CoreException& ) { throw; diff --git a/source/sqlsrv/php_sqlsrv_int.h b/source/sqlsrv/php_sqlsrv_int.h index e6acb845..c469bc0f 100644 --- a/source/sqlsrv/php_sqlsrv_int.h +++ b/source/sqlsrv/php_sqlsrv_int.h @@ -6,19 +6,19 @@ // // Contents: Internal declarations for the extension // -// Comments: Also contains "internal" declarations shared across source files. +// Comments: Also contains "internal" declarations shared across source files. // // Microsoft Drivers 5.11 for PHP for SQL Server // Copyright(c) Microsoft Corporation // All rights reserved. // MIT License -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), -// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), +// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, // and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions : // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. //--------------------------------------------------------------------------------------------------------------------------------- @@ -44,9 +44,9 @@ PHP_INI_BEGIN() STD_PHP_INI_BOOLEAN( INI_PREFIX INI_WARNINGS_RETURN_AS_ERRORS , "1", PHP_INI_ALL, OnUpdateBool, warnings_return_as_errors, zend_sqlsrv_globals, sqlsrv_globals ) - STD_PHP_INI_ENTRY( INI_PREFIX INI_LOG_SEVERITY, "0", PHP_INI_ALL, OnUpdateLong, log_severity, zend_sqlsrv_globals, + STD_PHP_INI_ENTRY( INI_PREFIX INI_LOG_SEVERITY, "0", PHP_INI_ALL, OnUpdateLong, log_severity, zend_sqlsrv_globals, sqlsrv_globals ) - STD_PHP_INI_ENTRY( INI_PREFIX INI_LOG_SUBSYSTEMS, "0", PHP_INI_ALL, OnUpdateLong, log_subsystems, zend_sqlsrv_globals, + STD_PHP_INI_ENTRY( INI_PREFIX INI_LOG_SUBSYSTEMS, "0", PHP_INI_ALL, OnUpdateLong, log_subsystems, zend_sqlsrv_globals, sqlsrv_globals ) STD_PHP_INI_ENTRY( INI_PREFIX INI_BUFFERED_QUERY_LIMIT, INI_BUFFERED_QUERY_LIMIT_DEFAULT, PHP_INI_ALL, OnUpdateLong, buffered_query_limit, zend_sqlsrv_globals, sqlsrv_globals ) @@ -85,13 +85,13 @@ struct ss_sqlsrv_conn : sqlsrv_conn bool format_decimals; // flag set to turn on formatting for values of decimal / numeric types short decimal_places; // number of decimal digits to show in a result set unless format_numbers is false bool in_transaction; // flag set when inside a transaction and used for checking validity of tran API calls - + // static variables used in process_params static const char* resource_name; static int descriptor; // initialize with default values - ss_sqlsrv_conn( _In_ SQLHANDLE h, _In_ error_callback e, _In_ void* drv ) : + ss_sqlsrv_conn( _In_ SQLHANDLE h, _In_ error_callback e, _In_ void* drv ) : sqlsrv_conn( h, e, drv, SQLSRV_ENCODING_SYSTEM ), stmts( NULL ), date_as_string( false ), @@ -125,7 +125,7 @@ struct ss_sqlsrv_stmt : public sqlsrv_stmt { virtual ~ss_sqlsrv_stmt( void ); - void new_result_set( void ); + void new_result_set( void ); // driver specific conversion rules from a SQL Server/ODBC type to one of the SQLSRV_PHPTYPE_* constants sqlsrv_phptype sql_type_to_php_type( _In_ SQLINTEGER sql_type, _In_ SQLUINTEGER size, _In_ bool prefer_string_to_stream ); @@ -164,7 +164,7 @@ void __cdecl sqlsrv_stmt_dtor( _Inout_ zend_resource *rsrc ); // "internal" statement functions shared by functions in conn.cpp and stmt.cpp void bind_params( _Inout_ ss_sqlsrv_stmt* stmt ); -bool sqlsrv_stmt_common_execute( sqlsrv_stmt* s, const SQLCHAR* sql_string, int sql_len, bool direct, const char* function +bool sqlsrv_stmt_common_execute( sqlsrv_stmt* s, const SQLCHAR* sql_string, int sql_len, bool direct, const char* function ); void free_odbc_resources( ss_sqlsrv_stmt* stmt ); void free_stmt_resource( _Inout_ zval* stmt_z ); @@ -183,12 +183,12 @@ struct ss_error { // List of all driver specific error codes. enum SS_ERROR_CODES { - + SS_SQLSRV_ERROR_ALREADY_IN_TXN = SQLSRV_ERROR_DRIVER_SPECIFIC, SS_SQLSRV_ERROR_NOT_IN_TXN, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, SS_SQLSRV_ERROR_REGISTER_RESOURCE, - SS_SQLSRV_ERROR_INVALID_CONNECTION_KEY, + SS_SQLSRV_ERROR_INVALID_CONNECTION_KEY, SS_SQLSRV_ERROR_STATEMENT_NOT_PREPARED, SS_SQLSRV_ERROR_INVALID_FETCH_STYLE, SS_SQLSRV_ERROR_INVALID_FETCH_TYPE, @@ -227,9 +227,9 @@ SQLWCHAR* utf16_string_from_mbcs_string( _In_ unsigned int php_encoding, _In_rea _In_ unsigned int mbcs_len, _Out_ unsigned int* utf16_len, bool use_strict_conversion = false ); // *** internal error macros and functions *** -bool handle_error( sqlsrv_context const* ctx, int log_subsystem, const char* function, +bool handle_error( sqlsrv_context const* ctx, int log_subsystem, const char* function, sqlsrv_error const* ssphp, ... ); -void handle_warning( sqlsrv_context const* ctx, int log_subsystem, const char* function, +void handle_warning( sqlsrv_context const* ctx, int log_subsystem, const char* function, sqlsrv_error const* ssphp, ... ); void __cdecl sqlsrv_error_dtor( zend_resource *rsrc ); @@ -307,7 +307,7 @@ public: const char* _FN_ = function_name; \ SQLSRV_G( current_subsystem ) = current_log_subsystem; \ core_sqlsrv_register_severity_checker(ss_severity_check); \ - LOG(SEV_NOTICE, "%1!s!: entering", _FN_); + LOG(SEV_NOTICE, "%1!s!: entering", _FN_); // check the global variables of sqlsrv severity whether the message qualifies to be logged with the LOG macro bool ss_severity_check(_In_ unsigned int severity); @@ -323,7 +323,7 @@ enum logging_subsystems { //********************************************************************************************************************************* -// Common function wrappers +// Common function wrappers // have to place this namespace before the utility functions // otherwise can't compile in Linux because 'ss' not defined //********************************************************************************************************************************* @@ -342,7 +342,7 @@ namespace ss { { int zr = (NULL != (Z_RES(rsrc_result) = ::zend_register_resource(rsrc_pointer, rsrc_type)) ? SUCCESS : FAILURE); CHECK_CUSTOM_ERROR(( zr == FAILURE ), reinterpret_cast( rsrc_pointer ), SS_SQLSRV_ERROR_REGISTER_RESOURCE, - rsrc_name ) { + rsrc_name, NULL) { throw ss::SSException(); } Z_TYPE_INFO(rsrc_result) = IS_RESOURCE_EX; @@ -363,7 +363,7 @@ inline H* process_params( INTERNAL_FUNCTION_PARAMETERS, _In_ char const* param_s zval* rsrc; H* h = NULL; - + // reset the errors from the previous API call reset_errors(); @@ -384,14 +384,14 @@ inline H* process_params( INTERNAL_FUNCTION_PARAMETERS, _In_ char const* param_s va_start(vaList, param_count); //set the pointer to first argument for(size_t i = 0; i < param_count; ++i) { - + arr[i] = va_arg(vaList, void*); } va_end(vaList); int result = SUCCESS; - + // dummy context to pass to the error handler sqlsrv_context error_ctx( 0, ss_error_handler, NULL ); error_ctx.set_func( calling_func ); @@ -403,50 +403,50 @@ inline H* process_params( INTERNAL_FUNCTION_PARAMETERS, _In_ char const* param_s break; case 1: - result = zend_parse_parameters( ZEND_NUM_ARGS(), const_cast( param_spec ), &rsrc, arr[0] ); + result = zend_parse_parameters( ZEND_NUM_ARGS(), const_cast( param_spec ), &rsrc, arr[0] ); break; case 2: - result = zend_parse_parameters( ZEND_NUM_ARGS(), const_cast( param_spec ), &rsrc, arr[0], - arr[1] ); + result = zend_parse_parameters( ZEND_NUM_ARGS(), const_cast( param_spec ), &rsrc, arr[0], + arr[1] ); break; case 3: - result = zend_parse_parameters( ZEND_NUM_ARGS(), const_cast( param_spec ), &rsrc, arr[0], - arr[1], arr[2] ); + result = zend_parse_parameters( ZEND_NUM_ARGS(), const_cast( param_spec ), &rsrc, arr[0], + arr[1], arr[2] ); break; - + case 4: - result = zend_parse_parameters( ZEND_NUM_ARGS(), const_cast( param_spec ), &rsrc, arr[0], - arr[1], arr[2], arr[3] ); + result = zend_parse_parameters( ZEND_NUM_ARGS(), const_cast( param_spec ), &rsrc, arr[0], + arr[1], arr[2], arr[3] ); break; case 5: - result = zend_parse_parameters( ZEND_NUM_ARGS(), const_cast( param_spec ), &rsrc, arr[0], - arr[1], arr[2], arr[3], arr[4] ); + result = zend_parse_parameters( ZEND_NUM_ARGS(), const_cast( param_spec ), &rsrc, arr[0], + arr[1], arr[2], arr[3], arr[4] ); break; case 6: - result = zend_parse_parameters( ZEND_NUM_ARGS(), const_cast( param_spec ), &rsrc, arr[0], - arr[1], arr[2], arr[3], arr[4], arr[5] ); + result = zend_parse_parameters( ZEND_NUM_ARGS(), const_cast( param_spec ), &rsrc, arr[0], + arr[1], arr[2], arr[3], arr[4], arr[5] ); break; default: { - THROW_CORE_ERROR( error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, calling_func ); + THROW_CORE_ERROR( error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, calling_func, NULL ); break; } } - CHECK_CUSTOM_ERROR(( result == FAILURE ), &error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, calling_func ) { - + CHECK_CUSTOM_ERROR(( result == FAILURE ), &error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, calling_func, NULL) { + throw ss::SSException(); } - // get the resource registered + // get the resource registered h = static_cast( zend_fetch_resource(Z_RES_P(rsrc), H::resource_name, H::descriptor )); - - CHECK_CUSTOM_ERROR(( h == NULL ), &error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, calling_func ) { + + CHECK_CUSTOM_ERROR(( h == NULL ), &error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, calling_func, NULL) { throw ss::SSException(); } @@ -455,11 +455,11 @@ inline H* process_params( INTERNAL_FUNCTION_PARAMETERS, _In_ char const* param_s } catch( core::CoreException& ) { - + return NULL; } catch ( ... ) { - + DIE( "%1!s!: Unknown exception caught in process_params.", calling_func ); } diff --git a/source/sqlsrv/stmt.cpp b/source/sqlsrv/stmt.cpp index fe3b6dc2..4ecce3fa 100644 --- a/source/sqlsrv/stmt.cpp +++ b/source/sqlsrv/stmt.cpp @@ -100,8 +100,8 @@ void type_and_encoding( INTERNAL_FUNCTION_PARAMETERS, _In_ int type ); void type_and_size_calc( INTERNAL_FUNCTION_PARAMETERS, _In_ int type ); void type_and_precision_calc( INTERNAL_FUNCTION_PARAMETERS, _In_ int type ); bool verify_and_set_encoding( _In_ const char* encoding_string, _Inout_ sqlsrv_phptype& phptype_encoding ); -zval* parse_param_array(_Inout_ ss_sqlsrv_stmt* stmt, _Inout_ HashTable* param_ht, zend_ulong index, - _Out_ SQLSMALLINT& direction, _Out_ SQLSRV_PHPTYPE& php_out_type, +zval* parse_param_array(_Inout_ ss_sqlsrv_stmt* stmt, _Inout_ HashTable* param_ht, zend_ulong index, + _Out_ SQLSMALLINT& direction, _Out_ SQLSRV_PHPTYPE& php_out_type, _Out_ SQLSRV_ENCODING& encoding, _Out_ SQLSMALLINT& sql_type, _Out_ SQLULEN& column_size, _Out_ SQLSMALLINT& decimal_digits); @@ -341,7 +341,7 @@ PHP_FUNCTION( sqlsrv_fetch ) zend_long fetch_offset = 0; // default value for parameter if one isn't supplied // take only the statement resource - PROCESS_PARAMS( stmt, "r|ll", _FN_, 2, &fetch_style, &fetch_offset ); + PROCESS_PARAMS( stmt, "r|ll", _FN_, 2, &fetch_style, &fetch_offset, NULL ); try { @@ -395,7 +395,7 @@ PHP_FUNCTION( sqlsrv_fetch_array ) // retrieve the statement resource and optional fetch type (see enum SQLSRV_FETCH_TYPE), // fetch style (see SQLSRV_SCROLL_* constants) and fetch offset - PROCESS_PARAMS( stmt, "r|lll", _FN_, 3, &fetch_type, &fetch_style, &fetch_offset ); + PROCESS_PARAMS( stmt, "r|lll", _FN_, 3, &fetch_type, &fetch_style, &fetch_offset, NULL ); try { @@ -786,7 +786,7 @@ PHP_FUNCTION( sqlsrv_fetch_object ) // fetch style (see SQLSRV_SCROLL_* constants) and fetch offset // we also use z! instead of s and a so that null may be passed in as valid values for // the class name and ctor params - PROCESS_PARAMS( stmt, "r|z!z!ll", _FN_, 4, &class_name_z, &ctor_params_z, &fetch_style, &fetch_offset ); + PROCESS_PARAMS( stmt, "r|z!z!ll", _FN_, 4, &class_name_z, &ctor_params_z, &fetch_style, &fetch_offset, NULL ); try { @@ -797,7 +797,7 @@ PHP_FUNCTION( sqlsrv_fetch_object ) if( class_name_z ) { - CHECK_CUSTOM_ERROR(( Z_TYPE_P( class_name_z ) != IS_STRING ), stmt, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ) { + CHECK_CUSTOM_ERROR(( Z_TYPE_P( class_name_z ) != IS_STRING ), stmt, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_, NULL) { throw ss::SSException(); } class_name = Z_STRVAL( *class_name_z ); @@ -805,7 +805,7 @@ PHP_FUNCTION( sqlsrv_fetch_object ) } if( ctor_params_z && Z_TYPE_P( ctor_params_z ) != IS_ARRAY ) { - THROW_SS_ERROR( stmt, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ); + THROW_SS_ERROR( stmt, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_, NULL ); } // fetch the data @@ -822,14 +822,14 @@ PHP_FUNCTION( sqlsrv_fetch_object ) zend_string* class_name_str_z = zend_string_init( class_name, class_name_len, 0 ); int zr = ( NULL != ( class_entry = zend_lookup_class( class_name_str_z ))) ? SUCCESS : FAILURE; zend_string_release( class_name_str_z ); - CHECK_ZEND_ERROR( zr, stmt, SS_SQLSRV_ERROR_ZEND_BAD_CLASS, class_name ) { + CHECK_ZEND_ERROR( zr, stmt, SS_SQLSRV_ERROR_ZEND_BAD_CLASS, class_name, NULL ) { throw ss::SSException(); } // create an instance of the object with its default properties // we pass NULL for the properties so that the object will be populated by its default properties zr = object_and_properties_init( &retval_z, class_entry, NULL /*properties*/ ); - CHECK_ZEND_ERROR( zr, stmt, SS_SQLSRV_ERROR_ZEND_OBJECT_FAILED, class_name ) { + CHECK_ZEND_ERROR( zr, stmt, SS_SQLSRV_ERROR_ZEND_OBJECT_FAILED, class_name, NULL ) { throw ss::SSException(); } @@ -872,7 +872,7 @@ PHP_FUNCTION( sqlsrv_fetch_object ) zval* value_z = NULL; ZEND_HASH_FOREACH_VAL( ctor_params_ht, value_z ) { zr = ( value_z ) ? SUCCESS : FAILURE; - CHECK_ZEND_ERROR( zr, stmt, SS_SQLSRV_ERROR_ZEND_OBJECT_FAILED, class_name ) { + CHECK_ZEND_ERROR( zr, stmt, SS_SQLSRV_ERROR_ZEND_OBJECT_FAILED, class_name, NULL ) { throw ss::SSException(); } ZVAL_COPY_VALUE(¶ms_m[i], value_z); @@ -906,7 +906,7 @@ PHP_FUNCTION( sqlsrv_fetch_object ) fcic.object = Z_OBJ_P( &retval_z ); zr = zend_call_function( &fci, &fcic ); - CHECK_ZEND_ERROR( zr, stmt, SS_SQLSRV_ERROR_ZEND_OBJECT_FAILED, class_name ) { + CHECK_ZEND_ERROR( zr, stmt, SS_SQLSRV_ERROR_ZEND_OBJECT_FAILED, class_name, NULL ) { throw ss::SSException(); } @@ -1083,7 +1083,7 @@ PHP_FUNCTION( sqlsrv_get_field ) ZVAL_UNDEF(&retval_z); // get the statement, the field index and the optional type - PROCESS_PARAMS( stmt, "rl|l", _FN_, 2, &field_index, &sqlsrv_php_type ); + PROCESS_PARAMS( stmt, "rl|l", _FN_, 2, &field_index, &sqlsrv_php_type, NULL ); try { @@ -1091,7 +1091,7 @@ PHP_FUNCTION( sqlsrv_get_field ) SQLSMALLINT num_cols = get_resultset_meta_data(stmt); if( field_index < 0 || field_index >= num_cols ) { - THROW_SS_ERROR( stmt, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ); + THROW_SS_ERROR( stmt, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_, NULL ); } core_sqlsrv_get_field( stmt, static_cast( field_index ), sqlsrv_php_type, false, field_value, &field_len, false/*cache_field*/, @@ -1227,7 +1227,7 @@ void bind_params( _Inout_ ss_sqlsrv_stmt* stmt ) // Simply get the first variable and use the defaults value_z = zend_hash_index_find(param_ht, 0); if (value_z == NULL) { - THROW_SS_ERROR(stmt, SS_SQLSRV_ERROR_VAR_REQUIRED, index + 1); + THROW_SS_ERROR(stmt, SS_SQLSRV_ERROR_VAR_REQUIRED, index + 1, NULL); } } } catch (core::CoreException&) { @@ -1300,7 +1300,7 @@ PHP_FUNCTION( sqlsrv_cancel ) close_active_stream( stmt ); SQLRETURN r = SQLCancel( stmt->handle() ); - CHECK_SQL_ERROR_OR_WARNING( r, stmt ) { + CHECK_SQL_ERROR_OR_WARNING( r, stmt, NULL ) { throw ss::SSException(); } @@ -1375,7 +1375,7 @@ PHP_FUNCTION( sqlsrv_free_stmt ) // Check if it was a zval int zr = zend_parse_parameters( ZEND_NUM_ARGS(), "z", &stmt_r ); - CHECK_CUSTOM_ERROR(( zr == FAILURE ), error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ) { + CHECK_CUSTOM_ERROR(( zr == FAILURE ), error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_, NULL) { throw ss::SSException(); } @@ -1386,7 +1386,7 @@ PHP_FUNCTION( sqlsrv_free_stmt ) } else { - THROW_CORE_ERROR( error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ); + THROW_CORE_ERROR( error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_, NULL ); } } @@ -1402,7 +1402,7 @@ PHP_FUNCTION( sqlsrv_free_stmt ) if( stmt == NULL ) { - THROW_CORE_ERROR( error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ); + THROW_CORE_ERROR( error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_, NULL ); } // delete the resource from Zend's master list, which will trigger the statement's destructor @@ -1774,7 +1774,7 @@ void determine_stmt_has_rows( _Inout_ ss_sqlsrv_stmt* stmt ) if( SQL_SUCCEEDED( r )) { stmt->has_rows = true; - CHECK_SQL_WARNING( r, stmt ); + CHECK_SQL_WARNING( r, stmt, NULL ); // restore the cursor to its original position. r = stmt->current_results->fetch( SQL_FETCH_ABSOLUTE, 0 ); SQLSRV_ASSERT(( r == SQL_NO_DATA ), "core_sqlsrv_has_rows: Should have scrolled the cursor to the beginning " @@ -1791,7 +1791,7 @@ void determine_stmt_has_rows( _Inout_ ss_sqlsrv_stmt* stmt ) if( SQL_SUCCEEDED( r )) { stmt->has_rows = true; - CHECK_SQL_WARNING( r, stmt ); + CHECK_SQL_WARNING( r, stmt, NULL ); return; } } @@ -1841,7 +1841,7 @@ void fetch_fields_common( _Inout_ ss_sqlsrv_stmt* stmt, _In_ zend_long fetch_typ SQLSRV_PHPTYPE sqlsrv_php_type_out = SQLSRV_PHPTYPE_INVALID; // make sure that the fetch type is legal - CHECK_CUSTOM_ERROR((fetch_type < MIN_SQLSRV_FETCH || fetch_type > MAX_SQLSRV_FETCH), stmt, SS_SQLSRV_ERROR_INVALID_FETCH_TYPE, stmt->func()) { + CHECK_CUSTOM_ERROR((fetch_type < MIN_SQLSRV_FETCH || fetch_type > MAX_SQLSRV_FETCH), stmt, SS_SQLSRV_ERROR_INVALID_FETCH_TYPE, stmt->func(), NULL) { throw ss::SSException(); } @@ -1893,7 +1893,7 @@ void fetch_fields_common( _Inout_ ss_sqlsrv_stmt* stmt, _In_ zend_long fetch_typ if( fetch_type & SQLSRV_FETCH_ASSOC ) { CHECK_CUSTOM_WARNING_AS_ERROR(( stmt->fetch_field_names[i].len == 0 && !allow_empty_field_names ), stmt, - SS_SQLSRV_WARNING_FIELD_NAME_EMPTY) { + SS_SQLSRV_WARNING_FIELD_NAME_EMPTY, NULL) { throw ss::SSException(); } @@ -1924,16 +1924,16 @@ zval* parse_param_array(_Inout_ ss_sqlsrv_stmt* stmt, _Inout_ HashTable* param_h zval* dir = zend_hash_index_find(param_ht, 1); if (Z_TYPE_P(dir) != IS_NULL) { // if param direction is specified, make sure it's valid - CHECK_CUSTOM_ERROR(Z_TYPE_P(dir) != IS_LONG, stmt, SS_SQLSRV_ERROR_INVALID_PARAMETER_DIRECTION, index + 1) { + CHECK_CUSTOM_ERROR(Z_TYPE_P(dir) != IS_LONG, stmt, SS_SQLSRV_ERROR_INVALID_PARAMETER_DIRECTION, index + 1, NULL) { throw ss::SSException(); } direction = static_cast(Z_LVAL_P(dir)); CHECK_CUSTOM_ERROR(direction != SQL_PARAM_INPUT && direction != SQL_PARAM_OUTPUT && direction != SQL_PARAM_INPUT_OUTPUT, - stmt, SS_SQLSRV_ERROR_INVALID_PARAMETER_DIRECTION, index + 1) { + stmt, SS_SQLSRV_ERROR_INVALID_PARAMETER_DIRECTION, index + 1, NULL) { throw ss::SSException(); } - CHECK_CUSTOM_ERROR(direction != SQL_PARAM_INPUT && !Z_ISREF_P(var_or_val), stmt, SS_SQLSRV_ERROR_PARAM_VAR_NOT_REF, index + 1) { + CHECK_CUSTOM_ERROR(direction != SQL_PARAM_INPUT && !Z_ISREF_P(var_or_val), stmt, SS_SQLSRV_ERROR_PARAM_VAR_NOT_REF, index + 1, NULL) { throw ss::SSException(); } } @@ -1953,13 +1953,13 @@ zval* parse_param_array(_Inout_ ss_sqlsrv_stmt* stmt, _Inout_ HashTable* param_h php_out_type = zend_to_sqlsrv_phptype[Z_TYPE_P(var_or_val)]; } } else { - CHECK_CUSTOM_ERROR(Z_TYPE_P(phptype_z) != IS_LONG, stmt, SQLSRV_ERROR_INVALID_PARAMETER_PHPTYPE, index + 1) { + CHECK_CUSTOM_ERROR(Z_TYPE_P(phptype_z) != IS_LONG, stmt, SQLSRV_ERROR_INVALID_PARAMETER_PHPTYPE, index + 1, NULL) { throw ss::SSException(); } sqlsrv_phptype srv_phptype; srv_phptype.value = Z_LVAL_P(phptype_z); - CHECK_CUSTOM_ERROR(!is_valid_sqlsrv_phptype(srv_phptype), stmt, SQLSRV_ERROR_INVALID_PARAMETER_PHPTYPE, index + 1) { + CHECK_CUSTOM_ERROR(!is_valid_sqlsrv_phptype(srv_phptype), stmt, SQLSRV_ERROR_INVALID_PARAMETER_PHPTYPE, index + 1, NULL) { throw ss::SSException(); } @@ -1978,19 +1978,19 @@ zval* parse_param_array(_Inout_ ss_sqlsrv_stmt* stmt, _Inout_ HashTable* param_h throw ss::SSException(); } } else { - CHECK_CUSTOM_ERROR(Z_TYPE_P(sqltype_z) != IS_LONG, stmt, SQLSRV_ERROR_INVALID_PARAMETER_SQLTYPE, index + 1) { + CHECK_CUSTOM_ERROR(Z_TYPE_P(sqltype_z) != IS_LONG, stmt, SQLSRV_ERROR_INVALID_PARAMETER_SQLTYPE, index + 1, NULL) { throw ss::SSException(); } // since the user supplied this type, make sure it's valid sqlsrv_sqltype sqlsrv_sql_type; sqlsrv_sql_type.value = Z_LVAL_P(sqltype_z); - CHECK_CUSTOM_ERROR(!is_valid_sqlsrv_sqltype(sqlsrv_sql_type), stmt, SQLSRV_ERROR_INVALID_PARAMETER_SQLTYPE, index + 1) { + CHECK_CUSTOM_ERROR(!is_valid_sqlsrv_sqltype(sqlsrv_sql_type), stmt, SQLSRV_ERROR_INVALID_PARAMETER_SQLTYPE, index + 1, NULL) { throw ss::SSException(); } bool size_okay = determine_column_size_or_precision(stmt, sqlsrv_sql_type, &column_size, &decimal_digits); - CHECK_CUSTOM_ERROR(!size_okay, stmt, SS_SQLSRV_ERROR_INVALID_PARAMETER_PRECISION, index + 1) { + CHECK_CUSTOM_ERROR(!size_okay, stmt, SS_SQLSRV_ERROR_INVALID_PARAMETER_PRECISION, index + 1, NULL) { throw ss::SSException(); } diff --git a/source/sqlsrv/util.cpp b/source/sqlsrv/util.cpp index 0ab00969..cea3b042 100644 --- a/source/sqlsrv/util.cpp +++ b/source/sqlsrv/util.cpp @@ -9,13 +9,13 @@ // Copyright(c) Microsoft Corporation // All rights reserved. // MIT License -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), -// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the ""Software""), +// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, // and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions : // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. //--------------------------------------------------------------------------------------------------------------------------------- @@ -26,17 +26,17 @@ extern "C" { #include "php_sqlsrv_int.h" namespace { - + // current subsytem. defined for the CHECK_SQL_{ERROR|WARNING} macros unsigned int current_log_subsystem = LOG_UTIL; // *** internal functions *** sqlsrv_error_const* get_error_message( _In_ unsigned int sqlsrv_error_code ); -void copy_error_to_zval( _Inout_ zval* error_z, _In_ sqlsrv_error_const* error, _Inout_ zval* reported_chain, _Inout_ zval* ignored_chain, +void copy_error_to_zval( _Inout_ zval* error_z, _In_ sqlsrv_error_const* error, _Inout_ zval* reported_chain, _Inout_ zval* ignored_chain, _In_ bool warning ); bool ignore_warning( _In_ char* sql_state, _In_ int native_code ); -bool handle_errors_and_warnings( _Inout_ sqlsrv_context& ctx, _Inout_ zval* reported_chain, _Inout_ zval* ignored_chain, _In_ logging_severity log_severity, +bool handle_errors_and_warnings( _Inout_ sqlsrv_context& ctx, _Inout_ zval* reported_chain, _Inout_ zval* ignored_chain, _In_ logging_severity log_severity, _In_ unsigned int sqlsrv_error_code, _In_ int warning, _In_opt_ va_list* print_args ); int sqlsrv_merge_zend_hash_dtor( _Inout_ zval* dest ); @@ -46,9 +46,9 @@ bool sqlsrv_merge_zend_hash( _Inout_ zval* dest_z, zval const* src_z ); // List of all error messages ss_error SS_ERRORS[] = { - + { - SS_SQLSRV_ERROR_INVALID_OPTION, + SS_SQLSRV_ERROR_INVALID_OPTION, { IMSSP, (SQLCHAR*)"Invalid option %1!s! was passed to sqlsrv_connect.", -1, true } }, @@ -57,23 +57,23 @@ ss_error SS_ERRORS[] = { // these two share the same code since they are basically the same error. { - SQLSRV_ERROR_UID_PWD_BRACES_NOT_ESCAPED, + SQLSRV_ERROR_UID_PWD_BRACES_NOT_ESCAPED, { IMSSP, (SQLCHAR*) "An unescaped right brace (}) was found in either the user name or password. All right braces must be" " escaped with another right brace (}}).", -4, false } }, { - SS_SQLSRV_ERROR_CONNECT_BRACES_NOT_ESCAPED, + SS_SQLSRV_ERROR_CONNECT_BRACES_NOT_ESCAPED, { IMSSP, (SQLCHAR*)"An unescaped right brace (}) was found in option %1!s!.", -4, true } }, - - { - SQLSRV_ERROR_NO_DATA, - { IMSSP, (SQLCHAR*)"Field %1!d! returned no data.", -5, true } - }, { - SQLSRV_ERROR_STREAMABLE_TYPES_ONLY, + SQLSRV_ERROR_NO_DATA, + { IMSSP, (SQLCHAR*)"Field %1!d! returned no data.", -5, true } + }, + + { + SQLSRV_ERROR_STREAMABLE_TYPES_ONLY, { IMSSP, (SQLCHAR*)"Only char, nchar, varchar, nvarchar, binary, varbinary, and large object types can be read by using " "streams.", -6, false} }, @@ -90,12 +90,12 @@ ss_error SS_ERRORS[] = { }, { - SS_SQLSRV_ERROR_VAR_REQUIRED, + SS_SQLSRV_ERROR_VAR_REQUIRED, { IMSSP, (SQLCHAR*)"Parameter array %1!d! must have at least one value or variable.", -9, true } }, - + { - SS_SQLSRV_ERROR_INVALID_FETCH_TYPE, + SS_SQLSRV_ERROR_INVALID_FETCH_TYPE, { IMSSP, (SQLCHAR*)"An invalid fetch type was specified. SQLSRV_FETCH_NUMERIC, SQLSRV_FETCH_ARRAY and SQLSRV_FETCH_BOTH are acceptable values.", -10, false } }, @@ -103,24 +103,24 @@ ss_error SS_ERRORS[] = { SQLSRV_ERROR_STATEMENT_NOT_EXECUTED, { IMSSP, (SQLCHAR*)"The statement must be executed before results can be retrieved.", -11, false } }, - + { SS_SQLSRV_ERROR_ALREADY_IN_TXN, { IMSSP, (SQLCHAR*)"Cannot begin a transaction until the current transaction has been completed by calling either " "sqlsrv_commit or sqlsrv_rollback.", -12, false } - }, - + }, + { SS_SQLSRV_ERROR_NOT_IN_TXN, { IMSSP, (SQLCHAR*)"A transaction must be started by calling sqlsrv_begin_transaction before calling sqlsrv_commit or " "sqlsrv_rollback.", -13, false } - }, - + }, + { SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, { IMSSP, (SQLCHAR*)"An invalid parameter was passed to %1!s!.", -14, true } - }, - + }, + { SS_SQLSRV_ERROR_INVALID_PARAMETER_DIRECTION, { IMSSP, (SQLCHAR*)"An invalid direction for parameter %1!d! was specified. SQLSRV_PARAM_IN, SQLSRV_PARAM_OUT, and " @@ -140,7 +140,7 @@ ss_error SS_ERRORS[] = { { SQLSRV_ERROR_FETCH_NOT_CALLED, { IMSSP, (SQLCHAR*)"A row must be retrieved with sqlsrv_fetch before retrieving data with sqlsrv_get_field.", -18, false } - }, + }, { SQLSRV_ERROR_FIELD_INDEX_ERROR, @@ -159,14 +159,14 @@ ss_error SS_ERRORS[] = { { SQLSRV_ERROR_FETCH_PAST_END, { IMSSP, (SQLCHAR*)"There are no more rows in the active result set. Since this result set is not scrollable, no more " - "data may be retrieved.", -22, false } + "data may be retrieved.", -22, false } }, - + { - SS_SQLSRV_ERROR_STATEMENT_NOT_PREPARED, + SS_SQLSRV_ERROR_STATEMENT_NOT_PREPARED, { IMSSP, (SQLCHAR*)"A statement must be prepared with sqlsrv_prepare before calling sqlsrv_execute.", -23, false } - }, - + }, + { SQLSRV_ERROR_ZEND_HASH, { IMSSP, (SQLCHAR*)"An error occurred while creating or accessing a Zend hash table.", -24, false } @@ -181,37 +181,37 @@ ss_error SS_ERRORS[] = { SQLSRV_ERROR_NEXT_RESULT_PAST_END, { IMSSP, (SQLCHAR*)"There are no more results returned by the query.", -26, false } }, - + { SQLSRV_ERROR_STREAM_CREATE, { IMSSP, (SQLCHAR*)"An error occurred while retrieving a SQL Server field as a stream.", -27, false } }, - + { SQLSRV_ERROR_NO_FIELDS, { IMSSP, (SQLCHAR*)"The active result for the query contains no fields.", -28, false } }, { - SS_SQLSRV_ERROR_ZEND_BAD_CLASS, + SS_SQLSRV_ERROR_ZEND_BAD_CLASS, { IMSSP, (SQLCHAR*)"Failed to find class %1!s!.", -29, true } - }, + }, { SS_SQLSRV_ERROR_ZEND_OBJECT_FAILED, { IMSSP, (SQLCHAR*)"Failed to create an instance of class %1!s!.", -30, true } }, - + { SS_SQLSRV_ERROR_INVALID_PARAMETER_PRECISION, { IMSSP, (SQLCHAR*)"An invalid size or precision for parameter %1!d! was specified.", -31, true } }, - + { SQLSRV_ERROR_INVALID_OPTION_KEY, { IMSSP, (SQLCHAR*)"Option %1!s! is invalid.", -32, true } }, - + // these three errors are returned for invalid options, so they are given the same number for compatibility with 1.1 { SQLSRV_ERROR_INVALID_QUERY_TIMEOUT_VALUE, @@ -219,17 +219,17 @@ ss_error SS_ERRORS[] = { }, { - SQLSRV_ERROR_INVALID_OPTION_TYPE_INT, + SQLSRV_ERROR_INVALID_OPTION_TYPE_INT, { IMSSP, (SQLCHAR*) "Invalid value type for option %1!s! was specified. Integer type was expected.", -33, true } }, { - SQLSRV_ERROR_INVALID_OPTION_TYPE_STRING, + SQLSRV_ERROR_INVALID_OPTION_TYPE_STRING, { IMSSP, (SQLCHAR*) "Invalid value type for option %1!s! was specified. String type was expected.", -33, true } }, - + { - SQLSRV_ERROR_INPUT_OUTPUT_PARAM_TYPE_MATCH, + SQLSRV_ERROR_INPUT_OUTPUT_PARAM_TYPE_MATCH, { IMSSP, (SQLCHAR*)"The type of output parameter %1!d! does not match the type specified by the SQLSRV_PHPTYPE_* constant." " For output parameters, the type of the variable's current value must match the SQLSRV_PHPTYPE_* constant, or be NULL. " "If the type is NULL, the PHP type of the output parameter is inferred from the SQLSRV_SQLTYPE_* constant.", -34, true } @@ -238,14 +238,14 @@ ss_error SS_ERRORS[] = { { SQLSRV_ERROR_INVALID_TYPE, { IMSSP, (SQLCHAR*)"Invalid type", -35, false } - }, - + }, + // 36-38 have no equivalent 2.0 errors { SS_SQLSRV_ERROR_REGISTER_RESOURCE, { IMSSP, (SQLCHAR*)"Registering the %1!s! resource failed.", -39, true } - }, + }, { SQLSRV_ERROR_INPUT_PARAM_ENCODING_TRANSLATE, @@ -256,7 +256,7 @@ ss_error SS_ERRORS[] = { SQLSRV_ERROR_OUTPUT_PARAM_ENCODING_TRANSLATE, { IMSSP, (SQLCHAR*)"An error occurred translating string for an output param to UTF-8: %1!s!", -41, true } }, - + { SQLSRV_ERROR_FIELD_ENCODING_TRANSLATE, { IMSSP, (SQLCHAR*)"An error occurred translating string for a field to UTF-8: %1!s!", -42, true } @@ -267,24 +267,24 @@ ss_error SS_ERRORS[] = { { IMSSP, (SQLCHAR*)"An error occurred translating a PHP stream from UTF-8 to UTF-16: %1!s!", -43, true } }, - { + { SQLSRV_ERROR_MARS_OFF, { IMSSP, (SQLCHAR*)"The connection cannot process this operation because there is a statement with pending results. " "To make the connection available for other queries, either fetch all results or cancel or free the statement. " "For more information, see the product documentation about the MultipleActiveResultSets connection option.", -44, false } }, - + { - SQLSRV_ERROR_CONN_OPTS_WRONG_TYPE, + SQLSRV_ERROR_CONN_OPTS_WRONG_TYPE, { IMSSP, (SQLCHAR*) "Expected an array of options for the connection. Connection options must be passed as an array of " "key/value pairs.", -45, false } }, - { + { SQLSRV_ERROR_QUERY_STRING_ENCODING_TRANSLATE, - { IMSSP, (SQLCHAR*) "An error occurred translating the query string to UTF-16: %1!s!.", -46, true } + { IMSSP, (SQLCHAR*) "An error occurred translating the query string to UTF-16: %1!s!.", -46, true } }, - + { SQLSRV_ERROR_CONNECT_STRING_ENCODING_TRANSLATE, { IMSSP, (SQLCHAR*) "An error occurred translating the connection string to UTF-16: %1!s!", -47, true } @@ -300,13 +300,13 @@ ss_error SS_ERRORS[] = { { IMSSP, (SQLCHAR*) "This extension requires the Microsoft ODBC Driver for SQL Server. " "Access the following URL to download the ODBC Driver for SQL Server for %1!s!: " "https://go.microsoft.com/fwlink/?LinkId=163712", -49, true } - }, + }, - { + { SS_SQLSRV_ERROR_STATEMENT_NOT_SCROLLABLE, { IMSSP, (SQLCHAR*)"This function only works with statements that have static or keyset scrollable cursors.", -50, false } }, - + { SS_SQLSRV_ERROR_STATEMENT_SCROLLABLE, { IMSSP, (SQLCHAR*)"This function only works with statements that are not scrollable.", -51, false } @@ -314,11 +314,11 @@ ss_error SS_ERRORS[] = { // new error for 2.0, used here since 1.1 didn't have a -52 { - SQLSRV_ERROR_MAX_PARAMS_EXCEEDED, + SQLSRV_ERROR_MAX_PARAMS_EXCEEDED, { IMSSP, (SQLCHAR*) "Tried to bind parameter number %1!d!. SQL Server supports a maximum of 2100 parameters.", -52, true } }, - { + { SS_SQLSRV_ERROR_INVALID_FETCH_STYLE, { IMSSP, (SQLCHAR*)"The scroll type passed to sqlsrv_fetch, sqlsrv_fetch_array, or sqlsrv_fetch_object was not valid. " "Please use one of the SQLSRV_SCROLL constants.", -53, false } @@ -329,14 +329,14 @@ ss_error SS_ERRORS[] = { { IMSSP, (SQLCHAR*)"The value passed for the 'Scrollable' statement option is invalid. Please use 'static', 'dynamic', " "'keyset', 'forward', or 'buffered'.", -54, false } }, - + { SQLSRV_ERROR_UNKNOWN_SERVER_VERSION, { IMSSP, (SQLCHAR*)"Failed to retrieve the server version. Unable to continue.", -55, false } }, { - SQLSRV_ERROR_INVALID_PARAMETER_ENCODING, + SQLSRV_ERROR_INVALID_PARAMETER_ENCODING, { IMSSP, (SQLCHAR*) "An invalid encoding was specified for parameter %1!d!.", -56, true } }, @@ -346,7 +346,7 @@ ss_error SS_ERRORS[] = { }, { - SQLSRV_ERROR_OUTPUT_PARAM_TRUNCATED, + SQLSRV_ERROR_OUTPUT_PARAM_TRUNCATED, { IMSSP, (SQLCHAR*) "String data, right truncated for output parameter %1!d!.", -58, true } }, { @@ -472,7 +472,7 @@ ss_error SS_ERRORS[] = { { SQLSRV_ERROR_TVP_INPUT_PARAM_ONLY, { IMSSP, (SQLCHAR*) "You cannot return data in a table-valued parameter. Table-valued parameters are input-only.", -130, false } - }, + }, // terminate the list of errors/warnings { UINT_MAX, {} } @@ -491,7 +491,7 @@ bool ss_error_handler( _Inout_ sqlsrv_context& ctx, _In_ unsigned int sqlsrv_err severity = SEV_WARNING; } - return handle_errors_and_warnings( ctx, &SQLSRV_G( errors ), &SQLSRV_G( warnings ), severity, sqlsrv_error_code, warning, + return handle_errors_and_warnings( ctx, &SQLSRV_G( errors ), &SQLSRV_G( warnings ), severity, sqlsrv_error_code, warning, print_args ); } @@ -507,7 +507,7 @@ bool ss_error_handler( _Inout_ sqlsrv_context& ctx, _In_ unsigned int sqlsrv_err // // $errorsAndOrWarnings[OPTIONAL]: A predefined constant. This parameter can // take one of the values listed: -// +// // SQLSRV_ERR_ALL // Errors and warnings generated on the last sqlsrv function call are returned. // SQLSRV_ERR_ERRORS @@ -603,10 +603,10 @@ PHP_FUNCTION( sqlsrv_configure ) // dummy context to pass onto the error handler error_ctx = new ( sqlsrv_malloc( sizeof( sqlsrv_context ))) sqlsrv_context( 0, ss_error_handler, NULL ); error_ctx->set_func(_FN_); - + int zr = zend_parse_parameters( ZEND_NUM_ARGS(), "sz", &option, &option_len, &value_z ); - CHECK_CUSTOM_ERROR(( zr == FAILURE ), error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ) { - + CHECK_CUSTOM_ERROR(( zr == FAILURE ), error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_, NULL) { + throw ss::SSException(); } @@ -622,11 +622,11 @@ PHP_FUNCTION( sqlsrv_configure ) // LogSeverity else if( !stricmp( option, INI_LOG_SEVERITY )) { - CHECK_CUSTOM_ERROR(( Z_TYPE_P( value_z ) != IS_LONG ), error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ) { - + CHECK_CUSTOM_ERROR(( Z_TYPE_P( value_z ) != IS_LONG ), error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_, NULL) { + throw ss::SSException(); - } - + } + zend_long severity_mask = Z_LVAL_P( value_z ); // make sure they can't use 0 to shut off the masking in the severity if( severity_mask < SEV_ALL || severity_mask == 0 || severity_mask > (SEV_NOTICE + SEV_ERROR + SEV_WARNING) ) { @@ -641,11 +641,11 @@ PHP_FUNCTION( sqlsrv_configure ) // LogSubsystems else if( !stricmp( option, INI_LOG_SUBSYSTEMS )) { - CHECK_CUSTOM_ERROR(( Z_TYPE_P( value_z ) != IS_LONG ), error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ) { + CHECK_CUSTOM_ERROR(( Z_TYPE_P( value_z ) != IS_LONG ), error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_, NULL) { throw ss::SSException(); } - + zend_long subsystem_mask = Z_LVAL_P( value_z ); if( subsystem_mask < LOG_ALL || subsystem_mask > (LOG_INIT + LOG_CONN + LOG_STMT + LOG_UTIL) ) { @@ -658,15 +658,15 @@ PHP_FUNCTION( sqlsrv_configure ) } else if( !stricmp( option, INI_BUFFERED_QUERY_LIMIT )) { - - CHECK_CUSTOM_ERROR(( Z_TYPE_P( value_z ) != IS_LONG ), error_ctx, SQLSRV_ERROR_INVALID_BUFFER_LIMIT, _FN_ ) { + + CHECK_CUSTOM_ERROR(( Z_TYPE_P( value_z ) != IS_LONG ), error_ctx, SQLSRV_ERROR_INVALID_BUFFER_LIMIT, _FN_, NULL) { throw ss::SSException(); } zend_long buffered_query_limit = Z_LVAL_P( value_z ); - CHECK_CUSTOM_ERROR( buffered_query_limit <= 0, error_ctx, SQLSRV_ERROR_INVALID_BUFFER_LIMIT, _FN_ ) { + CHECK_CUSTOM_ERROR( buffered_query_limit <= 0, error_ctx, SQLSRV_ERROR_INVALID_BUFFER_LIMIT, _FN_, NULL) { throw ss::SSException(); } @@ -678,7 +678,7 @@ PHP_FUNCTION( sqlsrv_configure ) else { - THROW_CORE_ERROR( error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ); + THROW_CORE_ERROR( error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_, NULL ); } } catch( core::CoreException& ) { @@ -693,7 +693,7 @@ PHP_FUNCTION( sqlsrv_configure ) // sqlsrv_get_config( string $setting ) -// +// // Returns the current value of the specified configuration setting. // // Parameters @@ -719,15 +719,15 @@ PHP_FUNCTION( sqlsrv_get_config ) reset_errors(); try { - + // dummy context to pass onto the error handler error_ctx = new ( sqlsrv_malloc( sizeof( sqlsrv_context ))) sqlsrv_context( 0, ss_error_handler, NULL ); error_ctx->set_func(_FN_); int zr = zend_parse_parameters( ZEND_NUM_ARGS(), "s", &option, &option_len ); - CHECK_CUSTOM_ERROR(( zr == FAILURE ), error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ) { + CHECK_CUSTOM_ERROR(( zr == FAILURE ), error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ , NULL) { - throw ss::SSException(); + throw ss::SSException(); } SQLSRV_ASSERT( option != NULL, "sqlsrv_get_config: option was null." ); if( !stricmp( option, INI_WARNINGS_RETURN_AS_ERRORS )) { @@ -751,16 +751,16 @@ PHP_FUNCTION( sqlsrv_get_config ) return; } else { - - THROW_CORE_ERROR( error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_ ); + + THROW_CORE_ERROR( error_ctx, SS_SQLSRV_ERROR_INVALID_FUNCTION_PARAMETER, _FN_, NULL ); } } catch( core::CoreException& ) { - + RETURN_FALSE; } catch( ... ) { - + DIE( "sqlsrv_get_config: Unknown exception caught." ); } } @@ -782,13 +782,13 @@ sqlsrv_error_const* get_error_message( _In_ unsigned int sqlsrv_error_code ) { return error_message; } -void copy_error_to_zval( _Inout_ zval* error_z, _In_ sqlsrv_error_const* error, _Inout_ zval* reported_chain, _Inout_ zval* ignored_chain, +void copy_error_to_zval( _Inout_ zval* error_z, _In_ sqlsrv_error_const* error, _Inout_ zval* reported_chain, _Inout_ zval* ignored_chain, _In_ bool warning ) { array_init(error_z); // sqlstate - zval temp; + zval temp; ZVAL_UNDEF(&temp); core::sqlsrv_zval_stringl( &temp, reinterpret_cast( error->sqlstate ), SQL_SQLSTATE_SIZE ); Z_TRY_ADDREF_P( &temp ); @@ -819,36 +819,36 @@ void copy_error_to_zval( _Inout_ zval* error_z, _In_ sqlsrv_error_const* error, // add the error or warning to the reported_chain. if( !warning || SQLSRV_G( warnings_return_as_errors ) ) { - // if the warning is part of the ignored warning list than + // if the warning is part of the ignored warning list than // add to the ignored chain if the ignored chain is not null. if( warning && ignore_warning( reinterpret_cast(error->sqlstate), error->native_code ) && ignored_chain != NULL ) { - + if( add_next_index_zval( ignored_chain, error_z ) == FAILURE ) { DIE( "Fatal error during error processing" ); - } + } } else { - // It is either an error or a warning which should not be ignored. + // It is either an error or a warning which should not be ignored. if( add_next_index_zval( reported_chain, error_z ) == FAILURE ) { DIE( "Fatal error during error processing" ); - } + } } } else { // It is a warning with warning_return_as_errors as false, so simply add it to the ignored_chain list if( ignored_chain != NULL ) { - + if( add_next_index_zval( ignored_chain, error_z ) == FAILURE ) { DIE( "Fatal error during error processing" ); - } + } } } } -bool handle_errors_and_warnings( _Inout_ sqlsrv_context& ctx, _Inout_ zval* reported_chain, _Inout_ zval* ignored_chain, _In_ logging_severity log_severity, +bool handle_errors_and_warnings( _Inout_ sqlsrv_context& ctx, _Inout_ zval* reported_chain, _Inout_ zval* ignored_chain, _In_ logging_severity log_severity, _In_ unsigned int sqlsrv_error_code, _In_ int warning, _In_opt_ va_list* print_args ) { bool result = true; @@ -872,20 +872,20 @@ bool handle_errors_and_warnings( _Inout_ sqlsrv_context& ctx, _Inout_ zval* repo // array of ignored errors if( ignored_chain != NULL ) { - + if( Z_TYPE_P( ignored_chain ) == IS_NULL ) { - + ignored_chain_was_null = true; array_init( ignored_chain ); } } if( sqlsrv_error_code != SQLSRV_ERROR_ODBC ) { - + core_sqlsrv_format_driver_error( ctx, get_error_message( sqlsrv_error_code ), error, log_severity, print_args ); copy_error_to_zval( &error_z, error, reported_chain, ignored_chain, warning ); } - + SQLSMALLINT record_number = 0; do { @@ -894,7 +894,7 @@ bool handle_errors_and_warnings( _Inout_ sqlsrv_context& ctx, _Inout_ zval* repo copy_error_to_zval( &error_z, error, reported_chain, ignored_chain, warning ); } } while( result ); - + // If it were a warning, we report that warnings where ignored except if warnings_return_as_errors // was true and we added some warnings to the reported_chain. if( warning ) { @@ -902,9 +902,9 @@ bool handle_errors_and_warnings( _Inout_ sqlsrv_context& ctx, _Inout_ zval* repo errors_ignored = true; if( SQLSRV_G( warnings_return_as_errors ) ) { - + if( zend_hash_num_elements( Z_ARRVAL_P( reported_chain )) > prev_reported_cnt ) { - + // We actually added some errors errors_ignored = false; } @@ -946,12 +946,12 @@ bool ignore_warning( _In_ char* sql_state, _In_ int native_code ) return true; } } ZEND_HASH_FOREACH_END(); - + return false; } int sqlsrv_merge_zend_hash_dtor( _Inout_ zval* dest ) -{ +{ zval_ptr_dtor( dest ); return ZEND_HASH_APPLY_REMOVE; } @@ -988,6 +988,6 @@ bool sqlsrv_merge_zend_hash( _Inout_ zval* dest_z, zval const* src_z ) } ZEND_HASH_FOREACH_END(); return true; -} +} } // namespace From 4ca08e5ca2ea9547cefb0879efc8da678324d305 Mon Sep 17 00:00:00 2001 From: Sicong Date: Mon, 27 Feb 2023 15:01:36 -0800 Subject: [PATCH 4/5] Update azure-pipelines.yml (#1440) --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index e4e5fb4a..a4c9b1f9 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -19,7 +19,7 @@ pr: jobs: - job: macOS pool: - vmImage: 'macOS-10.15' + vmImage: 'macos-latest' steps: - checkout: self clean: true From 3cd248fba816a69d41444b44d88e7353a57d453d Mon Sep 17 00:00:00 2001 From: Sicong Date: Tue, 28 Feb 2023 13:42:04 -0800 Subject: [PATCH 5/5] Update version to 5.11.0 (#1444) --- CHANGELOG.md | 27 +++++++++++++++++++++++++++ source/shared/version.h | 6 +++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f9183a1..79c04288 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,33 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) +## 5.11.0 - 2023-02-28 +Updated PECL release packages. Here is the list of updates: + +### Added +- Support for PHP 8.2 + +### Removed +- Support for PHP 7.4 + +### Limitations +- No support for inout / output params when using sql_variant type +- No support for inout / output params when formatting decimal values +- In Linux and macOS, setlocale() only takes effect if it is invoked before the first connection. Attempting to set the locale after connecting will not work +- Always Encrypted requires [MS ODBC Driver 17+](https://docs.microsoft.com/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server) + - Only Windows Certificate Store and Azure Key Vault are supported. Custom Keystores are not yet supported + - Issue [#716](https://github.com/Microsoft/msphpsql/issues/716) - With Always Encrypted enabled, named parameters in subqueries are not supported + - Issue [#1050](https://github.com/microsoft/msphpsql/issues/1050) - With Always Encrypted enabled, insertion requires the column list for any tables with identity columns + - [Always Encrypted limitations](https://docs.microsoft.com/sql/connect/php/using-always-encrypted-php-drivers#limitations-of-the-php-drivers-when-using-always-encrypted) + +### Known Issues +- This release requires ODBC Driver 17.4.2 or above. Otherwise, a warning about failing to set an attribute may be suppressed when using an older ODBC driver. +- Connection pooling on Linux or macOS is not recommended with [unixODBC](http://www.unixodbc.org/) < 2.3.7 +- When pooling is enabled in Linux or macOS + - unixODBC <= 2.3.4 (Linux and macOS) might not return proper diagnostic information, such as error messages, warnings and informative messages + - due to this unixODBC bug, fetch large data (such as xml, binary) as streams as a workaround. See the examples [here](https://github.com/Microsoft/msphpsql/wiki/Features#pooling) + + ## 5.11.0-beta1 - 2023-01-25 Updated PECL release packages. Here is the list of updates: diff --git a/source/shared/version.h b/source/shared/version.h index c49495ab..036bf15c 100644 --- a/source/shared/version.h +++ b/source/shared/version.h @@ -31,7 +31,7 @@ #define SQLVERSION_BUILD 0 // For previews, set this constant to 1, 2 and so on. Otherwise, set it to 0 -#define PREVIEW 1 +#define PREVIEW 0 #define SEMVER_PRERELEASE // Semantic versioning build metadata, build meta data is not counted in precedence order. @@ -59,7 +59,7 @@ #define _FILEVERSION SQLVERSION_MAJOR,SQLVERSION_MINOR,SQLVERSION_PATCH,SQLVERSION_BUILD // PECL package version ('-' or '+' is not allowed) - to support Pickle do not use macros below -#define PHP_SQLSRV_VERSION "5.11.0beta1" -#define PHP_PDO_SQLSRV_VERSION "5.11.0beta1" +#define PHP_SQLSRV_VERSION "5.11.0" +#define PHP_PDO_SQLSRV_VERSION "5.11.0" #endif // VERSION_H