@@ -105,7 +105,15 @@ static void odbc_ird_check(TDS_STMT * stmt);
105
105
CHECK_##t##_EXTRA(n); \
106
106
odbc_errs_reset(&n->errs);
107
107
108
- #define ODBC_ENTER_HSTMT INIT_HANDLE(STMT, stmt)
108
+ #define ODBC_ENTER_HSTMT_EX (post_cancel ) \
109
+ INIT_HANDLE(STMT, stmt) \
110
+ if (stmt->cancel_requested) { \
111
+ _SQLCancel(stmt); \
112
+ post_cancel; \
113
+ }
114
+
115
+ #define ODBC_ENTER_HSTMT ODBC_ENTER_HSTMT_EX(odbc_errs_reset(&stmt->errs))
116
+ #define ODBC_ENTER_HSTMT_OR_BAIL ODBC_ENTER_HSTMT_EX(return SQL_ERROR)
109
117
#define ODBC_ENTER_HDBC INIT_HANDLE(DBC, dbc)
110
118
#define ODBC_ENTER_HENV INIT_HANDLE(ENV, env)
111
119
#define ODBC_ENTER_HDESC INIT_HANDLE(DESC, desc)
@@ -733,7 +741,7 @@ SQLExtendedFetch(SQLHSTMT hstmt, SQLUSMALLINT fFetchType, SQLROWOFFSET irow, SQL
733
741
SQLULEN bookmark ;
734
742
SQLULEN out_len = 0 ;
735
743
736
- ODBC_ENTER_HSTMT ;
744
+ ODBC_ENTER_HSTMT_OR_BAIL ;
737
745
738
746
tdsdump_log (TDS_DBG_FUNC , "SQLExtendedFetch(%p, %d, %d, %p, %p)\n" ,
739
747
hstmt , fFetchType , (int )irow , pcrow , rgfRowStatus );
@@ -901,7 +909,7 @@ SQLMoreResults(SQLHSTMT hstmt)
901
909
SQLUSMALLINT param_status ;
902
910
int token_flags ;
903
911
904
- ODBC_ENTER_HSTMT ;
912
+ ODBC_ENTER_HSTMT_OR_BAIL ;
905
913
906
914
tdsdump_log (TDS_DBG_FUNC , "SQLMoreResults(%p)\n" , hstmt );
907
915
@@ -1233,7 +1241,7 @@ SQLSetPos(SQLHSTMT hstmt, SQLSETPOSIROW irow, SQLUSMALLINT fOption, SQLUSMALLINT
1233
1241
TDSSOCKET * tds ;
1234
1242
TDS_CURSOR_OPERATION op ;
1235
1243
TDSPARAMINFO * params = NULL ;
1236
- ODBC_ENTER_HSTMT ;
1244
+ ODBC_ENTER_HSTMT_OR_BAIL ;
1237
1245
1238
1246
tdsdump_log (TDS_DBG_FUNC , "SQLSetPos(%p, %ld, %d, %d)\n" ,
1239
1247
hstmt , (long ) irow , fOption , fLock );
@@ -1748,6 +1756,7 @@ _SQLAllocEnv(SQLHENV FAR * phenv, SQLINTEGER odbc_version)
1748
1756
env -> tds_ctx = ctx ;
1749
1757
ctx -> msg_handler = odbc_errmsg_handler ;
1750
1758
ctx -> err_handler = odbc_errmsg_handler ;
1759
+ ctx -> int_handler = odbc_int_handler ;
1751
1760
1752
1761
/* ODBC has its own format */
1753
1762
free (ctx -> locale -> datetime_fmt );
@@ -1983,55 +1992,59 @@ SQLBindCol(SQLHSTMT hstmt, SQLUSMALLINT icol, SQLSMALLINT fCType, SQLPOINTER rgb
1983
1992
SQLRETURN ODBC_PUBLIC ODBC_API
1984
1993
SQLCancel (SQLHSTMT hstmt )
1985
1994
{
1986
- TDSSOCKET * tds ;
1987
-
1988
- /*
1989
- * FIXME this function can be called from other thread, do not free
1990
- * errors for this function
1991
- * If function is called from another thread errors are not touched
1992
- */
1993
- /* TODO some tests required */
1994
1995
TDS_STMT * stmt = (TDS_STMT * )hstmt ;
1995
1996
if (SQL_NULL_HSTMT == hstmt || !IS_HSTMT (hstmt ))
1996
1997
return SQL_INVALID_HANDLE ;
1998
+ /* tdsdump_log(TDS_DBG_FUNC, "SQLCancel(%p)\n", hstmt); */
1999
+ stmt -> cancel_requested = true;
2000
+ return SQL_SUCCESS ;
2001
+ }
2002
+
2003
+ SQLRETURN
2004
+ _SQLCancel (TDS_STMT * stmt )
2005
+ {
2006
+ TDSSOCKET * tds ;
1997
2007
1998
- tdsdump_log ( TDS_DBG_FUNC , "SQLCancel(%p)\n" , hstmt );
2008
+ /* TODO some tests required */
1999
2009
2010
+ tds_mutex_lock (& stmt -> dbc -> mtx );
2011
+ if (!stmt -> cancel_requested ) {
2012
+ tds_mutex_unlock (& stmt -> dbc -> mtx );
2013
+ return SQL_SUCCESS ;
2014
+ }
2000
2015
tds = stmt -> tds ;
2016
+ tds_mutex_unlock (& stmt -> dbc -> mtx );
2017
+
2018
+ tdsdump_log (TDS_DBG_FUNC , "_SQLCancel(%p)\n" , stmt );
2001
2019
2002
2020
/* cancelling an inactive statement ?? */
2003
2021
if (!tds ) {
2004
- ODBC_SAFE_ERROR (stmt );
2005
- ODBC_EXIT_ (stmt );
2006
- }
2007
- if (tds_mutex_trylock (& stmt -> mtx ) == 0 ) {
2022
+ stmt -> cancel_requested = false;
2023
+ ODBC_RETURN_ (stmt );
2024
+ } else {
2008
2025
CHECK_STMT_EXTRA (stmt );
2009
2026
odbc_errs_reset (& stmt -> errs );
2027
+ odbc_errs_add (& stmt -> errs , "HY008" , "Operation was cancelled" );
2010
2028
2011
2029
/* FIXME test current statement */
2012
- /* FIXME here we are unlocked */
2013
2030
2014
2031
if (TDS_FAILED (tds_send_cancel (tds ))) {
2015
- ODBC_SAFE_ERROR ( stmt ) ;
2016
- ODBC_EXIT_ (stmt );
2032
+ stmt -> cancel_requested = false ;
2033
+ ODBC_RETURN_ (stmt );
2017
2034
}
2018
2035
2019
2036
if (TDS_FAILED (tds_process_cancel (tds ))) {
2020
- ODBC_SAFE_ERROR ( stmt ) ;
2021
- ODBC_EXIT_ (stmt );
2037
+ stmt -> cancel_requested = false ;
2038
+ ODBC_RETURN_ (stmt );
2022
2039
}
2023
2040
2024
2041
/* only if we processed cancel reset statement */
2025
2042
if (tds -> state == TDS_IDLE )
2026
2043
odbc_unlock_statement (stmt );
2027
2044
2028
- ODBC_EXIT_ (stmt );
2045
+ stmt -> cancel_requested = false;
2046
+ ODBC_RETURN_ (stmt );
2029
2047
}
2030
-
2031
- /* don't access error here, just return error */
2032
- if (TDS_FAILED (tds_send_cancel (tds )))
2033
- return SQL_ERROR ;
2034
- return SQL_SUCCESS ;
2035
2048
}
2036
2049
2037
2050
ODBC_FUNC (SQLConnect , (P (SQLHDBC ,hdbc ), PCHARIN (DSN ,SQLSMALLINT ), PCHARIN (UID ,SQLSMALLINT ),
@@ -4166,7 +4179,7 @@ SQLFetch(SQLHSTMT hstmt)
4166
4179
SQLUSMALLINT * array_status_ptr ;
4167
4180
} keep ;
4168
4181
4169
- ODBC_ENTER_HSTMT ;
4182
+ ODBC_ENTER_HSTMT_OR_BAIL ;
4170
4183
4171
4184
tdsdump_log (TDS_DBG_FUNC , "SQLFetch(%p)\n" , hstmt );
4172
4185
@@ -4195,7 +4208,7 @@ SQLFetch(SQLHSTMT hstmt)
4195
4208
SQLRETURN ODBC_PUBLIC ODBC_API
4196
4209
SQLFetchScroll (SQLHSTMT hstmt , SQLSMALLINT FetchOrientation , SQLLEN FetchOffset )
4197
4210
{
4198
- ODBC_ENTER_HSTMT ;
4211
+ ODBC_ENTER_HSTMT_OR_BAIL ;
4199
4212
4200
4213
tdsdump_log (TDS_DBG_FUNC , "SQLFetchScroll(%p, %d, %d)\n" , hstmt , FetchOrientation , (int )FetchOffset );
4201
4214
@@ -5060,7 +5073,7 @@ SQLGetData(SQLHSTMT hstmt, SQLUSMALLINT icol, SQLSMALLINT fCType, SQLPOINTER rgb
5060
5073
TDSRESULTINFO * resinfo ;
5061
5074
SQLLEN dummy_cb ;
5062
5075
5063
- ODBC_ENTER_HSTMT ;
5076
+ ODBC_ENTER_HSTMT_OR_BAIL ;
5064
5077
5065
5078
tdsdump_log (TDS_DBG_FUNC , "SQLGetData(%p, %u, %d, %p, %d, %p)\n" ,
5066
5079
hstmt , icol , fCType , rgbValue , (int )cbValueMax , pcbValue );
@@ -6303,7 +6316,7 @@ SQLGetTypeInfoW(SQLHSTMT hstmt, SQLSMALLINT fSqlType)
6303
6316
static SQLRETURN
6304
6317
_SQLParamData (SQLHSTMT hstmt , SQLPOINTER FAR * prgbValue )
6305
6318
{
6306
- ODBC_ENTER_HSTMT ;
6319
+ ODBC_ENTER_HSTMT_OR_BAIL ;
6307
6320
6308
6321
tdsdump_log (TDS_DBG_FUNC , "SQLParamData(%p, %p) [param_num %d, param_data_called = %d]\n" ,
6309
6322
hstmt , prgbValue , stmt -> param_num , stmt -> param_data_called );
0 commit comments