00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "common.h"
00017
00018 #include <basis/istring.h>
00019 #include <basis/log_base.h>
00020 #include <basis/program_wide_logger.h>
00021
00022 #if HAVE_UNISTD_H
00023 #include <unistd.h>
00024 #endif
00025
00026 #if HAVE_LIBGEN_H
00027 #include <libgen.h>
00028 #endif
00029
00030 #if HAVE_SYS_PARAM_H
00031 #include <sys/param.h>
00032 #endif
00033
00034 #include <stdlib.h>
00035 #include <string.h>
00036
00037 bool common_database_support::_error_was_seen = false;
00038
00039
00040 int common_database_support::syb_msg_handler(DBPROCESS * dbproc, DBINT msgno,
00041 int msgstate, int severity, char *msgtext, char *srvname, char *procname,
00042 int line)
00043 {
00044 char var_value[31];
00045 int i;
00046 char *c;
00047 int *pexpected_msgno;
00048
00049
00050
00051
00052
00053
00054
00055 if (msgno == 5701 ||
00056 msgno == 5703 ||
00057 msgno == 5704) {
00058
00059
00060
00061 if (msgtext != NULL && (c = strchr(msgtext, '\'')) != NULL) {
00062 i = 0;
00063 for (++c; i <= 30 && *c != '\0' && *c != '\''; ++c)
00064 var_value[i++] = *c;
00065 var_value[i] = '\0';
00066 }
00067
00068 return 0;
00069 }
00070
00071
00072
00073
00074
00075 if (dbproc != NULL) {
00076 pexpected_msgno = (int *) dbgetuserdata(dbproc);
00077 if (pexpected_msgno && *pexpected_msgno == msgno) {
00078 program_wide_logger().log(isprintf("OK: anticipated message arrived: %d %s", msgno, msgtext));
00079 *pexpected_msgno = 0;
00080 return 0;
00081 }
00082 }
00083
00084
00085
00086
00087 if (severity >= 0 || msgno == 0) {
00088
00089
00090
00091
00092
00093 if (msgno > 0 && severity > 0) {
00094 istring err_msg;
00095 err_msg += isprintf("ERROR: Msg %d, Level %d, State %d\n", (int) msgno, (int) severity, (int) msgstate);
00096 err_msg += isprintf("Server '%s'", srvname);
00097 if (procname != NULL && *procname != '\0')
00098 err_msg += isprintf(", Procedure '%s'", procname);
00099 if (line > 0)
00100 err_msg += isprintf(", Line %d", line);
00101 err_msg += isprintf("\n");
00102 err_msg += isprintf("%s", msgtext);
00103 program_wide_logger().log(err_msg);
00104
00105 _error_was_seen = true;
00106 } else {
00107
00108
00109
00110
00111 program_wide_logger().log(msgtext);
00112 }
00113 }
00114 return 0;
00115 }
00116
00117 int common_database_support::syb_err_handler(DBPROCESS * dbproc, int severity,
00118 int dberr, int oserr, char *dberrstr, char *oserrstr)
00119 {
00120 int *pexpected_dberr;
00121
00122
00123
00124
00125
00126 if (dberr == SYBESMSG) {
00127
00128 _error_was_seen = true;
00129 return INT_CANCEL;
00130 }
00131
00132
00133
00134
00135
00136 if (dbproc != NULL) {
00137 pexpected_dberr = (int *) dbgetuserdata(dbproc);
00138 if (pexpected_dberr && *pexpected_dberr == dberr) {
00139 program_wide_logger().log(isprintf("OK: anticipated error %d (%s) arrived", dberr, dberrstr));
00140 *pexpected_dberr = 0;
00141 return INT_CANCEL;
00142 }
00143 }
00144
00145 program_wide_logger().log(isprintf("ERROR: in db-library (severity %d, dberr %d, oserr %d, dberrstr %s, oserrstr %s):",
00146 severity, dberr, oserr, dberrstr ? dberrstr : "(null)", oserrstr ? oserrstr : "(null)"));
00147
00148 _error_was_seen = true;
00149
00150
00151
00152
00153
00154
00155
00156
00157 if ((dbproc == NULL) || DBDEAD(dbproc)) {
00158 if (dberr != SYBECOFL) {
00159
00160
00161 }
00162 }
00163 return INT_CANCEL;
00164 }
00165
00166 void common_database_support::nerf_special_characters(istring &to_nerf,
00167 char escape_char)
00168 {
00169 for (int i = 0; i < to_nerf.length(); i++) {
00170 const char current = to_nerf[i];
00171 switch (current) {
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184 case '\'': {
00185
00186 to_nerf.insert(i, istring('\'', 1));
00187 i++;
00188 break;
00189 }
00190 default:
00191
00192 break;
00193 }
00194 }
00195 }
00196