Skip to content

Commit e604624

Browse files
committed
refactor rb_tinytds_raise_error to accept tinytds_errordata
1 parent 527c134 commit e604624

File tree

3 files changed

+38
-45
lines changed

3 files changed

+38
-45
lines changed

ext/tiny_tds/client.c

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,25 @@ VALUE opt_escape_regex, opt_escape_dblquote;
2424

2525
// Lib Backend (Helpers)
2626

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) {
2828
VALUE e;
2929
GET_CLIENT_USERDATA(dbproc);
30-
if (cancel && !dbdead(dbproc) && userdata && !userdata->closed) {
30+
if (error.cancel && !dbdead(dbproc) && userdata && !userdata->closed) {
3131
userdata->dbsqlok_sent = 1;
3232
dbsqlok(dbproc);
3333
userdata->dbcancel_sent = 1;
3434
dbcancel(dbproc);
3535
}
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) {
4646
VALUE message_handler = userdata && userdata->message_handler ? userdata->message_handler : Qnil;
4747
if (message_handler && message_handler != Qnil && rb_respond_to(message_handler, intern_call) != 0) {
4848
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
109109
break;
110110
}
111111

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+
112122
/*
113123
When in non-blocking mode we need to store the exception data to throw it
114124
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
120130
dbcancel(dbproc);
121131
userdata->dbcancel_sent = 1;
122132
}
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);
134134
} else {
135-
rb_tinytds_raise_error(dbproc, 0, cancel, dberrstr, source, severity, dberr, oserr);
135+
rb_tinytds_raise_error(dbproc, error_data);
136136
}
137137

138138
return return_value;
@@ -144,30 +144,31 @@ int tinytds_msg_handler(DBPROCESS *dbproc, DBINT msgno, int msgstate, int severi
144144

145145
int is_message_an_error = severity > 10 ? 1 : 0;
146146

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+
147157
// See tinytds_err_handler() for info about why we do this
148158
if (userdata && userdata->nonblocking) {
149159
/*
150160
In the case of non-blocking command batch execution we can receive multiple messages
151161
(including errors). We keep track of those here so they can be processed once the
152162
non-blocking call returns.
153163
*/
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);
164165

165166
if (is_message_an_error && !dbdead(dbproc) && !userdata->closed) {
166167
dbcancel(dbproc);
167168
userdata->dbcancel_sent = 1;
168169
}
169170
} 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);
171172
}
172173
return 0;
173174
}

ext/tiny_tds/client.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ typedef struct {
4242
rb_encoding *encoding;
4343
} tinytds_client_wrapper;
4444

45-
VALUE rb_tinytds_raise_error(DBPROCESS *dbproc, int is_message, int cancel, const char *error, const char *source, int severity, int dberr, int oserr);
45+
VALUE rb_tinytds_raise_error(DBPROCESS *dbproc, tinytds_errordata error);
4646

4747
// Lib Macros
4848

ext/tiny_tds/result.c

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -100,15 +100,7 @@ static void nogvl_cleanup(DBPROCESS *client) {
100100
*/
101101
for (short int i = 0; i < userdata->nonblocking_errors_length; i++) {
102102
tinytds_errordata error = userdata->nonblocking_errors[i];
103-
rb_tinytds_raise_error(client,
104-
error.is_message,
105-
error.cancel,
106-
error.error,
107-
error.source,
108-
error.severity,
109-
error.dberr,
110-
error.oserr
111-
);
103+
rb_tinytds_raise_error(client, error);
112104
}
113105

114106
free(userdata->nonblocking_errors);

0 commit comments

Comments
 (0)