CUBRID Engine  latest
cas_function.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_function.c -
22  */
23 
24 #ident "$Id$"
25 
26 #include <stdio.h>
27 #include <stdlib.h>
28 
29 #if defined(WINDOWS)
30 #include <winsock2.h>
31 #include <windows.h>
32 #include <sys/timeb.h>
33 #include <process.h>
34 #else
35 #include <unistd.h>
36 #include <sys/time.h>
37 #endif
38 #include <assert.h>
39 
40 #include "error_manager.h"
41 
42 #include "cas_common.h"
43 #include "cas.h"
44 #include "cas_function.h"
45 #include "cas_network.h"
46 #include "cas_net_buf.h"
47 #include "cas_log.h"
48 #include "cas_handle.h"
49 #include "cas_util.h"
50 #include "cas_execute.h"
51 
52 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
53 #include "cas_error_log.h"
54 #else
55 #include "perf_monitor.h"
56 #endif /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
57 
58 #include "broker_filename.h"
59 #include "cas_sql_log2.h"
60 #include "dbtype.h"
61 #include "object_primitive.h"
62 #include "ddl_log.h"
63 
65  int *ret_srv_h_id);
67  int *prepared_srv_h_id);
68 static const char *get_schema_type_str (int schema_type);
69 static const char *get_tran_type_str (int tran_type);
70 static void bind_value_print (char type, void *net_value, bool slow_log);
71 static char *get_error_log_eids (int err);
72 #ifndef LIBCAS_FOR_JSP
73 static void bind_value_log (struct timeval *log_time, int start, int argc, void **argv, int param_size,
74  char *param_mode, unsigned int query_seq_num, bool slow_log);
75 #endif /* !LIBCAS_FOR_JSP */
76 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
77 void set_query_timeout (T_SRV_HANDLE * srv_handle, int query_timeout);
78 
79 extern int jsp_send_destroy_request_all ();
80 
81 /* functions implemented in transaction_cl.c */
82 extern void tran_set_query_timeout (int);
83 #ifndef LIBCAS_FOR_JSP
84 extern bool tran_is_in_libcas (void);
85 #endif /* !LIBCAS_FOR_JSP */
86 #endif
87 
88 static void update_error_query_count (T_APPL_SERVER_INFO * as_info_p, const T_ERROR_INFO * err_info_p);
89 
90 static const char *tran_type_str[] = { "COMMIT", "ROLLBACK" };
91 
92 static char logddl_is_exist_ddl_stmt (T_SRV_HANDLE * srv_handle);
93 
94 static const char *schema_type_str[] = {
95  "CLASS",
96  "VCLASS",
97  "QUERY_SPEC",
98  "ATTRIBUTE",
99  "CLASS_ATTRIBUTE",
100  "METHOD",
101  "CLASS_METHOD",
102  "METHOD_FILE",
103  "SUPERCLASS",
104  "SUBCLASS",
105  "CONSTRAINT",
106  "TRIGGER",
107  "CLASS_PRIVILEGE",
108  "ATTR_PRIVILEGE",
109  "DIRECT_SUPER_CLASS",
110  "PRIMARY_KEY",
111  "IMPORTED_KEYS",
112  "EXPORTED_KEYS",
113  "CROSS_REFERENCE"
114 };
115 
116 static const char *type_str_tbl[] = {
117  "NULL", /* CCI_U_TYPE_NULL */
118  "CHAR", /* CCI_U_TYPE_CHAR */
119  "VARCHAR", /* CCI_U_TYPE_STRING */
120  "NCHAR", /* CCI_U_TYPE_NCHAR */
121  "VARNCHAR", /* CCI_U_TYPE_VARNCHAR */
122  "BIT", /* CCI_U_TYPE_BIT */
123  "VARBIT", /* CCI_U_TYPE_VARBIT */
124  "NUMERIC", /* CCI_U_TYPE_NUMERIC */
125  "INT", /* CCI_U_TYPE_INT */
126  "SHORT", /* CCI_U_TYPE_SHORT */
127  "MONETARY", /* CCI_U_TYPE_MONETARY */
128  "FLOAT", /* CCI_U_TYPE_FLOAT */
129  "DOUBLE", /* CCI_U_TYPE_DOUBLE */
130  "DATE", /* CCI_U_TYPE_DATE */
131  "TIME", /* CCI_U_TYPE_TIME */
132  "TIMESTAMP", /* CCI_U_TYPE_TIMESTAMP */
133  "SET", /* CCI_U_TYPE_SET */
134  "MULTISET", /* CCI_U_TYPE_MULTISET */
135  "SEQUENCE", /* CCI_U_TYPE_SEQUENCE */
136  "OBJECT", /* CCI_U_TYPE_OBJECT */
137  "RESULTSET", /* CCI_U_TYPE_RESULTSET */
138  "BIGINT", /* CCI_U_TYPE_BIGINT */
139  "DATETIME", /* CCI_U_TYPE_DATETIME */
140  "BLOB", /* CCI_U_TYPE_BLOB */
141  "CLOB", /* CCI_U_TYPE_CLOB */
142  "ENUM", /* CCI_U_TYPE_ENUM */
143  "USHORT", /* CCI_U_TYPE_USHORT */
144  "UINT", /* CCI_U_TYPE_UINT */
145  "UBIGINT", /* CCI_U_TYPE_UBIGINT */
146  "TIMESTAMPTZ", /* CCI_U_TYPE_TIMESTAMPTZ */
147  "TIMESTAMPLTZ", /* CCI_U_TYPE_TIMESTAMPLTZ */
148  "DATETIMETZ", /* CCI_U_TYPE_DATETIMETZ */
149  "DATETIMELTZ", /* CCI_U_TYPE_DATETIMELTZ */
150  "TIMETZ", /* CCI_U_TYPE_TIMETZ */
151  "JSON", /* CCI_U_TYPE_JSON */
152 };
153 
154 FN_RETURN
156 {
157  int tran_type;
158  int err_code;
159  int elapsed_sec = 0, elapsed_msec = 0;
160  struct timeval end_tran_begin, end_tran_end;
161 #ifndef LIBCAS_FOR_JSP
162  int timeout;
163 #endif /* !LIBCAS_FOR_JSP */
164 
165  if (argc < 1)
166  {
168  NET_BUF_ERR_SET (net_buf);
169  return FN_KEEP_CONN;
170  }
171 
172  net_arg_get_char (tran_type, argv[0]);
173  if (tran_type != CCI_TRAN_COMMIT && tran_type != CCI_TRAN_ROLLBACK)
174  {
176  NET_BUF_ERR_SET (net_buf);
177  return FN_KEEP_CONN;
178  }
179 
180  cas_log_write (0, false, "end_tran %s", get_tran_type_str (tran_type));
181 
182  gettimeofday (&end_tran_begin, NULL);
183 
184  err_code = ux_end_tran ((char) tran_type, false);
185 
186  if ((tran_type == CCI_TRAN_ROLLBACK) && (req_info->client_version < CAS_MAKE_VER (8, 2, 0)))
187  {
188  /* For backward compatibility */
190  }
191 
192  gettimeofday (&end_tran_end, NULL);
193  ut_timeval_diff (&end_tran_begin, &end_tran_end, &elapsed_sec, &elapsed_msec);
194 
195  cas_log_write (0, false, "end_tran %s%d time %d.%03d%s", err_code < 0 ? "error:" : "", err_info.err_number,
196  elapsed_sec, elapsed_msec, get_error_log_eids (err_info.err_number));
197 
198  logddl_write_tran_str ("end_tran %s%d %s", err_code < 0 ? "error:" : "", err_info.err_number,
199  get_tran_type_str (tran_type));
200 
201  if (err_code < 0)
202  {
203  NET_BUF_ERR_SET (net_buf);
204  req_info->need_rollback = TRUE;
205  }
206  else
207  {
208  net_buf_cp_int (net_buf, 0, NULL);
209  req_info->need_rollback = FALSE;
210  }
211 
212 #ifndef LIBCAS_FOR_JSP
213  timeout =
214  ut_check_timeout (&tran_start_time, &end_tran_end, shm_appl->long_transaction_time, &elapsed_sec, &elapsed_msec);
215  if (timeout >= 0)
216  {
219  }
220  if (err_code < 0 || errors_in_transaction > 0)
221  {
222  cas_log_end (SQL_LOG_MODE_ERROR, elapsed_sec, elapsed_msec);
224  }
225  else
226  {
227  if (timeout >= 0 || query_timeout >= 0)
228  {
229  cas_log_end (SQL_LOG_MODE_TIMEOUT, elapsed_sec, elapsed_msec);
230  }
231  else
232  {
233  cas_log_end (SQL_LOG_MODE_NONE, elapsed_sec, elapsed_msec);
234  }
235  }
236 
237  gettimeofday (&tran_start_time, NULL);
238  gettimeofday (&query_start_time, NULL);
239  tran_timeout = 0;
240  query_timeout = 0;
241 
244  as_info->transaction_start_time = (time_t) 0;
245  if (as_info->cas_log_reset)
246  {
248  }
250  {
252  }
254  {
255  sql_log2_end (false);
258  }
259 
260  if (!ux_is_database_connected ())
261  {
262  cas_log_debug (ARG_FILE_LINE, "fn_end_tran: !ux_is_database_connected()");
263  return FN_CLOSE_CONN;
264  }
265  else if (restart_is_needed () || as_info->reset_flag == TRUE)
266  {
267  cas_log_debug (ARG_FILE_LINE, "fn_end_tran: restart_is_needed() || reset_flag");
268  return FN_KEEP_SESS;
269  }
270  return FN_KEEP_CONN;
271 #endif /* !LIBCAS_FOR_JSP */
272 
273  return FN_CLOSE_CONN;
274 }
275 
276 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
277 FN_RETURN
279 {
280  /* ignore all request to close session from drivers */
281  net_buf_cp_int (net_buf, NO_ERROR, NULL);
282 
283  return FN_KEEP_CONN;
284 }
285 
286 FN_RETURN
288 {
289  ux_get_row_count (net_buf);
290  return FN_KEEP_CONN;
291 }
292 
293 FN_RETURN
295 {
296  ux_get_last_insert_id (net_buf);
297  return FN_KEEP_CONN;
298 }
299 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
300 
301 FN_RETURN
303 {
304  return (fn_prepare_internal (sock_fd, argc, argv, net_buf, req_info, NULL));
305 }
306 
307 
308 static FN_RETURN
310  int *ret_srv_h_id)
311 {
312  char *sql_stmt;
313  char flag;
314  char auto_commit_mode;
315  int sql_size;
316  int srv_h_id;
317  T_SRV_HANDLE *srv_handle;
318  int i;
319 
320  if (argc < 2)
321  {
323  NET_BUF_ERR_SET (net_buf);
324  return FN_KEEP_CONN;
325  }
326 
327  net_arg_get_str (&sql_stmt, &sql_size, argv[0]);
328 
329  logddl_set_sql_text (sql_stmt, (int) strlen (sql_stmt));
330 
331  net_arg_get_char (flag, argv[1]);
332  if (argc > 2)
333  {
334  net_arg_get_char (auto_commit_mode, argv[2]);
335  if (cas_shard_flag == OFF)
336  {
337  for (i = 3; i < argc; i++)
338  {
339  int deferred_close_handle;
340  net_arg_get_int (&deferred_close_handle, argv[i]);
341  cas_log_write (0, true, "close_req_handle srv_h_id %d", deferred_close_handle);
342  hm_srv_handle_free (deferred_close_handle);
343  }
344  }
345  }
346  else
347  {
348  auto_commit_mode = FALSE;
349  }
350 
351  logddl_set_commit_mode (auto_commit_mode);
352 
353 #if 0
354  ut_trim (sql_stmt);
355 #endif
356 
357 #ifndef LIBCAS_FOR_JSP
358  gettimeofday (&query_start_time, NULL);
359  query_timeout = 0;
360 #endif /* !LIBCAS_FOR_JSP */
361 
362  cas_log_write_nonl (query_seq_num_next_value (), false, "prepare %d ", flag);
363  cas_log_write_query_string (sql_stmt, sql_size - 1);
364 
365 #ifndef LIBCAS_FOR_JSP
366  SQL_LOG2_COMPILE_BEGIN (as_info->cur_sql_log2, ((const char *) sql_stmt));
367 
368  /* append query string to as_info->log_msg */
369  if (sql_stmt)
370  {
371  char *s, *t;
372  size_t l;
373 
374  for (s = as_info->log_msg, l = 0; *s && l < SHM_LOG_MSG_SIZE - 1; s++, l++)
375  {
376  /* empty body */
377  }
378  *s++ = ' ';
379  l++;
380  for (t = sql_stmt; *t && l < SHM_LOG_MSG_SIZE - 1; s++, t++, l++)
381  {
382  *s = *t;
383  }
384  *s = '\0';
385  }
386 #endif
387 
388  srv_h_id = ux_prepare (sql_stmt, flag, auto_commit_mode, net_buf, req_info, query_seq_num_current_value ());
389 
390  if (ret_srv_h_id != NULL)
391  {
392  /* this ret_srv_h_id used by following fn_execute_internal() function */
393  *ret_srv_h_id = srv_h_id;
394  }
395 
396  srv_handle = hm_find_srv_handle (srv_h_id);
397 
398  cas_log_write (query_seq_num_current_value (), false, "prepare srv_h_id %s%d%s%s", (srv_h_id < 0) ? "error:" : "",
399  (srv_h_id < 0) ? err_info.err_number : srv_h_id, (srv_handle != NULL
400  && srv_handle->use_plan_cache) ? " (PC)" : "",
403 
404 #ifndef LIBCAS_FOR_JSP
405  if (srv_h_id < 0)
406  {
408  }
409 #endif /* !LIBCAS_FOR_JSP */
410 
411  return FN_KEEP_CONN;
412 }
413 
414 FN_RETURN
416 {
417  FN_RETURN ret = fn_execute_internal (sock_fd, argc, argv, net_buf, req_info, NULL);
418 
419  return ret;
420 }
421 
422 static FN_RETURN
424  int *prepared_srv_h_id)
425 {
426  int srv_h_id;
427  char flag;
428  int max_col_size;
429  int bind_value_index;
430  int max_row = 0;
431  int ret_code;
432  int param_mode_size = 0;
433  char forward_only_cursor = 0;
434  char auto_commit_mode = 0;
435  char *param_mode = NULL;
436  T_SRV_HANDLE *srv_handle;
437  const char *exec_func_name;
438  int argc_mod_2;
439  int (*ux_exec_func) (T_SRV_HANDLE *, char, int, int, int, void **, T_NET_BUF *, T_REQ_INFO *, CACHE_TIME *, int *);
440  char fetch_flag = 0;
441  CACHE_TIME clt_cache_time, *clt_cache_time_ptr;
442  int client_cache_reusable = FALSE;
443  int elapsed_sec = 0, elapsed_msec = 0;
444  struct timeval exec_begin, exec_end;
445  int app_query_timeout;
446  bool client_supports_query_timeout = false;
447  char *eid_string;
448  int err_number_execute;
449  int arg_idx = 0;
450  char stmt_type = -1;
451 
452 #ifndef LIBCAS_FOR_JSP
453 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
454  char *plan = NULL;
455 #endif
456 #endif
457 
458  bind_value_index = 9;
459  /*
460  * query timeout is transferred from a driver only if protocol version 1
461  * or above.
462  */
463  if (req_info->client_version >= CAS_PROTO_MAKE_VER (PROTOCOL_V1))
464  {
465  client_supports_query_timeout = true;
466  bind_value_index++;
467  }
468 
469  argc_mod_2 = bind_value_index % 2;
470 
471  if ((argc < bind_value_index) || (argc % 2 != argc_mod_2))
472  {
474  NET_BUF_ERR_SET (net_buf);
475  return FN_KEEP_CONN;
476  }
477 
478  if (prepared_srv_h_id != NULL)
479  {
480  srv_h_id = *prepared_srv_h_id;
481  }
482  else
483  {
484  net_arg_get_int (&srv_h_id, argv[arg_idx++]);
485  }
486  srv_handle = hm_find_srv_handle (srv_h_id);
487 
488 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
489  if (srv_handle == NULL)
490 #else /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
491  if (srv_handle == NULL || srv_handle->schema_type >= CCI_SCH_FIRST)
492 #endif /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
493  {
495  NET_BUF_ERR_SET (net_buf);
496  return FN_KEEP_CONN;
497  }
498 
499 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
500  srv_handle->next_cursor_pos = 1;
501 #endif
502 
503  net_arg_get_char (flag, argv[arg_idx++]);
504  net_arg_get_int (&max_col_size, argv[arg_idx++]);
505  net_arg_get_int (&max_row, argv[arg_idx++]);
506  net_arg_get_str (&param_mode, &param_mode_size, argv[arg_idx++]);
507  if (prepared_srv_h_id != NULL)
508  {
509 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
510  if (srv_handle->stmt_type == CUBRID_STMT_SELECT)
511 #else
512  if (srv_handle->q_result->stmt_type == CUBRID_STMT_SELECT)
513 #endif
514  {
515  fetch_flag = 1;
516  }
517  else
518  {
519  fetch_flag = 0;
520  }
521 
522  if (srv_handle->auto_commit_mode != 0)
523  {
524  auto_commit_mode = true;
525  forward_only_cursor = true;
526  }
527  else
528  {
529  auto_commit_mode = false;
530  forward_only_cursor = false;
531  }
532  }
533  else
534  {
535  /* PROTOCOL_V2 is used only 9.0.0 */
537  {
538 #if defined(CAS_FOR_ORACLE)
539  if (srv_handle->stmt_type == CUBRID_STMT_SELECT)
540 #elif defined(CAS_FOR_MYSQL)
541  if (srv_handle->stmt_type == CUBRID_STMT_SELECT || srv_handle->stmt_type == CUBRID_STMT_CALL_SP)
542 #else
543  if (srv_handle->q_result->stmt_type == CUBRID_STMT_SELECT)
544 #endif
545  {
546  fetch_flag = 1;
547  }
548  else
549  {
550  fetch_flag = 0;
551  }
552 
553  arg_idx++; /* skip fetch_flag from driver */
554  }
555  else
556  {
557  net_arg_get_char (fetch_flag, argv[arg_idx++]);
558  }
559 
560  net_arg_get_char (auto_commit_mode, argv[arg_idx++]);
561  net_arg_get_char (forward_only_cursor, argv[arg_idx++]);
562  }
563 
564  clt_cache_time_ptr = &clt_cache_time;
565  net_arg_get_cache_time (clt_cache_time_ptr, argv[arg_idx++]);
566 
567  if (client_supports_query_timeout == true)
568  {
569  net_arg_get_int (&app_query_timeout, argv[arg_idx++]);
570 
572  {
573  /* protocol version v1 driver send query timeout in second */
574  app_query_timeout *= 1000;
575  }
576  }
577  else
578  {
579  app_query_timeout = 0;
580  }
581 
582 #ifndef LIBCAS_FOR_JSP
583  if (shm_appl->max_string_length >= 0)
584  {
585  if (max_col_size <= 0 || max_col_size > shm_appl->max_string_length)
586  max_col_size = shm_appl->max_string_length;
587  }
588 #endif /* LIBCAS_FOR_JSP */
589 
590 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
591  set_query_timeout (srv_handle, app_query_timeout);
592 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
593 
594  srv_handle->auto_commit_mode = auto_commit_mode;
595  srv_handle->forward_only_cursor = forward_only_cursor;
596  logddl_set_commit_mode (auto_commit_mode);
597 
598  if (srv_handle->prepare_flag & CCI_PREPARE_CALL)
599  {
600  exec_func_name = "execute_call";
601  ux_exec_func = ux_execute_call;
602 #if !defined(CAS_FOR_MYSQL)
603  if (param_mode)
604  {
605  ux_call_info_cp_param_mode (srv_handle, param_mode, param_mode_size);
606  }
607 #endif /* !CAS_FOR_MYSQL */
608  }
609  else if (flag & CCI_EXEC_QUERY_ALL)
610  {
611  exec_func_name = "execute_all";
612  ux_exec_func = ux_execute_all;
613  }
614  else
615  {
616  exec_func_name = "execute";
617  ux_exec_func = ux_execute;
618  }
619 
620 #ifndef LIBCAS_FOR_JSP
621  if (srv_handle->is_pooled)
622  {
623  gettimeofday (&query_start_time, NULL);
624  query_timeout = 0;
625  }
626 #endif /* !LIBCAS_FOR_JSP */
627 
628  cas_log_write_nonl (SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false, "%s srv_h_id %d ", exec_func_name, srv_h_id);
629  if (srv_handle->sql_stmt != NULL)
630  {
631  cas_log_write_query_string (srv_handle->sql_stmt, (int) strlen (srv_handle->sql_stmt));
632  logddl_set_sql_text (srv_handle->sql_stmt, (int) strlen (srv_handle->sql_stmt));
633  }
634  cas_log_debug (ARG_FILE_LINE, "%s%s", auto_commit_mode ? "auto_commit_mode " : "",
635  forward_only_cursor ? "forward_only_cursor " : "");
636 
637 #ifndef LIBCAS_FOR_JSP
639  {
640  bind_value_log (NULL, bind_value_index, argc, argv, param_mode_size, param_mode,
641  SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false);
642  }
643 #endif /* !LIBCAS_FOR_JSP */
644 
645 #ifndef LIBCAS_FOR_JSP
646  /* append query string to as_info->log_msg */
647  if (srv_handle->sql_stmt)
648  {
649  char *s, *t;
650  size_t l;
651 
652  for (s = as_info->log_msg, l = 0; *s && l < SHM_LOG_MSG_SIZE - 1; s++, l++)
653  {
654  /* empty body */
655  }
656  *s++ = ' ';
657  l++;
658  for (t = srv_handle->sql_stmt; *t && l < SHM_LOG_MSG_SIZE - 1; s++, t++, l++)
659  {
660  *s = *t;
661  }
662  *s = '\0';
663  }
664 #endif /* !LIBCAS_FOR_JSP */
665 
666  gettimeofday (&exec_begin, NULL);
667 
668  ret_code =
669  (*ux_exec_func) (srv_handle, flag, max_col_size, max_row, argc - bind_value_index, argv + bind_value_index, net_buf,
670  req_info, clt_cache_time_ptr, &client_cache_reusable);
671  gettimeofday (&exec_end, NULL);
672  ut_timeval_diff (&exec_begin, &exec_end, &elapsed_sec, &elapsed_msec);
673  eid_string = get_error_log_eids (err_info.err_number);
674  err_number_execute = err_info.err_number;
676 
677  if (fetch_flag && ret_code >= 0 && client_cache_reusable == FALSE)
678  {
679 #if defined(CAS_FOR_MYSQL)
680  if (srv_handle->stmt_type == CUBRID_STMT_SELECT)
681  {
682 #endif /* CAS_FOR_MYSQL */
683  ux_fetch (srv_handle, 1, 50, 0, 0, net_buf, req_info);
684 #if defined(CAS_FOR_MYSQL)
685  }
686 #endif /* CAS_FOR_MYSQL */
687  }
688 
689  cas_log_write (SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false, "%s %s%d tuple %d time %d.%03d%s%s%s", exec_func_name,
690  (ret_code < 0) ? "error:" : "", err_number_execute, get_tuple_count (srv_handle), elapsed_sec,
691  elapsed_msec, (client_cache_reusable == TRUE) ? " (CC)" : "",
692  (srv_handle->use_query_cache == true) ? " (QC)" : "", eid_string);
693 
694  if (strcmp (exec_func_name, "execute_call") != 0)
695  {
696  stmt_type = logddl_is_exist_ddl_stmt (srv_handle);
697  logddl_set_stmt_type (stmt_type);
698  }
699 
700 #ifndef LIBCAS_FOR_JSP
701 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
702  plan = db_get_execution_plan ();
703 #endif
704 
705  query_timeout =
706  ut_check_timeout (&query_start_time, &exec_end, shm_appl->long_query_time, &elapsed_sec, &elapsed_msec);
707  if (query_timeout >= 0 || ret_code < 0)
708  {
709  if (query_timeout >= 0)
710  {
713  }
714 
715  if (ret_code < 0)
716  {
718  }
719 
721  {
722  cas_slow_log_write (&query_start_time, SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false, "%s srv_h_id %d ",
723  exec_func_name, srv_h_id);
724  if (srv_handle->sql_stmt != NULL)
725  {
726  cas_slow_log_write_query_string (srv_handle->sql_stmt, (int) strlen (srv_handle->sql_stmt));
727  bind_value_log (&query_start_time, bind_value_index, argc, argv, param_mode_size, param_mode,
728  SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), true);
729  }
730  cas_slow_log_write (NULL, SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false,
731  "%s %s%d tuple %d time %d.%03d%s%s%s\n", exec_func_name, (ret_code < 0) ? "error:" : "",
732  err_number_execute, get_tuple_count (srv_handle), elapsed_sec, elapsed_msec,
733  (client_cache_reusable == TRUE) ? " (CC)" : "",
734  (srv_handle->use_query_cache == true) ? " (QC)" : "", eid_string);
735 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
736  if (plan != NULL && plan[0] != '\0')
737  {
738  cas_slow_log_write (NULL, 0, false, "slow query plan\n%s", plan);
739  }
740 #endif
741  cas_slow_log_end ();
742  }
743  }
744 #endif /* !LIBCAS_FOR_JSP */
745 
746 #ifndef LIBCAS_FOR_JSP
747  /* set is_pooled */
749  {
750  srv_handle->is_pooled = TRUE;
751  }
752 
753 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
754  if (plan != NULL && plan[0] != '\0')
755  {
756  cas_log_write (0, true, "slow query plan\n%s", plan);
757 
758  /* reset global plan buffer */
760  }
761 #endif
762 
763 #endif /* !LIBCAS_FOR_JSP */
764 
765 /* destroy JDBC resources in stored procedure */
766  if (req_info->driver_info[DRIVER_INFO_CLIENT_TYPE] != CAS_CLIENT_SERVER_SIDE_JDBC)
767  {
769  }
770 
771  return FN_KEEP_CONN;
772 }
773 
774 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
775 FN_RETURN
777 {
778  int prepare_argc_count;
779  int srv_h_id;
780  T_SRV_HANDLE *srv_handle;
781 
782  net_arg_get_int (&prepare_argc_count, argv[0]);
783 
784  fn_prepare_internal (sock_fd, prepare_argc_count, argv + 1, net_buf, req_info, &srv_h_id);
785  if (IS_ERROR_INFO_SET ())
786  {
787  goto prepare_and_execute_end;
788  }
789 
790  /* execute argv begins at prepare argv + 1 + prepare_argc_count */
791  fn_execute_internal (sock_fd, 10, argv + 1 + prepare_argc_count, net_buf, req_info, &srv_h_id);
792  if (IS_ERROR_INFO_SET ())
793  {
794  srv_handle = hm_find_srv_handle (srv_h_id);
795  cas_log_write (SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false, "close_req_handle srv_h_id %d", srv_h_id);
796  hm_srv_handle_free (srv_h_id);
797  }
798 
799 prepare_and_execute_end:
800  return FN_KEEP_CONN;
801 }
802 
803 FN_RETURN
805 {
806  int param_name;
807 
808  if (argc < 1)
809  {
811  NET_BUF_ERR_SET (net_buf);
812  return FN_KEEP_CONN;
813  }
814 
815  net_arg_get_int (&param_name, argv[0]);
816 
817  if (param_name == CCI_PARAM_ISOLATION_LEVEL)
818  {
819  int isol_level;
820 
821  ux_get_tran_setting (NULL, &isol_level);
822  cas_log_write (0, true, "get_db_parameter isolation_level %d", isol_level);
823 
824  net_buf_cp_int (net_buf, 0, NULL); /* res code */
825  net_buf_cp_int (net_buf, isol_level, NULL); /* res msg */
826  }
827  else if (param_name == CCI_PARAM_LOCK_TIMEOUT)
828  {
829  int lock_timeout;
830  char lock_timeout_string[32];
831 
832  ux_get_tran_setting (&lock_timeout, NULL);
833 
834  if (lock_timeout == 0)
835  {
836  sprintf (lock_timeout_string, "0 (No wait)");
837  }
838  else if (lock_timeout == -1)
839  {
840  sprintf (lock_timeout_string, "-1 (Infinite wait)");
841  }
842  else
843  {
844  sprintf (lock_timeout_string, "%d ms", lock_timeout);
845  }
846 
847  cas_log_write (0, true, "get_db_parameter lock_timeout %s", lock_timeout_string);
848 
849  net_buf_cp_int (net_buf, 0, NULL);
851  {
852  if (lock_timeout > 0)
853  {
854  /* protocol version v1 driver receive lock timeout in second */
855  lock_timeout /= 1000;
856  }
857  }
858  net_buf_cp_int (net_buf, lock_timeout, NULL);
859  }
860  else if (param_name == CCI_PARAM_MAX_STRING_LENGTH)
861  {
862 #ifndef LIBCAS_FOR_JSP
863  int max_str_len = shm_appl->max_string_length;
864 #else /* !LIBCAS_FOR_JSP */
865  int max_str_len = DB_MAX_STRING_LENGTH;
866 #endif /* !LIBCAS_FOR_JSP */
867 
868  net_buf_cp_int (net_buf, 0, NULL);
869  if (max_str_len <= 0 || max_str_len > DB_MAX_STRING_LENGTH)
870  max_str_len = DB_MAX_STRING_LENGTH;
871  net_buf_cp_int (net_buf, max_str_len, NULL);
872  }
873  else if (param_name == CCI_PARAM_NO_BACKSLASH_ESCAPES)
874  {
875  int no_backslash_escapes;
876 
877  no_backslash_escapes =
878  ((cas_default_no_backslash_escapes == true) ? CCI_NO_BACKSLASH_ESCAPES_TRUE : CCI_NO_BACKSLASH_ESCAPES_FALSE);
879 
880  cas_log_write (0, true, "get_db_parameter no_backslash_escapes %s",
881  (cas_default_no_backslash_escapes ? "true" : "false"));
882 
883  net_buf_cp_int (net_buf, 0, NULL);
884  net_buf_cp_int (net_buf, no_backslash_escapes, NULL);
885  }
886  else
887  {
889  NET_BUF_ERR_SET (net_buf);
890  return FN_KEEP_CONN;
891  }
892 
893  return FN_KEEP_CONN;
894 }
895 
896 FN_RETURN
898 {
899  int param_name;
900 
901  if (argc < 2)
902  {
904  NET_BUF_ERR_SET (net_buf);
905  return FN_KEEP_CONN;
906  }
907 
908  net_arg_get_int (&param_name, argv[0]);
909 
910  if (param_name == CCI_PARAM_ISOLATION_LEVEL)
911  {
912  int isol_level;
913 
914  net_arg_get_int (&isol_level, argv[1]);
915 
916  cas_log_write (0, true, "set_db_parameter isolation_level %d", isol_level);
917 
918  if (ux_set_isolation_level (isol_level, net_buf) < 0)
919  return FN_KEEP_CONN;
920 
921  net_buf_cp_int (net_buf, 0, NULL); /* res code */
922  }
923  else if (param_name == CCI_PARAM_LOCK_TIMEOUT)
924  {
925  int lock_timeout;
926  char lock_timeout_string[32];
927 
928  net_arg_get_int (&lock_timeout, argv[1]);
929 
930  if (lock_timeout == -2)
931  {
932  lock_timeout = cas_default_lock_timeout;
933  }
934 
935  if (lock_timeout < -1)
936  {
938  NET_BUF_ERR_SET (net_buf);
939  return FN_KEEP_CONN;
940  }
941 
942  ux_set_lock_timeout (lock_timeout);
943 
944  if (lock_timeout == 0)
945  {
946  sprintf (lock_timeout_string, "0 (No wait)");
947  }
948  else if (lock_timeout == -1)
949  {
950  sprintf (lock_timeout_string, "-1 (Infinite wait)");
951  }
952  else
953  {
954  sprintf (lock_timeout_string, "%d ms", lock_timeout);
955  }
956 
957  cas_log_write (0, true, "set_db_parameter lock_timeout %s", lock_timeout_string);
958 
959  net_buf_cp_int (net_buf, 0, NULL);
960  }
961  else if (param_name == CCI_PARAM_AUTO_COMMIT)
962  {
963  int auto_commit;
964 
965  net_arg_get_int (&auto_commit, argv[1]);
966 
967 #ifndef LIBCAS_FOR_JSP
968  if (auto_commit)
970  else
972 
973  cas_log_write (0, true, "set_db_parameter auto_commit %d", auto_commit);
974 #endif /* !LIBCAS_FOR_JSP */
975 
976  net_buf_cp_int (net_buf, 0, NULL);
977  }
978  else
979  {
981  NET_BUF_ERR_SET (net_buf);
982  return FN_KEEP_CONN;
983  }
984 
985  return FN_KEEP_CONN;
986 }
987 
988 FN_RETURN
990 {
991  int mode;
992 
993  if (argc < 1)
994  {
996  NET_BUF_ERR_SET (net_buf);
997  return FN_KEEP_CONN;
998  }
999 
1000  net_arg_get_int (&mode, argv[0]);
1001 
1002  if (mode != CAS_CHANGE_MODE_AUTO && mode != CAS_CHANGE_MODE_KEEP)
1003  {
1005  NET_BUF_ERR_SET (net_buf);
1006  return FN_KEEP_CONN;
1007  }
1008 
1009  cas_log_write (0, true, "set_cas_change_mode %s", mode == CAS_CHANGE_MODE_AUTO ? "AUTO" : "KEEP");
1010 
1011  ux_set_cas_change_mode (mode, net_buf);
1012 
1013  return FN_KEEP_CONN;
1014 }
1015 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
1016 
1017 FN_RETURN
1019 {
1020  int srv_h_id;
1021  T_SRV_HANDLE *srv_handle;
1022  char auto_commit_mode = FALSE;
1023 
1024  if (argc < 1)
1025  {
1027  NET_BUF_ERR_SET (net_buf);
1028  return FN_KEEP_CONN;
1029  }
1030 
1031  net_arg_get_int (&srv_h_id, argv[0]);
1032 
1033  if (argc > 1)
1034  {
1035  net_arg_get_char (auto_commit_mode, argv[1]);
1036  }
1037 
1038 #ifndef LIBCAS_FOR_JSP
1039  srv_handle = hm_find_srv_handle (srv_h_id);
1040  if (auto_commit_mode == TRUE)
1041  {
1042  req_info->need_auto_commit = TRAN_AUTOCOMMIT;
1043  }
1044 
1045 #else /* !LIBCAS_FOR_JSP */
1046  srv_handle = NULL;
1047 #endif /* !LIBCAS_FOR_JSP */
1048 
1049  cas_log_write (SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false, "close_req_handle srv_h_id %d", srv_h_id);
1050 
1051  hm_srv_handle_free (srv_h_id);
1052 
1053  net_buf_cp_int (net_buf, 0, NULL); /* res code */
1054 
1055  return FN_KEEP_CONN;
1056 }
1057 
1058 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1059 FN_RETURN
1061 {
1062  int srv_h_id;
1063  int offset;
1064  char origin;
1065 
1066  if (argc < 3)
1067  {
1069  NET_BUF_ERR_SET (net_buf);
1070  return FN_KEEP_CONN;
1071  }
1072 
1073  net_arg_get_int (&srv_h_id, argv[0]);
1074  net_arg_get_int (&offset, argv[1]);
1075  net_arg_get_char (origin, argv[2]);
1076 
1077  ux_cursor (srv_h_id, offset, origin, net_buf);
1078 
1079  return FN_KEEP_CONN;
1080 }
1081 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
1082 
1083 FN_RETURN
1085 {
1086  int srv_h_id;
1087  int cursor_pos;
1088  int fetch_count;
1089  int func_args;
1090  char fetch_flag;
1091  int result_set_index;
1092  T_SRV_HANDLE *srv_handle;
1093 
1094  func_args = 5;
1095 
1096  if (argc < func_args)
1097  {
1099  NET_BUF_ERR_SET (net_buf);
1100  return FN_KEEP_CONN;
1101  }
1102 
1103  net_arg_get_int (&srv_h_id, argv[0]);
1104  net_arg_get_int (&cursor_pos, argv[1]);
1105  net_arg_get_int (&fetch_count, argv[2]);
1106  net_arg_get_char (fetch_flag, argv[3]);
1107  net_arg_get_int (&result_set_index, argv[4]);
1108 
1109  srv_handle = hm_find_srv_handle (srv_h_id);
1110 
1111  if (srv_handle == NULL)
1112  {
1114  NET_BUF_ERR_SET (net_buf);
1115  return FN_KEEP_CONN;
1116  }
1117 
1118  cas_log_write (SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false, "fetch srv_h_id %d cursor_pos %d fetch_count %d",
1119  srv_h_id, cursor_pos, fetch_count);
1120 
1121  ux_fetch (srv_handle, cursor_pos, fetch_count, fetch_flag, result_set_index, net_buf, req_info);
1122 
1123  return FN_KEEP_CONN;
1124 }
1125 
1126 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1127 FN_RETURN
1129 {
1130  int schema_type;
1131  char *arg1, *arg2;
1132  char flag;
1133  int arg1_size, arg2_size;
1134  int shard_id;
1135  int srv_h_id;
1136 
1137  if (argc < 4)
1138  {
1140  NET_BUF_ERR_SET (net_buf);
1141  return FN_KEEP_CONN;
1142  }
1143 
1144  net_arg_get_int (&schema_type, argv[0]);
1145  net_arg_get_str (&arg1, &arg1_size, argv[1]);
1146  net_arg_get_str (&arg2, &arg2_size, argv[2]);
1147  net_arg_get_char (flag, argv[3]);
1149  {
1150  net_arg_get_int (&shard_id, argv[4]);
1151  }
1152  else
1153  {
1154  shard_id = 0;
1155  }
1156 
1157  cas_log_write (query_seq_num_next_value (), true, "schema_info %s %s %s %d", get_schema_type_str (schema_type),
1158  (arg1 ? arg1 : "NULL"), (arg2 ? arg2 : "NULL"), flag);
1159 
1160  srv_h_id = ux_schema_info (schema_type, arg1, arg2, flag, net_buf, req_info, query_seq_num_current_value ());
1161 
1162  cas_log_write (query_seq_num_current_value (), false, "schema_info srv_h_id %d", srv_h_id);
1163 
1164  return FN_KEEP_CONN;
1165 }
1166 
1167 FN_RETURN
1169 {
1170  int pageid;
1171  short slotid, volid;
1172  int ret;
1173 
1174  if (argc < 1)
1175  {
1177  NET_BUF_ERR_SET (net_buf);
1178  return FN_KEEP_CONN;
1179  }
1180 
1181  net_arg_get_cci_object (&pageid, &slotid, &volid, argv[0]);
1182 
1183  ret = ux_oid_get (argc, argv, net_buf);
1184 
1185  cas_log_write (0, true, "oid_get @%d|%d|%d %s", pageid, slotid, volid, (ret < 0 ? "ERR" : ""));
1186  return FN_KEEP_CONN;
1187 }
1188 
1189 FN_RETURN
1191 {
1192  if (argc < 3 || argc % 3 != 1)
1193  {
1195  NET_BUF_ERR_SET (net_buf);
1196  return FN_KEEP_CONN;
1197  }
1198 
1199  cas_log_write (0, true, "oid_put");
1200 
1201  ux_oid_put (argc, argv, net_buf);
1202 
1203  return FN_KEEP_CONN;
1204 }
1205 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
1206 
1207 
1208 FN_RETURN
1210 {
1211  char auto_commit_mode;
1212  cas_log_write (0, true, "get_version");
1213 
1214  if (argc < 1)
1215  {
1217  NET_BUF_ERR_SET (net_buf);
1218  return FN_KEEP_CONN;
1219  }
1220 
1221  net_arg_get_char (auto_commit_mode, argv[0]);
1222 
1223  ux_get_db_version (net_buf, req_info);
1224 
1225 #ifndef LIBCAS_FOR_JSP
1226  if (auto_commit_mode == TRUE)
1227  {
1228  req_info->need_auto_commit = TRAN_AUTOCOMMIT;
1229  }
1230 #endif /* !LIBCAS_FOR_JSP */
1231 
1232  return FN_KEEP_CONN;
1233 }
1234 
1235 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1236 FN_RETURN
1238 {
1239  char *class_name;
1240  char flag;
1241  int class_name_size;
1242 
1243  if (argc < 2)
1244  {
1246  NET_BUF_ERR_SET (net_buf);
1247  return FN_KEEP_CONN;
1248  }
1249 
1250  cas_log_write (0, true, "get_class_num_objs");
1251 
1252  net_arg_get_str (&class_name, &class_name_size, argv[0]);
1253  net_arg_get_char (flag, argv[1]);
1254 
1255  ux_get_class_num_objs (class_name, flag, net_buf);
1256 
1257  return FN_KEEP_CONN;
1258 }
1259 
1260 FN_RETURN
1262 {
1263  DB_OBJECT *obj;
1264  char cmd;
1265  int err_code;
1266  char *res_msg = NULL;
1267 
1268  if (argc < 2)
1269  {
1271  goto fn_oid_error;
1272  }
1273 
1274  net_arg_get_char (cmd, argv[0]);
1275  net_arg_get_dbobject (&obj, argv[1]);
1276  if (cmd != CCI_OID_IS_INSTANCE)
1277  {
1278  if ((err_code = ux_check_object (obj, net_buf)) < 0)
1279  {
1280  goto fn_oid_error;
1281  }
1282  }
1283 
1284  if (cmd == CCI_OID_DROP)
1285  {
1286  cas_log_write (0, true, "oid drop");
1287  if (obj == NULL)
1288  {
1290  goto fn_oid_error;
1291  }
1292  err_code = db_drop (obj);
1293  }
1294  else if (cmd == CCI_OID_IS_INSTANCE)
1295  {
1296  cas_log_write (0, true, "oid is_instance");
1297  if (obj == NULL)
1298  {
1299  err_code = 0;
1300  }
1301  else
1302  {
1303  er_clear ();
1304  if (db_is_instance (obj) > 0)
1305  {
1306  err_code = 1;
1307  }
1308  else
1309  {
1310  err_code = db_error_code ();
1311  if (err_code == -48)
1312  err_code = 0;
1313  }
1314  }
1315  }
1316  else if (cmd == CCI_OID_LOCK_READ)
1317  {
1318  cas_log_write (0, true, "oid lock_read");
1319  if (obj == NULL)
1320  {
1322  goto fn_oid_error;
1323  }
1324  err_code = db_lock_read (obj);
1325  }
1326  else if (cmd == CCI_OID_LOCK_WRITE)
1327  {
1328  cas_log_write (0, true, "oid lock_write");
1329  if (obj == NULL)
1330  {
1332  goto fn_oid_error;
1333  }
1334  err_code = db_lock_write (obj);
1335  }
1336  else if (cmd == CCI_OID_CLASS_NAME)
1337  {
1338  cas_log_write (0, true, "oid get_class_name");
1339  if (obj == NULL)
1340  {
1342  goto fn_oid_error;
1343  }
1344  res_msg = (char *) db_get_class_name (obj);
1345  if (res_msg == NULL)
1346  {
1347  err_code = db_error_code ();
1348  res_msg = (char *) "";
1349  }
1350  else
1351  {
1352  err_code = 0;
1353  }
1354  }
1355  else
1356  {
1358  goto fn_oid_error;
1359  }
1360 
1361  if (err_code < 0)
1362  {
1364  goto fn_oid_error;
1365  }
1366  else
1367  {
1368  net_buf_cp_int (net_buf, err_code, NULL);
1369  if (cmd == CCI_OID_CLASS_NAME)
1370  {
1371  net_buf_cp_str (net_buf, res_msg, (int) strlen (res_msg) + 1);
1372  }
1373  }
1374 
1375  return FN_KEEP_CONN;
1376 
1377 fn_oid_error:
1378  NET_BUF_ERR_SET (net_buf);
1379  return FN_KEEP_CONN;
1380 }
1381 
1382 FN_RETURN
1384 {
1385  char cmd;
1386  DB_OBJECT *obj;
1387  char *attr_name = (char *) "";
1388  int attr_name_size = 0, seq_index = 0;
1389  int err_code;
1390  DB_VALUE val;
1391  DB_COLLECTION *collection;
1392  DB_ATTRIBUTE *attr;
1393  DB_DOMAIN *domain, *ele_domain;
1394  char col_type, ele_type, db_type;
1395  int value_index;
1396  DB_VALUE *ele_val = NULL;
1397 
1398  if (argc < 3)
1399  {
1401  NET_BUF_ERR_SET (net_buf);
1402  return FN_KEEP_CONN;
1403  }
1404 
1405  net_arg_get_char (cmd, argv[0]);
1406  net_arg_get_dbobject (&obj, argv[1]);
1407 
1408  if ((err_code = ux_check_object (obj, net_buf)) < 0)
1409  {
1410  NET_BUF_ERR_SET (net_buf);
1411  return FN_KEEP_CONN;
1412  }
1413 
1414  err_code = 0;
1415  value_index = 0;
1416 
1417  switch (cmd)
1418  {
1419  case CCI_COL_GET:
1420  case CCI_COL_SIZE:
1421  net_arg_get_str (&attr_name, &attr_name_size, argv[2]);
1422  break;
1423  case CCI_COL_SET_DROP:
1424  case CCI_COL_SET_ADD:
1425  if (argc < 5)
1426  {
1428  }
1429 
1430  else
1431  {
1432  net_arg_get_str (&attr_name, &attr_name_size, argv[2]);
1433  }
1434  value_index = 3;
1435  break;
1436  case CCI_COL_SEQ_DROP:
1437  if (argc < 4)
1438  {
1440  }
1441  else
1442  {
1443  net_arg_get_int (&seq_index, argv[2]);
1444  net_arg_get_str (&attr_name, &attr_name_size, argv[3]);
1445  }
1446  break;
1447  case CCI_COL_SEQ_INSERT:
1448  case CCI_COL_SEQ_PUT:
1449  if (argc < 6)
1450  {
1452  }
1453  else
1454  {
1455  net_arg_get_int (&seq_index, argv[2]);
1456  net_arg_get_str (&attr_name, &attr_name_size, argv[3]);
1457  }
1458 
1459  value_index = 4;
1460  break;
1461  default:
1463  }
1464 
1465  if (err_code < 0)
1466  {
1467  NET_BUF_ERR_SET (net_buf);
1468  return FN_KEEP_CONN;
1469  }
1470 
1471  if (attr_name_size < 1)
1472  {
1474  goto fn_col_finale;
1475  }
1476 
1477  attr = db_get_attribute (obj, attr_name);
1478  if (attr == NULL)
1479  {
1481  goto fn_col_finale;
1482  }
1483  domain = db_attribute_domain (attr);
1484  col_type = ux_db_type_to_cas_type (TP_DOMAIN_TYPE (domain));
1485  if (col_type != CCI_U_TYPE_SET && col_type != CCI_U_TYPE_MULTISET && col_type != CCI_U_TYPE_SEQUENCE)
1486  {
1488  goto fn_col_finale;
1489  }
1490  ele_type = get_set_domain (domain, NULL, NULL, &db_type, NULL);
1491  ele_domain = db_domain_set (domain);
1492  if (ele_type <= 0)
1493  {
1495  goto fn_col_finale;
1496  }
1497 
1498  err_code = db_get (obj, attr_name, &val);
1499  if (err_code < 0)
1500  {
1502  goto fn_col_finale;
1503  }
1504  if (db_value_type (&val) == DB_TYPE_NULL)
1505  {
1506  collection = NULL;
1507  }
1508  else
1509  {
1510  collection = db_get_collection (&val);
1511  }
1512 
1513  if (value_index > 0)
1514  {
1515  err_code = make_bind_value (1, 2, argv + value_index, &ele_val, net_buf, db_type);
1516  if (err_code < 0)
1517  {
1518  goto fn_col_finale;
1519  }
1520  }
1521 
1522  err_code = 0;
1523  switch (cmd)
1524  {
1525  case CCI_COL_GET:
1526  ux_col_get (collection, col_type, ele_type, ele_domain, net_buf);
1527  break;
1528  case CCI_COL_SIZE:
1529  ux_col_size (collection, net_buf);
1530  break;
1531  case CCI_COL_SET_DROP:
1532  err_code = ux_col_set_drop (collection, ele_val, net_buf);
1533  break;
1534  case CCI_COL_SET_ADD:
1535  err_code = ux_col_set_add (collection, ele_val, net_buf);
1536  break;
1537  case CCI_COL_SEQ_DROP:
1538  err_code = ux_col_seq_drop (collection, seq_index, net_buf);
1539  break;
1540  case CCI_COL_SEQ_INSERT:
1541  err_code = ux_col_seq_insert (collection, seq_index, ele_val, net_buf);
1542  break;
1543  case CCI_COL_SEQ_PUT:
1544  err_code = ux_col_seq_put (collection, seq_index, ele_val, net_buf);
1545  break;
1546  default:
1547  break;
1548  }
1549 
1550  switch (cmd)
1551  {
1552  case CCI_COL_SET_DROP:
1553  case CCI_COL_SET_ADD:
1554  case CCI_COL_SEQ_DROP:
1555  case CCI_COL_SEQ_INSERT:
1556  case CCI_COL_SEQ_PUT:
1557  if (err_code >= 0)
1558  db_put (obj, attr_name, &val);
1559  default:
1560  break;
1561  }
1562 
1563  if (ele_val)
1564  {
1565  db_value_clear (ele_val);
1566  FREE_MEM (ele_val);
1567  }
1568 
1569  db_col_free (collection);
1570  db_value_clear (&val);
1571 
1572  return FN_KEEP_CONN;
1573 
1574 fn_col_finale:
1575  NET_BUF_ERR_SET (net_buf);
1576  return FN_KEEP_CONN;
1577 }
1578 
1579 /* MYSQL : NOT SUPPORT MULTIPLE STATEMENT */
1580 FN_RETURN
1582 {
1583  int srv_h_id;
1584  char flag;
1585  int func_args;
1586  T_SRV_HANDLE *srv_handle;
1587 
1588  func_args = 2;
1589 
1590  if (argc < func_args)
1591  {
1593  NET_BUF_ERR_SET (net_buf);
1594  return FN_KEEP_CONN;
1595  }
1596 
1597  net_arg_get_int (&srv_h_id, argv[0]);
1598  net_arg_get_char (flag, argv[1]);
1599 
1600  srv_handle = hm_find_srv_handle (srv_h_id);
1601  if (srv_handle == NULL)
1602  {
1604  NET_BUF_ERR_SET (net_buf);
1605  return FN_KEEP_CONN;
1606  }
1607 
1608  cas_log_write (SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false, "next_result %d %s", srv_h_id,
1609  (srv_handle->use_query_cache == true) ? "(QC)" : "");
1610 
1611  ux_next_result (srv_handle, flag, net_buf, req_info);
1612 
1613  return FN_KEEP_CONN;
1614 }
1615 
1616 FN_RETURN
1618 {
1619  int arg_index = 0;
1620  char auto_commit_mode;
1621  int query_timeout;
1622 
1623  net_arg_get_char (auto_commit_mode, argv[arg_index]);
1624 
1625  logddl_set_commit_mode (auto_commit_mode);
1626 
1627  arg_index++;
1628 
1630  {
1631  net_arg_get_int (&query_timeout, argv[arg_index]);
1632  arg_index++;
1633  }
1634  else
1635  {
1636  query_timeout = 0;
1637  }
1638 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1639  /* does not support query timeout for execute_batch yet */
1640  set_query_timeout (NULL, query_timeout);
1641 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
1642 
1643  cas_log_write (0, true, "execute_batch %d", argc - arg_index);
1644  ux_execute_batch (argc - arg_index, argv + arg_index, net_buf, req_info, auto_commit_mode);
1645 
1646  cas_log_write (0, true, "execute_batch end");
1647 
1648  return FN_KEEP_CONN;
1649 }
1650 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
1651 
1652 FN_RETURN
1654 {
1655  int srv_h_id;
1656  T_SRV_HANDLE *srv_handle;
1657  int ret_code;
1658  int elapsed_sec = 0, elapsed_msec = 0;
1659  struct timeval exec_begin, exec_end;
1660  char *eid_string;
1661 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1662  char *plan = NULL;
1663 #endif /* !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL) */
1664  int driver_query_timeout;
1665  int arg_index = 0;
1666  char auto_commit_mode;
1667  int min_argc;
1668 
1669  /* argv[0] : service handle argv[1] : auto commit flag */
1670  min_argc = 2;
1672  {
1673  /* argv[2] : driver_query_timeout */
1674  min_argc++;
1675  }
1676 
1677  if (argc < min_argc)
1678  {
1679  net_buf_cp_int (net_buf, CAS_ER_ARGS, NULL);
1680  return FN_KEEP_CONN;
1681  }
1682 
1683  net_arg_get_int (&srv_h_id, argv[arg_index]);
1684  arg_index++;
1685 
1686  srv_handle = hm_find_srv_handle (srv_h_id);
1687  if (srv_handle == NULL)
1688  {
1689  net_buf_cp_int (net_buf, CAS_ER_ARGS, NULL);
1690  return FN_KEEP_CONN;
1691  }
1692 
1693 #ifndef LIBCAS_FOR_JSP
1694  if (srv_handle->is_pooled)
1695  {
1696  gettimeofday (&query_start_time, NULL);
1697  query_timeout = 0;
1698  }
1699 #endif /* !LIBCAS_FOR_JSP */
1701  {
1702  net_arg_get_int (&driver_query_timeout, argv[arg_index]);
1703  arg_index++;
1704  }
1705  else
1706  {
1707  driver_query_timeout = 0;
1708  }
1709 
1710 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1711  /* does not support query timeout for execute_array yet */
1712  set_query_timeout (srv_handle, driver_query_timeout);
1713 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
1714 
1715  net_arg_get_char (auto_commit_mode, argv[arg_index]);
1716  arg_index++;
1717 
1718  if (auto_commit_mode == TRUE)
1719  {
1720  req_info->need_auto_commit = TRAN_AUTOCOMMIT;
1721  }
1722  srv_handle->auto_commit_mode = auto_commit_mode;
1723 
1724  cas_log_write_nonl (SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false, "execute_array srv_h_id %d %d ", srv_h_id,
1725  (argc - arg_index) / 2);
1726  if (srv_handle->sql_stmt != NULL)
1727  {
1728  cas_log_write_query_string (srv_handle->sql_stmt, (int) strlen (srv_handle->sql_stmt));
1729  logddl_set_sql_text (srv_handle->sql_stmt, (int) strlen (srv_handle->sql_stmt));
1730  }
1731 #ifndef LIBCAS_FOR_JSP
1733  {
1734  bind_value_log (NULL, arg_index, argc - 1, argv, 0, NULL, SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false);
1735  }
1736 #endif /* !LIBCAS_FOR_JSP */
1737 
1738  gettimeofday (&exec_begin, NULL);
1739 
1740  ret_code = ux_execute_array (srv_handle, argc - arg_index, argv + arg_index, net_buf, req_info);
1741 
1742  gettimeofday (&exec_end, NULL);
1743  ut_timeval_diff (&exec_begin, &exec_end, &elapsed_sec, &elapsed_msec);
1744 
1745  eid_string = get_error_log_eids (err_info.err_number);
1746  cas_log_write (SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false, "execute_array %s%d tuple %d time %d.%03d%s%s%s",
1747  (ret_code < 0) ? "error:" : "", err_info.err_number, get_tuple_count (srv_handle), elapsed_sec,
1748  elapsed_msec, "", (srv_handle->use_query_cache == true) ? " (QC)" : "", eid_string);
1749 
1750 #ifndef LIBCAS_FOR_JSP
1751  query_timeout =
1752  ut_check_timeout (&query_start_time, &exec_end, shm_appl->long_query_time, &elapsed_sec, &elapsed_msec);
1753 
1754  if (query_timeout >= 0 || ret_code < 0)
1755  {
1756  if (query_timeout >= 0)
1757  {
1760  }
1761 
1762  if (ret_code < 0)
1763  {
1765  }
1766 
1768  {
1770  "execute_array srv_h_id %d %d ", srv_h_id, (argc - 2) / 2);
1771  if (srv_handle->sql_stmt != NULL)
1772  {
1773  cas_slow_log_write_query_string (srv_handle->sql_stmt, (int) strlen (srv_handle->sql_stmt));
1774  bind_value_log (&query_start_time, 2, argc - 1, argv, 0, NULL, SRV_HANDLE_QUERY_SEQ_NUM (srv_handle),
1775  true);
1776  }
1777  cas_slow_log_write (NULL, SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false,
1778  "execute_array %s%d tuple %d time %d.%03d%s%s%s\n", (ret_code < 0) ? "error:" : "",
1779  err_info.err_number, get_tuple_count (srv_handle), elapsed_sec, elapsed_msec, "",
1780  (srv_handle->use_query_cache == true) ? " (QC)" : "", eid_string);
1781 
1782 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1783  plan = db_get_execution_plan ();
1784 
1785  if (plan != NULL && plan[0] != '\0')
1786  {
1787  cas_slow_log_write (NULL, 0, false, "slow query plan\n%s", plan);
1788 
1789  /* reset global plan buffer */
1791  }
1792 #endif
1793  cas_slow_log_end ();
1794  }
1795  }
1796 #endif /* !LIBCAS_FOR_JSP */
1797 
1798  return FN_KEEP_CONN;
1799 }
1800 
1801 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1802 FN_RETURN
1804 {
1805  int srv_h_id;
1806  int cursor_pos;
1807  T_SRV_HANDLE *srv_handle;
1808 
1809  if (argc < 2)
1810  {
1812  NET_BUF_ERR_SET (net_buf);
1813  return FN_KEEP_CONN;
1814  }
1815 
1816  net_arg_get_int (&srv_h_id, argv[0]);
1817  net_arg_get_int (&cursor_pos, argv[1]);
1818 
1819  srv_handle = hm_find_srv_handle (srv_h_id);
1820 
1821  cas_log_write (SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false, "cursor_update srv_h_id %d, cursor %d", srv_h_id,
1822  cursor_pos);
1823 
1824  ux_cursor_update (srv_handle, cursor_pos, argc, argv, net_buf);
1825 
1826  return FN_KEEP_CONN;
1827 }
1828 
1829 FN_RETURN
1831 {
1832  int srv_h_id;
1833  T_SRV_HANDLE *srv_handle;
1834 
1835  net_arg_get_int (&srv_h_id, argv[0]);
1836 
1837  srv_handle = hm_find_srv_handle (srv_h_id);
1838  if (srv_handle == NULL || srv_handle->num_q_result < 1)
1839  {
1840  /* has already been closed */
1841  return FN_KEEP_CONN;
1842  }
1843 
1844  cas_log_write (SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false, "cursor_close srv_h_id %d", srv_h_id);
1845 
1846  ux_cursor_close (srv_handle);
1847 
1848  return FN_KEEP_CONN;
1849 }
1850 
1851 FN_RETURN
1853 {
1854  int size;
1855  char *class_name;
1856  char *attr_name;
1857 
1858  if (argc < 2)
1859  {
1861  NET_BUF_ERR_SET (net_buf);
1862  return FN_KEEP_CONN;
1863  }
1864 
1865  net_arg_get_str (&class_name, &size, argv[0]);
1866  net_arg_get_str (&attr_name, &size, argv[1]);
1867 
1868  ux_get_attr_type_str (class_name, attr_name, net_buf, req_info);
1869 
1870  return FN_KEEP_CONN;
1871 }
1872 
1873 FN_RETURN
1875 {
1876  char info_type;
1877  T_SRV_HANDLE *srv_handle = NULL;
1878  int srv_h_id, size, stmt_id, err;
1879  char *sql_stmt = NULL;
1880  DB_SESSION *session;
1881  DB_QUERY_RESULT *result = NULL;
1882 
1883  if (argc < 2)
1884  {
1886  NET_BUF_ERR_SET (net_buf);
1887  return FN_KEEP_CONN;
1888  }
1889 
1890  net_arg_get_int (&srv_h_id, argv[0]);
1891  net_arg_get_char (info_type, argv[1]);
1892  if (argc >= 3)
1893  {
1894  net_arg_get_str (&sql_stmt, &size, argv[2]);
1895  }
1896 
1897  if (sql_stmt != NULL)
1898  {
1899  srv_h_id = hm_new_srv_handle (&srv_handle, query_seq_num_next_value ());
1900  if (srv_h_id < 0)
1901  {
1902  net_buf_cp_byte (net_buf, '\0');
1903  goto end;
1904  }
1905 
1906  cas_log_query_info_init (srv_h_id, TRUE);
1907  srv_handle->query_info_flag = TRUE;
1908 
1909  session = db_open_buffer (sql_stmt);
1910  if (!session)
1911  {
1913  NET_BUF_ERR_SET (net_buf);
1914  goto end;
1915  }
1916 
1917  if ((stmt_id = db_compile_statement (session)) < 0)
1918  {
1920  NET_BUF_ERR_SET (net_buf);
1921  db_close_session (session);
1922  goto end;
1923  }
1924 
1925  /* Generally, it is not necessary to execute a statement in order to get a plan. But, if a statement has a term,
1926  * which cannot be prepared, such as serial, we should execute it to get its plan. And, currently, we cannot see
1927  * a plan for a statement which includes both "cannot be prepared" term and host variable. This limitation also
1928  * exists in csql. */
1929  err = db_execute_statement (session, stmt_id, &result);
1930  if (err < 0 && err != ER_UCI_TOO_FEW_HOST_VARS)
1931  {
1932  /* We will ignore an error "too few host variables are given" to return a plan for a statement including host
1933  * variables. */
1935  NET_BUF_ERR_SET (net_buf);
1936  db_close_session (session);
1937  goto end;
1938  }
1939  if (result != NULL)
1940  {
1941  db_query_end (result);
1942  }
1943 
1944  db_close_session (session);
1945  }
1946 
1947  ux_get_query_info (srv_h_id, info_type, net_buf);
1948 
1949 end:
1950  if (sql_stmt != NULL)
1951  {
1953  hm_srv_handle_free (srv_h_id);
1954  }
1955 
1956  return FN_KEEP_CONN;
1957 }
1958 
1959 FN_RETURN
1961 {
1962  int err_code;
1963  char cmd;
1964  char *savepoint_name;
1965  int savepoint_name_size;
1966 
1967  if (argc < 2)
1968  {
1970  NET_BUF_ERR_SET (net_buf);
1971  return FN_KEEP_CONN;
1972  }
1973 
1974  net_arg_get_char (cmd, argv[0]);
1975  net_arg_get_str (&savepoint_name, &savepoint_name_size, argv[1]);
1976  if (savepoint_name == NULL)
1977  savepoint_name = (char *) "";
1978 
1979  if (cmd == 1)
1980  { /* set */
1981  cas_log_write (0, true, "savepoint %s", savepoint_name);
1982  err_code = db_savepoint_transaction (savepoint_name);
1983  }
1984  else if (cmd == 2)
1985  { /* rollback */
1986  cas_log_write (0, true, "rollback_savepoint %s", savepoint_name);
1987  err_code = db_abort_to_savepoint (savepoint_name);
1988  }
1989  else
1990  {
1992  NET_BUF_ERR_SET (net_buf);
1993  return FN_KEEP_CONN;
1994  }
1995 
1996  if (err_code < 0)
1997  {
1999  NET_BUF_ERR_SET (net_buf);
2000  }
2001  else
2002  {
2003  net_buf_cp_int (net_buf, 0, NULL);
2004  }
2005 
2006  return FN_KEEP_CONN;
2007 }
2008 
2009 FN_RETURN
2011 {
2012  int srv_h_id;
2013 
2014  if (argc < 1)
2015  {
2017  NET_BUF_ERR_SET (net_buf);
2018  return FN_KEEP_CONN;
2019  }
2020 
2021  net_arg_get_int (&srv_h_id, argv[0]);
2022 
2023  ux_get_parameter_info (srv_h_id, net_buf);
2024 
2025  return FN_KEEP_CONN;
2026 }
2027 
2028 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
2029 
2030 FN_RETURN
2032 {
2033  cas_log_write (0, true, "con_close");
2034  net_buf_cp_int (net_buf, 0, NULL);
2035 
2037  {
2038  logddl_free (true);
2039  }
2040 
2041  return FN_CLOSE_CONN;
2042 }
2043 
2044 FN_RETURN
2046 {
2047  int retcode = 0;
2048 
2049  if (argc == 1)
2050  {
2051  char *msg;
2052  int msg_size;
2053  net_arg_get_str (&msg, &msg_size, argv[0]);
2054  cas_log_write (0, true, "client_msg:%s", msg);
2055  }
2056  else
2057  {
2058  retcode = ux_check_connection ();
2059  cas_log_write (0, true, "check_cas %d", retcode);
2060  }
2061 
2062  if (retcode < 0)
2063  {
2065  NET_BUF_ERR_SET (net_buf);
2066  return FN_KEEP_SESS;
2067  }
2068  else
2069  {
2070  return FN_KEEP_CONN;
2071  }
2072 }
2073 
2074 #if !defined(CAS_FOR_MYSQL)
2075 FN_RETURN
2077 {
2078  int srv_h_id;
2079 
2080  if (argc < 1)
2081  {
2083  NET_BUF_ERR_SET (net_buf);
2084  return FN_KEEP_CONN;
2085  }
2086 
2087  net_arg_get_int (&srv_h_id, argv[0]);
2088  ux_make_out_rs (srv_h_id, net_buf, req_info);
2089 
2090  return FN_KEEP_CONN;
2091 }
2092 #else /* !defined(CAS_FOR_MYSQL) */
2093 FN_RETURN
2094 fn_make_out_rs (SOCKET sock_fd, int argc, void **argv, T_NET_BUF * net_buf, T_REQ_INFO * req_info)
2095 {
2096  return fn_not_supported (sock_fd, argc, argv, net_buf, req_info);
2097 }
2098 #endif /* !defined(CAS_FOR_MYSQL) */
2099 
2100 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
2101 FN_RETURN
2102 fn_get_generated_keys (SOCKET sock_fd, int argc, void **argv, T_NET_BUF * net_buf, T_REQ_INFO * req_info)
2103 {
2104  int srv_h_id;
2105  T_SRV_HANDLE *srv_handle;
2106 
2107  if (argc < 1)
2108  {
2110  NET_BUF_ERR_SET (net_buf);
2111  return FN_KEEP_CONN;
2112  }
2113 
2114  net_arg_get_int (&srv_h_id, argv[0]);
2115  srv_handle = hm_find_srv_handle (srv_h_id);
2116 
2117  if (srv_handle == NULL)
2118  {
2120  NET_BUF_ERR_SET (net_buf);
2121  return FN_KEEP_CONN;
2122  }
2123 
2124  cas_log_write (SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false, "get_generated_keys %d", srv_h_id);
2125 
2126  ux_get_generated_keys (srv_handle, net_buf);
2127 
2128  return FN_KEEP_CONN;
2129 }
2130 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
2131 
2132 static const char *
2133 get_schema_type_str (int schema_type)
2134 {
2135  if (schema_type < 1 || schema_type > CCI_SCH_LAST)
2136  {
2137  return "";
2138  }
2139 
2140  return (schema_type_str[schema_type - 1]);
2141 }
2142 
2143 static const char *
2144 get_tran_type_str (int tran_type)
2145 {
2146  if (tran_type < 1 || tran_type > 2)
2147  {
2148  return "";
2149  }
2150 
2151  return (tran_type_str[tran_type - 1]);
2152 }
2153 
2154 #ifndef LIBCAS_FOR_JSP
2155 static void
2156 bind_value_log (struct timeval *log_time, int start, int argc, void **argv, int param_size, char *param_mode,
2157  unsigned int query_seq_num, bool slow_log)
2158 {
2159  int idx;
2160  char type;
2161  int num_bind;
2162  void *net_value;
2163  const char *param_mode_str;
2164  void (*write2_func) (const char *, ...);
2165 
2166  if (slow_log)
2167  {
2168  write2_func = cas_slow_log_write2;
2169  }
2170  else
2171  {
2172  write2_func = cas_log_write2_nonl;
2173  }
2174 
2175  num_bind = 1;
2176  idx = start;
2177 
2178  while (idx < argc)
2179  {
2180  net_arg_get_char (type, argv[idx++]);
2181  net_value = argv[idx++];
2182 
2183  param_mode_str = "";
2184  if (param_mode != NULL && param_size >= num_bind)
2185  {
2186  if (param_mode[num_bind - 1] == CCI_PARAM_MODE_IN)
2187  param_mode_str = "(IN) ";
2188  else if (param_mode[num_bind - 1] == CCI_PARAM_MODE_OUT)
2189  param_mode_str = "(OUT) ";
2190  else if (param_mode[num_bind - 1] == CCI_PARAM_MODE_INOUT)
2191  param_mode_str = "(INOUT) ";
2192  }
2193 
2194  if (slow_log)
2195  {
2196  cas_slow_log_write (log_time, query_seq_num, false, "bind %d %s: ", num_bind++, param_mode_str);
2197  }
2198  else
2199  {
2200  cas_log_write_nonl (query_seq_num, false, "bind %d %s: ", num_bind++, param_mode_str);
2201  }
2202 
2203  if (type > CCI_U_TYPE_FIRST && type <= CCI_U_TYPE_LAST)
2204  {
2205  write2_func ("%s ", type_str_tbl[(int) type]);
2206  bind_value_print (type, net_value, slow_log);
2207  }
2208  else
2209  {
2210  write2_func ("NULL");
2211  }
2212  write2_func ("\n");
2213  }
2214 }
2215 #endif /* !LIBCAS_FOR_JSP */
2216 
2217 static void
2218 bind_value_print (char type, void *net_value, bool slow_log)
2219 {
2220  int data_size;
2221  void (*write2_func) (const char *, ...);
2222  void (*fwrite_func) (char *value, int size);
2223 
2224  if (slow_log)
2225  {
2226  write2_func = cas_slow_log_write2;
2227  fwrite_func = cas_slow_log_write_value_string;
2228  }
2229  else
2230  {
2231  write2_func = cas_log_write2_nonl;
2232  fwrite_func = cas_log_write_value_string;
2233  }
2234 
2235  net_arg_get_size (&data_size, net_value);
2236  if (data_size <= 0)
2237  {
2238  type = CCI_U_TYPE_NULL;
2239  data_size = 0;
2240  }
2241 
2242  switch (type)
2243  {
2244  case CCI_U_TYPE_CHAR:
2245  case CCI_U_TYPE_STRING:
2246  case CCI_U_TYPE_NCHAR:
2247  case CCI_U_TYPE_VARNCHAR:
2248  {
2250  char *str_val;
2251  int val_size;
2252  int num_chars = 0;
2253 
2254  net_arg_get_str (&str_val, &val_size, net_value);
2255  if (val_size > 0)
2256  {
2257  num_chars = intl_char_count ((const unsigned char *) str_val, val_size, charset, &num_chars) - 1;
2258  }
2259  write2_func ("(%d)", num_chars);
2260  fwrite_func (str_val, val_size - 1);
2261  }
2262  break;
2263  case CCI_U_TYPE_BIT:
2264  case CCI_U_TYPE_VARBIT:
2265  case CCI_U_TYPE_NUMERIC:
2266  case CCI_U_TYPE_ENUM:
2267  case CCI_U_TYPE_JSON:
2268  {
2269  char *str_val;
2270  int val_size;
2271  net_arg_get_str (&str_val, &val_size, net_value);
2272  if (type != CCI_U_TYPE_NUMERIC)
2273  {
2274  write2_func ("(%d)", val_size);
2275  }
2276  fwrite_func (str_val, val_size - 1);
2277  }
2278  break;
2279  case CCI_U_TYPE_BIGINT:
2280  {
2281  INT64 bi_val;
2282  net_arg_get_bigint (&bi_val, net_value);
2283  write2_func ("%lld", (long long) bi_val);
2284  }
2285  break;
2286  case CCI_U_TYPE_UBIGINT:
2287  {
2288  UINT64 ubi_val;
2289  net_arg_get_bigint ((INT64 *) (&ubi_val), net_value);
2290  write2_func ("%llu", (unsigned long long) ubi_val);
2291  }
2292  break;
2293  case CCI_U_TYPE_INT:
2294  {
2295  int i_val;
2296  net_arg_get_int (&i_val, net_value);
2297  write2_func ("%d", i_val);
2298  }
2299  break;
2300  case CCI_U_TYPE_UINT:
2301  {
2302  unsigned int ui_val;
2303  net_arg_get_int ((int *) &ui_val, net_value);
2304  write2_func ("%u", ui_val);
2305  }
2306  break;
2307  case CCI_U_TYPE_SHORT:
2308  {
2309  short s_val;
2310  net_arg_get_short (&s_val, net_value);
2311  write2_func ("%d", s_val);
2312  }
2313  break;
2314  case CCI_U_TYPE_USHORT:
2315  {
2316  unsigned short us_val;
2317  net_arg_get_short ((short *) &us_val, net_value);
2318  write2_func ("%u", us_val);
2319  }
2320  break;
2321  case CCI_U_TYPE_MONETARY:
2322  case CCI_U_TYPE_DOUBLE:
2323  {
2324  double d_val;
2325  net_arg_get_double (&d_val, net_value);
2326  write2_func ("%.15e", d_val);
2327  }
2328  break;
2329  case CCI_U_TYPE_FLOAT:
2330  {
2331  float f_val;
2332  net_arg_get_float (&f_val, net_value);
2333  write2_func ("%.6e", f_val);
2334  }
2335  break;
2336  case CCI_U_TYPE_DATE:
2337  case CCI_U_TYPE_TIME:
2338  case CCI_U_TYPE_TIMESTAMP:
2339  case CCI_U_TYPE_DATETIME:
2340  {
2341  short yr, mon, day, hh, mm, ss, ms;
2342  net_arg_get_datetime (&yr, &mon, &day, &hh, &mm, &ss, &ms, net_value);
2343  if (type == CCI_U_TYPE_DATE)
2344  write2_func ("%d-%d-%d", yr, mon, day);
2345  else if (type == CCI_U_TYPE_TIME)
2346  write2_func ("%d:%d:%d", hh, mm, ss);
2347  else if (type == CCI_U_TYPE_TIMESTAMP)
2348  write2_func ("%d-%d-%d %d:%d:%d", yr, mon, day, hh, mm, ss);
2349  else
2350  write2_func ("%d-%d-%d %d:%d:%d.%03d", yr, mon, day, hh, mm, ss, ms);
2351  }
2352  break;
2353  case CCI_U_TYPE_TIMESTAMPTZ:
2354  case CCI_U_TYPE_DATETIMETZ:
2355  {
2356  short yr, mon, day, hh, mm, ss, ms;
2357  char *tz_str_p;
2358  int tz_size;
2359  char tz_str[CCI_TZ_SIZE + 1];
2360 
2361  net_arg_get_datetimetz (&yr, &mon, &day, &hh, &mm, &ss, &ms, &tz_str_p, &tz_size, net_value);
2362  tz_size = MIN (CCI_TZ_SIZE, tz_size);
2363  strncpy (tz_str, tz_str_p, tz_size);
2364  tz_str[tz_size] = '\0';
2365 
2366  if (type == CCI_U_TYPE_TIMESTAMPTZ)
2367  {
2368  write2_func ("%d-%d-%d %d:%d:%d %s", yr, mon, day, hh, mm, ss, tz_str);
2369  }
2370  else
2371  {
2372  write2_func ("%d-%d-%d %d:%d:%d.%03d %s", yr, mon, day, hh, mm, ss, ms, tz_str);
2373  }
2374  }
2375  break;
2376  case CCI_U_TYPE_SET:
2377  case CCI_U_TYPE_MULTISET:
2378  case CCI_U_TYPE_SEQUENCE:
2379  {
2380  int remain_size = data_size;
2381  int ele_size;
2382  char ele_type;
2383  char *cur_p = (char *) net_value;
2384  char print_comma = 0;
2385 
2386  cur_p += 4;
2387  ele_type = *cur_p;
2388  cur_p++;
2389  remain_size--;
2390 
2391  if (ele_type <= CCI_U_TYPE_FIRST || ele_type > CCI_U_TYPE_LAST)
2392  break;
2393 
2394  write2_func ("(%s) {", type_str_tbl[(int) ele_type]);
2395 
2396  while (remain_size > 0)
2397  {
2398  net_arg_get_size (&ele_size, cur_p);
2399  if (ele_size + 4 > remain_size)
2400  break;
2401  if (print_comma)
2402  write2_func (", ");
2403  else
2404  print_comma = 1;
2405  bind_value_print (ele_type, cur_p, slow_log);
2406  ele_size += 4;
2407  cur_p += ele_size;
2408  remain_size -= ele_size;
2409  }
2410 
2411  write2_func ("}");
2412  }
2413  break;
2414 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
2415  case CCI_U_TYPE_OBJECT:
2416  {
2417  int pageid;
2418  short slotid, volid;
2419 
2420  net_arg_get_cci_object (&pageid, &slotid, &volid, net_value);
2421  write2_func ("%d|%d|%d", pageid, slotid, volid);
2422  }
2423  break;
2424  case CCI_U_TYPE_BLOB:
2425  case CCI_U_TYPE_CLOB:
2426  {
2427  DB_VALUE db_val;
2428  DB_ELO *db_elo;
2429  net_arg_get_lob_value (&db_val, net_value);
2430  db_elo = db_get_elo (&db_val);
2431  if (db_elo)
2432  {
2433  write2_func ("%s|%lld|%s|%s|%d", (type == CCI_U_TYPE_BLOB) ? "BLOB" : "CLOB", db_elo->size, db_elo->locator,
2434  db_elo->meta_data, db_elo->type);
2435  }
2436  else
2437  {
2438  write2_func ("invalid LOB");
2439  }
2440 
2441  db_value_clear (&db_val);
2442  }
2443  break;
2444 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
2445  default:
2446  write2_func ("NULL");
2447  break;
2448  }
2449 }
2450 
2451 /*
2452  * get_error_log_eids - get error identifier string
2453  * return: pointer to internal buffer
2454  * NOTE:
2455  * this function is not MT safe. Rreturned address is guaranteed to be valid
2456  * until next get_error_log_eids() call.
2457  *
2458  */
2459 static char *
2461 {
2462  static char *pending_alloc = NULL;
2463  static char buffer[512];
2464  char *buf;
2465 
2466 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
2467  if (err == 0)
2468  {
2469  return (char *) "";
2470  }
2471 #else /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
2472  if (err >= 0)
2473  {
2474  return (char *) "";
2475  }
2476 #endif /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
2477 
2478  if (pending_alloc != NULL)
2479  {
2480  free (pending_alloc);
2481  pending_alloc = NULL;
2482  }
2483 
2484 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
2485  buf = cas_error_log_get_eid (buffer, sizeof (buffer));
2486 #else
2487  buf = cas_log_error_handler_asprint (buffer, sizeof (buffer), true);
2488 #endif /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
2489  if (buf != buffer)
2490  {
2491  pending_alloc = buf;
2492  }
2493 
2494  return buf;
2495 }
2496 
2497 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
2498 FN_RETURN
2499 fn_lob_new (SOCKET sock_fd, int argc, void **argv, T_NET_BUF * net_buf, T_REQ_INFO * req_info)
2500 {
2501  int lob_type, err_code;
2502  int elapsed_sec = 0, elapsed_msec = 0;
2503  struct timeval lob_new_begin, lob_new_end;
2504 
2505  if (argc != 1)
2506  {
2507 #if defined(CAS_FOR_DBMS)
2509  NET_BUF_ERR_SET (net_buf);
2510 #else /* CAS_FOR_DBMS */
2511  net_buf_cp_int (net_buf, CAS_ER_ARGS, NULL);
2512 #endif /* CAS_FOR_DBMS */
2513  return FN_KEEP_CONN;
2514  }
2515 
2516  net_arg_get_int (&lob_type, argv[0]);
2517  if (lob_type != CCI_U_TYPE_BLOB && lob_type != CCI_U_TYPE_CLOB)
2518  {
2519 #if defined(CAS_FOR_DBMS)
2521  NET_BUF_ERR_SET (net_buf);
2522 #else /* CAS_FOR_DBMS */
2523  net_buf_cp_int (net_buf, CAS_ER_ARGS, NULL);
2524 #endif /* CAS_FOR_DBMS */
2525  return FN_KEEP_CONN;
2526  }
2527 
2528  cas_log_write (0, false, "lob_new lob_type=%d", lob_type);
2529  gettimeofday (&lob_new_begin, NULL);
2530 
2531  err_code = ux_lob_new (lob_type, net_buf);
2532 
2533  gettimeofday (&lob_new_end, NULL);
2534  ut_timeval_diff (&lob_new_begin, &lob_new_end, &elapsed_sec, &elapsed_msec);
2535 
2536  cas_log_write (0, false, "lob_new %s%d time %d.%03d%s", err_code < 0 ? "error:" : "", err_info.err_number,
2537  elapsed_sec, elapsed_msec, get_error_log_eids (err_info.err_number));
2538 
2539  return FN_KEEP_CONN;
2540 }
2541 
2542 FN_RETURN
2543 fn_lob_write (SOCKET sock_fd, int argc, void **argv, T_NET_BUF * net_buf, T_REQ_INFO * req_info)
2544 {
2545  DB_VALUE lob_dbval;
2546  INT64 offset;
2547  char *data_buf = NULL;
2548  int err_code, data_length = 0;
2549  int elapsed_sec = 0, elapsed_msec = 0;
2550  struct timeval lob_new_begin, lob_new_end;
2551  DB_ELO *elo_debug;
2552 
2553  if (argc != 3)
2554  {
2555 #if defined(CAS_FOR_DBMS)
2557  NET_BUF_ERR_SET (net_buf);
2558 #else /* CAS_FOR_DBMS */
2559  net_buf_cp_int (net_buf, CAS_ER_ARGS, NULL);
2560 #endif /* CAS_FOR_DBMS */
2561  return FN_KEEP_CONN;
2562  }
2563 
2564  net_arg_get_lob_value (&lob_dbval, argv[0]);
2565  net_arg_get_bigint (&offset, argv[1]);
2566  net_arg_get_str (&data_buf, &data_length, argv[2]);
2567 
2568  elo_debug = db_get_elo (&lob_dbval);
2569  cas_log_write (0, false, "lob_write lob_type=%d offset=%lld, length=%d", elo_debug->type, offset, data_length);
2570  gettimeofday (&lob_new_begin, NULL);
2571 
2572  err_code = ux_lob_write (&lob_dbval, offset, data_length, data_buf, net_buf);
2573 
2574  gettimeofday (&lob_new_end, NULL);
2575  ut_timeval_diff (&lob_new_begin, &lob_new_end, &elapsed_sec, &elapsed_msec);
2576 
2577  cas_log_write (0, false, "lob_write %s%d time %d.%03d%s", err_code < 0 ? "error:" : "", err_info.err_number,
2578  elapsed_sec, elapsed_msec, get_error_log_eids (err_info.err_number));
2579 
2580  db_value_clear (&lob_dbval);
2581  return FN_KEEP_CONN;
2582 }
2583 
2584 FN_RETURN
2585 fn_lob_read (SOCKET sock_fd, int argc, void **argv, T_NET_BUF * net_buf, T_REQ_INFO * req_info)
2586 {
2587  DB_VALUE lob_dbval;
2588  INT64 offset;
2589  int err_code, data_length = 0;
2590  int elapsed_sec = 0, elapsed_msec = 0;
2591  struct timeval lob_new_begin, lob_new_end;
2592  DB_ELO *elo_debug;
2593 
2594  if (argc != 3)
2595  {
2596 #if defined(CAS_FOR_DBMS)
2598  NET_BUF_ERR_SET (net_buf);
2599 #else /* CAS_FOR_DBMS */
2600  net_buf_cp_int (net_buf, CAS_ER_ARGS, NULL);
2601 #endif /* CAS_FOR_DBMS */
2602  return FN_KEEP_CONN;
2603  }
2604 
2605  net_arg_get_lob_value (&lob_dbval, argv[0]);
2606  net_arg_get_bigint (&offset, argv[1]);
2607  net_arg_get_int (&data_length, argv[2]);
2608 
2609  elo_debug = db_get_elo (&lob_dbval);
2610  cas_log_write (0, false, "lob_read lob_type=%d offset=%lld, length=%d", elo_debug->type, offset, data_length);
2611  gettimeofday (&lob_new_begin, NULL);
2612 
2613  err_code = ux_lob_read (&lob_dbval, offset, data_length, net_buf);
2614 
2615  gettimeofday (&lob_new_end, NULL);
2616  ut_timeval_diff (&lob_new_begin, &lob_new_end, &elapsed_sec, &elapsed_msec);
2617 
2618  cas_log_write (0, false, "lob_read %s%d time %d.%03d%s", err_code < 0 ? "error:" : "", err_info.err_number,
2619  elapsed_sec, elapsed_msec, get_error_log_eids (err_info.err_number));
2620 
2621  db_value_clear (&lob_dbval);
2622  return FN_KEEP_CONN;
2623 }
2624 
2625 FN_RETURN
2626 fn_deprecated (SOCKET sock_fd, int argc, void **argv, T_NET_BUF * net_buf, T_REQ_INFO * req_info)
2627 {
2628 #if defined(CAS_FOR_DBMS)
2630  NET_BUF_ERR_SET (net_buf);
2631 #else /* CAS_FOR_DBMS */
2633 #endif /* CAS_FOR_DBMS */
2634  return FN_KEEP_CONN;
2635 }
2636 #endif
2637 
2638 FN_RETURN
2639 fn_not_supported (SOCKET sock_fd, int argc, void **argv, T_NET_BUF * net_buf, T_REQ_INFO * req_info)
2640 {
2642  NET_BUF_ERR_SET (net_buf);
2643  return FN_KEEP_CONN;
2644 }
2645 
2646 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
2647 void
2649 {
2650 #ifndef LIBCAS_FOR_JSP
2651  int broker_timeout_in_millis = shm_appl->query_timeout * 1000;
2652 
2653  if (tran_is_in_libcas () == false)
2654  {
2655  if (query_timeout == 0 || broker_timeout_in_millis == 0)
2656  {
2657  tran_set_query_timeout (query_timeout + broker_timeout_in_millis);
2658 
2659  if (query_timeout == 0 && broker_timeout_in_millis == 0)
2660  {
2661  cas_log_write (SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false, "set query timeout to 0 (no limit)");
2662  }
2663  else
2664  {
2665  cas_log_write (SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false, "set query timeout to %d ms (from %s)",
2666  (query_timeout + broker_timeout_in_millis), (query_timeout > 0 ? "app" : "broker"));
2667  }
2668  }
2669  else if (query_timeout > broker_timeout_in_millis)
2670  {
2671  tran_set_query_timeout (broker_timeout_in_millis);
2672  cas_log_write (SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false, "set query timeout to %d ms (from broker)",
2673  broker_timeout_in_millis);
2674  }
2675  else
2676  {
2677  tran_set_query_timeout (query_timeout);
2678  cas_log_write (SRV_HANDLE_QUERY_SEQ_NUM (srv_handle), false, "set query timeout to %d ms (from app)",
2679  query_timeout);
2680  }
2681  }
2682 #else
2684 #endif
2685 }
2686 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
2687 
2688 static void
2690 {
2691  assert (as_info_p != NULL);
2692  assert (err_info_p != NULL);
2693 
2694  if (err_info_p->err_number != ER_QPROC_INVALID_XASLNODE)
2695  {
2696  as_info_p->num_error_queries %= MAX_DIAG_DATA_VALUE;
2697  as_info_p->num_error_queries++;
2698  }
2699 
2700  if (err_info_p->err_indicator == DBMS_ERROR_INDICATOR)
2701  {
2702  if (err_info_p->err_number == ER_BTREE_UNIQUE_FAILED || err_info_p->err_number == ER_UNIQUE_VIOLATION_WITHKEY)
2703  {
2705  as_info_p->num_unique_error_queries++;
2706  }
2707  }
2708 }
2709 
2710 static char
2712 {
2713  char stmt_type = -1;
2714  for (int i = 0; i < srv_handle->num_q_result; i++)
2715  {
2716  if (logddl_is_ddl_type (srv_handle->q_result[i].stmt_type) == true)
2717  {
2718  stmt_type = srv_handle->q_result[i].stmt_type;
2719  break;
2720  }
2721  }
2722  return stmt_type;
2723 }
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)
INT64 num_long_transactions
Definition: broker_shm.h:347
T_QUERY_RESULT * q_result
Definition: cas_handle.h:159
void net_arg_get_datetime(short *yr, short *mon, short *day, short *hh, short *mm, short *ss, short *ms, void *arg)
Definition: cas_net_buf.c:625
enum tran_auto_commit need_auto_commit
Definition: cas.h:77
#define NO_ERROR
Definition: error_code.h:46
T_BROKER_VERSION client_version
Definition: cas.h:75
#define TRUE
Definition: broker_admin.c:49
int ux_prepare(char *sql_stmt, int flag, char auto_commit_mode, T_NET_BUF *net_buf, T_REQ_INFO *req_info, unsigned int query_seq_num)
Definition: cas_execute.c:729
int ux_get_class_num_objs(char *class_name, int flag, T_NET_BUF *net_buf)
Definition: cas_execute.c:2853
#define NET_BUF_ERR_SET(NET_BUF)
Definition: cas_execute.h:55
FN_RETURN fn_execute_batch(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
void net_arg_get_datetimetz(short *yr, short *mon, short *day, short *hh, short *mm, short *ss, short *ms, char **tz, int *tz_size, void *arg)
Definition: cas_net_buf.c:654
static const char * get_tran_type_str(int tran_type)
FN_RETURN fn_not_supported(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
int SOCKET
Definition: porting.h:482
int net_buf_cp_str(T_NET_BUF *net_buf, const char *buf, int size)
Definition: cas_net_buf.c:110
const char * db_get_class_name(DB_OBJECT *class_)
Definition: db_info.c:608
FN_RETURN fn_oid(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
int ux_lob_write(DB_VALUE *lob_dbval, INT64 offset, int size, char *data, T_NET_BUF *net_buf)
Definition: cas_execute.c:9898
#define SHM_LOG_MSG_SIZE
Definition: broker_shm.h:112
int ux_set_isolation_level(int new_isol_level, T_NET_BUF *net_buf)
Definition: cas_execute.c:2496
#define DB_MAX_STRING_LENGTH
Definition: dbtype_def.h:516
int ux_col_set_drop(DB_COLLECTION *col, DB_VALUE *ele_val, T_NET_BUF *net_buf)
Definition: cas_execute.c:2946
static const char * tran_type_str[]
Definition: cas_function.c:90
#define CAS_PROTO_MAKE_VER(VER)
Definition: cas_protocol.h:284
int argc
Definition: dynamic_load.c:951
static const char * type_str_tbl[]
Definition: cas_function.c:116
bool logddl_is_ddl_type(int node_type)
Definition: ddl_log.c:1330
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
#define db_get_collection
Definition: dbtype.h:60
int ux_get_attr_type_str(char *class_name, char *attr_name, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_execute.c:3219
char * sql_stmt
Definition: cas_handle.h:169
char forward_only_cursor
Definition: cas_handle.h:192
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
void cas_log_write_nonl(unsigned int seq_num, bool unit_start, const char *fmt,...)
Definition: cas_log.c:442
FN_RETURN fn_cursor(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
DB_ELO_TYPE type
Definition: dbtype_def.h:950
char log_msg[SHM_LOG_MSG_SIZE]
Definition: broker_shm.h:342
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 ER_QPROC_INVALID_XASLNODE
Definition: error_code.h:532
int db_is_instance(MOP obj)
Definition: db_info.c:394
char need_rollback
Definition: cas.h:78
FN_RETURN
Definition: cas_function.h:31
int db_query_end(DB_QUERY_RESULT *result)
Definition: db_query.c:3362
int ux_get_db_version(T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_execute.c:2833
FN_RETURN fn_lob_write(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
FN_RETURN fn_get_db_version(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
bool tran_is_in_libcas(void)
void set_query_timeout(T_SRV_HANDLE *srv_handle, int query_timeout)
int ux_execute_array(T_SRV_HANDLE *srv_handle, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_execute.c:2200
int ux_get_generated_keys(T_SRV_HANDLE *srv_handle, T_NET_BUF *net_buf)
Definition: cas_execute.c:9130
static FN_RETURN fn_prepare_internal(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info, int *ret_srv_h_id)
Definition: cas_function.c:309
INT64 num_unique_error_queries
Definition: broker_shm.h:369
int ux_get_row_count(T_NET_BUF *net_buf)
Definition: cas_execute.c:1076
bool use_query_cache
Definition: cas_handle.h:194
void net_arg_get_cci_object(int *pageid, short *slotid, short *volid, void *arg)
Definition: cas_net_buf.c:717
char * cas_log_error_handler_asprint(char *buf, size_t bufsz, bool clear)
Definition: cas_execute.c:9780
int cas_send_result_flag
Definition: cas.c:182
#define CAS_MAKE_VER(MAJOR, MINOR, PATCH)
Definition: cas_protocol.h:304
void cas_slow_log_end()
Definition: cas_log.c:1033
void cas_slow_log_write_value_string(char *value, int size)
Definition: cas_log.c:1125
#define IS_ERROR_INFO_SET()
Definition: cas_execute.h:48
FN_RETURN fn_cursor_close(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
int ux_oid_put(int argc, void **argv, T_NET_BUF *net_buf)
Definition: cas_execute.c:3046
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
void logddl_set_sql_text(char *sql_text, int len)
Definition: ddl_log.c:268
FN_RETURN fn_make_out_rs(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
#define ER_UCI_TOO_FEW_HOST_VARS
Definition: error_code.h:541
void net_arg_get_int(int *value, void *arg)
Definition: cas_net_buf.c:484
DB_ELO * db_get_elo(const DB_VALUE *value)
int ux_col_set_add(DB_COLLECTION *col, DB_VALUE *ele_val, T_NET_BUF *net_buf)
Definition: cas_execute.c:2966
int db_lock_read(DB_OBJECT *op)
Definition: db_admin.c:2001
static FN_RETURN fn_execute_internal(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info, int *prepared_srv_h_id)
Definition: cas_function.c:423
int ux_get_last_insert_id(T_NET_BUF *net_buf)
Definition: cas_execute.c:1101
char cur_statement_pooling
Definition: broker_shm.h:313
FN_RETURN fn_deprecated(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
int net_buf_cp_int(T_NET_BUF *net_buf, int value, int *begin_offset)
Definition: cas_net_buf.c:126
int db_lock_write(DB_OBJECT *op)
Definition: db_admin.c:2030
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
DB_ATTRIBUTE * db_get_attribute(DB_OBJECT *obj, const char *name)
Definition: db_info.c:791
Definition: db_set.h:35
void hm_srv_handle_free(int h_id)
Definition: cas_handle.c:155
int cas_shard_flag
Definition: cas.c:143
#define DOES_CLIENT_MATCH_THE_PROTOCOL(CLIENT, MATCH)
Definition: cas_protocol.h:289
char prepare_flag
Definition: cas_handle.h:185
int ux_lob_read(DB_VALUE *lob_dbval, INT64 offset, int size, T_NET_BUF *net_buf)
Definition: cas_execute.c:9925
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)
FN_RETURN fn_savepoint(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
char * db_get_execution_plan(void)
Definition: db_query.c:3621
#define assert(x)
char get_set_domain(DB_DOMAIN *set_domain, int *precision, short *scale, char *db_type, char *charset)
Definition: cas_execute.c:3123
void cas_log_write_query_string(char *query, int size)
Definition: cas_log.c:647
int ux_col_seq_drop(DB_COLLECTION *col, int index, T_NET_BUF *net_buf)
Definition: cas_execute.c:2986
FN_RETURN fn_execute_array(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
FN_RETURN fn_collection(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
bool use_plan_cache
Definition: cas_handle.h:193
void cas_log_write2_nonl(const char *fmt,...)
Definition: cas_log.c:584
int ux_col_seq_insert(DB_COLLECTION *col, int index, DB_VALUE *ele_val, T_NET_BUF *net_buf)
Definition: cas_execute.c:3006
int ux_execute_all(T_SRV_HANDLE *srv_handle, char flag, int max_col_size, int max_row, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info, CACHE_TIME *clt_cache_time, int *clt_cache_reusable)
Definition: cas_execute.c:1437
int db_error_code(void)
Definition: db_admin.c:2143
#define SRV_HANDLE_QUERY_SEQ_NUM(SRV_HANDLE)
Definition: cas_handle.h:37
DB_TYPE db_value_type(const DB_VALUE *value)
void net_arg_get_short(short *value, void *arg)
Definition: cas_net_buf.c:495
static const char * get_schema_type_str(int schema_type)
int db_put(DB_OBJECT *obj, const char *name, DB_VALUE *value)
Definition: db_obj.c:318
void net_arg_get_str(char **value, int *size, void *arg)
Definition: cas_net_buf.c:528
int db_col_free(DB_COLLECTION *col)
Definition: db_set.c:998
static enum scanner_mode mode
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
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
T_ERROR_INFO err_info
Definition: cas.c:186
int db_abort_to_savepoint(const char *savepoint_name)
Definition: db_admin.c:1237
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
void cas_log_end(int mode, int run_time_sec, int run_time_msec)
Definition: cas_log.c:319
#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)
#define TP_DOMAIN_TYPE(dom)
int db_execute_statement(DB_SESSION *session, int stmt_ndx, DB_QUERY_RESULT **result)
Definition: db_vdb.c:2978
static void bind_value_print(char type, void *net_value, bool slow_log)
#define NULL
Definition: freelistheap.h:34
int db_drop(DB_OBJECT *obj)
Definition: db_obj.c:190
void cas_slow_log_write_query_string(char *query, int size)
Definition: cas_log.c:1141
DB_SESSION * db_open_buffer(const char *buffer)
Definition: db_vdb.c:232
void cas_log_write_value_string(char *value, int size)
Definition: cas_log.c:625
int db_compile_statement(DB_SESSION *session)
Definition: db_vdb.c:766
void db_close_session(DB_SESSION *session)
Definition: db_vdb.c:3319
void cas_log_debug(const char *file_name, const int line_no, const char *fmt,...)
Definition: cas_log.c:701
void net_arg_get_lob_value(DB_VALUE *db_lob, void *arg)
Definition: cas_net_buf.c:762
void net_arg_get_bigint(DB_BIGINT *value, void *arg)
Definition: cas_net_buf.c:472
#define FREE_MEM(PTR)
Definition: cas_common.h:58
#define err(fd,...)
Definition: porting.h:431
int ux_execute_batch(int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info, char auto_commit_mode)
Definition: cas_execute.c:2010
int db_savepoint_transaction(const char *savepoint_name)
Definition: db_admin.c:1198
int ux_next_result(T_SRV_HANDLE *srv_handle, char flag, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_execute.c:1946
#define ER_UNIQUE_VIOLATION_WITHKEY
Definition: error_code.h:1103
char ux_db_type_to_cas_type(int db_type)
Definition: cas_execute.c:3458
FN_RETURN fn_lob_read(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
void net_arg_get_size(int *size, void *arg)
Definition: cas_net_buf.c:451
bool cas_default_no_backslash_escapes
Definition: cas.c:180
int err_number
Definition: cas.h:85
int get_tuple_count(T_SRV_HANDLE *srv_handle)
Definition: cas_execute.c:9834
#define CAS_SCHEMA_DEFAULT_CHARSET
Definition: cas_common.h:170
void db_set_execution_plan(char *plan, int length)
Definition: db_query.c:3567
void sql_log2_init(char *br_name, int index, int sql_log_value, bool log_reuse_flag)
Definition: cas_sql_log2.c:53
int ux_check_connection(void)
Definition: cas_execute.c:406
static T_SHM_APPL_SERVER * shm_appl
Definition: broker.c:311
char is_pooled
Definition: cas_handle.h:189
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
void net_arg_get_cache_time(void *ct, void *arg)
Definition: cas_net_buf.c:688
void ux_cursor_close(T_SRV_HANDLE *srv_handle)
Definition: cas_execute.c:2805
DB_DOMAIN * db_attribute_domain(DB_ATTRIBUTE *attribute)
Definition: db_info.c:1165
int ut_check_timeout(struct timeval *start_time, struct timeval *end_time, int timeout_msec, int *res_sec, int *res_msec)
Definition: cas_util.c:119
void ux_call_info_cp_param_mode(T_SRV_HANDLE *srv_handle, char *param_mode, int num_param)
Definition: cas_execute.c:3645
int ux_is_database_connected(void)
Definition: cas_execute.c:622
int ux_cursor(int srv_h_id, int offset, int origin, T_NET_BUF *net_buf)
Definition: cas_execute.c:2674
int jsp_send_destroy_request_all()
Definition: jsp_cl.c:1963
struct timeval tran_start_time
Definition: cas.c:157
#define ER_BTREE_UNIQUE_FAILED
Definition: error_code.h:811
void ux_col_size(DB_COLLECTION *col, T_NET_BUF *net_buf)
Definition: cas_execute.c:2927
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
int ux_make_out_rs(int srv_h_id, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_execute.c:9444
void ux_col_get(DB_COLLECTION *col, char col_type, char ele_type, DB_DOMAIN *ele_domain, T_NET_BUF *net_buf)
Definition: cas_execute.c:2889
void cas_log_reset(char *br_name)
Definition: cas_log.c:211
int ux_check_object(DB_OBJECT *obj, T_NET_BUF *net_buf)
Definition: cas_execute.c:3421
char driver_info[SRV_CON_CLIENT_INFO_SIZE]
Definition: cas.h:76
int errors_in_transaction
Definition: cas.c:167
void ux_set_lock_timeout(int lock_timeout)
Definition: cas_execute.c:2513
#define ARG_FILE_LINE
Definition: error_manager.h:44
void cas_slow_log_reset(char *br_name)
Definition: cas_log.c:998
static char * get_error_log_eids(int err)
static void update_error_query_count(T_APPL_SERVER_INFO *as_info_p, const T_ERROR_INFO *err_info_p)
void tran_set_query_timeout(int)
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
int hm_new_srv_handle(T_SRV_HANDLE **new_handle, unsigned int seq_num)
Definition: cas_handle.c:62
#define SQL_LOG2_COMPILE_BEGIN(SQL_LOG2_VALUE, SQL_STMT)
Definition: cas_sql_log2.h:68
void cas_log_query_info_init(int id, char is_only_query_plan)
Definition: cas_log.c:871
const char ** argv
Definition: dynamic_load.c:952
char * locator
Definition: dbtype_def.h:948
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
void cas_log_write(unsigned int seq_num, bool unit_start, const char *fmt,...)
Definition: cas_log.c:506
int ux_get_query_info(int srv_h_id, char info_type, T_NET_BUF *net_buf)
Definition: cas_execute.c:3272
void cas_slow_log_write2(const char *fmt,...)
Definition: cas_log.c:1105
enum intl_codeset INTL_CODESET
Definition: intl_support.h:190
int intl_char_count(const unsigned char *src, int length_in_bytes, INTL_CODESET src_codeset, int *char_count)
Definition: intl_support.c:983
int make_bind_value(int num_bind, int argc, void **argv, DB_VALUE **ret_val, T_NET_BUF *net_buf, char desired_type)
Definition: cas_execute.c:3176
void cas_slow_log_write(struct timeval *log_time, unsigned int seq_num, bool unit_start, const char *fmt,...)
Definition: cas_log.c:1085
void logddl_set_commit_mode(bool mode)
Definition: ddl_log.c:422
int db_get(DB_OBJECT *object, const char *attpath, DB_VALUE *value)
Definition: db_obj.c:233
int tran_timeout
Definition: cas.c:159
int query_timeout
Definition: cas.c:160
int ux_execute(T_SRV_HANDLE *srv_handle, char flag, int max_col_size, int max_row, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info, CACHE_TIME *clt_cache_time, int *clt_cache_reusable)
Definition: cas_execute.c:1126
int64_t size
Definition: dbtype_def.h:947
#define FALSE
Definition: broker_admin.c:50
T_APPL_SERVER_INFO * as_info
Definition: cas.c:153
#define ERROR_INFO_SET(ERR_CODE, ERR_INDICATOR)
Definition: cas_execute.h:49
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 DOES_CLIENT_UNDERSTAND_THE_PROTOCOL(CLIENT, REQUIRE)
Definition: cas_protocol.h:290
void er_clear(void)
static SOCKET sock_fd
Definition: broker.c:300
#define DBMS_ERROR_INDICATOR
Definition: cas.h:40
void ux_get_tran_setting(int *lock_wait, int *isol_level)
Definition: cas_execute.c:2476
static void bind_value_log(struct timeval *log_time, int start, int argc, void **argv, int param_size, char *param_mode, unsigned int query_seq_num, bool slow_log)
char query_info_flag
Definition: cas_handle.h:188
int ux_get_parameter_info(int srv_h_id, T_NET_BUF *net_buf)
Definition: cas_execute.c:3325
int i
Definition: dynamic_load.c:954
static const char * schema_type_str[]
Definition: cas_function.c:94
Definition: cas.h:73
int ux_end_tran(int tran_type, bool reset_con_status)
Definition: cas_execute.c:984
int num_q_result
Definition: cas_handle.h:174
#define MAX_DIAG_DATA_VALUE
Definition: perf_monitor.h:50
int ux_fetch(T_SRV_HANDLE *srv_handle, int cursor_pos, int fetch_count, char fetch_flag, int result_set_index, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_execute.c:2536
int db_value_clear(DB_VALUE *value)
Definition: db_macro.c:1588
void ux_set_cas_change_mode(int mode, T_NET_BUF *net_buf)
Definition: cas_execute.c:2519
void net_arg_get_dbobject(DB_OBJECT **obj, void *arg)
Definition: cas_net_buf.c:704
void net_arg_get_double(double *value, void *arg)
Definition: cas_net_buf.c:517
void logddl_write_tran_str(const char *fmt,...)
Definition: ddl_log.c:807
void logddl_free(bool all_free)
Definition: ddl_log.c:143
char * meta_data
Definition: dbtype_def.h:949
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 auto_commit_mode
Definition: cas_handle.h:191
void net_arg_get_float(float *value, void *arg)
Definition: cas_net_buf.c:506
int ux_oid_get(int argc, void **argv, T_NET_BUF *net_buf)
Definition: cas_execute.c:2600
void logddl_set_err_code(int err_code)
Definition: ddl_log.c:361
int query_seq_num_next_value(void)
Definition: cas.c:2935
int err_indicator
Definition: cas.h:84
static T_REQ_INFO req_info
Definition: cas.c:333
FN_RETURN fn_oid_get(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
char * ut_trim(char *str)
char * cas_error_log_get_eid(char *buf, size_t bufsz)
void ut_timeval_diff(struct timeval *start, struct timeval *end, int *res_sec, int *res_msec)
Definition: cas_util.c:101
FN_RETURN fn_get_query_info(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
int ux_execute_call(T_SRV_HANDLE *srv_handle, char flag, int max_col_size, int max_row, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info, CACHE_TIME *clt_cache_time, int *clt_cache_reusable)
Definition: cas_execute.c:1772
FN_RETURN fn_cursor_update(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
int net_buf_cp_byte(T_NET_BUF *net_buf, char ch)
Definition: cas_net_buf.c:97
void logddl_set_stmt_type(int stmt_type)
Definition: ddl_log.c:291
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
static char logddl_is_exist_ddl_stmt(T_SRV_HANDLE *srv_handle)
int ux_col_seq_put(DB_COLLECTION *col, int index, DB_VALUE *ele_val, T_NET_BUF *net_buf)
Definition: cas_execute.c:3026
FN_RETURN fn_lob_new(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
int ux_cursor_update(T_SRV_HANDLE *srv_handle, int cursor_pos, int argc, void **argv, T_NET_BUF *net_buf)
Definition: cas_execute.c:2710
int ux_schema_info(int schema_type, char *arg1, char *arg2, char flag, T_NET_BUF *net_buf, T_REQ_INFO *req_info, unsigned int query_seq_num)
Definition: cas_execute.c:3506
FN_RETURN fn_get_attr_type_str(SOCKET sock_fd, int argc, void **argv, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
#define net_arg_get_char(value, arg)
Definition: cas_net_buf.h:146
DB_DOMAIN * db_domain_set(const DB_DOMAIN *domain)
Definition: db_macro.c:4060
int ux_lob_new(int lob_type, T_NET_BUF *net_buf)
Definition: cas_execute.c:9864
void reset_optimization_level_as_saved(void)
Definition: cas_execute.c:9850