@@ -24,25 +24,25 @@ VALUE opt_escape_regex, opt_escape_dblquote;
24
24
25
25
// Lib Backend (Helpers)
26
26
27
- VALUE rb_tinytds_raise_error (DBPROCESS * dbproc , int is_message , int cancel , const char * error , const char * source , int severity , int dberr , int oserr ) {
27
+ VALUE rb_tinytds_raise_error (DBPROCESS * dbproc , tinytds_errordata error ) {
28
28
VALUE e ;
29
29
GET_CLIENT_USERDATA (dbproc );
30
- if (cancel && !dbdead (dbproc ) && userdata && !userdata -> closed ) {
30
+ if (error . cancel && !dbdead (dbproc ) && userdata && !userdata -> closed ) {
31
31
userdata -> dbsqlok_sent = 1 ;
32
32
dbsqlok (dbproc );
33
33
userdata -> dbcancel_sent = 1 ;
34
34
dbcancel (dbproc );
35
35
}
36
- e = rb_exc_new2 (cTinyTdsError , error );
37
- rb_funcall (e , intern_source_eql , 1 , rb_str_new2 (source ));
38
- if (severity )
39
- rb_funcall (e , intern_severity_eql , 1 , INT2FIX (severity ));
40
- if (dberr )
41
- rb_funcall (e , intern_db_error_number_eql , 1 , INT2FIX (dberr ));
42
- if (oserr )
43
- rb_funcall (e , intern_os_error_number_eql , 1 , INT2FIX (oserr ));
44
-
45
- if (severity <= 10 && is_message ) {
36
+ e = rb_exc_new2 (cTinyTdsError , error . error );
37
+ rb_funcall (e , intern_source_eql , 1 , rb_str_new2 (error . source ));
38
+ if (error . severity )
39
+ rb_funcall (e , intern_severity_eql , 1 , INT2FIX (error . severity ));
40
+ if (error . dberr )
41
+ rb_funcall (e , intern_db_error_number_eql , 1 , INT2FIX (error . dberr ));
42
+ if (error . oserr )
43
+ rb_funcall (e , intern_os_error_number_eql , 1 , INT2FIX (error . oserr ));
44
+
45
+ if (error . severity <= 10 && error . is_message ) {
46
46
VALUE message_handler = userdata && userdata -> message_handler ? userdata -> message_handler : Qnil ;
47
47
if (message_handler && message_handler != Qnil && rb_respond_to (message_handler , intern_call ) != 0 ) {
48
48
rb_funcall (message_handler , intern_call , 1 , e );
@@ -109,6 +109,16 @@ int tinytds_err_handler(DBPROCESS *dbproc, int severity, int dberr, int oserr, c
109
109
break ;
110
110
}
111
111
112
+ tinytds_errordata error_data = {
113
+ .is_message = 0 ,
114
+ .cancel = cancel ,
115
+ .severity = severity ,
116
+ .dberr = dberr ,
117
+ .oserr = oserr
118
+ };
119
+ strncpy (error_data .error , dberrstr , ERROR_MSG_SIZE );
120
+ strncpy (error_data .source , source , ERROR_MSG_SIZE );
121
+
112
122
/*
113
123
When in non-blocking mode we need to store the exception data to throw it
114
124
once the blocking call returns, otherwise we will segfault ruby since part
@@ -120,19 +130,9 @@ int tinytds_err_handler(DBPROCESS *dbproc, int severity, int dberr, int oserr, c
120
130
dbcancel (dbproc );
121
131
userdata -> dbcancel_sent = 1 ;
122
132
}
123
-
124
- tinytds_errordata error = {
125
- .is_message = 0 ,
126
- .cancel = cancel ,
127
- .severity = severity ,
128
- .dberr = dberr ,
129
- .oserr = oserr
130
- };
131
- strncpy (error .error , dberrstr , ERROR_MSG_SIZE );
132
- strncpy (error .source , source , ERROR_MSG_SIZE );
133
- push_userdata_error (userdata , error );
133
+ push_userdata_error (userdata , error_data );
134
134
} else {
135
- rb_tinytds_raise_error (dbproc , 0 , cancel , dberrstr , source , severity , dberr , oserr );
135
+ rb_tinytds_raise_error (dbproc , error_data );
136
136
}
137
137
138
138
return return_value ;
@@ -144,30 +144,31 @@ int tinytds_msg_handler(DBPROCESS *dbproc, DBINT msgno, int msgstate, int severi
144
144
145
145
int is_message_an_error = severity > 10 ? 1 : 0 ;
146
146
147
+ tinytds_errordata error_data = {
148
+ .is_message = !is_message_an_error ,
149
+ .cancel = is_message_an_error ,
150
+ .severity = severity ,
151
+ .dberr = msgno ,
152
+ .oserr = msgstate
153
+ };
154
+ strncpy (error_data .error , msgtext , ERROR_MSG_SIZE );
155
+ strncpy (error_data .source , source , ERROR_MSG_SIZE );
156
+
147
157
// See tinytds_err_handler() for info about why we do this
148
158
if (userdata && userdata -> nonblocking ) {
149
159
/*
150
160
In the case of non-blocking command batch execution we can receive multiple messages
151
161
(including errors). We keep track of those here so they can be processed once the
152
162
non-blocking call returns.
153
163
*/
154
- tinytds_errordata error = {
155
- .is_message = !is_message_an_error ,
156
- .cancel = is_message_an_error ,
157
- .severity = severity ,
158
- .dberr = msgno ,
159
- .oserr = msgstate
160
- };
161
- strncpy (error .error , msgtext , ERROR_MSG_SIZE );
162
- strncpy (error .source , source , ERROR_MSG_SIZE );
163
- push_userdata_error (userdata , error );
164
+ push_userdata_error (userdata , error_data );
164
165
165
166
if (is_message_an_error && !dbdead (dbproc ) && !userdata -> closed ) {
166
167
dbcancel (dbproc );
167
168
userdata -> dbcancel_sent = 1 ;
168
169
}
169
170
} else {
170
- rb_tinytds_raise_error (dbproc , ! is_message_an_error , is_message_an_error , msgtext , source , severity , msgno , msgstate );
171
+ rb_tinytds_raise_error (dbproc , error_data );
171
172
}
172
173
return 0 ;
173
174
}
0 commit comments