CUBRID Engine  latest
cas.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.c -
22  */
23 
24 #ident "$Id$"
25 
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <signal.h>
29 #include <assert.h>
30 
31 #if defined(WINDOWS)
32 #include <winsock2.h>
33 #include <windows.h>
34 #include <process.h>
35 #include <sys/timeb.h>
36 #include <dbgHelp.h>
37 #else /* WINDOWS */
38 #include <unistd.h>
39 #include <netinet/in.h>
40 #include <netinet/tcp.h>
41 #include <sys/socket.h>
42 #include <sys/time.h>
43 #endif /* WINDOWS */
44 
45 #include "cas_common.h"
46 #include "cas.h"
47 #include "cas_network.h"
48 #include "cas_function.h"
49 #include "cas_net_buf.h"
50 #include "cas_log.h"
51 #include "cas_util.h"
52 #include "broker_filename.h"
53 #include "cas_execute.h"
54 
55 #if defined(CAS_FOR_ORACLE)
56 #include "cas_oracle.h"
57 #include "cas_error_log.h"
58 #elif defined(CAS_FOR_MYSQL)
59 #include "cas_mysql.h"
60 #include "cas_error_log.h"
61 #endif /* CAS_FOR_MYSQL */
62 
63 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
64 #include "connection_support.h"
65 #include "perf_monitor.h"
66 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
67 
68 #if !defined(WINDOWS)
69 #include "broker_recv_fd.h"
70 #endif /* !WINDOWS */
71 
72 #include "broker_shm.h"
73 #include "broker_util.h"
74 #include "broker_env_def.h"
75 #include "broker_process_size.h"
76 #include "cas_sql_log2.h"
77 #include "broker_acl.h"
78 #include "dbtype.h"
79 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
80 #include "environment_variable.h"
81 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
82 #include "error_manager.h"
83 #include "ddl_log.h"
84 
85 static const int DEFAULT_CHECK_INTERVAL = 1;
86 
87 #define FUNC_NEEDS_RESTORING_CON_STATUS(func_code) \
88  (((func_code) == CAS_FC_GET_DB_PARAMETER) \
89  ||((func_code) == CAS_FC_SET_DB_PARAMETER) \
90  ||((func_code) == CAS_FC_CLOSE_REQ_HANDLE) \
91  ||((func_code) == CAS_FC_GET_DB_VERSION) \
92  ||((func_code) == CAS_FC_GET_ATTR_TYPE_STR) \
93  ||((func_code) == CAS_FC_CURSOR_CLOSE) \
94  ||((func_code) == CAS_FC_END_SESSION) \
95  ||((func_code) == CAS_FC_CAS_CHANGE_MODE))
96 
98 
99 #if defined(WINDOWS)
100 LONG WINAPI CreateMiniDump (struct _EXCEPTION_POINTERS *pException);
101 #endif /* WINDOWS */
102 
103 #ifndef LIBCAS_FOR_JSP
104 static int cas_main (void);
105 static int shard_cas_main (void);
106 static void cas_sig_handler (int signo);
107 static int cas_init (void);
108 static void cas_final (void);
109 static void cas_free (bool from_sighandler);
110 static void query_cancel (int signo);
111 
112 static int cas_init_shm (void);
114 static int net_read_process (SOCKET proxy_sock_fd, MSG_HEADER * client_msg_header, T_REQ_INFO * req_info);
115 static int get_graceful_down_timeout (void);
116 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
117 static void set_db_parameter (void);
118 #endif /* !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL) */
119 
120 static int net_read_int_keep_con_auto (SOCKET clt_sock_fd, MSG_HEADER * client_msg_header, T_REQ_INFO * req_info);
121 static int net_read_header_keep_con_on (SOCKET clt_sock_fd, MSG_HEADER * client_msg_header);
122 static void set_db_connection_info (void);
123 static void clear_db_connection_info (void);
124 static bool need_database_reconnect (void);
125 
126 extern bool ssl_client;
127 extern int cas_init_ssl (int);
128 extern void cas_ssl_close (int client_sock_fd);
129 
130 #else /* !LIBCAS_FOR_JSP */
131 extern int libcas_main (SOCKET jsp_sock_fd);
132 extern void *libcas_get_db_result_set (int h_id);
133 extern void libcas_srv_handle_free (int h_id);
134 #endif /* !LIBCAS_FOR_JSP */
135 
136 static void set_cas_info_size (void);
137 
141 static int query_sequence_num = 0;
142 
145 
146 #ifndef LIBCAS_FOR_JSP
147 const char *program_name;
150 
154 int shm_proxy_id = -1;
156 
157 struct timeval tran_start_time;
158 struct timeval query_start_time;
159 int tran_timeout = 0;
163 
164 bool autocommit_deferred = false;
165 #endif /* !LIBCAS_FOR_JSP */
166 
170 
171 #ifndef LIBCAS_FOR_JSP
175 #endif /* !LIBCAS_FOR_JSP */
179 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
181 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
185 
187 
188 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
189 static T_SERVER_FUNC server_fn_table[] = {
190  fn_end_tran, /* CAS_FC_END_TRAN */
191  fn_prepare, /* CAS_FC_PREPARE */
192  fn_execute, /* CAS_FC_EXECUTE */
193  fn_not_supported, /* CAS_FC_GET_DB_PARAMETER */
194  fn_not_supported, /* CAS_FC_SET_DB_PARAMETER */
195  fn_close_req_handle, /* CAS_FC_CLOSE_REQ_HANDLE */
196  fn_not_supported, /* CAS_FC_CURSOR */
197  fn_fetch, /* CAS_FC_FETCH */
198  fn_not_supported, /* CAS_FC_SCHEMA_INFO */
199  fn_not_supported, /* CAS_FC_OID_GET */
200  fn_not_supported, /* CAS_FC_OID_SET */
201  fn_not_supported, /* CAS_FC_DEPRECATED1 */
202  fn_not_supported, /* CAS_FC_DEPRECATED2 */
203  fn_not_supported, /* CAS_FC_DEPRECATED3 */
204  fn_get_db_version, /* CAS_FC_GET_DB_VERSION */
205  fn_not_supported, /* CAS_FC_GET_CLASS_NUM_OBJS */
206  fn_not_supported, /* CAS_FC_OID_CMD */
207  fn_not_supported, /* CAS_FC_COLLECTION */
208  fn_not_supported, /* CAS_FC_NEXT_RESULT */
209  fn_not_supported, /* CAS_FC_EXECUTE_BATCH */
210  fn_execute_array, /* CAS_FC_EXECUTE_ARRAY */
211  fn_not_supported, /* CAS_FC_CURSOR_UPDATE */
212  fn_not_supported, /* CAS_FC_GET_ATTR_TYPE_STR */
213  fn_not_supported, /* CAS_FC_GET_QUERY_INFO */
214  fn_not_supported, /* CAS_FC_DEPRECATED4 */
215  fn_not_supported, /* CAS_FC_SAVEPOINT */
216  fn_not_supported, /* CAS_FC_PARAMETER_INFO */
217  fn_not_supported, /* CAS_FC_XA_PREPARE */
218  fn_not_supported, /* CAS_FC_XA_RECOVER */
219  fn_not_supported, /* CAS_FC_XA_END_TRAN */
220  fn_con_close, /* CAS_FC_CON_CLOSE */
221  fn_check_cas, /* CAS_FC_CHECK_CAS */
222  fn_make_out_rs, /* CAS_FC_MAKE_OUT_RS */
223  fn_not_supported, /* CAS_FC_GET_GENERATED_KEYS */
224  fn_not_supported, /* CAS_FC_LOB_NEW */
225  fn_not_supported, /* CAS_FC_LOB_WRITE */
226  fn_not_supported, /* CAS_FC_LOB_READ */
227  fn_not_supported, /* CAS_FC_END_SESSION */
228  fn_not_supported, /* CAS_FC_GET_ROW_COUNT */
229  fn_not_supported, /* CAS_FC_GET_LAST_INSERT_ID */
230  fn_not_supported, /* CAS_FC_PREPARE_AND_EXECUTE */
231  fn_not_supported, /* CAS_FC_CURSOR_CLOSE */
232  fn_not_supported, /* CAS_FC_GET_SHARD_INFO */
233  fn_not_supported /* CAS_FC_SET_CAS_CHANGE_MODE */
234 };
235 #else /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
237  fn_end_tran, /* CAS_FC_END_TRAN */
238  fn_prepare, /* CAS_FC_PREPARE */
239  fn_execute, /* CAS_FC_EXECUTE */
240  fn_get_db_parameter, /* CAS_FC_GET_DB_PARAMETER */
241  fn_set_db_parameter, /* CAS_FC_SET_DB_PARAMETER */
242  fn_close_req_handle, /* CAS_FC_CLOSE_REQ_HANDLE */
243  fn_cursor, /* CAS_FC_CURSOR */
244  fn_fetch, /* CAS_FC_FETCH */
245  fn_schema_info, /* CAS_FC_SCHEMA_INFO */
246  fn_oid_get, /* CAS_FC_OID_GET */
247  fn_oid_put, /* CAS_FC_OID_SET */
248  fn_deprecated, /* CAS_FC_DEPRECATED1 *//* fn_glo_new */
249  fn_deprecated, /* CAS_FC_DEPRECATED2 *//* fn_glo_save */
250  fn_deprecated, /* CAS_FC_DEPRECATED3 *//* fn_glo_load */
251  fn_get_db_version, /* CAS_FC_GET_DB_VERSION */
252  fn_get_class_num_objs, /* CAS_FC_GET_CLASS_NUM_OBJS */
253  fn_oid, /* CAS_FC_OID_CMD */
254  fn_collection, /* CAS_FC_COLLECTION */
255  fn_next_result, /* CAS_FC_NEXT_RESULT */
256  fn_execute_batch, /* CAS_FC_EXECUTE_BATCH */
257  fn_execute_array, /* CAS_FC_EXECUTE_ARRAY */
258  fn_cursor_update, /* CAS_FC_CURSOR_UPDATE */
259  fn_get_attr_type_str, /* CAS_FC_GET_ATTR_TYPE_STR */
260  fn_get_query_info, /* CAS_FC_GET_QUERY_INFO */
261  fn_deprecated, /* CAS_FC_DEPRECATED4 *//* fn_glo_cmd */
262  fn_savepoint, /* CAS_FC_SAVEPOINT */
263  fn_parameter_info, /* CAS_FC_PARAMETER_INFO */
264  fn_xa_prepare, /* CAS_FC_XA_PREPARE */
265  fn_xa_recover, /* CAS_FC_XA_RECOVER */
266  fn_xa_end_tran, /* CAS_FC_XA_END_TRAN */
267  fn_con_close, /* CAS_FC_CON_CLOSE */
268  fn_check_cas, /* CAS_FC_CHECK_CAS */
269  fn_make_out_rs, /* CAS_FC_MAKE_OUT_RS */
270  fn_get_generated_keys, /* CAS_FC_GET_GENERATED_KEYS */
271  fn_lob_new, /* CAS_FC_LOB_NEW */
272  fn_lob_write, /* CAS_FC_LOB_WRITE */
273  fn_lob_read, /* CAS_FC_LOB_READ */
274  fn_end_session, /* CAS_FC_END_SESSION */
275  fn_get_row_count, /* CAS_FC_GET_ROW_COUNT */
276  fn_get_last_insert_id, /* CAS_FC_GET_LAST_INSERT_ID */
277  fn_prepare_and_execute, /* CAS_FC_PREPARE_AND_EXECUTE */
278  fn_cursor_close, /* CAS_FC_CURSOR_CLOSE */
279  fn_not_supported, /* CAS_FC_GET_SHARD_INFO */
280  fn_set_cas_change_mode /* CAS_FC_SET_CAS_CHANGE_MODE */
281 };
282 #endif /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
283 
284 #ifndef LIBCAS_FOR_JSP
285 static const char *server_func_name[] = {
286  "end_tran",
287  "prepare",
288  "execute",
289  "get_db_parameter",
290  "set_db_parameter",
291  "close_req_handle",
292  "cursor",
293  "fetch",
294  "schema_info",
295  "oid_get",
296  "oid_put",
297  "glo_new(deprecated)",
298  "glo_save(deprecated)",
299  "glo_load(deprecated)",
300  "get_db_version",
301  "get_class_num_objs",
302  "oid",
303  "collection",
304  "next_result",
305  "execute_batch",
306  "execute_array",
307  "cursor_update",
308  "get_attr_type_str",
309  "get_query_info",
310  "glo_cmd(deprecated)",
311  "savepoint",
312  "parameter_info",
313  "xa_prepare",
314  "xa_recover",
315  "xa_end_tran",
316  "con_close",
317  "check_cas",
318  "fn_make_out_rs",
319  "fn_get_generated_keys",
320  "fn_lob_new",
321  "fn_lob_write",
322  "fn_lob_read",
323  "fn_end_session",
324  "fn_get_row_count",
325  "fn_get_last_insert_id",
326  "fn_prepare_and_execute",
327  "fn_cursor_close",
328  "fn_get_shard_info",
329  "fn_set_cas_change_mode"
330 };
331 #endif /* !LIBCAS_FOR_JSP */
332 
334 #ifndef LIBCAS_FOR_JSP
336 static int cas_req_count = 0;
337 #endif /* !LIBCAS_FOR_JSP */
338 
339 #ifndef LIBCAS_FOR_JSP
340 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
341 static void
343 {
344  size_t size = 0;
345  SESSION_ID session;
346 
347 
348  memcpy (out + size, db_get_server_session_key (), SERVER_SESSION_KEY_SIZE);
349  size += SERVER_SESSION_KEY_SIZE;
350  session = db_get_session_id ();
351  session = htonl (session);
352  memcpy (out + size, &session, sizeof (SESSION_ID));
353  size += sizeof (SESSION_ID);
354  memset (out + size, 0, DRIVER_SESSION_SIZE - size);
355 }
356 
357 static void
358 cas_set_session_id (T_CAS_PROTOCOL protocol, char *session)
359 {
361 
363  {
364  id = *(SESSION_ID *) (session + 8);
365  id = ntohl (id);
366  db_set_server_session_key (session);
367  db_set_session_id (id);
368  cas_log_write_and_end (0, false, "session id for connection %u", id);
369  }
370  else
371  {
372  /* always create new session for old drivers */
373  char key[] =
374  { (char) 0xFF, (char) 0xFF, (char) 0xFF, (char) 0xFF, (char) 0xFF, (char) 0xFF, (char) 0xFF, (char) 0xFF };
375 
376  cas_log_write_and_end (0, false, "session id (old protocol) for connection 0");
379  }
380 }
381 #endif
382 
383 static void
384 cas_send_connect_reply_to_driver (T_CAS_PROTOCOL protocol, SOCKET client_sock_fd, char *cas_info)
385 {
386  char msgbuf[CAS_CONNECTION_REPLY_SIZE + 8];
387  char *p = msgbuf;
388  char sessid[DRIVER_SESSION_SIZE];
389  int v;
390 
391 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
393 #else
394  memset (sessid, 0, DRIVER_SESSION_SIZE);
395 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
396 
398  {
400  }
402  {
404  }
405  else
406  {
408  }
409  memcpy (p, &v, sizeof (int));
410  p += sizeof (int);
411  if (cas_info_size > 0)
412  {
413  memcpy (p, cas_info, cas_info_size);
414  p += cas_info_size;
415  }
416  v = htonl (getpid ());
417  memcpy (p, &v, CAS_PID_SIZE);
418  p += CAS_PID_SIZE;
420  p += BROKER_INFO_SIZE;
422  {
423  v = htonl (shm_as_index + 1);
424  memcpy (p, &v, CAS_PID_SIZE);
425  p += CAS_PID_SIZE;
426  }
428  {
429  memcpy (p, sessid, DRIVER_SESSION_SIZE);
430  p += DRIVER_SESSION_SIZE;
431  }
432  else
433  {
434 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
435  v = htonl (db_get_session_id ());
436 #else
437  v = 0;
438 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
439  memcpy (p, &v, SESSION_ID_SIZE);
440  p += SESSION_ID_SIZE;
441  }
442  net_write_stream (client_sock_fd, msgbuf, p - msgbuf);
443 }
444 
445 #if defined(WINDOWS)
446 int WINAPI
447 WinMain (HINSTANCE hInstance, // handle to current instance
448  HINSTANCE hPrevInstance, // handle to previous instance
449  LPSTR lpCmdLine, // pointer to command line
450  int nShowCmd // show state of window
451  )
452 #else /* WINDOWS */
453 int
454 main (int argc, char *argv[])
455 #endif
456 {
457  int res = 0;
458 
459 #if !defined(WINDOWS)
460  signal (SIGTERM, cas_sig_handler);
461  signal (SIGINT, cas_sig_handler);
462  signal (SIGUSR1, SIG_IGN);
463  signal (SIGPIPE, SIG_IGN);
464  signal (SIGXFSZ, SIG_IGN);
465 #endif /* WINDOWS */
466 
467  if (cas_init () < 0)
468  return -1;
469 
470 #if !defined(WINDOWS)
471  program_name = argv[0];
472  if (argc == 2 && strcmp (argv[1], "--version") == 0)
473  {
474  printf ("%s\n", makestring (BUILD_NUMBER));
475  return 0;
476  }
477 #else /* !WINDOWS */
478 #if defined(CAS_FOR_ORACLE)
480 #elif defined(CAS_FOR_MYSQL)
482 #else /* CAS_FOR_MYSQL */
484 #endif /* CAS_FOR_MYSQL */
485 #endif /* !WINDOWS */
486 
487  memset (&req_info, 0, sizeof (req_info));
488 
489  set_cubrid_home ();
490 
491  if (cas_shard_flag == ON)
492  {
493  res = shard_cas_main ();
494  }
495  else
496  {
497  res = cas_main ();
498  }
499 
500  return res;
501 }
502 
503 static int
505 {
506  T_NET_BUF net_buf;
508  int err_code;
509  int one = 1;
510  FN_RETURN fn_ret = FN_KEEP_CONN;
511 
512  struct timeval cas_start_time;
513 
514  int error;
515 
516  bool is_first = true;
517 
519 
520  net_buf_init (&net_buf, cas_get_client_version ());
521  net_buf.data = (char *) MALLOC (SHARD_NET_BUF_ALLOC_SIZE);
522  if (net_buf.data == NULL)
523  {
524  return -1;
525  }
527 
528  as_info->service_ready_flag = TRUE;
529  as_info->con_status = CON_STATUS_IN_TRAN;
530  as_info->cur_keep_con = KEEP_CON_DEFAULT;
532 #if !defined(WINDOWS)
533  psize_at_start = as_info->psize = getsize (getpid ());
534 #endif /* !WINDOWS */
535 
537 
538 conn_retry:
539  if (is_first == false)
540  {
541  do
542  {
543  SLEEP_SEC (1);
544  }
545  while (as_info->uts_status == UTS_STATUS_RESTART || as_info->uts_status == UTS_STATUS_STOP);
546  }
547  is_first = false;
548 
549  net_timeout_set (-1);
550 
553  cas_log_write_and_end (0, true, "CAS STARTED pid %d", getpid ());
554 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
556 #endif
557 
558  /* This is a only use in proxy-cas internal message */
560 
562 
563  gettimeofday (&cas_start_time, NULL);
564 
565  int ret;
566 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
567  ret = snprintf (cas_db_name, MAX_HA_DBINFO_LENGTH - 1, "%s", shm_appl->shard_conn_info[shm_shard_id].db_name);
568 #else
569  ret = snprintf (cas_db_name, MAX_HA_DBINFO_LENGTH - 1, "%s@%s", shm_appl->shard_conn_info[shm_shard_id].db_name,
571 #endif /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
572 
573  if (ret < 0)
574  {
575  assert (false);
576  FREE (net_buf.data);
577  return -1;
578  }
579 
581 
582  if (as_info->reset_flag == TRUE)
583  {
584  cas_log_debug (ARG_FILE_LINE, "main: set reset_flag");
585  cas_set_db_connect_status (-1); /* DB_CONNECTION_STATUS_RESET */
586  as_info->reset_flag = FALSE;
587  }
588 
589 #if defined(WINDOWS)
590  __try
591  {
592 #endif /* WINDOWS */
593 
594  if (cas_db_user[0] != '\0')
595  {
597  if (err_code < 0)
598  {
600  SLEEP_SEC (1);
601  goto finish_cas;
602  }
603 
604 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
606 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
607 
608  cas_log_write_and_end (0, false, "connect db %s user %s", cas_db_name, cas_db_user);
609  }
610 
611  as_info->uts_status = UTS_STATUS_IDLE;
612 
613  conn_proxy_retry:
615 
616 #if defined(WINDOWS)
617  proxy_sock_fd = net_connect_proxy (shm_proxy_id);
618 #else /* WINDOWS */
619  proxy_sock_fd = net_connect_proxy ();
620 #endif /* !WINDOWS */
621 
622  if (IS_INVALID_SOCKET (proxy_sock_fd))
623  {
624  SLEEP_SEC (1);
625  goto conn_proxy_retry;
626  }
627 
628  net_timeout_set (-1);
629 
630  setsockopt (proxy_sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *) &one, sizeof (one));
631 
632  error = cas_register_to_proxy (proxy_sock_fd);
633  if (error)
634  {
635  CLOSE_SOCKET (proxy_sock_fd);
636  SLEEP_SEC (1);
637  goto conn_proxy_retry;
638  }
639 
640 #if defined(WINDOWS)
641  as_info->uts_status = UTS_STATUS_BUSY;
642 #endif /* WINDOWS */
644 
646 
647  as_info->cur_sql_log2 = shm_appl->sql_log2;
649  setsockopt (proxy_sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *) &one, sizeof (one));
650 
651  if (IS_INVALID_SOCKET (proxy_sock_fd))
652  {
653  goto conn_proxy_retry;
654  }
655 
656  as_info->auto_commit_mode = FALSE;
657  cas_log_write_and_end (0, false, "DEFAULT isolation_level %d, " "lock_timeout %d", cas_default_isolation_level,
659 
660  if (shm_appl->statement_pooling)
661  {
662  as_info->cur_statement_pooling = ON;
663  }
664  else
665  {
666  as_info->cur_statement_pooling = OFF;
667  }
668 /* TODO : SHARD, assume KEEP_CON_ON*/
669  as_info->cur_keep_con = KEEP_CON_ON;
670 
671  as_info->cci_default_autocommit = shm_appl->cci_default_autocommit;
672  req_info.need_rollback = TRUE;
673 
674  gettimeofday (&tran_start_time, NULL);
675  gettimeofday (&query_start_time, NULL);
676  tran_timeout = 0;
677  query_timeout = 0;
678 
679  for (;;)
680  {
681 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
683 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
684  fn_ret = FN_KEEP_CONN;
685  as_info->con_status = CON_STATUS_OUT_TRAN;
686 
687  while (fn_ret == FN_KEEP_CONN)
688  {
689 #if !defined(WINDOWS)
690  signal (SIGUSR1, query_cancel);
691 #endif /* !WINDOWS */
692 
693  fn_ret = process_request (proxy_sock_fd, &net_buf, &req_info);
694 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
696 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
697 #if !defined(WINDOWS)
698  signal (SIGUSR1, SIG_IGN);
699 #endif /* !WINDOWS */
700  as_info->last_access_time = time (NULL);
701 
702  if (as_info->con_status == CON_STATUS_OUT_TRAN
704  {
705  fn_ret = FN_CLOSE_CONN;
706  }
707  }
708  /* This is a only use in proxy-cas internal message */
710 
712 
713  if (as_info->cur_statement_pooling)
714  {
715  hm_srv_handle_free_all (true);
716  }
717 
718  if (!is_xa_prepared ())
719  {
720  ux_end_tran (CCI_TRAN_ROLLBACK, false);
721  }
722 
723 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
724  if (fn_ret != FN_KEEP_SESS)
725  {
726  ux_end_session ();
727  }
728 #endif
729 
730  if (as_info->reset_flag == TRUE || is_xa_prepared ())
731  {
733  as_info->reset_flag = FALSE;
734  cas_set_db_connect_status (-1); /* DB_CONNECTION_STATUS_RESET */
735  }
736 
737 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
739 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
740  finish_cas:
741 #if defined(WINDOWS)
742  as_info->close_flag = 1;
743 #endif /* WINDOWS */
744 
745  cas_log_write_and_end (0, true, "disconnect");
747  cas_log_write_and_end (0, false, "STATE idle");
748  cas_log_close (true);
750  sql_log2_end (true);
751 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
752  cas_error_log_close (true);
753 #endif
754 
755  cas_req_count++;
756  CLOSE_SOCKET (proxy_sock_fd);
757 
758  if (restart_is_needed ())
759  {
760  cas_final ();
761  return 0;
762  }
763  else if (fn_ret == FN_GRACEFUL_DOWN)
764  {
765  as_info->uts_status = UTS_STATUS_STOP;
766  }
767  else
768  {
769  as_info->uts_status = UTS_STATUS_CON_WAIT;
770  }
771 
772  goto conn_retry;
773  }
774 #if defined(WINDOWS)
775  }
776  __except (CreateMiniDump (GetExceptionInformation ()))
777  {
778  }
779 #endif /* WINDOWS */
780 
781  return 0;
782 }
783 
784 static int
785 cas_main (void)
786 {
787  T_NET_BUF net_buf;
788  SOCKET br_sock_fd, client_sock_fd;
789  char read_buf[1024];
790  int err_code;
791  char *db_name, *db_user, *db_passwd, *db_sessionid;
792 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
793  SESSION_ID session_id = DB_EMPTY_SESSION;
794 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
795  int one = 1, db_info_size;
796 #if defined(WINDOWS)
797  int new_port;
798 #else
799  int con_status;
800  char port_name[BROKER_PATH_MAX];
801  char do_not_use_driver_info[SRV_CON_CLIENT_INFO_SIZE];
802 #endif /* WINDOWS */
803  int client_ip_addr;
804  char cas_info[CAS_INFO_SIZE] = { CAS_INFO_STATUS_INACTIVE,
807  CAS_INFO_RESERVED_DEFAULT
808  };
809  FN_RETURN fn_ret = FN_KEEP_CONN;
810  char client_ip_str[16];
811  bool is_new_connection;
812 
814 
815 #if defined(CAS_FOR_ORACLE)
817 #elif defined(CAS_FOR_MYSQL)
819 #endif /* CAS_FOR_MYSQL */
820 
821 #if defined(WINDOWS)
822  if (shm_appl->as_port > 0)
823  {
824  new_port = shm_appl->as_port + shm_as_index;
825  }
826  else
827  {
828  new_port = 0;
829  }
830  srv_sock_fd = net_init_env (&new_port);
831 #else /* WINDOWS */
833 
834  srv_sock_fd = net_init_env (port_name);
835 #endif /* WINDOWS */
837  {
838  return -1;
839  }
840 
841  net_buf_init (&net_buf, cas_get_client_version ());
842  net_buf.data = (char *) MALLOC (NET_BUF_ALLOC_SIZE);
843  if (net_buf.data == NULL)
844  {
845  return -1;
846  }
847  net_buf.alloc_size = NET_BUF_ALLOC_SIZE;
848 
851  cas_log_write_and_end (0, true, "CAS STARTED pid %d", getpid ());
852 
853 #if defined(WINDOWS)
854  as_info->as_port = new_port;
855 #endif /* WINDOWS */
856 
858 
859  as_info->service_ready_flag = TRUE;
860  as_info->fn_status = FN_STATUS_CONN;
861  as_info->con_status = CON_STATUS_IN_TRAN;
862  as_info->transaction_start_time = time (0);
863  as_info->cur_keep_con = KEEP_CON_DEFAULT;
864  query_cancel_flag = 0;
866 #if !defined(WINDOWS)
867  psize_at_start = as_info->psize = getsize (getpid ());
868 #endif /* !WINDOWS */
869  if (shm_appl->appl_server_max_size > shm_appl->appl_server_hard_limit)
870  {
871  cas_log_write_and_end (0, true,
872  "CONFIGURATION WARNING - the APPL_SERVER_MAX_SIZE(%dM) is greater than the APPL_SERVER_MAX_SIZE_HARD_LIMIT(%dM)",
873  shm_appl->appl_server_max_size / ONE_K, shm_appl->appl_server_hard_limit / ONE_K);
874  }
875 
877 
878  // init error manager with default arguments; should be reinitialized later
880 
881  logddl_init ();
882 
883 #if defined(WINDOWS)
884  __try
885  {
886 #endif /* WINDOWS */
887  for (;;)
888  {
889  ssl_client = false;
890  error_info_clear ();
892 
894  br_sock_fd = net_connect_client (srv_sock_fd);
895 
896  if (IS_INVALID_SOCKET (br_sock_fd))
897  {
898  goto finish_cas;
899  }
900 
901  req_info.client_version = as_info->clt_version;
902  memcpy (req_info.driver_info, as_info->driver_info, SRV_CON_CLIENT_INFO_SIZE);
903 
905 
906 #if defined(WINDOWS)
907  as_info->uts_status = UTS_STATUS_BUSY;
908 #endif /* WINDOWS */
909  as_info->fn_status = FN_STATUS_BUSY;
910  as_info->con_status = CON_STATUS_IN_TRAN;
911  as_info->transaction_start_time = time (0);
913 
914  client_ip_addr = 0;
915 
916 #if defined(WINDOWS)
917  client_sock_fd = br_sock_fd;
918  if (ioctlsocket (client_sock_fd, FIONBIO, (u_long *) (&one)) < 0)
919  {
920  goto finish_cas;
921  }
922  memcpy (&client_ip_addr, as_info->cas_clt_ip, 4);
923 #else /* WINDOWS */
925 
926  if (net_read_int (br_sock_fd, &con_status) < 0)
927  {
928  cas_log_write_and_end (0, false, "HANDSHAKE ERROR net_read_int(con_status)");
929  CLOSE_SOCKET (br_sock_fd);
930  goto finish_cas;
931  }
932  if (net_write_int (br_sock_fd, as_info->con_status) < 0)
933  {
934  cas_log_write_and_end (0, false, "HANDSHAKE ERROR net_write_int(con_status)");
935  CLOSE_SOCKET (br_sock_fd);
936  goto finish_cas;
937  }
938 
939  client_sock_fd = recv_fd (br_sock_fd, &client_ip_addr, do_not_use_driver_info);
940  if (client_sock_fd == -1)
941  {
942  cas_log_write_and_end (0, false, "HANDSHAKE ERROR recv_fd %d", client_sock_fd);
943  CLOSE_SOCKET (br_sock_fd);
944  goto finish_cas;
945  }
946  if (net_write_int (br_sock_fd, as_info->uts_status) < 0)
947  {
948  cas_log_write_and_end (0, false, "HANDSHAKE ERROR net_write_int(uts_status)");
949  CLOSE_SOCKET (br_sock_fd);
950  CLOSE_SOCKET (client_sock_fd);
951  goto finish_cas;
952  }
953 
954  CLOSE_SOCKET (br_sock_fd);
955 #endif /* WINDOWS */
957 
959 
962  as_info->cur_sql_log2 = shm_appl->sql_log2;
964 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
966 #else
967  if (as_info->cas_err_log_reset == CAS_LOG_RESET_REOPEN)
968  {
970 
972 
973  // reload error manager; call er_final first to make sure even sticky error manager is reloaded
976  as_info->cas_err_log_reset = 0;
977  }
978 #endif
979 
980  ut_get_ipv4_string (client_ip_str, sizeof (client_ip_str), (unsigned char *) (&client_ip_addr));
981  cas_log_write_and_end (0, false, "CLIENT IP %s", client_ip_str);
982  setsockopt (client_sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *) &one, sizeof (one));
983  ut_set_keepalive (client_sock_fd);
984 
986 
987  if (IS_INVALID_SOCKET (client_sock_fd))
988  {
989  goto finish_cas;
990  }
991 #if !defined(WINDOWS)
992  else
993  {
994  /* send NO_ERROR to client */
995  if (net_write_int (client_sock_fd, 0) < 0)
996  {
997  CLOSE_SOCKET (client_sock_fd);
998  goto finish_cas;
999  }
1000  }
1001 #endif
1002  req_info.client_version = as_info->clt_version;
1003  memcpy (req_info.driver_info, as_info->driver_info, SRV_CON_CLIENT_INFO_SIZE);
1004  cas_client_type = as_info->cas_client_type;
1005 
1006  if (req_info.client_version < CAS_MAKE_VER (8, 2, 0))
1007  {
1008  db_info_size = SRV_CON_DB_INFO_SIZE_PRIOR_8_2_0;
1009  }
1010  else if (req_info.client_version < CAS_MAKE_VER (8, 4, 0))
1011  {
1012  db_info_size = SRV_CON_DB_INFO_SIZE_PRIOR_8_4_0;
1013  }
1014  else
1015  {
1016  db_info_size = SRV_CON_DB_INFO_SIZE;
1017  }
1018 
1019  if (IS_SSL_CLIENT (req_info.driver_info))
1020  {
1021  err_code = cas_init_ssl (client_sock_fd);
1022  if (err_code < 0)
1023  {
1024  net_write_error (client_sock_fd, req_info.client_version, req_info.driver_info, cas_info, cas_info_size,
1026  goto finish_cas;
1027  }
1028  }
1029 
1030  if (net_read_stream (client_sock_fd, read_buf, db_info_size) < 0)
1031  {
1033  net_write_error (client_sock_fd, req_info.client_version, req_info.driver_info, cas_info, cas_info_size,
1035  }
1036  else
1037  {
1038  int len;
1039  unsigned char *ip_addr;
1040  char *db_err_msg = NULL, *url = NULL;
1041  struct timeval cas_start_time;
1042 
1043  gettimeofday (&cas_start_time, NULL);
1044 
1045  db_name = read_buf;
1046  db_name[SRV_CON_DBNAME_SIZE - 1] = '\0';
1047 
1048  /* Send response to broker health checker */
1049  if (strcmp (db_name, HEALTH_CHECK_DUMMY_DB) == 0)
1050  {
1051  cas_log_write_and_end (0, false, "Incoming health check request from client.");
1052 
1053  net_write_int (client_sock_fd, 0);
1055  net_write_stream (client_sock_fd, cas_info, cas_info_size);
1056  CLOSE_SOCKET (client_sock_fd);
1057 
1058  goto finish_cas;
1059  }
1060 
1061  db_user = db_name + SRV_CON_DBNAME_SIZE;
1062  db_user[SRV_CON_DBUSER_SIZE - 1] = '\0';
1063  if (db_user[0] == '\0')
1064  {
1065  strcpy (db_user, "PUBLIC");
1066  }
1067 
1068  db_passwd = db_user + SRV_CON_DBUSER_SIZE;
1069  db_passwd[SRV_CON_DBPASSWD_SIZE - 1] = '\0';
1070 
1071  if (req_info.client_version >= CAS_MAKE_VER (8, 2, 0))
1072  {
1073  url = db_passwd + SRV_CON_DBPASSWD_SIZE;
1074  url[SRV_CON_URL_SIZE - 1] = '\0';
1075  }
1076 
1077  if (req_info.client_version >= CAS_MAKE_VER (8, 4, 0))
1078  {
1079  assert (url != NULL);
1080 
1081  db_sessionid = url + SRV_CON_URL_SIZE;
1082  db_sessionid[SRV_CON_DBSESS_ID_SIZE - 1] = '\0';
1083  }
1084  else
1085  {
1086  /* even drivers do not send session id (under RB-8.4.0) the cas_set_session_id() should be called */
1087  db_sessionid = NULL;
1088  }
1089  as_info->driver_version[0] = '\0';
1091  {
1092  assert (url != NULL);
1093 
1094  len = *(url + strlen (url) + 1);
1095  if (len > 0 && len < SRV_CON_VER_STR_MAX_SIZE)
1096  {
1097  memcpy (as_info->driver_version, url + strlen (url) + 2, (int) len);
1098  as_info->driver_version[len] = '\0';
1099  }
1100  else
1101  {
1102  snprintf (as_info->driver_version, SRV_CON_VER_STR_MAX_SIZE, "PROTOCOL V%d",
1103  (int) (CAS_PROTO_VER_MASK & req_info.client_version));
1104  }
1105  }
1107  {
1108  char *ver;
1109 
1110  CAS_PROTO_TO_VER_STR (&ver, (int) (CAS_PROTO_VER_MASK & req_info.client_version));
1111 
1112  strncpy_bufsize (as_info->driver_version, ver);
1113  }
1114  else
1115  {
1116  snprintf (as_info->driver_version, SRV_CON_VER_STR_MAX_SIZE, "%d.%d.%d",
1118  CAS_VER_TO_PATCH (req_info.client_version));
1119  }
1120  cas_log_write_and_end (0, false, "CLIENT VERSION %s", as_info->driver_version);
1121 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1122  /* todo: casting T_BROKER_VERSION to T_CAS_PROTOCOL */
1123  cas_set_session_id ((T_CAS_PROTOCOL) req_info.client_version, db_sessionid);
1125  {
1126  is_new_connection = false;
1127  }
1128  else
1129  {
1130  is_new_connection = true;
1131  }
1132 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
1133 
1135 
1136  cas_log_debug (ARG_FILE_LINE, "db_name %s db_user %s url %s " "session id %s", db_name, db_user, url,
1137  db_sessionid);
1138  if (as_info->reset_flag == TRUE)
1139  {
1140  cas_log_debug (ARG_FILE_LINE, "main: set reset_flag");
1141  cas_set_db_connect_status (-1); /* DB_CONNECTION_STATUS_RESET */
1142  as_info->reset_flag = FALSE;
1143  }
1144 
1146 
1147  ip_addr = (unsigned char *) (&client_ip_addr);
1148 
1149  if (shm_appl->access_control)
1150  {
1151  if (access_control_check_right (shm_appl, db_name, db_user, ip_addr) < 0)
1152  {
1153  char err_msg[1024];
1154 
1155  as_info->num_connect_rejected++;
1156 
1157  sprintf (err_msg, "Authorization error.(Address is rejected)");
1158 
1160  net_write_error (client_sock_fd, req_info.client_version, req_info.driver_info, cas_info,
1162 
1164 
1165  cas_log_write_and_end (0, false, "connect db %s user %s url %s - rejected", db_name, db_user, url);
1166 
1167  if (shm_appl->access_log == ON)
1168  {
1169  cas_access_log (&cas_start_time, shm_as_index, client_ip_addr, db_name, db_user, ACL_REJECTED);
1170  }
1171 
1173 
1174  CLOSE_SOCKET (client_sock_fd);
1175 
1176  goto finish_cas;
1177  }
1178  }
1179 
1180  err_code = ux_database_connect (db_name, db_user, db_passwd, &db_err_msg);
1181 
1182  if (err_code < 0)
1183  {
1184  char msg_buf[LINE_MAX];
1185 
1187  net_write_error (client_sock_fd, req_info.client_version, req_info.driver_info, cas_info, cas_info_size,
1188  err_info.err_indicator, err_info.err_number, db_err_msg);
1189 
1190  if (db_err_msg == NULL)
1191  {
1192  snprintf (msg_buf, LINE_MAX, "connect db %s user %s url %s, error:%d.", db_name, db_user, url,
1193  err_info.err_number);
1194  }
1195  else
1196  {
1197  snprintf (msg_buf, LINE_MAX, "connect db %s user %s url %s, error:%d, %s", db_name, db_user, url,
1198  err_info.err_number, db_err_msg);
1199  }
1200 
1201  cas_log_write_and_end (0, false, msg_buf);
1202  cas_slow_log_write_and_end (NULL, 0, msg_buf);
1203 
1204  if (ssl_client)
1205  {
1206  cas_ssl_close (client_sock_fd);
1207  }
1208 
1209  CLOSE_SOCKET (client_sock_fd);
1210  FREE_MEM (db_err_msg);
1211 
1212  goto finish_cas;
1213  }
1214 
1215  FREE_MEM (db_err_msg);
1216 
1219  logddl_set_br_name (shm_appl->broker_name);
1221  logddl_set_db_name (db_name);
1222  logddl_set_user_name (db_user);
1223  logddl_set_ip (client_ip_str);
1224  logddl_set_pid (getpid ());
1225 
1227 
1228 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1229  session_id = db_get_session_id ();
1230  as_info->session_id = session_id;
1231 
1232  if (shm_appl->access_log == ON)
1233  {
1234  ACCESS_LOG_TYPE type = (is_new_connection) ? NEW_CONNECTION : CLIENT_CHANGED;
1235 
1236  cas_access_log (&cas_start_time, shm_as_index, client_ip_addr, db_name, db_user, type);
1237  }
1238 
1239  cas_log_write_and_end (0, false, "connect db %s@%s user %s url %s" " session id %u", as_info->database_name,
1240  as_info->database_host, db_user, url, session_id);
1241 #else
1242  cas_log_write_and_end (0, false, "connect db %s user %s url %s", db_name, db_user, url);
1243 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
1244 
1245 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1247 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
1248 
1249  as_info->auto_commit_mode = FALSE;
1250  cas_log_write_and_end (0, false, "DEFAULT isolation_level %d, " "lock_timeout %d",
1252 
1253  as_info->cur_keep_con = shm_appl->keep_connection;
1255  if (shm_appl->statement_pooling)
1256  {
1257  as_info->cur_statement_pooling = ON;
1258  }
1259  else
1260  {
1261  as_info->cur_statement_pooling = OFF;
1262  }
1264 
1266  /* todo: casting T_BROKER_VERSION to T_CAS_PROTOCOL */
1267  cas_send_connect_reply_to_driver ((T_CAS_PROTOCOL) req_info.client_version, client_sock_fd, cas_info);
1268 
1269  as_info->cci_default_autocommit = shm_appl->cci_default_autocommit;
1270  req_info.need_rollback = TRUE;
1271 
1272  gettimeofday (&tran_start_time, NULL);
1274  gettimeofday (&query_start_time, NULL);
1275  tran_timeout = 0;
1276  query_timeout = 0;
1277 
1278 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1280 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
1281 #ifndef LIBCAS_FOR_JSP
1283  is_first_request = true;
1284 #endif /* !LIBCAS_FOR_JSP */
1285  fn_ret = FN_KEEP_CONN;
1286  while (fn_ret == FN_KEEP_CONN)
1287  {
1288 #if !defined(WINDOWS)
1289  signal (SIGUSR1, query_cancel);
1290 #endif /* !WINDOWS */
1291 
1292  fn_ret = process_request (client_sock_fd, &net_buf, &req_info);
1293  as_info->fn_status = FN_STATUS_DONE;
1294 #ifndef LIBCAS_FOR_JSP
1295  is_first_request = false;
1296 #endif /* !LIBCAS_FOR_JSP */
1297 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1299 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
1300 #if !defined(WINDOWS)
1301  signal (SIGUSR1, SIG_IGN);
1302 #endif /* !WINDOWS */
1303  as_info->last_access_time = time (NULL);
1304  }
1305 
1307 
1308  if (as_info->cur_statement_pooling)
1309  {
1310  hm_srv_handle_free_all (true);
1311  }
1312 
1313  if (!is_xa_prepared ())
1314  {
1315  if (ux_end_tran (CCI_TRAN_ROLLBACK, false) < 0)
1316  {
1317  as_info->reset_flag = TRUE;
1318  }
1319  }
1320 
1321 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1322  if (fn_ret != FN_KEEP_SESS)
1323  {
1324  ux_end_session ();
1325  }
1326 #endif
1327 
1328  if (is_xa_prepared ())
1329  {
1331  ux_database_connect (db_name, db_user, db_passwd, NULL);
1332  }
1333 
1334  if (as_info->reset_flag == TRUE)
1335  {
1337  as_info->reset_flag = FALSE;
1338  cas_set_db_connect_status (-1); /* DB_CONNECTION_STATUS_RESET */
1339  }
1340 
1341 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1343 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
1344  }
1345 
1346  CLOSE_SOCKET (client_sock_fd);
1347 
1348  if (ssl_client)
1349  {
1350  cas_ssl_close (client_sock_fd);
1351  }
1352 
1353  finish_cas:
1354  as_info->fn_status = FN_STATUS_IDLE;
1356 #if defined(WINDOWS)
1357  as_info->close_flag = 1;
1358 #endif /* WINDOWS */
1359  if (as_info->con_status != CON_STATUS_CLOSE_AND_CONNECT)
1360  {
1361  memset (as_info->cas_clt_ip, 0x0, sizeof (as_info->cas_clt_ip));
1362  as_info->cas_clt_port = 0;
1363  as_info->driver_version[0] = '\0';
1364  }
1365 
1366  as_info->transaction_start_time = (time_t) 0;
1367  cas_log_write_and_end (0, true, "disconnect");
1369  cas_log_write_and_end (0, false, "STATE idle");
1370  cas_log_close (true);
1371  cas_slow_log_close ();
1372  sql_log2_end (true);
1373 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
1374  cas_error_log_close (true);
1375 #endif
1376  cas_req_count++;
1377 
1379 
1380  if (is_server_aborted ())
1381  {
1382 #if defined(WINDOWS)
1384  WSACleanup ();
1385 #endif
1386  cas_final ();
1387  return 0;
1388  }
1389  else if (!(as_info->cur_keep_con == KEEP_CON_AUTO && as_info->con_status == CON_STATUS_CLOSE_AND_CONNECT))
1390  {
1391  if (restart_is_needed ())
1392  {
1393 #if defined(WINDOWS)
1395  WSACleanup ();
1396 #endif
1397  cas_final ();
1398  return 0;
1399  }
1400  else
1401  {
1402  as_info->uts_status = UTS_STATUS_IDLE;
1403  }
1404  }
1405  }
1406 #if defined(WINDOWS)
1407  }
1408  __except (CreateMiniDump (GetExceptionInformation ()))
1409  {
1410  }
1411 #endif /* WINDOWS */
1412 
1413  return 0;
1414 }
1415 
1416 #else /* LIBCAS_FOR_JSP */
1417 int
1418 libcas_main (SOCKET jsp_sock_fd)
1419 {
1420  T_NET_BUF net_buf;
1421  SOCKET client_sock_fd;
1422  int status = FN_KEEP_CONN;
1423 
1424  memset (&req_info, 0, sizeof (req_info));
1425 
1429  client_sock_fd = jsp_sock_fd;
1430 
1431  net_buf_init (&net_buf, cas_get_client_version ());
1432  net_buf.data = (char *) MALLOC (NET_BUF_ALLOC_SIZE);
1433  if (net_buf.data == NULL)
1434  {
1435  return -1;
1436  }
1437  net_buf.alloc_size = NET_BUF_ALLOC_SIZE;
1438 
1439  logddl_set_jsp_mode (true);
1440 
1441  while (status == FN_KEEP_CONN)
1442  {
1443  status = process_request (client_sock_fd, &net_buf, &req_info);
1444  }
1445 
1446  net_buf_clear (&net_buf);
1447  net_buf_destroy (&net_buf);
1448 
1449  if (status == FN_CLOSE_CONN)
1450  {
1451  return 0;
1452  }
1453  else
1454  {
1455  return -1;
1456  }
1457 }
1458 
1459 void *
1460 libcas_get_db_result_set (int h_id)
1461 {
1462  T_SRV_HANDLE *srv_handle;
1463 
1464  srv_handle = hm_find_srv_handle (h_id);
1465  if (srv_handle == NULL || srv_handle->cur_result == NULL)
1466  {
1467  return NULL;
1468  }
1469 
1470  return srv_handle;
1471 }
1472 
1473 void
1474 libcas_srv_handle_free (int h_id)
1475 {
1476  hm_srv_handle_free (h_id);
1477 }
1478 #endif /* !LIBCAS_FOR_JSP */
1479 
1480 /*
1481  * set_hang_check_time() -
1482  * Mark the current time so that cas hang checker thread
1483  * in broker can monitor the status of the cas.
1484  * If the time is set, ALWAYS unset it
1485  * before meeting indefinite blocking operation.
1486  */
1487 void
1489 {
1490 #if !defined(LIBCAS_FOR_JSP)
1491  if (cas_shard_flag == OFF && as_info != NULL && shm_appl != NULL && shm_appl->monitor_hang_flag)
1492  {
1493  as_info->claimed_alive_time = time (NULL);
1494  }
1495 #endif /* !LIBCAS_FOR_JSP */
1496  return;
1497 }
1498 
1499 /*
1500  * unset_hang_check_time -
1501  * Clear the time and the cas is free from being monitored
1502  * by hang checker in broker.
1503  */
1504 void
1506 {
1507 #if !defined(LIBCAS_FOR_JSP)
1508  if (cas_shard_flag == OFF && as_info != NULL && shm_appl != NULL && shm_appl->monitor_hang_flag)
1509  {
1510  as_info->claimed_alive_time = (time_t) 0;
1511  }
1512 #endif /* !LIBCAS_FOR_JSP */
1513  return;
1514 }
1515 
1516 bool
1517 check_server_alive (const char *db_name, const char *db_host)
1518 {
1519 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1520 #if !defined(LIBCAS_FOR_JSP)
1521  int i, u_index;
1522  char *unusable_db_name;
1523  char *unusable_db_host;
1524  const char *check_db_host = db_host;
1525  const char *check_db_name = db_name;
1526 
1527  if (cas_shard_flag == OFF && as_info != NULL && shm_appl != NULL && shm_appl->monitor_server_flag)
1528  {
1529  /* if db_name is NULL, use the CAS shared memory */
1530  if (db_name == NULL)
1531  {
1532  check_db_name = as_info->database_name;
1533  }
1534 
1535  /* if db_host is NULL, use the CAS shared memory */
1536  if (db_host == NULL)
1537  {
1538  check_db_host = as_info->database_host;
1539  }
1540 
1541  u_index = shm_appl->unusable_databases_seq % 2;
1542 
1543  for (i = 0; i < shm_appl->unusable_databases_cnt[u_index]; i++)
1544  {
1545  unusable_db_name = shm_appl->unusable_databases[u_index][i].database_name;
1546  unusable_db_host = shm_appl->unusable_databases[u_index][i].database_host;
1547 
1548  if (strcmp (unusable_db_name, check_db_name) == 0 && strcmp (unusable_db_host, check_db_host) == 0)
1549  {
1550  return false;
1551  }
1552  }
1553  }
1554 #endif /* !LIBCAS_FOR_JSP */
1555 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
1556 
1557  return true;
1558 }
1559 
1560 #ifndef LIBCAS_FOR_JSP
1561 static void
1562 cas_sig_handler (int signo)
1563 {
1564  signal (signo, SIG_IGN);
1565  cas_free (true);
1566  as_info->pid = 0;
1567  as_info->uts_status = UTS_STATUS_RESTART;
1568  _exit (0);
1569 }
1570 
1571 static void
1573 {
1574  signal (SIGTERM, SIG_IGN);
1575  signal (SIGINT, SIG_IGN);
1576  cas_free (false);
1577  as_info->pid = 0;
1578  as_info->uts_status = UTS_STATUS_RESTART;
1580  exit (0);
1581 }
1582 
1583 static void
1584 cas_free (bool from_sighandler)
1585 {
1586 #ifdef MEM_DEBUG
1587  int fd;
1588 #endif
1589  int max_process_size;
1590 
1591  if (from_sighandler)
1592  {
1593  cas_log_debug (ARG_FILE_LINE, "ux_database_shutdown: db_shutdown()");
1594 #ifndef LIBCAS_FOR_JSP
1595  as_info->database_name[0] = '\0';
1596  as_info->database_host[0] = '\0';
1597  as_info->database_user[0] = '\0';
1598  as_info->database_passwd[0] = '\0';
1599  as_info->last_connect_time = 0;
1600 #endif /* !LIBCAS_FOR_JSP */
1601  }
1602  else
1603  {
1605  }
1606 
1607  if (as_info->cur_statement_pooling && !from_sighandler)
1608  {
1609  hm_srv_handle_free_all (true);
1610  }
1611 #if defined(WINDOWS)
1612  if (shm_appl->use_pdh_flag)
1613  {
1614  if ((as_info->pid == as_info->pdh_pid) && (as_info->pdh_workset > shm_appl->appl_server_max_size))
1615  {
1616  cas_log_write_and_end (0, true, "CAS MEMORY USAGE (%dM) HAS EXCEEDED MAX SIZE (%dM)",
1617  as_info->pdh_workset / ONE_K, shm_appl->appl_server_max_size / ONE_K);
1618  }
1619 
1620  if ((as_info->pid == as_info->pdh_pid) && (as_info->pdh_workset > shm_appl->appl_server_hard_limit))
1621  {
1622  cas_log_write_and_end (0, true, "CAS MEMORY USAGE (%dM) HAS EXCEEDED HARD LIMIT (%dM)",
1623  as_info->pdh_workset / ONE_K, shm_appl->appl_server_hard_limit / ONE_K);
1624  }
1625  }
1626  else
1627  {
1628  if (cas_req_count > 500)
1629  {
1630  cas_log_write_and_end (0, true, "CAS REQUEST COUNT (%d) HAS EXCEEDED MAX LIMIT (%d)", cas_req_count, 500);
1631  }
1632  }
1633 #else /* WINDOWS */
1634 #if defined(AIX)
1635  /* In linux, getsize() returns VSM(55M). but in AIX, getsize() returns vritual meory size for data(900K). so, the
1636  * size of cub_cas process exceeds 'psize_at_start * 2' very easily. the linux's rule to restart cub_cas is not suit
1637  * for AIX. In AIX, we use 20M as max_process_size. */
1638  max_process_size = (shm_appl->appl_server_max_size > 0) ? shm_appl->appl_server_max_size : 20 * ONE_K;
1639 #else
1640  max_process_size = (shm_appl->appl_server_max_size > 0) ? shm_appl->appl_server_max_size : (psize_at_start * 2);
1641 #endif
1642  if (as_info->psize > max_process_size)
1643  {
1644  cas_log_write_and_end (0, true, "CAS MEMORY USAGE (%dM) HAS EXCEEDED MAX SIZE (%dM)", as_info->psize / ONE_K,
1645  max_process_size / ONE_K);
1646  }
1647 
1648  if (as_info->psize > shm_appl->appl_server_hard_limit)
1649  {
1650  cas_log_write_and_end (0, true, "CAS MEMORY USAGE (%dM) HAS EXCEEDED HARD LIMIT (%dM)", as_info->psize / ONE_K,
1651  shm_appl->appl_server_hard_limit / ONE_K);
1652  }
1653 #endif /* !WINDOWS */
1654 
1655  cas_log_write_and_end (0, true, "CAS TERMINATED pid %d", getpid ());
1656  cas_log_close (true);
1657  cas_slow_log_close ();
1658  logddl_destroy ();
1659 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
1660  cas_error_log_close (true);
1661 #endif
1662 
1663 #ifdef MEM_DEBUG
1664  fd = open ("mem_debug.log", O_CREAT | O_TRUNC | O_WRONLY, 0666);
1665  if (fd > 0)
1666  {
1667  malloc_dump (fd);
1668  close (fd);
1669  }
1670 #endif
1671 }
1672 
1673 static void
1674 query_cancel (int signo)
1675 {
1676 #if !defined(WINDOWS)
1677  struct timespec ts;
1678 #if defined(CAS_FOR_ORACLE)
1679  signal (signo, SIG_IGN);
1680  cas_oracle_query_cancel ();
1681 #elif defined(CAS_FOR_MYSQL)
1682 #else /* CAS_FOR_CUBRID */
1683  signal (signo, SIG_IGN);
1684  db_set_interrupt (1);
1685 #endif /* CAS_FOR_ORACLE */
1686  as_info->num_interrupts %= MAX_DIAG_DATA_VALUE;
1687  as_info->num_interrupts++;
1688 
1689  clock_gettime (CLOCK_REALTIME, &ts);
1690  query_cancel_time = ts.tv_sec * 1000LL;
1691  query_cancel_time += (ts.tv_nsec / 1000000LL);
1692  query_cancel_flag = 1;
1693 #else
1694  assert (0);
1695 #endif /* !WINDOWS */
1696 }
1697 #endif /* !LIBCAS_FOR_JSP */
1698 
1699 static FN_RETURN
1701 {
1702  MSG_HEADER client_msg_header;
1703  MSG_HEADER cas_msg_header;
1704  char *read_msg;
1705  char func_code;
1706  int argc;
1707  void **argv = NULL;
1708  int err_code;
1709 #ifndef LIBCAS_FOR_JSP
1710  int con_status_to_restore, old_con_status;
1711 #endif
1712  T_SERVER_FUNC server_fn;
1713  FN_RETURN fn_ret = FN_KEEP_CONN;
1714 
1715  error_info_clear ();
1716  init_msg_header (&client_msg_header);
1717  init_msg_header (&cas_msg_header);
1718 
1719 #ifndef LIBCAS_FOR_JSP
1720  old_con_status = as_info->con_status;
1721 #endif
1722 
1723 #ifndef LIBCAS_FOR_JSP
1724  if (cas_shard_flag == ON)
1725  {
1726  /* set req_info->client_version in net_read_process */
1727  err_code = net_read_process (sock_fd, &client_msg_header, req_info);
1728  if (err_code < 0)
1729  {
1730  const char *cas_log_msg = NULL;
1731  net_write_error (sock_fd, req_info->client_version, req_info->driver_info, cas_msg_header.info_ptr,
1733  fn_ret = FN_CLOSE_CONN;
1734 
1735  if (is_net_timed_out ())
1736  {
1737  if (as_info->reset_flag == TRUE)
1738  {
1739  cas_log_msg = "CONNECTION RESET";
1740  }
1741  else if (get_graceful_down_timeout () > 0)
1742  {
1743  cas_log_msg = "SESSION TIMEOUT AND EXPIRE IDLE TIMEOUT";
1744  fn_ret = FN_GRACEFUL_DOWN;
1745  }
1746  else
1747  {
1748  if (as_info->con_status == CON_STATUS_IN_TRAN)
1749  {
1750  cas_log_msg = "SESSION TIMEOUT";
1751  }
1752  else
1753  {
1754  cas_log_msg = "CONNECTION WAIT TIMEOUT";
1755  }
1756  }
1757  }
1758  else
1759  {
1760  cas_log_msg = "COMMUNICATION ERROR net_read_header()";
1761  }
1762  cas_log_write_and_end (0, true, cas_log_msg);
1763  return fn_ret;
1764  }
1765  else
1766  {
1767  as_info->uts_status = UTS_STATUS_BUSY;
1768 
1769  if (need_database_reconnect ())
1770  {
1771  assert (as_info->fixed_shard_user == false);
1772 
1774 
1776  if (err_code < 0)
1777  {
1779  net_write_error (sock_fd, req_info->client_version, req_info->driver_info, cas_msg_header.info_ptr,
1780  cas_info_size, err_info.err_indicator, err_info.err_number, err_info.err_string);
1781  return FN_CLOSE_CONN;
1782  }
1783 
1784 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1786 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
1787 
1788  cas_log_write_and_end (0, false, "connect db %s user %s", cas_db_name, cas_db_user);
1789  }
1790  }
1791  }
1792  else
1793 #endif /* !LIBCAS_FOR_JSP */
1794  {
1795 #ifndef LIBCAS_FOR_JSP
1797  if (as_info->cur_keep_con == KEEP_CON_AUTO)
1798  {
1799  err_code = net_read_int_keep_con_auto (sock_fd, &client_msg_header, req_info);
1800  }
1801  else
1802  {
1803  err_code = net_read_header_keep_con_on (sock_fd, &client_msg_header);
1804 
1805  if (as_info->cur_keep_con == KEEP_CON_ON && as_info->con_status == CON_STATUS_OUT_TRAN)
1806  {
1807  as_info->con_status = CON_STATUS_IN_TRAN;
1808  as_info->transaction_start_time = time (0);
1810  }
1811  }
1812 #else /* !LIBCAS_FOR_JSP */
1813  net_timeout_set (60);
1814  err_code = net_read_header (sock_fd, &client_msg_header);
1815 #endif /* !LIBCAS_FOR_JSP */
1816 
1817  if (err_code < 0)
1818  {
1819  const char *cas_log_msg = NULL;
1820 
1821  fn_ret = FN_CLOSE_CONN;
1822 
1823 #ifndef LIBCAS_FOR_JSP
1824  if (as_info->reset_flag)
1825  {
1826  cas_log_msg = "RESET";
1827  cas_log_write_and_end (0, true, cas_log_msg);
1828  fn_ret = FN_KEEP_SESS;
1829  }
1830  if (as_info->con_status == CON_STATUS_CLOSE_AND_CONNECT)
1831  {
1832  cas_log_msg = "CHANGE CLIENT";
1833  fn_ret = FN_KEEP_SESS;
1834  }
1835 #endif /* !LIBCAS_FOR_JSP */
1836  if (cas_log_msg == NULL)
1837  {
1838  if (is_net_timed_out ())
1839  {
1840 #ifndef LIBCAS_FOR_JSP
1841  if (as_info->reset_flag == TRUE)
1842  {
1843  cas_log_msg = "CONNECTION RESET";
1844  }
1845  else
1846  {
1847  cas_log_msg = "SESSION TIMEOUT";
1848  }
1849 #else
1850  cas_log_msg = "SESSION TIMEOUT";
1851 #endif /* !LIBCAS_FOR_JSP */
1852  }
1853  else
1854  {
1855  cas_log_msg = "COMMUNICATION ERROR net_read_header()";
1856  }
1857  }
1858  cas_log_write_and_end (0, true, cas_log_msg);
1859  return fn_ret;
1860  }
1861  }
1862 
1863 #ifndef LIBCAS_FOR_JSP
1864 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1865 #if !defined(WINDOWS)
1866  /* Before start to execute a new request, try to reset a previous interrupt request we might have. The interrupt
1867  * request arrived too late to interrupt the previous request and still remains. */
1868  db_set_interrupt (0);
1869 #endif /* !WINDOWS */
1870 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL) */
1871 
1872 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1873  if (cas_shard_flag == ON)
1874  {
1875  set_db_parameter ();
1876  }
1877 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL) */
1878 
1879  if (shm_appl->session_timeout < 0)
1881  else
1883 #else /* !LIBCAS_FOR_JSP */
1885 #endif /* LIBCAS_FOR_JSP */
1886 
1887  if (cas_shard_flag == ON && req_info->client_version == 0)
1888  {
1889  assert (0);
1891  }
1892 
1893  read_msg = (char *) MALLOC (*(client_msg_header.msg_body_size_ptr));
1894  if (read_msg == NULL)
1895  {
1896  net_write_error (sock_fd, req_info->client_version, req_info->driver_info, cas_msg_header.info_ptr, cas_info_size,
1898  return FN_CLOSE_CONN;
1899  }
1900  if (net_read_stream (sock_fd, read_msg, *(client_msg_header.msg_body_size_ptr)) < 0)
1901  {
1902  FREE_MEM (read_msg);
1903  net_write_error (sock_fd, req_info->client_version, req_info->driver_info, cas_msg_header.info_ptr, cas_info_size,
1905  cas_log_write_and_end (0, true, "COMMUNICATION ERROR net_read_stream()");
1906  return FN_CLOSE_CONN;
1907  }
1908 
1909  argc = net_decode_str (read_msg, *(client_msg_header.msg_body_size_ptr), &func_code, &argv);
1910  if (argc < 0)
1911  {
1912  FREE_MEM (read_msg);
1913  net_write_error (sock_fd, req_info->client_version, req_info->driver_info, cas_msg_header.info_ptr, cas_info_size,
1915  return FN_CLOSE_CONN;
1916  }
1917 
1918  if (func_code <= 0 || func_code >= CAS_FC_MAX)
1919  {
1920  FREE_MEM (argv);
1921  FREE_MEM (read_msg);
1922  net_write_error (sock_fd, req_info->client_version, req_info->driver_info, cas_msg_header.info_ptr, cas_info_size,
1924  return FN_CLOSE_CONN;
1925  }
1926 
1927 #ifndef LIBCAS_FOR_JSP
1928  /* PROTOCOL_V2 is used only 9.0.0 */
1930  {
1931  switch (func_code)
1932  {
1935  break;
1936  case CAS_FC_CURSOR_CLOSE:
1938  break;
1939  default:
1940  break;
1941  }
1942  }
1943 
1944  con_status_to_restore = -1;
1945 
1946  if (FUNC_NEEDS_RESTORING_CON_STATUS (func_code))
1947  {
1948  if (is_first_request == true)
1949  {
1950  /* If this request is the first request after connection established, con_status should be
1951  * CON_STATUS_OUT_TRAN. */
1952  con_status_to_restore = CON_STATUS_OUT_TRAN;
1953  }
1954  else if (con_status_before_check_cas != -1)
1955  {
1956  con_status_to_restore = con_status_before_check_cas;
1957  }
1958  else
1959  {
1960  con_status_to_restore = old_con_status;
1961  }
1962 
1964  }
1965  else if (func_code == CAS_FC_CHECK_CAS)
1966  {
1967  con_status_before_check_cas = old_con_status;
1968  }
1969  else
1970  {
1972  }
1973 
1974  strcpy (as_info->log_msg, server_func_name[func_code - 1]);
1975 #endif /* !LIBCAS_FOR_JSP */
1976 
1977  server_fn = server_fn_table[func_code - 1];
1978 
1979 #ifndef LIBCAS_FOR_JSP
1981  {
1982  assert (prev_cas_info[CAS_INFO_STATUS] == client_msg_header.info_ptr[CAS_INFO_STATUS]);
1983 #if defined (PROTOCOL_EXTENDS_DEBUG) /* for debug cas <-> JDBC info */
1984  if (prev_cas_info[CAS_INFO_STATUS] != client_msg_header.info_ptr[CAS_INFO_STATUS])
1985  {
1987  "[%d][PREV : %d, RECV : %d], " "[preffunc : %d, recvfunc : %d], [REQ: %d, REQ: %d], "
1988  "[JID : %d] \n", func_code - 1, prev_cas_info[CAS_INFO_STATUS],
1989  client_msg_header.info_ptr[CAS_INFO_STATUS], prev_cas_info[CAS_INFO_RESERVED_1],
1990  client_msg_header.info_ptr[CAS_INFO_RESERVED_1], prev_cas_info[CAS_INFO_RESERVED_2],
1991  client_msg_header.info_ptr[CAS_INFO_RESERVED_2],
1992  client_msg_header.info_ptr[CAS_INFO_RESERVED_3]);
1993  }
1994 #endif /* end for debug */
1995  }
1996 #endif /* !LIBCAS_FOR_JSP */
1997 
1998 #ifndef LIBCAS_FOR_JSP
2000 #endif /* !LIBCAS_FOR_JSP */
2002 
2003 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
2004  /* for 9.0 driver */
2006  {
2007  ux_set_utype_for_enum (CCI_U_TYPE_STRING);
2008  }
2009 
2010  /* for driver less than 10.0 */
2012  {
2013  ux_set_utype_for_datetimetz (CCI_U_TYPE_DATETIME);
2014  ux_set_utype_for_timestamptz (CCI_U_TYPE_TIMESTAMP);
2015  ux_set_utype_for_datetimeltz (CCI_U_TYPE_DATETIME);
2016  ux_set_utype_for_timestampltz (CCI_U_TYPE_TIMESTAMP);
2017  }
2018 
2019  /* driver version < 10.2 */
2021  {
2022  ux_set_utype_for_json (CCI_U_TYPE_STRING);
2023  }
2024 #endif
2025 
2026 #ifndef LIBCAS_FOR_JSP
2027  as_info->fn_status = FN_STATUS_BUSY;
2028 #endif
2029 
2030  net_buf->client_version = req_info->client_version;
2032  fn_ret = (*server_fn) (sock_fd, argc, argv, net_buf, req_info);
2034 
2035 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
2036  /* set back original utype for enum, date-time, JSON */
2038  {
2039  ux_set_utype_for_enum (CCI_U_TYPE_ENUM);
2040  }
2041 
2042  /* for driver less than 10.0 */
2044  {
2045  ux_set_utype_for_datetimetz (CCI_U_TYPE_DATETIMETZ);
2046  ux_set_utype_for_timestamptz (CCI_U_TYPE_TIMESTAMPTZ);
2047  ux_set_utype_for_datetimeltz (CCI_U_TYPE_DATETIMETZ);
2048  ux_set_utype_for_timestampltz (CCI_U_TYPE_TIMESTAMPTZ);
2049  }
2050 
2051  /* driver version < 10.2 */
2053  {
2054  ux_set_utype_for_json (CCI_U_TYPE_JSON);
2055  }
2056 #endif
2057 
2058 #ifndef LIBCAS_FOR_JSP
2059  cas_log_debug (ARG_FILE_LINE, "process_request: %s() err_code %d", server_func_name[func_code - 1],
2060  err_info.err_number);
2061 
2062  if (con_status_to_restore != -1)
2063  {
2065  as_info->con_status = con_status_to_restore;
2067  }
2068 #endif /* !LIBCAS_FOR_JSP */
2069 
2070  if (cas_shard_flag == ON && (func_code == CAS_FC_PREPARE || func_code == CAS_FC_CHECK_CAS)
2072  {
2073  /* for shard dummy prepare */
2074  /* for connection check */
2075  req_info->need_auto_commit = TRAN_AUTOROLLBACK;
2076  }
2077 
2078 #ifndef LIBCAS_FOR_JSP
2079  if (fn_ret == FN_KEEP_CONN && net_buf->err_code == 0 && as_info->con_status == CON_STATUS_IN_TRAN
2080  && req_info->need_auto_commit != TRAN_NOT_AUTOCOMMIT && err_info.err_number != CAS_ER_STMT_POOLING)
2081  {
2082  /* no communication error and auto commit is needed */
2083  err_code = ux_auto_commit (net_buf, req_info);
2084  if (err_code < 0)
2085  {
2086  fn_ret = FN_CLOSE_CONN;
2087  }
2088  else
2089  {
2090  if (as_info->cas_log_reset)
2091  {
2093  }
2094  if (as_info->cas_slow_log_reset)
2095  {
2097  }
2098  if (!ux_is_database_connected ())
2099  {
2100  fn_ret = FN_CLOSE_CONN;
2101  }
2102  else if (restart_is_needed ())
2103  {
2104  fn_ret = FN_KEEP_SESS;
2105  }
2106  if (shm_appl->sql_log2 != as_info->cur_sql_log2)
2107  {
2108  sql_log2_end (false);
2109  as_info->cur_sql_log2 = shm_appl->sql_log2;
2111  }
2112  }
2114  as_info->num_transactions_processed++;
2115 
2116  /* should be OUT_TRAN in auto commit */
2118  if (as_info->con_status == CON_STATUS_IN_TRAN)
2119  {
2120  as_info->con_status = CON_STATUS_OUT_TRAN;
2121  }
2123  }
2124 
2125  if ((func_code == CAS_FC_EXECUTE) || (func_code == CAS_FC_SCHEMA_INFO))
2126  {
2128  as_info->num_requests_received++;
2129  }
2130  else if (func_code == CAS_FC_END_TRAN)
2131  {
2133  as_info->num_transactions_processed++;
2134  }
2135 
2136  as_info->log_msg[0] = '\0';
2137  if (as_info->con_status == CON_STATUS_IN_TRAN)
2138  {
2140  }
2141  else
2142  {
2144  }
2145 #endif /* !LIBCAS_FOR_JSP */
2146 
2147  if (func_code == CAS_FC_EXECUTE || err_info.err_number < 0)
2148  {
2149 #ifndef LIBCAS_FOR_JSP
2150  if (logddl_get_jsp_mode () == false)
2151  {
2152  logddl_write_end ();
2153  }
2154 #else
2155  logddl_write_end ();
2156 #endif
2157  }
2158 
2159  if (net_buf->err_code)
2160  {
2161  net_write_error (sock_fd, req_info->client_version, req_info->driver_info, cas_msg_header.info_ptr, cas_info_size,
2162  CAS_ERROR_INDICATOR, net_buf->err_code, NULL);
2163  fn_ret = FN_CLOSE_CONN;
2164  goto exit_on_end;
2165  }
2166 
2167  if (cas_send_result_flag && net_buf->data != NULL)
2168  {
2169 #ifndef LIBCAS_FOR_JSP
2171  cas_msg_header.info_ptr[CAS_INFO_ADDITIONAL_FLAG] |=
2173 
2174  if (cas_shard_flag == ON)
2175  {
2176  cas_msg_header.info_ptr[CAS_INFO_ADDITIONAL_FLAG] &= ~CAS_INFO_FLAG_MASK_FORCE_OUT_TRAN;
2177  }
2178 #if defined (PROTOCOL_EXTENDS_DEBUG) /* for debug cas<->jdbc info */
2179  cas_msg_header.info_ptr[CAS_INFO_RESERVED_1] = func_code - 1;
2180  cas_msg_header.info_ptr[CAS_INFO_RESERVED_2] = as_info->num_requests_received % 128;
2184 #endif /* end for debug */
2185 
2186 #endif /* !LIBCAS_FOR_JSP */
2187 
2188  *(cas_msg_header.msg_body_size_ptr) = htonl (net_buf->data_size);
2189  memcpy (net_buf->data, cas_msg_header.msg_body_size_ptr, NET_BUF_HEADER_MSG_SIZE);
2190 
2191  if (cas_info_size > 0)
2192  {
2193  memcpy (net_buf->data + NET_BUF_HEADER_MSG_SIZE, cas_msg_header.info_ptr, cas_info_size);
2194  }
2195 
2196  assert (NET_BUF_CURR_SIZE (net_buf) <= net_buf->alloc_size);
2197  if (net_write_stream (sock_fd, net_buf->data, NET_BUF_CURR_SIZE (net_buf)) < 0)
2198  {
2199  cas_log_write_and_end (0, true, "COMMUNICATION ERROR net_write_stream()");
2200  }
2201  }
2202 
2203  if (cas_shard_flag == OFF && cas_send_result_flag && net_buf->post_send_file != NULL)
2204  {
2205  err_code = net_write_from_file (sock_fd, net_buf->post_file_size, net_buf->post_send_file);
2206  unlink (net_buf->post_send_file);
2207  if (err_code < 0)
2208  {
2209  fn_ret = FN_CLOSE_CONN;
2210  goto exit_on_end;
2211  }
2212  }
2213 
2214 #ifndef LIBCAS_FOR_JSP
2215  if (as_info->reset_flag
2216  &&
2217  ((as_info->con_status != CON_STATUS_IN_TRAN && as_info->num_holdable_results < 1
2218  && as_info->cas_change_mode == CAS_CHANGE_MODE_AUTO) || (cas_get_db_connect_status () == -1)))
2219  {
2220  cas_log_debug (ARG_FILE_LINE, "process_request: reset_flag && !CON_STATUS_IN_TRAN");
2221  fn_ret = FN_KEEP_SESS;
2222  goto exit_on_end;
2223  }
2224 #endif /* !LIBCAS_FOR_JSP */
2225 
2226 exit_on_end:
2227 #ifndef LIBCAS_FOR_JSP
2228  if (cas_shard_flag == ON && as_info->con_status != CON_STATUS_IN_TRAN && as_info->uts_status == UTS_STATUS_BUSY)
2229  {
2230  as_info->uts_status = UTS_STATUS_IDLE;
2231  }
2232 #endif /* !LIBCAS_FOR_JSP */
2233 
2234  net_buf_clear (net_buf);
2235 
2236  FREE_MEM (read_msg);
2237  FREE_MEM (argv);
2238 
2239  return fn_ret;
2240 }
2241 
2242 #ifndef LIBCAS_FOR_JSP
2243 static int
2245 {
2246  if (cas_init_shm () < 0)
2247  {
2248  return -1;
2249  }
2250 
2251  strncpy (broker_name, shm_appl->broker_name, BROKER_NAME_LEN);
2252 
2256 
2257  as_pid_file_create (broker_name, as_info->as_id);
2259 
2260 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
2261  if (cas_shard_flag == OFF)
2262  {
2265  }
2266 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
2267  return 0;
2268 }
2269 
2270 static int
2271 net_read_process (SOCKET proxy_sock_fd, MSG_HEADER * client_msg_header, T_REQ_INFO * req_info)
2272 {
2273  int ret_value = 0;
2274  int timeout = 0, remained_timeout = 0;
2275  bool is_proxy_conn_wait_timeout = false;
2276 
2277  if (as_info->con_status == CON_STATUS_IN_TRAN)
2278  {
2279  net_timeout_set (shm_appl->session_timeout);
2280  }
2281  else
2282  {
2284 
2285  timeout = get_graceful_down_timeout ();
2286  if (timeout < 0 && as_info->database_user[0] != '\0')
2287  {
2288  timeout = as_info->proxy_conn_wait_timeout;
2289  is_proxy_conn_wait_timeout = true;
2290  }
2291 #if defined(CAS_FOR_MYSQL)
2292  if (timeout > 0)
2293  {
2294  timeout = MIN (timeout, cas_mysql_get_mysql_wait_timeout ());
2295  }
2296  else
2297  {
2298  timeout = cas_mysql_get_mysql_wait_timeout ();
2299  }
2300 #endif
2301 
2302  remained_timeout = timeout;
2303  }
2304 
2305  do
2306  {
2307  if (as_info->cas_log_reset)
2308  {
2310  }
2311 
2312  if (as_info->con_status == CON_STATUS_CLOSE)
2313  {
2314  break;
2315  }
2316  else if (as_info->con_status == CON_STATUS_OUT_TRAN)
2317  {
2318  remained_timeout -= DEFAULT_CHECK_INTERVAL;
2319  }
2320 
2321  /*
2322  * net_read_header error case. case 1 : disconnect with proxy_sock_fd case 2 : CON_STATUS_IN_TRAN &&
2323  * session_timeout case 3 : reset_flag is TRUE */
2324  if (net_read_header (proxy_sock_fd, client_msg_header) < 0)
2325  {
2326  /* if in-transaction state, return network error */
2327  if (as_info->con_status == CON_STATUS_IN_TRAN || !is_net_timed_out ())
2328  {
2329  ret_value = -1;
2330  break;
2331  }
2332  /* if out-of-transaction state, check whether restart is needed */
2333  if (as_info->con_status == CON_STATUS_OUT_TRAN && is_net_timed_out ())
2334  {
2335  if (as_info->reset_flag == TRUE)
2336  {
2337  ret_value = -1;
2338  break;
2339  }
2340 
2341  if (restart_is_needed ())
2342  {
2343  cas_log_debug (ARG_FILE_LINE, "net_read_process: " "restart_is_needed()");
2344  ret_value = -1;
2345  break;
2346  }
2347 
2348  /* this is not real timeout. try again. */
2349  if (timeout < 0 || remained_timeout > 0)
2350  {
2351  continue;
2352  }
2353 
2354 #if defined (CAS_FOR_MYSQL)
2355  /* execute dummy query to reset wait_timeout of MySQL */
2356  if (cas_mysql_execute_dummy () >= 0)
2357  {
2358  remained_timeout = timeout;
2359  continue;
2360  }
2361 #endif /* CAS_FOR_MYSQL */
2362 
2363  if (is_proxy_conn_wait_timeout)
2364  {
2365  as_info->database_user[0] = '\0';
2366  as_info->database_passwd[0] = '\0';
2367  }
2368 
2369  /* MYSQL_CONNECT_TIMEOUT case */
2370  /* SHARD_CAS expire idle time and restart case */
2371  ret_value = -1;
2372  break;
2373  }
2374  }
2375  else
2376  {
2377  break;
2378  }
2379  }
2380  while (1);
2381 
2383 
2384  if (as_info->con_status == CON_STATUS_OUT_TRAN)
2385  {
2386  as_info->num_request++;
2387  gettimeofday (&tran_start_time, NULL);
2389  }
2390 
2391  if (as_info->con_status == CON_STATUS_CLOSE)
2392  {
2393  ret_value = -1;
2394  }
2395  else
2396  {
2397  if (as_info->con_status != CON_STATUS_IN_TRAN)
2398  {
2399  if (ret_value >= 0)
2400  {
2401  as_info->con_status = CON_STATUS_IN_TRAN;
2403  }
2404 
2406 
2407  /* This is a real client protocol version */
2408  req_info->client_version = as_info->clt_version;
2409  memcpy (req_info->driver_info, as_info->driver_info, SRV_CON_CLIENT_INFO_SIZE);
2410  cas_log_write_and_end (0, false, "CLIENT VERSION %s", as_info->driver_version);
2411  }
2412  }
2413 
2415 
2416  return ret_value;
2417 }
2418 
2419 static int
2420 net_read_int_keep_con_auto (SOCKET clt_sock_fd, MSG_HEADER * client_msg_header, T_REQ_INFO * req_info)
2421 {
2422  int ret_value = 0;
2423 #if defined(CAS_FOR_MYSQL)
2424  int timeout = 0, remained_timeout = 0;
2425 #endif /* CAS_FOR_MYSQL */
2426 
2427  if (as_info->con_status == CON_STATUS_IN_TRAN)
2428  {
2429  /* holdable results have the same lifespan of a normal session */
2430  net_timeout_set (shm_appl->session_timeout);
2431  }
2432  else
2433  {
2435 
2436 #if defined(CAS_FOR_MYSQL)
2437  timeout = cas_mysql_get_mysql_wait_timeout ();
2438  remained_timeout = timeout;
2439 #endif /* CAS_FOR_MYSQL */
2440 
2442  }
2443 
2444  do
2445  {
2446  if (as_info->cas_log_reset)
2447  {
2449  }
2450  if (as_info->cas_slow_log_reset)
2451  {
2453  }
2454 
2455  if (as_info->con_status != CON_STATUS_IN_TRAN && as_info->reset_flag == TRUE)
2456  {
2457  return -1;
2458  }
2459 
2460  if (as_info->con_status == CON_STATUS_CLOSE || as_info->con_status == CON_STATUS_CLOSE_AND_CONNECT)
2461  {
2462  break;
2463  }
2464 #if defined (CAS_FOR_MYSQL)
2465  else if (as_info->con_status == CON_STATUS_OUT_TRAN)
2466  {
2467  remained_timeout -= DEFAULT_CHECK_INTERVAL;
2468  }
2469 #endif /* CAS_FOR_MYSQL */
2470 
2471  if (net_read_header (clt_sock_fd, client_msg_header) < 0)
2472  {
2473  /* if in-transaction state, return network error */
2474  if (as_info->con_status == CON_STATUS_IN_TRAN || !is_net_timed_out ())
2475  {
2476  ret_value = -1;
2477  break;
2478  }
2479  /* if out-of-transaction state, check whether restart is needed */
2480  if (as_info->con_status == CON_STATUS_OUT_TRAN && is_net_timed_out ())
2481  {
2482  if (restart_is_needed ())
2483  {
2484  cas_log_debug (ARG_FILE_LINE, "net_read_int_keep_con_auto: " "restart_is_needed()");
2485  ret_value = -1;
2486  break;
2487  }
2488 
2489  if (as_info->reset_flag == TRUE)
2490  {
2491  ret_value = -1;
2492  break;
2493  }
2494 
2495 #if defined (CAS_FOR_MYSQL)
2496  /* this is not real timeout. try again. */
2497  if (remained_timeout > 0)
2498  {
2499  continue;
2500  }
2501 
2502  /* execute dummy query to reset wait_timeout of MySQL */
2503  if (cas_mysql_execute_dummy () >= 0)
2504  {
2505  remained_timeout = timeout;
2506  continue;
2507  }
2508 #endif /* CAS_FOR_MYSQL */
2509  }
2510  }
2511  else
2512  {
2513  break;
2514  }
2515  }
2516  while (1);
2517 
2519 
2521 
2522  if (as_info->con_status == CON_STATUS_OUT_TRAN)
2523  {
2524  as_info->num_request++;
2525  gettimeofday (&tran_start_time, NULL);
2526  }
2528 
2529  if (as_info->con_status == CON_STATUS_CLOSE || as_info->con_status == CON_STATUS_CLOSE_AND_CONNECT)
2530  {
2531  ret_value = -1;
2532  }
2533  else
2534  {
2535  if (as_info->con_status != CON_STATUS_IN_TRAN)
2536  {
2537  as_info->con_status = CON_STATUS_IN_TRAN;
2538  as_info->transaction_start_time = time (0);
2540  }
2541  }
2542 
2544 
2545  return ret_value;
2546 }
2547 
2548 static int
2549 net_read_header_keep_con_on (SOCKET clt_sock_fd, MSG_HEADER * client_msg_header)
2550 {
2551  int ret_value = 0;
2552  int timeout = 0, remained_timeout = 0;
2553 
2554  if (as_info->con_status == CON_STATUS_IN_TRAN)
2555  {
2556  net_timeout_set (shm_appl->session_timeout);
2557  }
2558  else
2559  {
2561  timeout = shm_appl->session_timeout;
2562  remained_timeout = timeout;
2563  }
2564 
2565  do
2566  {
2567  if (as_info->con_status == CON_STATUS_OUT_TRAN)
2568  {
2569  remained_timeout -= DEFAULT_CHECK_INTERVAL;
2570  }
2571 
2572  if (net_read_header (clt_sock_fd, client_msg_header) < 0)
2573  {
2574  /* if in-transaction state, return network error */
2575  if (as_info->con_status == CON_STATUS_IN_TRAN || !is_net_timed_out ())
2576  {
2577  ret_value = -1;
2578  break;
2579  }
2580  /* if out-of-transaction state, check whether restart is needed */
2581  if (as_info->con_status == CON_STATUS_OUT_TRAN && is_net_timed_out ())
2582  {
2583  if (as_info->reset_flag == TRUE)
2584  {
2585  ret_value = -1;
2586  break;
2587  }
2588 
2589  if (timeout > 0 && remained_timeout <= 0)
2590  {
2591  ret_value = -1;
2592  break;
2593  }
2594  }
2595  }
2596  else
2597  {
2598  break;
2599  }
2600  }
2601  while (1);
2602 
2603  return ret_value;
2604 }
2605 
2606 static void
2608 {
2609  if (as_info->fixed_shard_user)
2610  {
2611  strncpy (as_info->database_user, shm_appl->shard_conn_info[shm_shard_id].db_user, SRV_CON_DBUSER_SIZE - 1);
2612  as_info->database_user[SRV_CON_DBUSER_SIZE - 1] = '\0';
2613 
2614  strncpy (as_info->database_passwd, shm_appl->shard_conn_info[shm_shard_id].db_password,
2615  SRV_CON_DBPASSWD_SIZE - 1);
2616  as_info->database_passwd[SRV_CON_DBUSER_SIZE - 1] = '\0';
2617  }
2618 
2619  strncpy (cas_db_user, as_info->database_user, SRV_CON_DBUSER_SIZE - 1);
2620  cas_db_user[SRV_CON_DBUSER_SIZE - 1] = '\0';
2621 
2622  strncpy (cas_db_passwd, as_info->database_passwd, SRV_CON_DBPASSWD_SIZE - 1);
2624 
2625  cas_log_debug (ARG_FILE_LINE, "db_name %s db_user %s", cas_db_name, cas_db_user);
2626 }
2627 
2628 static void
2630 {
2631  if (as_info->fixed_shard_user)
2632  {
2633  return;
2634  }
2635 
2636  cas_db_user[0] = '\0';
2637  cas_db_passwd[0] = '\0';
2638  as_info->database_user[0] = '\0';
2639  as_info->database_passwd[0] = '\0';
2640 }
2641 
2642 static bool
2644 {
2645  if (as_info->force_reconnect)
2646  {
2647  return true;
2648  }
2649 #if defined(CAS_FOR_MYSQL)
2650  if (strcmp (cas_db_user, as_info->database_user))
2651 #else /* CAS_FOR_MYSQL */
2652  if (strcasecmp (cas_db_user, as_info->database_user))
2653 #endif /* CAS_FOR_MYSQL */
2654  {
2655  return true;
2656  }
2657 
2658  if (strcmp (cas_db_passwd, as_info->database_passwd))
2659  {
2660  return true;
2661  }
2662 
2663  return false;
2664 }
2665 #endif /* !LIBCAS_FOR_JSP */
2666 
2667 static void
2669 {
2670 #if !defined(LIBCAS_FOR_JSP)
2671  if (cas_shard_flag == OFF && as_info->clt_version <= CAS_MAKE_VER (8, 1, 5))
2672  {
2673  cas_info_size = 0;
2674  }
2675  else
2676 #endif /* !LIBCAS_FOR_JSP */
2677  {
2679  }
2680 }
2681 
2682 #ifndef LIBCAS_FOR_JSP
2683 int
2685 {
2686  if (as_info->num_holdable_results > 0 || as_info->cas_change_mode == CAS_CHANGE_MODE_KEEP)
2687  {
2688  /* we do not want to restart the CAS when there are open holdable results or cas_change_mode is
2689  * CAS_CHANGE_MODE_KEEP */
2690  return 0;
2691  }
2692 #if defined(WINDOWS)
2693  if (shm_appl->use_pdh_flag == TRUE)
2694  {
2695  if ((as_info->pid == as_info->pdh_pid) && (as_info->pdh_workset > shm_appl->appl_server_max_size))
2696  {
2697  return 1;
2698  }
2699  else
2700  {
2701  return 0;
2702  }
2703  }
2704  else
2705  {
2706  if (cas_req_count > 500)
2707  return 1;
2708  else
2709  return 0;
2710  }
2711 #else /* WINDOWS */
2712  int max_process_size;
2713 
2714 #if defined(AIX)
2715  /* In linux, getsize() returns VSM(55M). but in AIX, getsize() returns vritual meory size for data(900K). so, the
2716  * size of cub_cas process exceeds 'psize_at_start * 2' very easily. the linux's rule to restart cub_cas is not suit
2717  * for AIX. In AIX, we use 20M as max_process_size. */
2718  max_process_size = (shm_appl->appl_server_max_size > 0) ? shm_appl->appl_server_max_size : 20 * ONE_K;
2719 #else
2720  max_process_size = (shm_appl->appl_server_max_size > 0) ? shm_appl->appl_server_max_size : (psize_at_start * 2);
2721 #endif
2722 
2723  if (as_info->psize > max_process_size)
2724  {
2725  return 1;
2726  }
2727  else
2728  {
2729  return 0;
2730  }
2731 #endif /* !WINDOWS */
2732 }
2733 
2734 #if defined(WINDOWS)
2735 
2736 LONG WINAPI
2737 CreateMiniDump (struct _EXCEPTION_POINTERS * pException)
2738 {
2739  TCHAR DumpFile[MAX_PATH] = { 0, };
2740  TCHAR DumpPath[MAX_PATH] = { 0, };
2741  SYSTEMTIME SystemTime;
2742  HANDLE FileHandle;
2743 
2744  GetLocalTime (&SystemTime);
2745 
2746  sprintf (DumpFile, "%d-%d-%d %d_%d_%d.dmp", SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay, SystemTime.wHour,
2747  SystemTime.wMinute, SystemTime.wSecond);
2748  envvar_bindir_file (DumpPath, MAX_PATH, DumpFile);
2749 
2750  FileHandle = CreateFile (DumpPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
2751 
2752  if (FileHandle != INVALID_HANDLE_VALUE)
2753  {
2754  MINIDUMP_EXCEPTION_INFORMATION MiniDumpExceptionInfo;
2755  BOOL Success;
2756 
2757  MiniDumpExceptionInfo.ThreadId = GetCurrentThreadId ();
2758  MiniDumpExceptionInfo.ExceptionPointers = pException;
2759  MiniDumpExceptionInfo.ClientPointers = FALSE;
2760 
2761  Success =
2762  MiniDumpWriteDump (GetCurrentProcess (), GetCurrentProcessId (), FileHandle, MiniDumpNormal,
2763  (pException) ? &MiniDumpExceptionInfo : NULL, NULL, NULL);
2764  }
2765 
2766  CloseHandle (FileHandle);
2767 
2769 
2770  return EXCEPTION_EXECUTE_HANDLER;
2771 }
2772 #endif /* WINDOWS */
2773 
2774 static int
2776 {
2777  MSG_HEADER proxy_msg_header;
2778  char func_code = 0x01;
2779 
2780  /* proxy/cas connection handshake */
2781  init_msg_header (&proxy_msg_header);
2782 
2783  *(proxy_msg_header.msg_body_size_ptr) = sizeof (char) /* func_code */ +
2784  sizeof (int) /* shard_id */ +
2785  sizeof (int) /* cas_id */ ;
2786 
2787  if (net_write_header (proxy_sock_fd, &proxy_msg_header))
2788  {
2789  cas_log_write_and_end (0, false, "HANDSHAKE ERROR send msg_header");
2790  return -1;
2791  }
2792 
2793  if (net_write_stream (proxy_sock_fd, &func_code, 1) < 0)
2794  {
2795  cas_log_write_and_end (0, false, "HANDSHAKE ERROR send func_code");
2796  return -1;
2797  }
2798 
2799  if (net_write_int (proxy_sock_fd, shm_shard_id) < 0)
2800  {
2801  cas_log_write_and_end (0, false, "HANDSHAKE ERROR send shard_id");
2802  return -1;
2803  }
2804 
2805  if (net_write_int (proxy_sock_fd, shm_shard_cas_id) < 0)
2806  {
2807  cas_log_write_and_end (0, false, "HANDSHAKE ERROR send cas_id");
2808  return -1;
2809  }
2810 
2811  return 0;
2812 }
2813 
2814 static int
2816 {
2817  char *p;
2818  int as_shm_key;
2819  int pxy_id, shd_id, shard_cas_id, as_id;
2820 
2821  p = getenv (APPL_SERVER_SHM_KEY_STR);
2822  if (p == NULL)
2823  {
2824  goto return_error;
2825  }
2826 
2827  parse_int (&as_shm_key, p, 10);
2828  SHARD_ERR ("<CAS> APPL_SERVER_SHM_KEY_STR:[%d:%x]\n", as_shm_key, as_shm_key);
2829  shm_appl = (T_SHM_APPL_SERVER *) uw_shm_open (as_shm_key, SHM_APPL_SERVER, SHM_MODE_ADMIN);
2830 
2831  if (shm_appl == NULL)
2832  {
2833  goto return_error;
2834  }
2835 
2836  p = getenv (AS_ID_ENV_STR);
2837  if (p == NULL)
2838  {
2839  goto return_error;
2840  }
2841 
2842  parse_int (&as_id, p, 10);
2843  SHARD_ERR ("<CAS> AS_ID_ENV_STR:[%d]\n", as_id);
2844  as_info = &shm_appl->as_info[as_id];
2845 
2846  shm_as_index = as_id;
2847 
2848  cas_shard_flag = shm_appl->shard_flag;
2849 
2850  if (cas_shard_flag == OFF)
2851  {
2852  return 0;
2853  }
2854 
2855  pxy_id = as_info->proxy_id;
2856  SHARD_ERR ("<CAS> PROXY_ID:[%d]\n", pxy_id);
2857  shm_proxy_id = pxy_id;
2858 
2859  shd_id = as_info->shard_id;
2860  SHARD_ERR ("<CAS> SHARD_ID:[%d]\n", shd_id);
2861  shm_shard_id = shd_id;
2862 
2863  shard_cas_id = as_info->shard_cas_id;
2864  SHARD_ERR ("<CAS> SHARD_CAS_ID:[%d]\n", shard_cas_id);
2865  shm_shard_cas_id = shard_cas_id;
2866 
2867  return 0;
2868 
2869 #if 1
2870  /* SHARD TODO : tuning cur_keep_con parameter */
2871  as_info->cur_keep_con = 1;
2872 #endif
2873 
2874  return 0;
2875 return_error:
2876 
2877  if (shm_appl)
2878  {
2879  uw_shm_detach (shm_appl);
2880  shm_appl = NULL;
2881  }
2882 
2883  return -1;
2884 }
2885 
2886 static int
2888 {
2889  if (as_info->advance_activate_flag)
2890  {
2891  return -1;
2892  }
2893 
2894  return 1 * 60; /* 1 min */
2895 }
2896 
2897 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
2898 static void
2900 {
2901  int cur_isolation_level;
2902  int cur_lock_timeout;
2903  int isolation_level = as_info->isolation_level;
2904  int lock_timeout = as_info->lock_timeout;
2905 
2906  if (isolation_level == CAS_USE_DEFAULT_DB_PARAM)
2907  {
2908  isolation_level = cas_default_isolation_level;
2909  }
2910 
2911  if (lock_timeout == CAS_USE_DEFAULT_DB_PARAM)
2912  {
2913  lock_timeout = cas_default_lock_timeout;
2914  }
2915 
2916  ux_get_tran_setting (&cur_lock_timeout, &cur_isolation_level);
2917  if (cur_lock_timeout != lock_timeout)
2918  {
2919  ux_set_lock_timeout (lock_timeout);
2920 
2921  cas_log_write_and_end (0, false, "set_db_parameter lock_timeout %d", lock_timeout);
2922  }
2923 
2924  if (cur_isolation_level != isolation_level)
2925  {
2926  ux_set_isolation_level (isolation_level, NULL);
2927 
2928  cas_log_write_and_end (0, false, "set_db_parameter isolation_level %d", isolation_level);
2929  }
2930 }
2931 #endif /* !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL) */
2932 #endif /* !LIBCAS_FOR_JSP */
2933 
2934 int
2936 {
2937  return ++query_sequence_num;
2938 }
2939 
2940 int
2942 {
2943  return query_sequence_num;
2944 }
2945 
2948 {
2949  return req_info.client_version;
2950 }
void sql_log2_end(bool reset_filename_flag)
Definition: cas_sql_log2.c:118
FN_RETURN fn_get_generated_keys(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
FN_RETURN fn_close_req_handle(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
int net_write_from_file(SOCKET sock_fd, int file_size, char *filename)
Definition: cas_network.c:482
bool cas_default_ansi_quotes
Definition: cas.c:178
char database_name[SRV_CON_DBNAME_SIZE]
Definition: broker_shm.h:552
static int net_read_header_keep_con_on(SOCKET clt_sock_fd, MSG_HEADER *client_msg_header)
Definition: cas.c:2549
void db_set_interrupt(int set)
Definition: db_admin.c:1445
char database_name[SRV_CON_DBNAME_SIZE]
Definition: broker_shm.h:352
enum tran_auto_commit need_auto_commit
Definition: cas.h:77
T_BROKER_VERSION client_version
Definition: cas_net_buf.h:100
int cas_default_isolation_level
Definition: cas.c:176
int ut_set_keepalive(int sock)
Definition: broker_util.c:289
void cas_error_log_open(char *br_name)
Definition: cas_error_log.c:86
T_BROKER_VERSION client_version
Definition: cas.h:75
#define TRUE
Definition: broker_admin.c:49
void cas_ssl_close(int client_sock_fd)
Definition: cas_ssl.c:265
static SOCKET srv_sock_fd
Definition: cas.c:335
#define CAS_INFO_FLAG_MASK_FORCE_OUT_TRAN
Definition: cas_protocol.h:106
#define NET_BUF_ALLOC_SIZE
Definition: cas_net_buf.h:74
void ux_database_shutdown()
Definition: cas_execute.c:710
FN_RETURN fn_execute_batch(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
#define APPL_SERVER_CAS_MYSQL_NAME
FN_RETURN fn_not_supported(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
int con_status_before_check_cas
Definition: cas.c:172
int SOCKET
Definition: porting.h:482
static void cas_set_session_id(T_CAS_PROTOCOL protocol, char *session)
Definition: cas.c:358
#define SRV_CON_CLIENT_INFO_SIZE
Definition: cas_protocol.h:34
void ux_set_utype_for_datetimeltz(char u_type)
Definition: cas_execute.c:3494
FN_RETURN fn_oid(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
int max_prepared_stmt_count
Definition: broker_shm.h:623
#define SHARD_ID_UNSUPPORTED
Definition: cas_protocol.h:153
char stripped_column_name
Definition: cas.c:168
char db_name[MAX_DBNAME_LENGTH]
Definition: broker_shm.h:219
#define DRIVER_SESSION_SIZE
Definition: cas_protocol.h:130
void logddl_set_db_name(const char *db_name)
Definition: ddl_log.c:205
int ux_set_isolation_level(int new_isol_level, T_NET_BUF *net_buf)
Definition: cas_execute.c:2496
void set_hang_check_time(void)
Definition: cas.c:1488
SOCKET net_connect_proxy(void)
Definition: cas_network.c:172
int psize_at_start
Definition: cas.c:149
#define CAS_PROTO_VER_MASK
Definition: cas_protocol.h:293
int argc
Definition: dynamic_load.c:951
void unset_hang_check_time(void)
Definition: cas.c:1505
unsigned int htonl(unsigned int from)
#define CAS_CONNECTION_REPLY_SIZE
Definition: cas_protocol.h:134
char * ut_get_ipv4_string(char *ip_str, int len, const unsigned char *ip_addr)
Definition: broker_util.c:474
int restart_is_needed(void)
Definition: cas.c:2684
FN_RETURN fn_get_row_count(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_function.c:287
int parse_int(int *ret_p, const char *str_p, int base)
Definition: porting.c:2290
SESSION_ID db_get_session_id(void)
Definition: db_admin.c:2859
unsigned char cas_clt_ip[4]
Definition: broker_shm.h:323
#define BROKER_PATH_MAX
Definition: broker_config.h:91
SOCKET new_req_sock_fd
Definition: cas.c:174
void cas_slow_log_open(char *br_name)
Definition: cas_log.c:966
int access_control_check_right(T_SHM_APPL_SERVER *shm_as_p, char *dbname, char *dbuser, unsigned char *address)
Definition: broker_acl.c:401
T_BROKER_VERSION clt_version
Definition: broker_shm.h:303
time_t last_access_time
Definition: broker_shm.h:317
FN_RETURN fn_con_close(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
FN_RETURN fn_oid_put(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
char broker_name[BROKER_NAME_LEN]
Definition: cas.c:148
char cas_client_type
Definition: cas.c:169
FN_RETURN fn_cursor(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
char log_msg[SHM_LOG_MSG_SIZE]
Definition: broker_shm.h:342
int libcas_main(SOCKET fd)
FN_RETURN fn_prepare(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_function.c:302
#define SHARD_ERR(f, a...)
FN_RETURN fn_xa_prepare(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_xa.c:54
void cas_slow_log_write_and_end(struct timeval *log_time, unsigned int seq_num, const char *fmt,...)
Definition: cas_log.c:1062
char need_rollback
Definition: cas.h:78
#define CAS_LOG_RESET_REOPEN
Definition: broker_shm.h:122
FN_RETURN
Definition: cas_function.h:31
static char cas_db_user[SRV_CON_DBUSER_SIZE]
Definition: cas.c:139
#define NET_BUF_HEADER_MSG_SIZE
Definition: cas_net_buf.h:77
FN_RETURN fn_lob_write(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
int unusable_databases_cnt[PAIR_LIST]
Definition: broker_shm.h:627
FN_RETURN fn_get_db_version(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
static void set_cas_info_size(void)
Definition: cas.c:2668
#define UTS_STATUS_RESTART
Definition: broker_shm.h:47
#define CAS_VER_TO_MAJOR(VER)
Definition: cas_protocol.h:317
int net_write_header(SOCKET sock_fd, MSG_HEADER *header)
Definition: cas_network.c:347
#define IS_SSL_CLIENT(driver_info)
Definition: cas_protocol.h:40
char database_user[SRV_CON_DBUSER_SIZE]
Definition: broker_shm.h:354
#define CAS_CONNECTION_REPLY_SIZE_V3
Definition: cas_protocol.h:132
static int cas_init_shm(void)
Definition: cas.c:2815
#define FUNC_NEEDS_RESTORING_CON_STATUS(func_code)
Definition: cas.c:87
#define APPL_SERVER_SHM_KEY_STR
char * db_get_server_session_key(void)
Definition: db_admin.c:2849
void ux_set_default_setting()
Definition: cas_execute.c:686
char db_host[MAX_CONN_INFO_LENGTH]
Definition: broker_shm.h:220
FN_RETURN fn_xa_recover(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_xa.c:104
void logddl_set_jsp_mode(bool mode)
Definition: ddl_log.c:431
#define CON_STATUS_LOCK(AS_INFO, LOCK_OWNER)
Definition: broker_shm.h:106
#define UTS_STATUS_BUSY
Definition: broker_shm.h:45
#define CAS_INFO_SIZE
Definition: cas_protocol.h:109
int cas_send_result_flag
Definition: cas.c:182
#define SRV_CON_DBPASSWD_SIZE
Definition: cas_protocol.h:56
#define CAS_MAKE_VER(MAJOR, MINOR, PATCH)
Definition: cas_protocol.h:304
int net_read_header(SOCKET sock_fd, MSG_HEADER *header)
Definition: cas_network.c:329
T_DB_SERVER unusable_databases[PAIR_LIST][UNUSABLE_DATABASE_MAX]
Definition: broker_shm.h:643
void css_register_check_server_alive_fn(CSS_CHECK_SERVER_ALIVE_FN callback_fn)
static void clear_db_connection_info(void)
Definition: cas.c:2629
char broker_name[BROKER_NAME_LEN]
Definition: broker_shm.h:588
static int cas_init(void)
Definition: cas.c:2244
#define SRV_CON_DB_INFO_SIZE
Definition: cas_protocol.h:61
FN_RETURN fn_cursor_close(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
const char * cas_bi_get_broker_info(void)
Definition: cas_meta.c:52
#define INVALID_SOCKET
Definition: porting.h:483
int appl_server_hard_limit
Definition: broker_shm.h:612
void net_buf_clear(T_NET_BUF *net_buf)
Definition: cas_net_buf.c:66
void logddl_set_logging_enabled(bool enable)
Definition: ddl_log.c:995
void * cur_result
Definition: cas_handle.h:167
bool is_first_request
Definition: cas.c:173
char db_user[SRV_CON_DBUSER_SIZE]
Definition: broker_shm.h:221
INT64 query_cancel_time
Definition: cas.c:161
#define UTS_STATUS_IDLE
Definition: broker_shm.h:46
FN_RETURN fn_get_last_insert_id(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_function.c:294
FN_RETURN fn_make_out_rs(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
#define SRV_CON_DBNAME_SIZE
int er_init(const char *msglog_filename, int exit_ask)
#define NET_DEFAULT_TIMEOUT
Definition: cas_network.h:34
static int cas_main(void)
Definition: cas.c:785
#define SRV_CON_VER_STR_MAX_SIZE
Definition: cas_protocol.h:59
void logddl_write_end()
Definition: ddl_log.c:668
char cci_default_autocommit
Definition: broker_shm.h:572
void cas_log_error_handler_begin(void)
Definition: cas_execute.c:9733
#define CAS_INFO_RESERVED_DEFAULT
Definition: cas_protocol.h:110
int cas_info_size
Definition: cas.c:183
char cur_statement_pooling
Definition: broker_shm.h:313
#define FREE(PTR)
Definition: cas_common.h:56
FN_RETURN fn_deprecated(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
void net_buf_init(T_NET_BUF *net_buf, T_BROKER_VERSION client_version)
Definition: cas_net_buf.c:54
#define APPL_SERVER_CAS_ORACLE_NAME
char query_cancel_flag
Definition: cas.c:162
#define CAS_PROTO_CURRENT_VER
Definition: cas_protocol.h:286
char database_host[CUB_MAXHOSTNAMELEN]
Definition: broker_shm.h:553
void cas_bi_set_cci_pconnect(const char cci_pconnect)
Definition: cas_meta.c:103
void init_msg_header(MSG_HEADER *header)
Definition: cas_network.c:358
FN_RETURN fn_end_session(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_function.c:278
char db_password[SRV_CON_DBPASSWD_SIZE]
Definition: broker_shm.h:222
#define CON_STATUS_LOCK_CAS
Definition: broker_shm.h:73
int shm_proxy_id
Definition: cas.c:154
unsigned short cas_clt_port
Definition: broker_shm.h:324
FN_RETURN fn_xa_end_tran(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_xa.c:143
void hm_srv_handle_free(int h_id)
Definition: cas_handle.c:155
int cas_shard_flag
Definition: cas.c:143
void ux_set_utype_for_datetimetz(char u_type)
Definition: cas_execute.c:3482
int cas_access_log(struct timeval *start_time, int as_index, int client_ip_addr, char *dbname, char *dbuser, ACCESS_LOG_TYPE log_type)
Definition: cas_log.c:784
#define DOES_CLIENT_MATCH_THE_PROTOCOL(CLIENT, MATCH)
Definition: cas_protocol.h:289
unsigned int unusable_databases_seq
Definition: broker_shm.h:628
FN_RETURN fn_parameter_info(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
FN_RETURN fn_get_class_num_objs(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
#define UTS_STATUS_STOP
Definition: broker_shm.h:53
FN_RETURN fn_savepoint(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
static void set_db_parameter(void)
Definition: cas.c:2899
#define UTS_STATUS_CON_WAIT
Definition: broker_shm.h:52
#define CAS_VER_TO_PATCH(VER)
Definition: cas_protocol.h:319
#define assert(x)
void er_final(ER_FINAL_CODE do_global_final)
FN_RETURN fn_execute_array(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
char driver_info[SRV_CON_CLIENT_INFO_SIZE]
Definition: broker_shm.h:304
FN_RETURN fn_collection(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
char database_passwd[SRV_CON_DBPASSWD_SIZE]
Definition: broker_shm.h:355
static void cas_send_connect_reply_to_driver(T_CAS_PROTOCOL protocol, SOCKET client_sock_fd, char *cas_info)
Definition: cas.c:384
static void query_cancel(int signo)
Definition: cas.c:1674
int net_write_int(SOCKET sock_fd, int value)
Definition: cas_network.c:375
char * sql_log2_get_filename()
Definition: cas_sql_log2.c:84
static int net_read_process(SOCKET proxy_sock_fd, MSG_HEADER *client_msg_header, T_REQ_INFO *req_info)
Definition: cas.c:2271
int * msg_body_size_ptr
Definition: cas_network.h:270
#define SRV_CON_DB_INFO_SIZE_PRIOR_8_2_0
Definition: cas_protocol.h:67
T_SHM_APPL_SERVER * shm_appl
Definition: cas.c:152
int ux_end_session(void)
Definition: cas_execute.c:1070
SOCKET net_connect_client(SOCKET srv_sock_fd)
Definition: cas_network.c:260
void libcas_srv_handle_free(int h_id)
void uw_shm_detach(void *p)
Definition: broker_shm.c:700
#define IS_INVALID_SOCKET(socket)
Definition: porting.h:484
char cci_default_autocommit
Definition: broker_shm.h:356
#define CAS_USE_DEFAULT_DB_PARAM
Definition: cas_common.h:43
struct timeval query_start_time
Definition: cas.c:158
FN_RETURN fn_end_tran(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_function.c:155
static int query_sequence_num
Definition: cas.c:141
FN_RETURN fn_execute(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_function.c:415
char * envvar_bindir_file(char *path, size_t size, const char *filename)
void logddl_destroy()
Definition: ddl_log.c:185
T_ERROR_INFO err_info
Definition: cas.c:186
T_SRV_HANDLE * hm_find_srv_handle(int h_id)
Definition: cas_handle.c:144
time_t transaction_start_time
Definition: broker_shm.h:318
#define SRV_CON_URL_SIZE
Definition: cas_protocol.h:57
#define CAS_ERROR_INDICATOR
Definition: cas.h:39
FN_RETURN fn_fetch(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
char * data
Definition: cas_net_buf.h:96
bool is_server_aborted(void)
Definition: cas_error.c:234
#define MAX_HA_DBINFO_LENGTH
Definition: cas.h:46
static SOCKET proxy_sock_fd
Definition: broker.c:306
#define SRV_CON_DB_INFO_SIZE_PRIOR_8_4_0
Definition: cas_protocol.h:64
void ux_set_utype_for_timestampltz(char u_type)
Definition: cas_execute.c:3488
#define NULL
Definition: freelistheap.h:34
#define strncpy_bufsize(buf, str)
Definition: porting.h:340
bool ssl_client
Definition: cas_ssl.c:81
#define BROKER_NAME_LEN
Definition: broker_config.h:87
void logddl_set_br_index(const int index)
Definition: ddl_log.c:259
void net_buf_destroy(T_NET_BUF *net_buf)
Definition: cas_net_buf.c:75
int main(int argc, char *argv[])
Definition: cas.c:454
#define NET_BUF_CURR_SIZE(n)
Definition: cas_net_buf.h:79
void cas_log_debug(const char *file_name, const int line_no, const char *fmt,...)
Definition: cas_log.c:701
#define MALLOC(SIZE)
Definition: cas_common.h:53
#define FREE_MEM(PTR)
Definition: cas_common.h:58
enum t_cas_protocol T_CAS_PROTOCOL
Definition: cas_protocol.h:230
INT64 num_transactions_processed
Definition: broker_shm.h:344
FN_RETURN fn_lob_read(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
#define DB_EMPTY_SESSION
Definition: dbtype_def.h:483
bool is_xa_prepared(void)
Definition: cas_xa.c:273
bool cas_default_no_backslash_escapes
Definition: cas.c:180
int err_number
Definition: cas.h:85
static const char * server_func_name[]
Definition: cas.c:285
int net_read_int(SOCKET sock_fd, int *value)
Definition: cas_network.c:383
#define BROKER_INFO_SIZE
Definition: cas_protocol.h:116
ACCESS_LOG_TYPE
Definition: cas_log.h:29
void cas_bi_set_dbms_type(const char dbms_type)
Definition: cas_meta.c:58
void sql_log2_init(char *br_name, int index, int sql_log_value, bool log_reuse_flag)
Definition: cas_sql_log2.c:53
static void cas_free(bool from_sighandler)
Definition: cas.c:1584
int ux_auto_commit(T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_execute.c:9594
void set_cubrid_home()
char * db_name
char err_log_dir[CONF_LOG_FILE_LEN]
Definition: broker_shm.h:587
static int cas_req_count
Definition: cas.c:336
FN_RETURN fn_next_result(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
int shm_as_index
Definition: cas.c:151
static void cas_make_session_for_driver(char *out)
Definition: cas.c:342
static bool need_database_reconnect(void)
Definition: cas.c:2643
int ux_is_database_connected(void)
Definition: cas_execute.c:622
char database_host[CUB_MAXHOSTNAMELEN]
Definition: broker_shm.h:353
void as_db_err_log_set(char *br_name, int proxy_index, int shard_id, int shard_cas_id, int as_index, int shard_flag)
Definition: broker_util.c:401
void db_set_server_session_key(const char *key)
Definition: db_admin.c:2843
#define APPL_SERVER_CAS_NAME
void cas_log_write_client_ip(const unsigned char *ip_addr)
Definition: cas_log.c:686
#define BROKER_RENEWED_ERROR_CODE
Definition: cas_protocol.h:117
void cas_log_error_handler_clear(void)
Definition: cas_execute.c:9767
unsigned int session_id
Definition: broker_shm.h:377
struct timeval tran_start_time
Definition: cas.c:157
static void error(const char *msg)
Definition: gencat.c:331
FN_RETURN fn_set_db_parameter(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_function.c:897
void hm_srv_handle_free_all(bool free_holdable)
Definition: cas_handle.c:186
void cas_log_reset(char *br_name)
Definition: cas_log.c:211
char driver_info[SRV_CON_CLIENT_INFO_SIZE]
Definition: cas.h:76
void logddl_init()
Definition: ddl_log.c:119
#define SRV_CON_DBSESS_ID_SIZE
Definition: cas_protocol.h:58
int errors_in_transaction
Definition: cas.c:167
void logddl_set_br_name(const char *br_name)
Definition: ddl_log.c:250
static void cas_sig_handler(int signo)
Definition: cas.c:1562
void ux_set_lock_timeout(int lock_timeout)
Definition: cas_execute.c:2513
#define BROKER_SUPPORT_HOLDABLE_RESULT
Definition: cas_protocol.h:118
void as_pid_file_create(char *br_name, int as_index)
Definition: broker_util.c:385
bool check_server_alive(const char *db_name, const char *db_host)
Definition: cas.c:1517
#define ARG_FILE_LINE
Definition: error_manager.h:44
int net_write_stream(SOCKET sock_fd, const char *buf, int size)
Definition: cas_network.c:283
time_t last_connect_time
Definition: broker_shm.h:357
int shm_shard_id
Definition: cas.c:144
void cas_bi_set_statement_pooling(const char statement_pooling)
Definition: cas_meta.c:82
void cas_slow_log_reset(char *br_name)
Definition: cas_log.c:998
bool monitor_server_flag
Definition: broker_shm.h:630
INT64 num_requests_received
Definition: broker_shm.h:343
time_t claimed_alive_time
Definition: broker_shm.h:319
void logddl_set_pid(const int pid)
Definition: ddl_log.c:241
#define CAS_VER_TO_MINOR(VER)
Definition: cas_protocol.h:318
FN_RETURN fn_prepare_and_execute(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_function.c:776
void * libcas_get_db_result_set(int h_id)
static FN_RETURN process_request(SOCKET sock_fd, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas.c:1700
void cas_log_error_handler_end(void)
Definition: cas_execute.c:9756
const char ** argv
Definition: dynamic_load.c:952
#define SRV_CON_DBUSER_SIZE
Definition: cas_protocol.h:55
FN_RETURN fn_check_cas(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
int query_seq_num_current_value(void)
Definition: cas.c:2941
#define strlen(s1)
Definition: intl_support.c:43
static int cas_register_to_proxy(SOCKET proxy_sock_fd)
Definition: cas.c:2775
int net_decode_str(char *msg, int msg_size, char *func_code, void ***ret_argv)
Definition: cas_network.c:393
bool autocommit_deferred
Definition: cas.c:164
int alloc_size
Definition: cas_net_buf.h:94
void logddl_set_app_name(T_APP_NAME app_name)
Definition: ddl_log.c:196
unsigned int SESSION_ID
Definition: dbtype_def.h:480
int ux_database_connect(char *db_name, char *db_user, char *db_passwd, char **db_err_msg)
Definition: cas_execute.c:461
void css_register_server_timeout_fn(CSS_SERVER_TIMEOUT_FN callback_fn)
int T_BROKER_VERSION
Definition: cas_protocol.h:342
#define CON_STATUS_UNLOCK(AS_INFO, LOCK_OWNER)
Definition: broker_shm.h:109
int tran_timeout
Definition: cas.c:159
int query_timeout
Definition: cas.c:160
void ux_set_utype_for_timestamptz(char u_type)
Definition: cas_execute.c:3476
bool prm_get_bool_value(PARAM_ID prm_id)
T_BROKER_VERSION cas_get_client_version(void)
Definition: cas.c:2947
#define FALSE
Definition: broker_admin.c:50
T_APPL_SERVER_INFO * as_info
Definition: cas.c:153
FN_RETURN fn_get_db_parameter(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_function.c:804
#define CLOSE_SOCKET(X)
Definition: cas_common.h:85
#define CAS_PROTO_TO_VER_STR(MSG_P, VER)
Definition: cas_protocol.h:320
#define DOES_CLIENT_UNDERSTAND_THE_PROTOCOL(CLIENT, REQUIRE)
Definition: cas_protocol.h:290
static SOCKET sock_fd
Definition: broker.c:300
char driver_version[SRV_CON_VER_STR_MAX_SIZE]
Definition: broker_shm.h:305
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
void ut_get_as_port_name(char *port_name, char *broker_name, int as_id, int len)
Definition: broker_util.c:570
T_APPL_SERVER_INFO as_info[APPL_SERVER_NUM_LIMIT]
Definition: broker_shm.h:641
void ux_get_tran_setting(int *lock_wait, int *isol_level)
Definition: cas_execute.c:2476
#define ONE_K
Definition: porting.h:62
int i
Definition: dynamic_load.c:954
#define HEALTH_CHECK_DUMMY_DB
Definition: cas_protocol.h:156
Definition: cas.h:73
int ux_end_tran(int tran_type, bool reset_con_status)
Definition: cas_execute.c:984
static int net_read_int_keep_con_auto(SOCKET clt_sock_fd, MSG_HEADER *client_msg_header, T_REQ_INFO *req_info)
Definition: cas.c:2420
SOCKET net_init_env(char *port_name)
Definition: cas_network.c:90
void net_timeout_set(int timeout_sec)
Definition: cas_network.c:519
void error_info_clear(void)
Definition: cas_error.c:217
#define MAX_DIAG_DATA_VALUE
Definition: perf_monitor.h:50
#define SERVER_SESSION_KEY_SIZE
#define CAS_CONNECTION_REPLY_SIZE_PRIOR_PROTOCOL_V3
Definition: cas_protocol.h:131
static T_SERVER_FUNC server_fn_table[]
Definition: cas.c:236
char err_string[ERR_MSG_LENGTH]
Definition: cas.h:86
int getsize(int pid)
void ux_set_utype_for_json(char u_type)
Definition: cas_execute.c:3500
bool logddl_get_jsp_mode()
Definition: ddl_log.c:440
void logddl_set_user_name(const char *user_name)
Definition: ddl_log.c:223
void db_set_session_id(const SESSION_ID session_id)
Definition: db_admin.c:2870
int net_read_stream(SOCKET sock_fd, char *buf, int size)
Definition: cas_network.c:305
#define SLEEP_SEC(X)
Definition: cas_common.h:109
static char database_user[SRV_CON_DBUSER_SIZE]
Definition: cas_execute.c:388
_exit(1)
void set_cubrid_file(T_CUBRID_FILE_ID fid, char *value)
void cas_set_db_connect_status(int status)
Definition: cas_execute.c:9699
#define SHARD_NET_BUF_ALLOC_SIZE
Definition: cas_net_buf.h:75
unsigned int ntohl(unsigned int from)
int recv_fd(int fd, int *rid, char *driver_info)
char stripped_column_name
Definition: broker_shm.h:563
int cas_get_db_connect_status(void)
Definition: cas_execute.c:9705
static void set_db_connection_info(void)
Definition: cas.c:2607
void * uw_shm_open(int shm_key, int which_shm, T_SHM_MODE shm_mode)
Definition: broker_shm.c:139
void cas_log_close(bool flag)
Definition: cas_log.c:234
FN_RETURN fn_schema_info(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
int cas_default_lock_timeout
Definition: cas.c:177
char slow_log_dir[CONF_LOG_FILE_LEN]
Definition: broker_shm.h:586
static int shard_cas_main(void)
Definition: cas.c:504
#define CAS_INFO_FLAG_MASK_AUTOCOMMIT
Definition: cas_protocol.h:105
void cas_log_write2(const char *fmt,...)
Definition: cas_log.c:604
bool is_net_timed_out(void)
Definition: cas_network.c:699
int query_seq_num_next_value(void)
Definition: cas.c:2935
const char * program_name
Definition: cas.c:147
int err_indicator
Definition: cas.h:84
void cas_slow_log_close()
Definition: cas_log.c:1021
static T_REQ_INFO req_info
Definition: cas.c:333
#define makestring(x)
FN_RETURN fn_oid_get(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
static char cas_db_passwd[SRV_CON_DBPASSWD_SIZE]
Definition: cas.c:140
#define AS_ID_ENV_STR
char log_dir[CONF_LOG_FILE_LEN]
Definition: broker_shm.h:585
static char cas_db_name[MAX_HA_DBINFO_LENGTH]
Definition: cas.c:138
FN_RETURN fn_get_query_info(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
static const int DEFAULT_CHECK_INTERVAL
Definition: cas.c:85
T_SHARD_CONN_INFO shard_conn_info[SHARD_INFO_SIZE_LIMIT]
Definition: broker_shm.h:639
int cas_init_ssl(int)
Definition: cas_ssl.c:86
static int get_graceful_down_timeout(void)
Definition: cas.c:2887
void logddl_set_ip(const char *ip_addr)
Definition: ddl_log.c:232
FN_RETURN fn_cursor_update(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
#define CAS_PID_SIZE
Definition: cas_protocol.h:128
void cas_log_open(char *br_name)
Definition: cas_log.c:163
FN_RETURN fn_set_cas_change_mode(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_function.c:989
#define SESSION_ID_SIZE
Definition: cas_protocol.h:129
#define NET_MIN_TIMEOUT
Definition: cas_network.h:33
FN_RETURN fn_lob_new(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
INT64 num_connect_rejected
Definition: broker_shm.h:359
const char ** p
Definition: dynamic_load.c:945
char prev_cas_info[CAS_INFO_SIZE]
Definition: cas.c:184
FN_RETURN fn_get_attr_type_str(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
FN_RETURN(* T_SERVER_FUNC)(SOCKET, int, void **, T_NET_BUF *, T_REQ_INFO *)
Definition: cas_function.h:39
void net_write_error(SOCKET sock, int version, char *driver_info, char *cas_info, int cas_info_size, int indicator, int code, char *msg)
Definition: cas_network.c:717
static void cas_final(void)
Definition: cas.c:1572
int shm_shard_cas_id
Definition: cas.c:155
char * info_ptr
Definition: cas_network.h:271
void logddl_set_start_time(struct timeval *time_val)
Definition: ddl_log.c:370
int hm_srv_handle_get_current_count(void)
Definition: cas_handle.c:494
void ux_set_utype_for_enum(char u_type)
Definition: cas_execute.c:3470
void cas_error_log_close(bool flag)
#define SHM_APPL_SERVER
Definition: broker_shm.h:63