CUBRID Engine  latest
cas_error.c
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 
20 /*
21  * cas_error.c -
22  */
23 
24 #ident "$Id$"
25 
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include <assert.h>
30 
31 #if defined(WINDOWS)
32 #include <winsock2.h>
33 #include <windows.h>
34 #include <io.h>
35 #include <fcntl.h>
36 #include <process.h>
37 #else
38 #include <unistd.h>
39 #include <fcntl.h>
40 #include <sys/time.h>
41 #endif
42 
43 #include "cas.h"
44 #include "cas_common.h"
45 #include "cas_execute.h"
46 #include "cas_network.h"
47 #include "cas_util.h"
48 #include "cas_schema_info.h"
49 #include "cas_log.h"
50 #include "cas_str_like.h"
51 
52 #include "broker_filename.h"
53 #include "cas_sql_log2.h"
54 
55 static bool server_aborted = false;
56 
57 void
58 err_msg_set (T_NET_BUF * net_buf, const char *file, int line)
59 {
61  {
62  cas_log_debug (ARG_FILE_LINE, "invalid internal error info : file %s line %d", file, line);
63  return;
64  }
65 
66  if (net_buf != NULL)
67  {
70  cas_log_debug (ARG_FILE_LINE, "err_msg_set: err_code %d file %s line %d", err_info.err_number, file, line);
71  }
73  {
74  return;
75  }
76 
77 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
78  if ((err_info.err_indicator == DBMS_ERROR_INDICATOR) && !is_server_alive ())
79  {
80  set_server_aborted (true);
81  }
82 #if defined(CAS_FOR_MYSQL)
83  switch (err_info.err_number)
84  {
85  case CR_COMMANDS_OUT_OF_SYNC:
93  if (as_info->reset_flag == FALSE)
94  {
95  cas_log_write_and_end (0, true, "FAILED TO EXECUTE QUERY AS INTERNAL PROBLEM. (MySQL ERR %d : %s)",
97  }
100  break;
101  case CR_SERVER_GONE_ERROR:
102  case CR_SERVER_LOST:
105  cas_log_debug (ARG_FILE_LINE, "db_err_msg_set: set reset_flag");
106  break;
107  }
108 #elif defined(CAS_FOR_ORACLE)
109  switch (err_info.err_number)
110  {
111  case 3114: /* ORA-03114: not connected to ORACLE */
112  case 3113: /* ORA-03113: end-of-file on communication channel */
113  case 1012: /* ORA-01012: not logged on */
114  case 28: /* ORA-00028: your session has been killed */
117  cas_log_debug (ARG_FILE_LINE, "db_err_msg_set: set reset_flag");
118  break;
119  }
120 #endif /* CAS_FOR_MYSQL */
121 #else /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
122 #ifndef LIBCAS_FOR_JSP
124  {
125  set_server_aborted (true);
126  }
127 #endif
128 
129  switch (err_info.err_number)
130  {
133  case ER_OBJ_NO_CONNECT:
135  /* case -581: *//* ER_DB_NO_MODIFICATIONS */
136 #ifndef LIBCAS_FOR_JSP
138  cas_log_debug (ARG_FILE_LINE, "db_err_msg_set: set reset_flag");
139 #endif
140  break;
141  }
142 #endif /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
143 }
144 
145 int
146 error_info_set (int err_number, int err_indicator, const char *file, int line)
147 {
148  return error_info_set_with_msg (err_number, err_indicator, NULL, false, file, line);
149 }
150 
151 int
152 error_info_set_force (int err_number, int err_indicator, const char *file, int line)
153 {
154  return error_info_set_with_msg (err_number, err_indicator, NULL, true, file, line);
155 }
156 
157 int
158 error_info_set_with_msg (int err_number, int err_indicator, const char *err_msg, bool force, const char *file, int line)
159 {
160  char *tmp_err_msg;
161 
162  if ((!force) && (err_info.err_indicator != ERROR_INDICATOR_UNSET))
163  {
164  cas_log_debug (ARG_FILE_LINE, "ERROR_INFO_SET reset error info : err_code %d", err_info.err_number);
165  return err_info.err_indicator;
166  }
167 
168 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
169  err_info.err_number = err_number;
170 #else /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
171  if ((err_indicator == DBMS_ERROR_INDICATOR) && (err_number == -1)) /* might be connection error */
172  {
173  assert (er_errid () != NO_ERROR);
175  }
176  else
177  {
178  err_info.err_number = err_number;
179  }
180 #endif /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
181  err_info.err_indicator = err_indicator;
182  strncpy (err_info.err_file, file, ERR_FILE_LENGTH - 1);
184  err_info.err_line = line;
185 
186  if ((err_indicator == CAS_ERROR_INDICATOR) && (err_msg == NULL))
187  return err_indicator;
188 
189 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
190  if (err_msg)
191  {
192  strncpy (err_info.err_string, err_msg, ERR_MSG_LENGTH - 1);
193  }
194 #else /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
195  if (err_msg)
196  {
197  strncpy (err_info.err_string, err_msg, ERR_MSG_LENGTH - 1);
198  }
199  else if (err_indicator == DBMS_ERROR_INDICATOR)
200  {
201  tmp_err_msg = (char *) db_error_string (1);
202  strncpy (err_info.err_string, tmp_err_msg, ERR_MSG_LENGTH - 1);
203  }
205 #endif /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
206 
207  return err_indicator;
208 }
209 
210 int
212 {
213  return (err_info.err_indicator == ERROR_INDICATOR_UNSET) ? 0 : 1;
214 }
215 
216 void
218 {
221  memset (err_info.err_string, 0x00, ERR_MSG_LENGTH);
222  memset (err_info.err_file, 0x00, ERR_FILE_LENGTH);
223  err_info.err_line = 0;
224 }
225 
226 
227 void
228 set_server_aborted (bool is_aborted)
229 {
230  server_aborted = is_aborted;
231 }
232 
233 bool
235 {
236  return server_aborted;
237 }
#define ERR_MSG_LENGTH
Definition: cas.h:42
#define NO_ERROR
Definition: error_code.h:46
#define TRUE
Definition: broker_admin.c:49
#define ERR_FILE_LENGTH
Definition: cas.h:43
void net_buf_error_msg_set(T_NET_BUF *net_buf, int err_indicator, int err_code, char *err_str, const char *file, int line)
Definition: cas_net_buf.c:277
int er_errid(void)
#define ER_OBJ_NO_CONNECT
Definition: error_code.h:295
void set_server_aborted(bool is_aborted)
Definition: cas_error.c:228
#define assert(x)
char err_file[ERR_FILE_LENGTH]
Definition: cas.h:87
const char * db_error_string(int level)
Definition: db_admin.c:2116
T_ERROR_INFO err_info
Definition: cas.c:186
#define CAS_ERROR_INDICATOR
Definition: cas.h:39
bool is_server_aborted(void)
Definition: cas_error.c:234
#define NULL
Definition: freelistheap.h:34
void cas_log_debug(const char *file_name, const int line_no, const char *fmt,...)
Definition: cas_log.c:701
int error_info_set(int err_number, int err_indicator, const char *file, int line)
Definition: cas_error.c:146
void err_msg_set(T_NET_BUF *net_buf, const char *file, int line)
Definition: cas_error.c:58
int err_number
Definition: cas.h:85
int is_error_info_set(void)
Definition: cas_error.c:211
int error_info_set_force(int err_number, int err_indicator, const char *file, int line)
Definition: cas_error.c:152
#define ARG_FILE_LINE
Definition: error_manager.h:44
#define FALSE
Definition: broker_admin.c:50
T_APPL_SERVER_INFO * as_info
Definition: cas.c:153
void cas_log_write_and_end(unsigned int seq_num, bool unit_start, const char *fmt,...)
Definition: cas_log.c:533
#define DBMS_ERROR_INDICATOR
Definition: cas.h:40
#define ER_TM_SERVER_DOWN_UNILATERALLY_ABORTED
Definition: error_code.h:171
#define ER_NET_SERVER_CRASHED
Definition: error_code.h:269
void error_info_clear(void)
Definition: cas_error.c:217
char err_string[ERR_MSG_LENGTH]
Definition: cas.h:86
int error_info_set_with_msg(int err_number, int err_indicator, const char *err_msg, bool force, const char *file, int line)
Definition: cas_error.c:158
void cas_set_db_connect_status(int status)
Definition: cas_execute.c:9699
#define ERROR_INDICATOR_UNSET
Definition: cas.h:38
int err_indicator
Definition: cas.h:84
int err_line
Definition: cas.h:88
#define DB_CONNECTION_STATUS_NOT_CONNECTED
Definition: db.h:46
#define CAS_NO_ERROR
Definition: cas.h:41
static bool server_aborted
Definition: cas_error.c:55
#define ER_BO_CONNECT_FAILED
Definition: error_code.h:821