CUBRID Engine  latest
cas_execute.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_execute.c -
22  */
23 
24 #ident "$Id$"
25 
26 #include "config.h"
27 
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <string.h>
31 
32 #if defined(WINDOWS)
33 #include <winsock2.h>
34 #include <windows.h>
35 #include <io.h>
36 #include <fcntl.h>
37 #include <process.h>
38 #else /* WINDOWS */
39 #include <unistd.h>
40 #include <fcntl.h>
41 #include <sys/time.h>
42 #endif /* WINDOWS */
43 #include <assert.h>
44 
45 #include "cas_db_inc.h"
46 
47 #include "cas.h"
48 #include "cas_common.h"
49 #include "cas_execute.h"
50 #include "cas_network.h"
51 #include "cas_util.h"
52 #include "cas_schema_info.h"
53 #include "cas_log.h"
54 #include "cas_str_like.h"
55 
56 #include "broker_filename.h"
57 #include "cas_sql_log2.h"
58 
59 #include "tz_support.h"
60 #include "release_string.h"
61 #include "perf_monitor.h"
62 #include "intl_support.h"
63 #include "language_support.h"
64 #include "unicode_support.h"
65 #include "transaction_cl.h"
66 #include "authenticate.h"
67 #include "trigger_manager.h"
68 #include "system_parameter.h"
69 #include "schema_manager.h"
70 #include "object_representation.h"
71 #include "connection_cl.h"
72 
73 #include "db_set_function.h"
74 #include "dbi.h"
75 #include "dbtype.h"
76 #include "memory_alloc.h"
77 #include "object_primitive.h"
78 #include "ddl_log.h"
79 #include "parse_tree.h"
80 #include "api_compat.h"
81 #if defined (SUPPRESS_STRLEN_WARNING)
82 #define strlen(s1) ((int) strlen(s1))
83 #endif /* defined (SUPPRESS_STRLEN_WARNING) */
84 
85 #define QUERY_BUFFER_MAX 4096
86 
87 #define FK_INFO_SORT_BY_PKTABLE_NAME 1
88 #define FK_INFO_SORT_BY_FKTABLE_NAME 2
89 
90 typedef enum
91 {
99 
100 #if !defined(WINDOWS)
101 #define STRING_APPEND(buffer_p, avail_size_holder, ...) \
102  do { \
103  if (avail_size_holder > 0) { \
104  int n = snprintf (buffer_p, avail_size_holder, __VA_ARGS__); \
105  if (n > 0) { \
106  if (n < avail_size_holder) { \
107  buffer_p += n; avail_size_holder -= n; \
108  } else { \
109  buffer_p += (avail_size_holder - 1); \
110  avail_size_holder = 0; \
111  } \
112  } \
113  } \
114  } while (0)
115 #else /* !WINDOWS */
116 #define STRING_APPEND(buffer_p, avail_size_holder, ...) \
117  do { \
118  if (avail_size_holder > 0) { \
119  int n = _snprintf (buffer_p, avail_size_holder, __VA_ARGS__); \
120  if (n < 0 || n >= avail_size_holder) { \
121  buffer_p += (avail_size_holder - 1); \
122  avail_size_holder = 0; \
123  *buffer_p = '\0'; \
124  } else { \
125  buffer_p += n; avail_size_holder -= n; \
126  } \
127  } \
128  } while (0)
129 #endif /* !WINDOWS */
130 
131 #define IS_NULL_CAS_TYPE(cas_type) ((cas_type) == CCI_U_TYPE_NULL)
132 
133 /* borrowed from optimizer.h: OPT_LEVEL, OPTIMIZATION_ENABLED,
134  * PLAN_DUMP_ENABLED, SIMPLE_DUMP,
135  * DETAILED_DUMP
136  */
137 #define CHK_OPT_LEVEL(level) ((level) & 0xff)
138 #define CHK_OPTIMIZATION_ENABLED(level) (CHK_OPT_LEVEL(level) != 0)
139 #define CHK_PLAN_DUMP_ENABLED(level) ((level) >= 0x100)
140 #define CHK_SIMPLE_DUMP(level) ((level) & 0x100)
141 #define CHK_DETAILED_DUMP(level) ((level) & 0x200)
142 #define CHK_OPTIMIZATION_LEVEL_VALID(level) \
143  (CHK_OPTIMIZATION_ENABLED(level) \
144  || CHK_PLAN_DUMP_ENABLED(level) \
145  || (level == 0))
146 
147 
148 typedef int (*T_FETCH_FUNC) (T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *);
149 
150 typedef struct t_priv_table T_PRIV_TABLE;
152 {
153  char *class_name;
154  char priv;
155  char grant;
156 };
157 
160 {
161  char *class_name;
162  short class_type;
163 };
164 
165 typedef struct t_attr_table T_ATTR_TABLE;
167 {
168  const char *class_name;
169  const char *attr_name;
170  const char *source_class;
172  short scale;
173  short attr_order;
174  void *default_val;
175  unsigned char domain;
176  char indexed;
177  char non_null;
178  char shared;
179  char unique;
181  char is_key;
182  const char *comment;
183 };
184 
185 extern void histo_print (FILE * stream);
186 extern void histo_clear (void);
187 
188 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
189 extern void set_query_timeout (T_SRV_HANDLE * srv_handle, int query_timeout);
190 #endif /* !LIBCAS_FOR_JSP */
191 
192 static int netval_to_dbval (void *type, void *value, DB_VALUE * db_val, T_NET_BUF * net_buf, char desired_type);
193 static int cur_tuple (T_QUERY_RESULT * q_result, int max_col_size, char sensitive_flag, DB_OBJECT * obj,
194  T_NET_BUF * net_buf);
195 static int dbval_to_net_buf (DB_VALUE * val, T_NET_BUF * net_buf, char fetch_flag, int max_col_size,
196  char column_type_flag);
197 static void dbobj_to_casobj (DB_OBJECT * obj, T_OBJECT * cas_obj);
198 static void casobj_to_dbobj (T_OBJECT * cas_obj, DB_OBJECT ** obj);
199 static void dblob_to_caslob (DB_VALUE * lob, T_LOB_HANDLE * cas_lob);
200 static void caslob_to_dblob (T_LOB_HANDLE * cas_lob, DB_VALUE * lob);
201 static int get_attr_name (DB_OBJECT * obj, char ***ret_attr_name);
202 static int get_attr_name_from_argv (int argc, void **argv, char ***ret_attr_name);
203 static int oid_attr_info_set (T_NET_BUF * net_buf, DB_OBJECT * obj, int num_attr, char **attr_name);
204 static int oid_data_set (T_NET_BUF * net_buf, DB_OBJECT * obj, int attr_num, char **attr_name);
205 static int prepare_column_list_info_set (DB_SESSION * session, char prepare_flag, T_QUERY_RESULT * q_result,
206  T_NET_BUF * net_buf, T_BROKER_VERSION client_version);
207 static void prepare_column_info_set (T_NET_BUF * net_buf, char ut, short scale, int prec, char charset,
208  const char *col_name, const char *default_value, char auto_increment,
209  char unique_key, char primary_key, char reverse_index, char reverse_unique,
210  char foreign_key, char shared, const char *attr_name, const char *class_name,
211  char nullable, T_BROKER_VERSION client_version);
212 static void set_column_info (T_NET_BUF * net_buf, char ut, short scale, int prec, char charset, const char *col_name,
213  const char *attr_name, const char *class_name, char is_non_null,
214  T_BROKER_VERSION client_version);
215 
216 /*
217  fetch_xxx prototype:
218  fetch_xxx(T_SRV_HANDLE *, int cursor_pos, int fetch_count, char fetch_flag,
219  int result_set_idx, T_NET_BUF *);
220 */
221 static int fetch_result (T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *);
222 static int fetch_class (T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *);
223 static int fetch_attribute (T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *);
224 static int fetch_method (T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *);
225 static int fetch_methfile (T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *);
226 static int fetch_constraint (T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *);
227 static int fetch_trigger (T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *);
228 static int fetch_privilege (T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *);
229 static int fetch_foreign_keys (T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *);
230 static void add_res_data_bytes (T_NET_BUF * net_buf, const char *str, int size, unsigned char ext_type, int *net_size);
231 static void add_res_data_string (T_NET_BUF * net_buf, const char *str, int size, unsigned char ext_type,
232  unsigned char charset, int *net_size);
233 static void add_res_data_string_safe (T_NET_BUF * net_buf, const char *str, unsigned char ext_type,
234  unsigned char charset, int *net_size);
235 static void add_res_data_int (T_NET_BUF * net_buf, int value, unsigned char ext_type, int *net_size);
236 static void add_res_data_bigint (T_NET_BUF * net_buf, DB_BIGINT value, unsigned char ext_type, int *net_size);
237 static void add_res_data_short (T_NET_BUF * net_buf, short value, unsigned char ext_type, int *net_size);
238 static void add_res_data_float (T_NET_BUF * net_buf, float value, unsigned char ext_type, int *net_size);
239 static void add_res_data_double (T_NET_BUF * net_buf, double value, unsigned char ext_type, int *net_size);
240 static void add_res_data_timestamp (T_NET_BUF * net_buf, short yr, short mon, short day, short hh, short mm, short ss,
241  unsigned char ext_type, int *net_size);
242 static void add_res_data_timestamptz (T_NET_BUF * net_buf, short yr, short mon, short day, short hh, short mm, short ss,
243  char *tz_str, unsigned char ext_type, int *net_size);
244 static void add_res_data_datetime (T_NET_BUF * net_buf, short yr, short mon, short day, short hh, short mm, short ss,
245  short ms, unsigned char ext_type, int *net_size);
246 static void add_res_data_datetimetz (T_NET_BUF * net_buf, short yr, short mon, short day, short hh, short mm, short ss,
247  short ms, char *tz_str, unsigned char ext_type, int *net_size);
248 static void add_res_data_time (T_NET_BUF * net_buf, short hh, short mm, short ss, unsigned char ext_type,
249  int *net_size);
250 static void add_res_data_date (T_NET_BUF * net_buf, short yr, short mon, short day, unsigned char ext_type,
251  int *net_size);
252 static void add_res_data_object (T_NET_BUF * net_buf, T_OBJECT * obj, unsigned char ext_type, int *net_size);
253 static void add_res_data_lob_handle (T_NET_BUF * net_buf, T_LOB_HANDLE * lob, unsigned char ext_type, int *net_size);
254 static void trigger_event_str (DB_TRIGGER_EVENT trig_event, char *buf);
255 static void trigger_status_str (DB_TRIGGER_STATUS trig_status, char *buf);
256 static void trigger_time_str (DB_TRIGGER_TIME trig_time, char *buf);
257 
258 static int get_num_markers (char *stmt);
259 static char *consume_tokens (char *stmt, STATEMENT_STATUS stmt_status);
260 static char get_stmt_type (char *stmt);
261 static int execute_info_set (T_SRV_HANDLE * srv_handle, T_NET_BUF * net_buf, T_BROKER_VERSION client_version,
262  char exec_flag);
263 static char get_attr_type (DB_OBJECT * obj_p, char *attr_name);
264 
265 static char *get_domain_str (DB_DOMAIN * domain);
266 
267 static DB_OBJECT *ux_str_to_obj (char *str);
268 
269 static int sch_class_info (T_NET_BUF * net_buf, char *class_name, char pattern_flag, char flag, T_SRV_HANDLE *,
270  T_BROKER_VERSION client_version);
271 static int sch_attr_info (T_NET_BUF * net_buf, char *class_name, char *attr_name, char pattern_flag, char flag,
272  T_SRV_HANDLE *);
273 static int sch_queryspec (T_NET_BUF * net_buf, char *class_name, T_SRV_HANDLE *);
274 static void sch_method_info (T_NET_BUF * net_buf, char *class_name, char flag, void **result);
275 static void sch_methfile_info (T_NET_BUF * net_buf, char *class_name, void **result);
276 static int sch_superclass (T_NET_BUF * net_buf, char *class_name, char flag, T_SRV_HANDLE * srv_handle);
277 static void sch_constraint (T_NET_BUF * net_buf, char *class_name, void **result);
278 static void sch_trigger (T_NET_BUF * net_buf, char *class_name, char flag, void **result);
279 static int sch_class_priv (T_NET_BUF * net_buf, char *class_name, char pat_flag, T_SRV_HANDLE * srv_handle);
280 static int sch_attr_priv (T_NET_BUF * net_buf, char *class_name, char *attr_name, char pat_flag,
281  T_SRV_HANDLE * srv_handle);
282 static int sch_direct_super_class (T_NET_BUF * net_buf, char *class_name, int pattern_flag, T_SRV_HANDLE * srv_handle);
283 static int sch_imported_keys (T_NET_BUF * net_buf, char *class_name, void **result);
284 static int sch_exported_keys_or_cross_reference (T_NET_BUF * net_buf, bool find_cross_ref, char *pktable_name,
285  char *fktable_name, void **result);
286 static int class_type (DB_OBJECT * class_obj);
287 static int class_attr_info (const char *class_name, DB_ATTRIBUTE * attr, char *attr_pattern, char pat_flag,
288  T_ATTR_TABLE * attr_table);
289 static int set_priv_table (unsigned int class_priv, char *name, T_PRIV_TABLE * priv_table, int index);
290 static int sch_query_execute (T_SRV_HANDLE * srv_handle, char *sql_stmt, T_NET_BUF * net_buf);
291 static int sch_primary_key (T_NET_BUF * net_buf, char *class_name, T_SRV_HANDLE * srv_handle);
292 static short constraint_dbtype_to_castype (int db_const_type);
293 
294 static T_PREPARE_CALL_INFO *make_prepare_call_info (int num_args, int is_first_out);
295 static void prepare_call_info_dbval_clear (T_PREPARE_CALL_INFO * call_info);
296 static int fetch_call (T_SRV_HANDLE * srv_handle, T_NET_BUF * net_buf, T_REQ_INFO * req_info);
297 static int create_srv_handle_with_query_result (T_QUERY_RESULT * src_q_result, DB_QUERY_TYPE * column_info,
298  unsigned int query_seq_num);
299 #define check_class_chn(s) 0
300 static int get_client_result_cache_lifetime (DB_SESSION * session, int stmt_id);
301 static bool has_stmt_result_set (char stmt_type);
302 static bool check_auto_commit_after_getting_result (T_SRV_HANDLE * srv_handle);
303 static const char *convert_db_value_to_string (DB_VALUE * value, DB_VALUE * value_string);
304 static void serialize_collection_as_string (DB_VALUE * col, char **out);
305 static void add_fk_info_before (T_FK_INFO_RESULT * pivot, T_FK_INFO_RESULT * pnew);
306 static void add_fk_info_after (T_FK_INFO_RESULT * pivot, T_FK_INFO_RESULT * pnew);
307 static T_FK_INFO_RESULT *add_fk_info_result (T_FK_INFO_RESULT * fk_res, const char *pktable_name,
308  const char *pkcolumn_name, const char *fktable_name,
309  const char *fkcolumn_name, short key_seq,
310  SM_FOREIGN_KEY_ACTION update_action, SM_FOREIGN_KEY_ACTION delete_action,
311  const char *fk_name, const char *pk_name, int sort_by);
312 
313 static char *get_backslash_escape_string (void);
314 
315 static void update_query_execution_count (T_APPL_SERVER_INFO * as_info_p, char stmt_type);
316 static bool need_reconnect_on_rctime (void);
317 static void report_abnormal_host_status (int err_code);
318 
319 static int set_host_variables (DB_SESSION * session, int num_bind, DB_VALUE * in_values);
320 static unsigned char set_extended_cas_type (T_CCI_U_TYPE u_set_type, DB_TYPE db_type);
321 static short encode_ext_type_to_short (T_BROKER_VERSION client_version, unsigned char cas_type);
322 static int ux_get_generated_keys_server_insert (T_SRV_HANDLE * srv_handle, T_NET_BUF * net_buf);
323 static int ux_get_generated_keys_client_insert (T_SRV_HANDLE * srv_handle, T_NET_BUF * net_buf);
324 
325 static bool do_commit_after_execute (const t_srv_handle & server_handle);
326 
327 static char cas_u_type[] = { 0, /* 0 */
328  CCI_U_TYPE_INT, /* 1 */
329  CCI_U_TYPE_FLOAT, /* 2 */
330  CCI_U_TYPE_DOUBLE, /* 3 */
331  CCI_U_TYPE_STRING, /* 4 */
332  CCI_U_TYPE_OBJECT, /* 5 */
333  CCI_U_TYPE_SET, /* 6 */
334  CCI_U_TYPE_MULTISET, /* 7 */
335  CCI_U_TYPE_SEQUENCE, /* 8 */
336  0, /* 9 */
337  CCI_U_TYPE_TIME, /* 10 */
338  CCI_U_TYPE_TIMESTAMP, /* 11 */
339  CCI_U_TYPE_DATE, /* 12 */
340  CCI_U_TYPE_MONETARY, /* 13 */
341  0, 0, 0, 0, /* 14 - 17 */
342  CCI_U_TYPE_SHORT, /* 18 */
343  0, 0, 0, /* 19 - 21 */
344  CCI_U_TYPE_NUMERIC, /* 22 */
345  CCI_U_TYPE_BIT, /* 23 */
346  CCI_U_TYPE_VARBIT, /* 24 */
347  CCI_U_TYPE_CHAR, /* 25 */
348  CCI_U_TYPE_NCHAR, /* 26 */
349  CCI_U_TYPE_VARNCHAR, /* 27 */
350  CCI_U_TYPE_RESULTSET, /* 28 */
351  0, 0, /* 29 - 30 */
352  CCI_U_TYPE_BIGINT, /* 31 */
353  CCI_U_TYPE_DATETIME, /* 32 */
354  CCI_U_TYPE_BLOB, /* 33 */
355  CCI_U_TYPE_CLOB, /* 34 */
356  CCI_U_TYPE_ENUM, /* 35 */
357  CCI_U_TYPE_TIMESTAMPTZ, /* 36 */
358  CCI_U_TYPE_TIMESTAMPLTZ, /* 37 */
359  CCI_U_TYPE_DATETIMETZ, /* 38 */
360  CCI_U_TYPE_DATETIMELTZ, /* 39 */
361  CCI_U_TYPE_JSON, /* 40 */
362 };
363 
365  fetch_result, /* query */
366  fetch_result, /* SCH_CLASS */
367  fetch_result, /* SCH_VCLASS */
368  fetch_result, /* SCH_QUERY_SPEC */
369  fetch_attribute, /* SCH_ATTRIBUTE */
370  fetch_attribute, /* SCH_CLASS_ATTRIBUTE */
371  fetch_method, /* SCH_METHOD */
372  fetch_method, /* SCH_CLASS_METHOD */
373  fetch_methfile, /* SCH_METHOD_FILE */
374  fetch_class, /* SCH_SUPERCLASS */
375  fetch_class, /* SCH_SUBCLASS */
376  fetch_constraint, /* SCH_CONSTRAINT */
377  fetch_trigger, /* SCH_TRIGGER */
378  fetch_privilege, /* SCH_CLASS_PRIVILEGE */
379  fetch_privilege, /* SCH_ATTR_PRIVILEGE */
380  fetch_result, /* SCH_DIRECT_SUPER_CLASS */
381  fetch_result, /* SCH_PRIMARY_KEY */
382  fetch_foreign_keys, /* SCH_IMPORTED_KEYS */
383  fetch_foreign_keys, /* SCH_EXPORTED_KEYS */
384  fetch_foreign_keys, /* SCH_CROSS_REFERENCE */
385 };
386 
390 static char cas_db_sys_param[128] = "";
391 static int saved_Optimization_level = -1;
392 
393 /*****************************
394  move from cas_log.c
395  *****************************/
396 /* log error handler related fields */
399 {
400  unsigned int from;
401  unsigned int to;
402 };
404 
405 int
407 {
408 #ifndef LIBCAS_FOR_JSP
410  {
411  if (db_ping_server (0, NULL) < 0)
412  {
413  cas_log_debug (ARG_FILE_LINE, "ux_check_connection: db_ping_server() error");
414  cas_log_write_and_end (0, true, "SERVER DOWN");
416  {
417  cas_log_debug (ARG_FILE_LINE, "ux_check_connection: cur_statement_pooling");
418  return -1;
419  }
420  else
421  {
425 
426  strncpy_bufsize (dbname, database_name);
427  strncpy_bufsize (dbuser, database_user);
428  strncpy_bufsize (dbpasswd, database_passwd);
429 
431  "ux_check_connection: ux_database_shutdown()" " ux_database_connect(%s, %s)", dbname,
432  dbuser);
434  ux_database_connect (dbname, dbuser, dbpasswd, NULL);
435  }
436  }
437  return 0;
438  }
439  else
440  {
441  return -1;
442  }
443 #endif /* !LIBCAS_FOR_JSP */
444  return 0;
445 }
446 
447 #ifndef LIBCAS_FOR_JSP
450 {
451  return db_get_session_id ();
452 }
453 
454 void
455 ux_set_session_id (const SESSION_ID session_id)
456 {
457  db_set_session_id (session_id);
458 }
459 
460 int
461 ux_database_connect (char *db_name, char *db_user, char *db_passwd, char **db_err_msg)
462 {
463  int err_code, client_type;
464  char *p = NULL;
465  const char *host_connected = NULL;
466 
467  as_info->force_reconnect = false;
468 
469  if (db_name == NULL || db_name[0] == '\0')
470  {
471  return ERROR_INFO_SET (-1, CAS_ERROR_INDICATOR);
472  }
473 
474  host_connected = db_get_host_connected ();
475 
476  if (cas_get_db_connect_status () != 1 /* DB_CONNECTION_STATUS_CONNECTED */
477  || database_name[0] == '\0' || strcmp (database_name, db_name) != 0
478  || strcmp (as_info->database_host, host_connected) != 0)
479  {
480  if (cas_get_db_connect_status () == -1) /* DB_CONNECTION_STATUS_RESET */
481  {
483  }
484 
485  if (database_name[0] != '\0')
486  {
488  }
489 
491  {
493  {
495  cas_log_debug (ARG_FILE_LINE, "ux_database_connect: read_replica_only_broker");
496  }
497  else
498  {
499  client_type = DB_CLIENT_TYPE_READ_ONLY_BROKER;
500  cas_log_debug (ARG_FILE_LINE, "ux_database_connect: read_only_broker");
501  }
502  }
504  {
506  {
508  cas_log_debug (ARG_FILE_LINE, "ux_database_connect: slave_replica_only_broker");
509  }
510  else
511  {
512  client_type = DB_CLIENT_TYPE_SLAVE_ONLY_BROKER;
513  cas_log_debug (ARG_FILE_LINE, "ux_database_connect: slave_only_broker");
514  }
515  }
516  else
517  {
519  {
521  cas_log_debug (ARG_FILE_LINE, "ux_database_connect: read_write_replica_only_broker");
522  }
523  else
524  {
525  client_type = DB_CLIENT_TYPE_BROKER;
526  }
527  }
528 
532 
533  err_code = db_restart_ex (program_name, db_name, db_user, db_passwd, NULL, client_type);
534 
535  report_abnormal_host_status (err_code);
536 
537  if (err_code < 0)
538  {
539  goto connect_error;
540  }
541 
542  if (shm_appl->trigger_action_flag == false)
543  {
545  }
546  else
547  {
549  }
550 
551  cas_log_debug (ARG_FILE_LINE, "ux_database_connect: db_login(%s) db_restart(%s) at %s", db_user, db_name,
552  host_connected);
553  p = strchr (db_name, '@');
554  if (p)
555  {
556  *p = '\0';
557  strncpy (as_info->database_name, db_name, sizeof (as_info->database_name) - 1);
558  *p = (char) '@';
559  }
560  else
561  {
562  strncpy (as_info->database_name, db_name, sizeof (as_info->database_name) - 1);
563  }
564  strncpy (as_info->database_host, host_connected, sizeof (as_info->database_host) - 1);
565  as_info->last_connect_time = time (NULL);
566 
567  strncpy (database_name, db_name, sizeof (database_name) - 1);
568  strncpy (database_user, db_user, sizeof (database_user) - 1);
569  strncpy (database_passwd, db_passwd, sizeof (database_passwd) - 1);
570 
572  }
573  else if (shm_appl->cache_user_info == OFF || strcmp (database_user, db_user) != 0
574  || strcmp (database_passwd, db_passwd) != 0)
575  {
576  int err_code;
577  /* Already connected to a database, make sure to clear errors from previous clients */
578  er_clear ();
579 
580  err_code = au_login (db_user, db_passwd, true);
581  if (err_code < 0)
582  {
584 
585  return ux_database_connect (db_name, db_user, db_passwd, db_err_msg);
586  }
587  (void) db_find_or_create_session (db_user, program_name);
588 
589  strncpy (database_user, db_user, sizeof (database_user) - 1);
590  strncpy (database_passwd, db_passwd, sizeof (database_passwd) - 1);
591  }
592  else
593  {
594  /* Already connected to a database, make sure to clear errors from previous clients */
595  er_clear ();
596  /* check session to see if it is still active and create if isn't */
597  (void) db_find_or_create_session (db_user, program_name);
598  }
599  return 0;
600 
601 connect_error:
602  p = (char *) db_error_string (1);
603  if (p == NULL)
604  {
605  p = (char *) "";
606  }
607 
608  if (db_err_msg)
609  {
610  *db_err_msg = (char *) malloc (strlen (p) + 1);
611  if (*db_err_msg)
612  {
613  strcpy (*db_err_msg, p);
614  }
615  }
616 
617  return ERROR_INFO_SET_WITH_MSG (err_code, DBMS_ERROR_INDICATOR, p);
618 }
619 #endif /* !LIBCAS_FOR_JSP */
620 
621 int
623 {
624  return (database_name[0] != '\0');
625 }
626 
627 void
629 {
631 
633  {
635  }
636 
637  strcpy (cas_db_sys_param, "index_scan_in_oid_order;garbage_collection;optimization_level;");
638 
640  {
641  cas_db_sys_param[0] = '\0';
642  }
643 
646 
649 
650  return;
651 }
652 
653 void
654 ux_get_system_parameter (const char *param, bool * value)
655 {
656  int err_code = 0;
657  char buffer[LINE_MAX], *p;
658 
659  strncpy (buffer, param, LINE_MAX);
660  buffer[LINE_MAX - 1] = 0;
661  err_code = db_get_system_parameters (buffer, LINE_MAX);
662  if (err_code != NO_ERROR)
663  {
664  return;
665  }
666 
667  p = strchr (buffer, '=');
668  if (p == NULL)
669  {
670  return;
671  }
672 
673  if (*(p + 1) == 'n')
674  {
675  *value = false;
676  }
677  else
678  {
679  *value = true;
680  }
681 
682  return;
683 }
684 
685 void
687 {
688  int cur_isolation_level;
689  int cur_lock_timeout;
690 
691  ux_get_tran_setting (&cur_lock_timeout, &cur_isolation_level);
692 
693  if (cas_default_isolation_level != cur_isolation_level)
694  {
696  }
697 
698  if (cas_default_lock_timeout != cur_lock_timeout)
699  {
701  }
702 
703  if (cas_db_sys_param[0])
704  {
706  }
707 }
708 
709 void
711 {
712  db_shutdown ();
713  cas_log_debug (ARG_FILE_LINE, "ux_database_shutdown: db_shutdown()");
714 #ifndef LIBCAS_FOR_JSP
715  as_info->database_name[0] = '\0';
716  as_info->database_host[0] = '\0';
717  as_info->database_user[0] = '\0';
718  as_info->database_passwd[0] = '\0';
720 #endif /* !LIBCAS_FOR_JSP */
721  memset (database_name, 0, sizeof (database_name));
722  memset (database_user, 0, sizeof (database_user));
723  memset (database_passwd, 0, sizeof (database_passwd));
726 }
727 
728 int
729 ux_prepare (char *sql_stmt, int flag, char auto_commit_mode, T_NET_BUF * net_buf, T_REQ_INFO * req_info,
730  unsigned int query_seq_num)
731 {
732  int stmt_id;
733  T_SRV_HANDLE *srv_handle = NULL;
734  DB_SESSION *session = NULL;
735  int srv_h_id = -1;
736  int err_code;
737  int num_markers;
738  char stmt_type;
739  char updatable_flag;
740  T_QUERY_RESULT *q_result = NULL;
741  T_BROKER_VERSION client_version = req_info->client_version;
742  int is_first_out = 0;
743  char *tmp;
744  int result_cache_lifetime;
745  PT_NODE *statement = NULL;
746 
747  if ((flag & CCI_PREPARE_UPDATABLE) && (flag & CCI_PREPARE_HOLDABLE))
748  {
749  /* do not allow updatable, holdable results */
751  goto prepare_error;
752  }
753 
754  srv_h_id = hm_new_srv_handle (&srv_handle, query_seq_num);
755  if (srv_h_id < 0)
756  {
757  err_code = srv_h_id;
758  goto prepare_error;
759  }
760  srv_handle->schema_type = -1;
761  srv_handle->auto_commit_mode = auto_commit_mode;
762 
763  ALLOC_COPY (srv_handle->sql_stmt, sql_stmt);
764  if (srv_handle->sql_stmt == NULL)
765  {
767  goto prepare_error;
768  }
769 
770  sql_stmt = srv_handle->sql_stmt;
771 
772  if (flag & CCI_PREPARE_QUERY_INFO)
773  {
774  cas_log_query_info_init (srv_handle->id, FALSE);
775  srv_handle->query_info_flag = TRUE;
776  }
777  else
778  {
779  srv_handle->query_info_flag = FALSE;
780  }
781 
782  if (flag & CCI_PREPARE_UPDATABLE)
783  {
784  srv_handle->is_updatable = TRUE;
785  }
786  else
787  {
788  srv_handle->is_updatable = FALSE;
789  }
790 
791  if (flag & CCI_PREPARE_CALL)
792  {
793  T_PREPARE_CALL_INFO *prepare_call_info;
794 
795  tmp = sql_stmt;
796  if (sql_stmt[0] == '?')
797  {
798  is_first_out = 1;
799  while (*tmp)
800  {
801  if (*tmp == '=')
802  {
803  break;
804  }
805  tmp++;
806  }
807 
808  if (!(*tmp))
809  {
811  goto prepare_error;
812  }
813 
814  tmp++;
815  }
816 
817  ut_trim (tmp);
818  stmt_type = get_stmt_type (tmp);
819  if (stmt_type != CUBRID_STMT_CALL)
820  {
822  goto prepare_error;
823  }
824 
825  session = db_open_buffer (tmp);
826  if (!session)
827  {
829  goto prepare_error;
830  }
831 
832  if (session->statements != NULL)
833  {
834  statement = session->statements[0];
835  if (statement != NULL)
836  {
837  logddl_set_stmt_type (statement->node_type);
838  }
839  }
840 
841  stmt_id = db_compile_statement (session);
842  if (stmt_id < 0)
843  {
844  err_code = ERROR_INFO_SET (stmt_id, DBMS_ERROR_INDICATOR);
845  goto prepare_error;
846  }
847 
848  num_markers = get_num_markers (sql_stmt);
849  stmt_type = CUBRID_STMT_CALL_SP;
850  srv_handle->is_prepared = TRUE;
851 
852  prepare_call_info = make_prepare_call_info (num_markers, is_first_out);
853  if (prepare_call_info == NULL)
854  {
856  goto prepare_error;
857  }
858  srv_handle->prepare_call_info = prepare_call_info;
859 
860  goto prepare_result_set;
861  }
862 
863  session = db_open_buffer (sql_stmt);
864  if (!session)
865  {
867  goto prepare_error;
868  }
869 
870  if (session->statements && (statement = session->statements[0]))
871  {
872  logddl_set_stmt_type (statement->node_type);
873  }
874 
875  updatable_flag = flag & CCI_PREPARE_UPDATABLE;
876  if (updatable_flag)
877  {
878  flag |= CCI_PREPARE_INCLUDE_OID;
879  }
880 
881  if (flag & CCI_PREPARE_INCLUDE_OID)
882  {
883  db_include_oid (session, DB_ROW_OIDS);
884  }
885 
886  if (flag & CCI_PREPARE_XASL_CACHE_PINNED)
887  {
888  db_session_set_xasl_cache_pinned (session, true, false);
889  }
890 
891  stmt_id = db_compile_statement (session);
892  if (stmt_id < 0)
893  {
894  stmt_type = get_stmt_type (sql_stmt);
895  if (stmt_id == ER_PT_SEMANTIC && stmt_type != CUBRID_MAX_STMT_TYPE)
896  {
897  db_close_session (session);
898  session = NULL;
899  num_markers = get_num_markers (sql_stmt);
900  }
901  else
902  {
903  err_code = ERROR_INFO_SET (stmt_id, DBMS_ERROR_INDICATOR);
904  goto prepare_error;
905  }
906  srv_handle->is_prepared = FALSE;
907  }
908  else
909  {
910  num_markers = get_num_markers (sql_stmt);
911  stmt_type = db_get_statement_type (session, stmt_id);
912  srv_handle->is_prepared = TRUE;
913  }
914 
915 prepare_result_set:
916  srv_handle->num_markers = num_markers;
917  srv_handle->prepare_flag = flag;
918 
919  net_buf_cp_int (net_buf, srv_h_id, NULL);
920 
921  result_cache_lifetime = get_client_result_cache_lifetime (session, stmt_id);
922  net_buf_cp_int (net_buf, result_cache_lifetime, NULL);
923 
924  net_buf_cp_byte (net_buf, stmt_type);
925  net_buf_cp_int (net_buf, num_markers, NULL);
926 
927  q_result = (T_QUERY_RESULT *) malloc (sizeof (T_QUERY_RESULT));
928  if (q_result == NULL)
929  {
931  goto prepare_error;
932  }
933 
934  hm_qresult_clear (q_result);
935  q_result->stmt_type = stmt_type;
936  q_result->stmt_id = stmt_id;
937 
938  err_code = prepare_column_list_info_set (session, flag, q_result, net_buf, client_version);
939  if (err_code < 0)
940  {
941  FREE_MEM (q_result);
942  goto prepare_error;
943  }
944 
945  srv_handle->session = session;
946  srv_handle->q_result = q_result;
947  srv_handle->num_q_result = 1;
948  srv_handle->cur_result = NULL;
949  srv_handle->cur_result_index = 0;
950 
951  if (flag & CCI_PREPARE_HOLDABLE)
952  {
953  srv_handle->is_holdable = true;
954  }
955 
956  db_get_cacheinfo (session, stmt_id, &srv_handle->use_plan_cache, &srv_handle->use_query_cache);
957 
958  return srv_h_id;
959 
960 prepare_error:
961  NET_BUF_ERR_SET (net_buf);
962 
963  if (auto_commit_mode == TRUE)
964  {
966  }
967 
969 
970  if (srv_handle)
971  {
972  hm_srv_handle_free (srv_h_id);
973  }
974 
975  if (session)
976  {
977  db_close_session (session);
978  }
979 
980  return err_code;
981 }
982 
983 int
984 ux_end_tran (int tran_type, bool reset_con_status)
985 {
986  int err_code;
987 
988 #ifndef LIBCAS_FOR_JSP
990  {
991  if (tran_type == CCI_TRAN_COMMIT)
992  {
993  hm_srv_handle_free_all (false);
994  }
995  else
996  {
997  hm_srv_handle_free_all (true);
998  }
999  }
1000  else
1001  {
1002  if (tran_type == CCI_TRAN_COMMIT)
1003  {
1004  /* do not close holdable results on commit */
1006  }
1007  else
1008  {
1009  /* clear all queries */
1011  }
1012  }
1013 
1014 #else /* !LIBCAS_FOR_JSP */
1015  hm_srv_handle_free_all (true);
1016 #endif /* !LIBCAS_FOR_JSP */
1017 
1018  if (tran_type == CCI_TRAN_COMMIT)
1019  {
1020  err_code = db_commit_transaction ();
1021  cas_log_debug (ARG_FILE_LINE, "ux_end_tran: db_commit_transaction() = %d", err_code);
1022  if (err_code < 0)
1023  {
1024  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
1025  }
1026  }
1027  else if (tran_type == CCI_TRAN_ROLLBACK)
1028  {
1029  err_code = db_abort_transaction ();
1030  cas_log_debug (ARG_FILE_LINE, "ux_end_tran: db_abort_transaction() = %d", err_code);
1031  if (err_code < 0)
1032  {
1033  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
1034  }
1035  }
1036  else
1037  {
1039  }
1040 
1041  if (err_code >= 0)
1042  {
1044 #ifndef LIBCAS_FOR_JSP
1045  if (reset_con_status)
1046  {
1049  as_info->transaction_start_time = (time_t) 0;
1050  }
1051 #endif /* !LIBCAS_FOR_JSP */
1052  }
1053  else
1054  {
1056  }
1057 
1058 #ifndef LIBCAS_FOR_JSP
1059  if (cas_get_db_connect_status () == -1 /* DB_CONNECTION_STATUS_RESET */
1061  {
1062  as_info->reset_flag = TRUE;
1063  }
1064 #endif /* !LIBCAS_FOR_JSP */
1065 
1066  return err_code;
1067 }
1068 
1069 int
1071 {
1072  return db_end_session ();
1073 }
1074 
1075 int
1077 {
1078  int row_count, err;
1079 
1080  row_count = db_get_row_count_cache ();
1081  if (row_count == DB_ROW_COUNT_NOT_SET)
1082  {
1083  /* get the value from the server */
1084  err = db_get_row_count (&row_count);
1085  if (err != NO_ERROR)
1086  {
1087  err = ERROR_INFO_SET (err, DBMS_ERROR_INDICATOR);
1088  NET_BUF_ERR_SET (net_buf);
1090  return err;
1091  }
1092  }
1093 
1094  net_buf_cp_int (net_buf, NO_ERROR, NULL); /* result code */
1095  net_buf_cp_int (net_buf, row_count, NULL);
1096 
1097  return NO_ERROR;
1098 }
1099 
1100 int
1102 {
1103  int err = NO_ERROR;
1104  DB_VALUE lid;
1105 
1106  db_make_null (&lid);
1107 
1108  err = db_get_last_insert_id (&lid);
1109  if (err != NO_ERROR)
1110  {
1111  err = ERROR_INFO_SET (err, DBMS_ERROR_INDICATOR);
1112  NET_BUF_ERR_SET (net_buf);
1114  return err;
1115  }
1116 
1117  net_buf_cp_int (net_buf, NO_ERROR, NULL); /* result code */
1118  dbval_to_net_buf (&lid, net_buf, 1, 0, 1);
1119 
1120  db_value_clear (&lid);
1121 
1122  return NO_ERROR;
1123 }
1124 
1125 int
1126 ux_execute (T_SRV_HANDLE * srv_handle, char flag, int max_col_size, int max_row, int argc, void **argv,
1127  T_NET_BUF * net_buf, T_REQ_INFO * req_info, CACHE_TIME * clt_cache_time, int *clt_cache_reusable)
1128 {
1129  int err_code;
1130  DB_VALUE *value_list = NULL;
1131  int num_bind = 0;
1132  int i, n, stmt_id;
1133  DB_QUERY_RESULT *result = NULL;
1134  DB_SESSION *session;
1135  T_BROKER_VERSION client_version = req_info->client_version;
1136  bool recompile = false;
1137 #ifndef LIBCAS_FOR_JSP
1138  char stmt_type;
1139 #endif /* !LIBCAS_FOR_JSP */
1140 
1141  hm_qresult_end (srv_handle, FALSE);
1142 
1143  if (srv_handle->is_prepared == TRUE && srv_handle->query_info_flag == FALSE && (flag & CCI_EXEC_QUERY_INFO))
1144  {
1145  /* A statement was already prepared, but an user wants to see a plan for the statement after execution. See the
1146  * following Java codes: PreparedStatement ps = con.prepareStatement("..."); ((CUBRIDPreparedStatement)
1147  * ps).setQueryInfo(true); ps.executeQuery(); String plan = ((CUBRIDPreparedStatement) ps).getQueryplan(); In
1148  * this case, we just recompile the statement at execution time and writes its plan to a temporary plan dump
1149  * file. */
1150  srv_handle->is_prepared = FALSE;
1151  recompile = true;
1152  }
1153 
1154  if (srv_handle->is_prepared == FALSE)
1155  {
1156  hm_session_free (srv_handle);
1157 
1158  session = db_open_buffer (srv_handle->sql_stmt);
1159  if (!session)
1160  {
1162  goto execute_error;
1163  }
1164  srv_handle->session = session;
1165  }
1166  else
1167  {
1168  session = (DB_SESSION *) srv_handle->session;
1169  }
1170 
1171  num_bind = srv_handle->num_markers;
1172 
1173  if (num_bind > 0)
1174  {
1175  err_code = make_bind_value (num_bind, argc, argv, &value_list, net_buf, DB_TYPE_NULL);
1176  if (err_code < 0)
1177  {
1178  goto execute_error;
1179  }
1180 
1181  err_code = set_host_variables (session, num_bind, value_list);
1182  if (err_code != NO_ERROR)
1183  {
1184  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
1185  goto execute_error;
1186  }
1187  }
1188 
1189  if (flag & CCI_EXEC_RETURN_GENERATED_KEYS)
1190  {
1192  }
1193  else
1194  {
1195  db_session_set_return_generated_keys ((DB_SESSION *) srv_handle->session, false);
1196  }
1197 
1198  if (srv_handle->is_prepared == FALSE)
1199  {
1200  if (flag & CCI_EXEC_QUERY_INFO)
1201  {
1202  cas_log_query_info_init (srv_handle->id, flag & CCI_EXEC_ONLY_QUERY_PLAN);
1203  srv_handle->query_info_flag = TRUE;
1204  }
1205 
1206  if (srv_handle->prepare_flag & CCI_PREPARE_XASL_CACHE_PINNED)
1207  {
1208  db_session_set_xasl_cache_pinned (session, true, recompile);
1209  }
1210 
1211  stmt_id = db_compile_statement (session);
1212  if (stmt_id < 0)
1213  {
1214  err_code = ERROR_INFO_SET (stmt_id, DBMS_ERROR_INDICATOR);
1215  goto execute_error;
1216  }
1217  }
1218  else
1219  {
1220  if (flag & CCI_EXEC_ONLY_QUERY_PLAN)
1221  {
1222  set_optimization_level (514);
1223  }
1224 
1225  stmt_id = srv_handle->q_result->stmt_id;
1226  }
1227 
1228  db_session_set_holdable ((DB_SESSION *) srv_handle->session, srv_handle->is_holdable);
1229  srv_handle->is_from_current_transaction = true;
1230 
1231  if (!(flag & CCI_EXEC_QUERY_INFO))
1232  {
1234  }
1235 
1236  if (clt_cache_time)
1237  {
1238  db_set_client_cache_time (session, stmt_id, clt_cache_time);
1239  }
1240 
1241 #if !defined (LIBCAS_FOR_JSP) && !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1242  err_code = db_set_statement_auto_commit (session, srv_handle->auto_commit_mode);
1243  if (err_code != NO_ERROR)
1244  {
1245  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
1246  goto execute_error;
1247  }
1248 #endif /* !LIBCAS_FOR_JSP && !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
1249 
1250  n = db_execute_and_keep_statement (session, stmt_id, &result);
1251 
1252 #ifndef LIBCAS_FOR_JSP
1253  stmt_type = db_get_statement_type (session, stmt_id);
1255 #endif /* !LIBCAS_FOR_JSP */
1256 
1257  if (n < 0)
1258  {
1259  err_code = ERROR_INFO_SET (n, DBMS_ERROR_INDICATOR);
1260  }
1261  else if (clt_cache_time && db_is_client_cache_reusable (result))
1262  {
1263  *clt_cache_reusable = TRUE;
1264  }
1265  else if (result != NULL)
1266  {
1267  /* success; peek the values in tuples */
1268  (void) db_query_set_copy_tplvalue (result, 0 /* peek */ );
1269  }
1270 
1271  if (flag & CCI_EXEC_QUERY_INFO)
1272  {
1273  SQL_LOG2_EXEC_APPEND (as_info->cur_sql_log2, stmt_id, n, cas_log_query_plan_file (srv_handle->id));
1275  }
1276  else
1277  {
1278  SQL_LOG2_EXEC_END (as_info->cur_sql_log2, stmt_id, n);
1279  }
1280 
1281  if (n < 0)
1282  {
1283  if (srv_handle->is_pooled && (n == ER_QPROC_INVALID_XASLNODE || n == ER_HEAP_UNKNOWN_OBJECT))
1284  {
1286  goto execute_error;
1287  }
1288  err_code = ERROR_INFO_SET (n, DBMS_ERROR_INDICATOR);
1289  goto execute_error;
1290  }
1291 
1292  if (max_row > 0 && db_get_statement_type (session, stmt_id) == CUBRID_STMT_SELECT && *clt_cache_reusable == FALSE)
1293  {
1294  err_code = db_query_seek_tuple (result, max_row, 1);
1295  if (err_code < 0)
1296  {
1297  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
1298  goto execute_error;
1299  }
1300  else if (err_code == DB_CURSOR_END)
1301  {
1302  n = db_query_tuple_count (result);
1303  }
1304  else
1305  {
1306  n = max_row;
1307  }
1308  n = MIN (n, max_row);
1309  }
1310 
1311  net_buf_cp_int (net_buf, n, NULL);
1312 
1313  if (srv_handle->prepare_flag & CCI_PREPARE_XASL_CACHE_PINNED)
1314  {
1315  db_session_set_xasl_cache_pinned (session, false, false);
1316  srv_handle->prepare_flag &= ~CCI_PREPARE_XASL_CACHE_PINNED;
1317  }
1318  srv_handle->max_col_size = max_col_size;
1319  srv_handle->num_q_result = 1;
1320  srv_handle->q_result->result = (void *) result;
1321  srv_handle->q_result->tuple_count = n;
1322  srv_handle->cur_result = (void *) srv_handle->q_result;
1323  srv_handle->cur_result_index = 1;
1324  srv_handle->max_row = max_row;
1325 
1326  if (has_stmt_result_set (srv_handle->q_result->stmt_type) == true)
1327  {
1328  srv_handle->has_result_set = true;
1329 
1330  if (srv_handle->is_holdable == true)
1331  {
1332  srv_handle->q_result->is_holdable = true;
1333 #if !defined(LIBCAS_FOR_JSP)
1335 #endif
1336  }
1337  }
1338 
1339  db_get_cacheinfo (session, stmt_id, &srv_handle->use_plan_cache, &srv_handle->use_query_cache);
1340 
1341  if (do_commit_after_execute (*srv_handle))
1342  {
1343  req_info->need_auto_commit = TRAN_AUTOCOMMIT;
1344  }
1345 
1346  if (value_list)
1347  {
1348  for (i = 0; i < num_bind; i++)
1349  {
1350  db_value_clear (&(value_list[i]));
1351  }
1352  FREE_MEM (value_list);
1353  }
1354 
1355  if (*clt_cache_reusable == TRUE)
1356  {
1357  net_buf_cp_byte (net_buf, 1);
1358  return 0;
1359  }
1360  else
1361  {
1362  net_buf_cp_byte (net_buf, 0);
1363  }
1364 
1365  err_code = execute_info_set (srv_handle, net_buf, client_version, flag);
1366  if (err_code != NO_ERROR)
1367  {
1368  goto execute_error;
1369  }
1370 
1371  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V2))
1372  {
1373  int result_cache_lifetime;
1374  char include_column_info;
1375 
1376  if (db_check_single_query (session) == NO_ERROR)
1377  {
1378  include_column_info = 0;
1379  }
1380  else
1381  {
1382  include_column_info = 1;
1383  }
1384 
1385  net_buf_cp_byte (net_buf, include_column_info);
1386  if (include_column_info == 1)
1387  {
1388  result_cache_lifetime = get_client_result_cache_lifetime (session, stmt_id);
1389 
1390  net_buf_cp_int (net_buf, result_cache_lifetime, NULL);
1391  net_buf_cp_byte (net_buf, srv_handle->q_result->stmt_type);
1392  net_buf_cp_int (net_buf, srv_handle->num_markers, NULL);
1393  err_code =
1394  prepare_column_list_info_set (session, srv_handle->prepare_flag, srv_handle->q_result, net_buf,
1395  client_version);
1396  if (err_code != NO_ERROR)
1397  {
1398  goto execute_error;
1399  }
1400  }
1401  }
1402 
1403  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V5))
1404  {
1405  net_buf_cp_int (net_buf, shm_shard_id, NULL);
1406  }
1407 
1408  return err_code;
1409 
1410 execute_error:
1411  NET_BUF_ERR_SET (net_buf);
1412 
1413  if (srv_handle->prepare_flag & CCI_PREPARE_XASL_CACHE_PINNED)
1414  {
1415  db_session_set_xasl_cache_pinned (session, false, false);
1416  srv_handle->prepare_flag &= ~CCI_PREPARE_XASL_CACHE_PINNED;
1417  }
1418  if (srv_handle->auto_commit_mode)
1419  {
1420  req_info->need_auto_commit = TRAN_AUTOROLLBACK;
1421  }
1422 
1424 
1425  if (value_list)
1426  {
1427  for (i = 0; i < num_bind; i++)
1428  {
1429  db_value_clear (&(value_list[i]));
1430  }
1431  FREE_MEM (value_list);
1432  }
1433  return err_code;
1434 }
1435 
1436 int
1437 ux_execute_all (T_SRV_HANDLE * srv_handle, char flag, int max_col_size, int max_row, int argc, void **argv,
1438  T_NET_BUF * net_buf, T_REQ_INFO * req_info, CACHE_TIME * clt_cache_time, int *clt_cache_reusable)
1439 {
1440  int err_code;
1441  DB_VALUE *value_list = NULL;
1442  int num_bind = 0;
1443  int i;
1444  int n;
1445  int stmt_type = -1, stmt_id = -1;
1446  int q_res_idx;
1447  char is_prepared;
1448  char is_first_stmt = TRUE;
1449  DB_QUERY_RESULT *result = NULL;
1450  DB_SESSION *session = NULL;
1451  T_BROKER_VERSION client_version = req_info->client_version;
1452  T_QUERY_RESULT *q_result;
1453  char savepoint[BROKER_PATH_MAX];
1454  char is_savepoint = FALSE;
1455 
1456  srv_handle->query_info_flag = FALSE;
1457 
1458  is_prepared = srv_handle->is_prepared;
1459 
1460  hm_qresult_end (srv_handle, FALSE);
1461 
1462  if (is_prepared == TRUE)
1463  {
1464  session = (DB_SESSION *) srv_handle->session;
1465  stmt_id = srv_handle->q_result->stmt_id;
1466  stmt_type = srv_handle->q_result->stmt_type;
1467  }
1468  else
1469  {
1470  hm_session_free (srv_handle);
1471 
1472  session = db_open_buffer (srv_handle->sql_stmt);
1473  if (!session)
1474  {
1476  goto execute_all_error;
1477  }
1478  srv_handle->session = session;
1479  }
1480 
1481  num_bind = srv_handle->num_markers;
1482  if (num_bind > 0)
1483  {
1484  err_code = make_bind_value (num_bind, argc, argv, &value_list, net_buf, DB_TYPE_NULL);
1485  if (err_code < 0)
1486  {
1487  goto execute_all_error;
1488  }
1489 
1490  err_code = set_host_variables (session, num_bind, value_list);
1491  if (err_code != NO_ERROR)
1492  {
1493  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
1494  goto execute_all_error;
1495  }
1496  }
1497 
1498  q_res_idx = 0;
1499  db_rewind_statement (session);
1500  if (!srv_handle->auto_commit_mode && db_statement_count (session) > 1)
1501  {
1502  static unsigned long long savepoint_count = 0;
1503 
1504  snprintf (savepoint, BROKER_PATH_MAX, "__MSS$%20lld__", savepoint_count++);
1505  db_savepoint_transaction (savepoint);
1506  is_savepoint = TRUE;
1507  }
1508 
1509  while (1)
1510  {
1511  if (flag & CCI_EXEC_RETURN_GENERATED_KEYS)
1512  {
1514  }
1515  else
1516  {
1517  db_session_set_return_generated_keys ((DB_SESSION *) srv_handle->session, false);
1518  }
1519 
1520  if (is_prepared == FALSE)
1521  {
1522  if (srv_handle->prepare_flag & CCI_PREPARE_XASL_CACHE_PINNED)
1523  {
1524  db_session_set_xasl_cache_pinned (session, true, false);
1525  }
1526 
1527  stmt_id = db_compile_statement (session);
1528  if (stmt_id == 0)
1529  {
1530  break;
1531  }
1532  if (stmt_id < 0)
1533  {
1534  err_code = ERROR_INFO_SET (stmt_id, DBMS_ERROR_INDICATOR);
1535  goto execute_all_error;
1536  }
1537 
1538  stmt_type = db_get_statement_type (session, stmt_id);
1539  if (stmt_type < 0)
1540  {
1541  err_code = ERROR_INFO_SET (stmt_type, DBMS_ERROR_INDICATOR);
1542  goto execute_all_error;
1543  }
1544  }
1545 
1546  db_session_set_holdable ((DB_SESSION *) srv_handle->session, srv_handle->is_holdable);
1547  srv_handle->is_from_current_transaction = true;
1548 
1549  if (clt_cache_time)
1550  {
1551  db_set_client_cache_time (session, stmt_id, clt_cache_time);
1552  }
1553 
1554 #if !defined (LIBCAS_FOR_JSP) && !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
1555  err_code = db_set_statement_auto_commit (session, srv_handle->auto_commit_mode);
1556  if (err_code != NO_ERROR)
1557  {
1558  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
1559  goto execute_all_error;
1560  }
1561 #endif /* !LIBCAS_FOR_JSP && !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
1562 
1564  n = db_execute_and_keep_statement (session, stmt_id, &result);
1565  SQL_LOG2_EXEC_END (as_info->cur_sql_log2, stmt_id, n);
1566 
1567 #ifndef LIBCAS_FOR_JSP
1569 #endif /* !LIBCAS_FOR_JSP */
1570 
1571  if (n < 0)
1572  {
1573  if (srv_handle->is_pooled && (n == ER_QPROC_INVALID_XASLNODE || n == ER_HEAP_UNKNOWN_OBJECT))
1574  {
1576  goto execute_all_error;
1577  }
1578 
1579  err_code = ERROR_INFO_SET (n, DBMS_ERROR_INDICATOR);
1580  goto execute_all_error;
1581  }
1582  else if (clt_cache_time && db_is_client_cache_reusable (result))
1583  {
1584  *clt_cache_reusable = TRUE;
1585  }
1586  else if (result != NULL)
1587  {
1588  /* success; peek the values in tuples */
1589  (void) db_query_set_copy_tplvalue (result, 0 /* peek */ );
1590  }
1591 
1592  if (max_row > 0 && db_get_statement_type (session, stmt_id) == CUBRID_STMT_SELECT && *clt_cache_reusable == FALSE)
1593  {
1594  err_code = db_query_seek_tuple (result, max_row, 1);
1595  if (err_code < 0)
1596  {
1597  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
1598  goto execute_all_error;
1599  }
1600  else if (err_code == DB_CURSOR_END)
1601  {
1602  n = db_query_tuple_count (result);
1603  }
1604  else
1605  {
1606  n = max_row;
1607  }
1608  n = MIN (n, max_row);
1609  }
1610 
1611  if (is_first_stmt == TRUE)
1612  {
1613  net_buf_cp_int (net_buf, n, NULL);
1614  srv_handle->num_q_result = 0;
1615  is_first_stmt = FALSE;
1616  }
1617 
1618  q_res_idx = srv_handle->num_q_result;
1619  srv_handle->q_result =
1620  (T_QUERY_RESULT *) REALLOC (srv_handle->q_result, sizeof (T_QUERY_RESULT) * (q_res_idx + 1));
1621  if (srv_handle->q_result == NULL)
1622  {
1623  db_query_end (result);
1625  goto execute_all_error;
1626  }
1627 
1628  q_result = &(srv_handle->q_result[q_res_idx]);
1629 
1630  if (is_prepared == FALSE)
1631  {
1632  hm_qresult_clear (q_result);
1633  q_result->stmt_type = stmt_type;
1634  q_result->stmt_id = stmt_id;
1635  }
1636 
1637  db_get_cacheinfo (session, stmt_id, &srv_handle->use_plan_cache, &srv_handle->use_query_cache);
1638 
1639  q_result->result = result;
1640  q_result->tuple_count = n;
1641  srv_handle->num_q_result++;
1642  is_prepared = FALSE;
1643 
1644  if (has_stmt_result_set (q_result->stmt_type) == true)
1645  {
1646  srv_handle->has_result_set = true;
1647 
1648  if (srv_handle->is_holdable == true)
1649  {
1650  q_result->is_holdable = true;
1651 #if !defined(LIBCAS_FOR_JSP)
1653 #endif
1654  }
1655  }
1656  }
1657 
1658  if (srv_handle->prepare_flag & CCI_PREPARE_XASL_CACHE_PINNED)
1659  {
1660  db_session_set_xasl_cache_pinned (session, false, false);
1661  srv_handle->prepare_flag &= ~CCI_PREPARE_XASL_CACHE_PINNED;
1662  }
1663  srv_handle->max_row = max_row;
1664  srv_handle->max_col_size = max_col_size;
1665  srv_handle->cur_result = (void *) srv_handle->q_result;
1666  srv_handle->cur_result_index = 1;
1667 
1668  if (do_commit_after_execute (*srv_handle))
1669  {
1670  req_info->need_auto_commit = TRAN_AUTOCOMMIT;
1671  }
1672 
1673  if (value_list)
1674  {
1675  for (i = 0; i < num_bind; i++)
1676  {
1677  db_value_clear (&(value_list[i]));
1678  }
1679  FREE_MEM (value_list);
1680  }
1681 
1682  if (*clt_cache_reusable == TRUE)
1683  {
1684  net_buf_cp_byte (net_buf, 1);
1685  return 0;
1686  }
1687  else
1688  {
1689  net_buf_cp_byte (net_buf, 0);
1690  }
1691 
1692  err_code = execute_info_set (srv_handle, net_buf, client_version, flag);
1693  if (err_code != NO_ERROR)
1694  {
1695  goto execute_all_error;
1696  }
1697 
1698  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V2))
1699  {
1700  int result_cache_lifetime;
1701  char include_column_info;
1702 
1703  if (db_check_single_query (session) == NO_ERROR)
1704  {
1705  include_column_info = 0;
1706  }
1707  else
1708  {
1709  include_column_info = 1;
1710  }
1711 
1712  net_buf_cp_byte (net_buf, include_column_info);
1713  if (include_column_info == 1)
1714  {
1715  result_cache_lifetime = get_client_result_cache_lifetime (session, stmt_id);
1716 
1717  net_buf_cp_int (net_buf, result_cache_lifetime, NULL);
1718  net_buf_cp_byte (net_buf, srv_handle->q_result[0].stmt_type);
1719  net_buf_cp_int (net_buf, srv_handle->num_markers, NULL);
1720  err_code =
1721  prepare_column_list_info_set (session, srv_handle->prepare_flag, &srv_handle->q_result[0], net_buf,
1722  client_version);
1723  if (err_code != NO_ERROR)
1724  {
1725  goto execute_all_error;
1726  }
1727  }
1728  }
1729 
1730  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V5))
1731  {
1732  net_buf_cp_int (net_buf, shm_shard_id, NULL);
1733  }
1734 
1735  return err_code;
1736 
1737 execute_all_error:
1738  NET_BUF_ERR_SET (net_buf);
1739 
1740  if (srv_handle->prepare_flag & CCI_PREPARE_XASL_CACHE_PINNED)
1741  {
1742  db_session_set_xasl_cache_pinned (session, false, false);
1743  srv_handle->prepare_flag &= ~CCI_PREPARE_XASL_CACHE_PINNED;
1744  }
1745  if (srv_handle->auto_commit_mode)
1746  {
1747  req_info->need_auto_commit = TRAN_AUTOROLLBACK;
1748  }
1749  else if (is_savepoint)
1750  {
1751  db_abort_to_savepoint (savepoint);
1752  }
1753 
1755 
1756  if (value_list)
1757  {
1758  for (i = 0; i < num_bind; i++)
1759  {
1760  db_value_clear (&(value_list[i]));
1761  }
1762  FREE_MEM (value_list);
1763  }
1764  return err_code;
1765 }
1766 
1767 extern DB_VALUE *db_get_hostvars (DB_SESSION * session);
1768 extern void jsp_set_prepare_call ();
1769 extern void jsp_unset_prepare_call ();
1770 
1771 int
1772 ux_execute_call (T_SRV_HANDLE * srv_handle, char flag, int max_col_size, int max_row, int argc, void **argv,
1773  T_NET_BUF * net_buf, T_REQ_INFO * req_info, CACHE_TIME * clt_cache_time, int *clt_cache_reusable)
1774 {
1775  int err_code;
1776  DB_VALUE *value_list = NULL, *out_vals;
1777  int num_bind;
1778  int i, j;
1779  int n;
1780  int stmt_id;
1781  DB_QUERY_RESULT *result = NULL;
1782  DB_SESSION *session;
1783  T_BROKER_VERSION client_version = req_info->client_version;
1784  T_PREPARE_CALL_INFO *call_info;
1785 #ifndef LIBCAS_FOR_JSP
1786  char stmt_type;
1787 #endif /* !LIBCAS_FOR_JSP */
1788 
1789  call_info = srv_handle->prepare_call_info;
1790  srv_handle->query_info_flag = FALSE;
1791  hm_qresult_end (srv_handle, FALSE);
1792  session = (DB_SESSION *) srv_handle->session;
1793  num_bind = srv_handle->num_markers;
1794 
1795  if (num_bind > 0)
1796  {
1797  err_code = make_bind_value (num_bind, argc, argv, &value_list, net_buf, DB_TYPE_NULL);
1798  if (err_code < 0)
1799  {
1800  goto execute_error;
1801  }
1802 
1803  if (call_info->is_first_out)
1804  {
1805  err_code = set_host_variables (session, num_bind - 1, &(value_list[1]));
1806  }
1807  else
1808  {
1809  err_code = set_host_variables (session, num_bind, value_list);
1810  }
1811  if (err_code != NO_ERROR)
1812  {
1813  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
1814  goto execute_error;
1815  }
1816  }
1817 
1818  stmt_id = srv_handle->q_result->stmt_id;
1819 
1821  n = db_execute_and_keep_statement (session, stmt_id, &result);
1823 
1824 #ifndef LIBCAS_FOR_JSP
1825  stmt_type = db_get_statement_type (session, stmt_id);
1827 #endif /* !LIBCAS_FOR_JSP */
1828 
1829  if (n < 0)
1830  {
1831  err_code = ERROR_INFO_SET (n, DBMS_ERROR_INDICATOR);
1832  goto execute_error;
1833  }
1834 
1835  if (result != NULL)
1836  {
1837  /* success; copy the values in tuples */
1838  (void) db_query_set_copy_tplvalue (result, 1 /* copy */ );
1839  }
1840 
1841  i = 0;
1842  if (call_info->is_first_out)
1843  {
1844  if (result != NULL)
1845  {
1846  db_query_get_tuple_value (result, 0, ((DB_VALUE **) call_info->dbval_args)[0]);
1847  }
1848  i++;
1849  }
1850 
1851  out_vals = db_get_hostvars (session);
1852 
1853  for (j = 0; i < call_info->num_args; i++, j++)
1854  {
1855  *(((DB_VALUE **) call_info->dbval_args)[i]) = out_vals[j];
1856  }
1857  net_buf_cp_int (net_buf, n, NULL);
1858 
1859  srv_handle->max_col_size = max_col_size;
1860  srv_handle->num_q_result = 1;
1861  srv_handle->has_result_set = true;
1862  srv_handle->q_result->result = (void *) result;
1863  srv_handle->q_result->tuple_count = n;
1864  srv_handle->cur_result = (void *) srv_handle->q_result;
1865  srv_handle->cur_result_index = 1;
1866  srv_handle->max_row = max_row;
1867 
1868  if (srv_handle->is_holdable == true)
1869  {
1870  srv_handle->q_result->is_holdable = true;
1871 #if !defined(LIBCAS_FOR_JSP)
1873 #endif
1874  }
1875 
1876  if (value_list)
1877  {
1878  for (i = 0; i < num_bind; i++)
1879  {
1880  db_value_clear (&(value_list[i]));
1881  }
1882  FREE_MEM (value_list);
1883  }
1884 
1885  net_buf_cp_byte (net_buf, 0); /* client cache reusable - always false */
1886 
1887  err_code = execute_info_set (srv_handle, net_buf, client_version, flag);
1888  if (err_code != NO_ERROR)
1889  {
1890  goto execute_error;
1891  }
1892 
1893  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V2))
1894  {
1895  int result_cache_lifetime;
1896  char include_column_info;
1897 
1898  if (db_check_single_query (session) == NO_ERROR)
1899  {
1900  include_column_info = 0;
1901  }
1902  else
1903  {
1904  include_column_info = 1;
1905  }
1906 
1907  net_buf_cp_byte (net_buf, include_column_info);
1908  if (include_column_info == 1)
1909  {
1910  result_cache_lifetime = get_client_result_cache_lifetime (session, stmt_id);
1911 
1912  net_buf_cp_int (net_buf, result_cache_lifetime, NULL);
1913  net_buf_cp_byte (net_buf, srv_handle->q_result->stmt_type);
1914  net_buf_cp_int (net_buf, srv_handle->num_markers, NULL);
1915  err_code =
1916  prepare_column_list_info_set (session, srv_handle->prepare_flag, srv_handle->q_result, net_buf,
1917  client_version);
1918  if (err_code != NO_ERROR)
1919  {
1920  goto execute_error;
1921  }
1922  }
1923  }
1924 
1925  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V5))
1926  {
1927  net_buf_cp_int (net_buf, shm_shard_id, NULL);
1928  }
1929 
1930  return err_code;
1931 
1932 execute_error:
1933  NET_BUF_ERR_SET (net_buf);
1934  if (value_list)
1935  {
1936  for (i = 0; i < num_bind; i++)
1937  {
1938  db_value_clear (&(value_list[i]));
1939  }
1940  FREE_MEM (value_list);
1941  }
1942  return err_code;
1943 }
1944 
1945 int
1946 ux_next_result (T_SRV_HANDLE * srv_handle, char flag, T_NET_BUF * net_buf, T_REQ_INFO * req_info)
1947 {
1948  int err_code;
1949  T_QUERY_RESULT *cur_result;
1950  T_QUERY_RESULT *prev_result;
1951  T_BROKER_VERSION client_version = req_info->client_version;
1952 
1953  if (srv_handle == NULL || srv_handle->schema_type >= CCI_SCH_FIRST)
1954  {
1956  goto next_result_error;
1957  }
1958 
1959  if (srv_handle->cur_result_index >= srv_handle->num_q_result)
1960  {
1962  goto next_result_error;
1963  }
1964 
1965  if (srv_handle->cur_result_index > 0)
1966  {
1967  prev_result = &(srv_handle->q_result[srv_handle->cur_result_index - 1]);
1968  if (prev_result->result && flag != CCI_KEEP_CURRENT_RESULT)
1969  {
1970  db_query_end ((DB_QUERY_RESULT *) (prev_result->result));
1971  prev_result->result = NULL;
1972  }
1973  }
1974 
1975  cur_result = &(srv_handle->q_result[srv_handle->cur_result_index]);
1976 
1977  net_buf_cp_int (net_buf, 0, NULL); /* result code */
1978 
1979  /* result msg */
1980  net_buf_cp_int (net_buf, cur_result->tuple_count, NULL);
1981  net_buf_cp_byte (net_buf, cur_result->stmt_type);
1982 
1983  err_code =
1984  prepare_column_list_info_set ((DB_SESSION *) srv_handle->session, srv_handle->prepare_flag, cur_result, net_buf,
1985  client_version);
1986  if (err_code < 0)
1987  {
1988  goto next_result_error;
1989  }
1990 
1991  srv_handle->cur_result = cur_result;
1992  (srv_handle->cur_result_index)++;
1993 
1994  if (!has_stmt_result_set (cur_result->stmt_type))
1995  {
1996  if (check_auto_commit_after_getting_result (srv_handle) == true)
1997  {
1998  req_info->need_auto_commit = TRAN_AUTOCOMMIT;
1999  }
2000  }
2001 
2002  return 0;
2003 
2004 next_result_error:
2005  NET_BUF_ERR_SET (net_buf);
2006  return err_code;
2007 }
2008 
2009 int
2010 ux_execute_batch (int argc, void **argv, T_NET_BUF * net_buf, T_REQ_INFO * req_info, char auto_commit_mode)
2011 {
2012  int query_index;
2013  int err_code, sql_size, res_count, stmt_id;
2014  int num_query_offset;
2015  bool use_plan_cache, use_query_cache;
2016  char *sql_stmt, *err_msg;
2017  char stmt_type;
2018  DB_SESSION *session;
2019  DB_QUERY_RESULT *result;
2020  DB_VALUE val;
2021  DB_OBJECT *ins_obj_p;
2022  T_OBJECT ins_oid;
2023  T_BROKER_VERSION client_version = req_info->client_version;
2024 
2025  net_buf_cp_int (net_buf, 0, NULL); /* result code */
2026  net_buf_cp_int (net_buf, argc, &num_query_offset); /* result msg. num_query */
2027 
2029 
2030  for (query_index = 0; query_index < argc; query_index++)
2031  {
2032  use_plan_cache = false;
2033  use_query_cache = false;
2034 
2035  net_arg_get_str (&sql_stmt, &sql_size, argv[query_index]);
2036  cas_log_write_nonl (0, false, "batch %d : ", query_index + 1);
2037  if (sql_stmt != NULL)
2038  {
2039  cas_log_write_query_string_nonl (sql_stmt, strlen (sql_stmt));
2040  logddl_set_sql_text (sql_stmt, (int) strlen (sql_stmt));
2041  }
2042 
2043  session = db_open_buffer (sql_stmt);
2044  if (!session)
2045  {
2046  cas_log_write2 ("");
2047  goto batch_error;
2048  }
2049 
2051 
2052  stmt_id = db_compile_statement (session);
2053  if (stmt_id < 0)
2054  {
2055  cas_log_write2 ("");
2056  goto batch_error;
2057  }
2058 
2059  stmt_type = db_get_statement_type (session, stmt_id);
2060  if (stmt_type < 0)
2061  {
2062  cas_log_write2 ("");
2063  goto batch_error;
2064  }
2065  logddl_set_stmt_type (stmt_type);
2066 
2068  db_get_cacheinfo (session, stmt_id, &use_plan_cache, &use_query_cache);
2069  cas_log_write2_nonl (" %s\n", use_plan_cache ? "(PC)" : "");
2070 
2071 #if !defined (LIBCAS_FOR_JSP) && !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
2072  if (db_set_statement_auto_commit (session, auto_commit_mode) != NO_ERROR)
2073  {
2074  cas_log_write2 ("");
2075  goto batch_error;
2076  }
2077 #endif /* !LIBCAS_FOR_JSP && !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
2078 
2079  res_count = db_execute_statement (session, stmt_id, &result);
2080  SQL_LOG2_EXEC_END (as_info->cur_sql_log2, stmt_id, res_count);
2081 
2082 #ifndef LIBCAS_FOR_JSP
2084 #endif /* LIBCAS_FOR_JSP */
2085 
2086  if (res_count < 0)
2087  {
2088  goto batch_error;
2089  }
2090 
2091  /* success; peek the values in tuples */
2092  if (result != NULL)
2093  {
2094  (void) db_query_set_copy_tplvalue (result, 0 /* peek */ );
2095  }
2096 
2097  net_buf_cp_byte (net_buf, stmt_type);
2098  net_buf_cp_int (net_buf, res_count, NULL);
2099 
2100  db_make_null (&val);
2101  memset (&ins_oid, 0, sizeof (T_OBJECT));
2102 
2103  if ((stmt_type == CUBRID_STMT_INSERT) && (res_count == 1) && (result != NULL)
2104  && (db_query_get_tuple_value (result, 0, &val) >= 0))
2105  {
2106  ins_obj_p = db_get_object (&val);
2107  dbobj_to_casobj (ins_obj_p, &ins_oid);
2108  db_value_clear (&val);
2109  }
2110  net_buf_cp_object (net_buf, &ins_oid);
2111 
2112  db_query_end (result);
2113  db_close_session (session);
2114 
2115  if (auto_commit_mode == TRUE)
2116  {
2118  }
2119  logddl_set_msg ("execute_batch %d%s", query_index + 1, auto_commit_mode == TRUE ? " auto_commit" : "");
2120  logddl_write ();
2121  continue;
2122 
2123  batch_error:
2124  stmt_type = CUBRID_MAX_STMT_TYPE;
2125 
2126  err_code = db_error_code ();
2127  if (err_code < 0)
2128  {
2129  logddl_set_err_code (err_code);
2130  if (auto_commit_mode == FALSE
2131  && (ER_IS_SERVER_DOWN_ERROR (err_code) || ER_IS_ABORTED_DUE_TO_DEADLOCK (err_code)))
2132  {
2133  if (session != NULL)
2134  {
2135  db_close_session (session);
2136  }
2137 
2138  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
2139  goto execute_batch_error;
2140  }
2141  else
2142  {
2143  err_msg = (char *) db_error_string (1);
2145  }
2146  }
2147  else
2148  {
2149  err_code = -1;
2150  err_msg = (char *) "";
2151  }
2152 
2153  net_buf_cp_byte (net_buf, stmt_type);
2154 
2155  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V3))
2156  {
2158  }
2159  net_buf_cp_int (net_buf, err_code, NULL);
2160  net_buf_cp_int (net_buf, strlen (err_msg) + 1, NULL);
2161  net_buf_cp_str (net_buf, err_msg, strlen (err_msg) + 1);
2162 
2163  if (session)
2164  {
2165  db_close_session (session);
2166  }
2167 
2168  if (auto_commit_mode == TRUE)
2169  {
2171  }
2172  logddl_set_msg ("execute_batch %d%s", query_index + 1, auto_commit_mode == TRUE ? " auto_rollback" : "");
2173  logddl_write ();
2174 
2175  if (err_code == ER_INTERRUPTED)
2176  {
2177  net_buf_overwrite_int (net_buf, num_query_offset, query_index + 1);
2178  break;
2179  }
2180  }
2181 
2182  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V5))
2183  {
2184  net_buf_cp_int (net_buf, shm_shard_id, NULL);
2185  }
2186  logddl_write_end ();
2187  return 0;
2188 
2189 execute_batch_error:
2190  NET_BUF_ERR_SET (net_buf);
2192 
2193  logddl_set_msg ("execute_batch %d%s", query_index + 1, auto_commit_mode == TRUE ? " auto_rollback" : "");
2194  logddl_write ();
2195  logddl_write_end ();
2196  return err_code;
2197 }
2198 
2199 int
2200 ux_execute_array (T_SRV_HANDLE * srv_handle, int argc, void **argv, T_NET_BUF * net_buf, T_REQ_INFO * req_info)
2201 {
2202  DB_VALUE *value_list = NULL;
2203  int err_code;
2204  int i, num_bind = 0;
2205  int num_markers;
2206  int stmt_id = -1;
2207  int first_value;
2208  int res_count;
2209  int num_query;
2210  int num_query_msg_offset;
2211  char is_prepared;
2212  char *err_msg;
2213  DB_SESSION *session = NULL;
2214  DB_QUERY_RESULT *result;
2215  int stmt_type = -1;
2216  T_OBJECT ins_oid;
2217  DB_VALUE val;
2218  DB_OBJECT *ins_obj_p;
2219  T_BROKER_VERSION client_version = req_info->client_version;
2220 
2221  if (srv_handle == NULL || srv_handle->schema_type >= CCI_SCH_FIRST)
2222  {
2224  goto execute_array_error;
2225  }
2226 
2227  if (srv_handle->prepare_flag & CCI_PREPARE_CALL)
2228  {
2229  net_buf_cp_int (net_buf, 0, NULL); /* result code */
2230  net_buf_cp_int (net_buf, 0, NULL); /* num_query */
2231  goto return_success;
2232  }
2233 
2234  hm_qresult_end (srv_handle, FALSE);
2235  is_prepared = srv_handle->is_prepared;
2236 
2237  if (is_prepared == FALSE)
2238  {
2239  hm_session_free (srv_handle);
2240  }
2241  else
2242  {
2243  session = (DB_SESSION *) srv_handle->session;
2244  stmt_id = srv_handle->q_result->stmt_id;
2245  }
2246 
2247  num_markers = srv_handle->num_markers;
2248  if (num_markers < 1)
2249  {
2250  net_buf_cp_int (net_buf, 0, NULL); /* result code */
2251  net_buf_cp_int (net_buf, 0, NULL); /* num_query */
2252  goto return_success;
2253  }
2254 
2255  net_buf_cp_int (net_buf, 0, NULL); /* result code */
2256 
2257  num_query = 0;
2258  net_buf_cp_int (net_buf, num_query, &num_query_msg_offset);
2259 
2260  if (argc <= 1)
2261  {
2262  goto return_success;
2263  }
2264  num_bind = argc / 2;
2265 
2266  err_code = make_bind_value (num_bind, argc, argv, &value_list, net_buf, DB_TYPE_NULL);
2267  if (err_code < 0)
2268  {
2269  goto execute_array_error;
2270  }
2271 
2272  first_value = 0;
2273 
2274  while (num_bind >= num_markers)
2275  {
2276  num_query++;
2277 
2278  if (is_prepared == FALSE)
2279  {
2280  session = db_open_buffer (srv_handle->sql_stmt);
2281  if (!session)
2282  {
2283  goto exec_db_error;
2284  }
2285  }
2286 
2287  err_code = set_host_variables (session, num_markers, &(value_list[first_value]));
2288  if (err_code != NO_ERROR)
2289  {
2290  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
2291  goto exec_db_error;
2292  }
2293 
2294  if (is_prepared == FALSE)
2295  {
2296  if (srv_handle->prepare_flag & CCI_PREPARE_XASL_CACHE_PINNED)
2297  {
2298  db_session_set_xasl_cache_pinned (session, true, false);
2299  }
2300 
2301  stmt_id = db_compile_statement (session);
2302  if (stmt_id < 0)
2303  {
2304  goto exec_db_error;
2305  }
2306  }
2307 
2308 #if !defined (LIBCAS_FOR_JSP) && !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
2309  err_code = db_set_statement_auto_commit (session, srv_handle->auto_commit_mode);
2310  if (err_code != NO_ERROR)
2311  {
2312  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
2313  goto exec_db_error;
2314  }
2315 #endif /* !LIBCAS_FOR_JSP && !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
2316 
2318  res_count = db_execute_and_keep_statement (session, stmt_id, &result);
2319  SQL_LOG2_EXEC_END (as_info->cur_sql_log2, stmt_id, res_count);
2320 
2321  if (stmt_type < 0)
2322  {
2323  stmt_type = db_get_statement_type (session, stmt_id);
2324  }
2325 #ifndef LIBCAS_FOR_JSP
2327 #endif /* LIBCAS_FOR_JSP */
2328 
2329  if (res_count < 0)
2330  {
2331  goto exec_db_error;
2332  }
2333 
2334  db_get_cacheinfo (session, stmt_id, &srv_handle->use_plan_cache, &srv_handle->use_query_cache);
2335 
2336  /* success; peek the values in tuples */
2337  if (result != NULL)
2338  {
2339  (void) db_query_set_copy_tplvalue (result, 0 /* peek */ );
2340  }
2341 
2342  db_make_null (&val);
2343  memset (&ins_oid, 0, sizeof (T_OBJECT));
2344 
2345  if ((stmt_type == CUBRID_STMT_INSERT) && (res_count == 1) && (result != NULL)
2346  && (db_query_get_tuple_value (result, 0, &val) >= 0))
2347  {
2348  ins_obj_p = db_get_object (&val);
2349  dbobj_to_casobj (ins_obj_p, &ins_oid);
2350  db_value_clear (&val);
2351  }
2352 
2353  db_query_end (result);
2354  if (is_prepared == FALSE)
2355  {
2356  db_close_session (session);
2357  session = NULL;
2358  }
2359 
2360  net_buf_cp_int (net_buf, res_count, NULL);
2361  net_buf_cp_object (net_buf, &ins_oid);
2362 
2363  num_bind -= num_markers;
2364  first_value += num_markers;
2365 
2366  if (srv_handle->auto_commit_mode == TRUE)
2367  {
2369  }
2370  continue;
2371 
2372  exec_db_error:
2373  err_code = db_error_code ();
2374 
2375  if (err_code < 0)
2376  {
2377  if (srv_handle->auto_commit_mode == FALSE
2378  && (ER_IS_SERVER_DOWN_ERROR (err_code) || ER_IS_ABORTED_DUE_TO_DEADLOCK (err_code)))
2379  {
2380  if (is_prepared == FALSE && session != NULL)
2381  {
2382  db_close_session (session);
2383  session = NULL;
2384  }
2385 
2386  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
2387  goto execute_array_error;
2388  }
2389  else
2390  {
2391  err_msg = (char *) db_error_string (1);
2393  }
2394  }
2395  else
2396  {
2397  err_code = -1;
2398  err_msg = (char *) "";
2399  }
2400 
2401  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V3))
2402  {
2404  }
2405  net_buf_cp_int (net_buf, err_code, NULL);
2406  net_buf_cp_int (net_buf, strlen (err_msg) + 1, NULL);
2407  net_buf_cp_str (net_buf, err_msg, strlen (err_msg) + 1);
2408 
2409  if (is_prepared == FALSE && session != NULL)
2410  {
2411  db_close_session (session);
2412  session = NULL;
2413  }
2414 
2415  num_bind -= num_markers;
2416  first_value += num_markers;
2417 
2418  if (srv_handle->auto_commit_mode == TRUE)
2419  {
2421  }
2422 
2423  if (err_code == ER_INTERRUPTED)
2424  {
2425  break;
2426  }
2427  }
2428 
2429  net_buf_overwrite_int (net_buf, num_query_msg_offset, num_query);
2430 
2431  if (value_list)
2432  {
2433  for (i = 0; i < num_bind; i++)
2434  {
2435  db_value_clear (&(value_list[i]));
2436  }
2437  FREE_MEM (value_list);
2438  }
2439 
2440 return_success:
2441  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V5))
2442  {
2443  net_buf_cp_int (net_buf, shm_shard_id, NULL);
2444  }
2445 
2446  if (srv_handle->prepare_flag & CCI_PREPARE_XASL_CACHE_PINNED)
2447  {
2448  db_session_set_xasl_cache_pinned (session, false, false);
2449  srv_handle->prepare_flag &= ~CCI_PREPARE_XASL_CACHE_PINNED;
2450  }
2451 
2452  return 0;
2453 
2454 execute_array_error:
2455  NET_BUF_ERR_SET (net_buf);
2457 
2458  if (srv_handle->prepare_flag & CCI_PREPARE_XASL_CACHE_PINNED)
2459  {
2460  db_session_set_xasl_cache_pinned (session, false, false);
2461  srv_handle->prepare_flag &= ~CCI_PREPARE_XASL_CACHE_PINNED;
2462  }
2463 
2464  if (value_list)
2465  {
2466  for (i = 0; i < num_bind; i++)
2467  {
2468  db_value_clear (&(value_list[i]));
2469  }
2470  FREE_MEM (value_list);
2471  }
2472  return err_code;
2473 }
2474 
2475 void
2476 ux_get_tran_setting (int *lock_wait, int *isol_level)
2477 {
2478  int tmp_lock_wait;
2479  DB_TRAN_ISOLATION tmp_isol_level;
2480  bool dummy;
2481 
2482  tran_get_tran_settings (&tmp_lock_wait, &tmp_isol_level, &dummy /* async_ws */ );
2483 
2484  if (lock_wait)
2485  {
2486  *lock_wait = (int) tmp_lock_wait;
2487  }
2488 
2489  if (isol_level)
2490  {
2491  *isol_level = (int) tmp_isol_level;
2492  }
2493 }
2494 
2495 int
2496 ux_set_isolation_level (int new_isol_level, T_NET_BUF * net_buf)
2497 {
2498  int err_code;
2499 
2500  err_code = db_set_isolation ((DB_TRAN_ISOLATION) new_isol_level);
2501  if (err_code < 0)
2502  {
2504  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
2505  NET_BUF_ERR_SET (net_buf);
2506  return err_code;
2507  }
2508 
2509  return 0;
2510 }
2511 
2512 void
2513 ux_set_lock_timeout (int lock_timeout)
2514 {
2515  (void) tran_reset_wait_times (lock_timeout);
2516 }
2517 
2518 void
2520 {
2521 #if !defined(LIBCAS_FOR_JSP)
2522  int prev_mode;
2523 
2524  prev_mode = as_info->cas_change_mode;
2526 
2527  net_buf_cp_int (net_buf, 0, NULL); /* result code */
2528  net_buf_cp_int (net_buf, prev_mode, NULL); /* result msg */
2529 #else
2530  net_buf_cp_int (net_buf, 0, NULL); /* result code */
2531  net_buf_cp_int (net_buf, CAS_CHANGE_MODE_UNKNOWN, NULL); /* result msg */
2532 #endif
2533 }
2534 
2535 int
2536 ux_fetch (T_SRV_HANDLE * srv_handle, int cursor_pos, int fetch_count, char fetch_flag, int result_set_index,
2537  T_NET_BUF * net_buf, T_REQ_INFO * req_info)
2538 {
2539  int err_code;
2540  int fetch_func_index;
2541 
2542  if (srv_handle == NULL)
2543  {
2545  goto fetch_error;
2546  }
2547 
2548  if (srv_handle->prepare_flag & CCI_PREPARE_CALL)
2549  {
2550  net_buf_cp_int (net_buf, 0, NULL); /* result code */
2551  return (fetch_call (srv_handle, net_buf, req_info));
2552  }
2553 
2554  if (srv_handle->schema_type < 0)
2555  {
2556  fetch_func_index = 0;
2557  }
2558  else if (srv_handle->schema_type >= CCI_SCH_FIRST && srv_handle->schema_type <= CCI_SCH_LAST)
2559  {
2560  fetch_func_index = srv_handle->schema_type;
2561  }
2562  else
2563  {
2565  goto fetch_error;
2566  }
2567 
2568  net_buf_cp_int (net_buf, 0, NULL); /* result code */
2569 
2570  if (fetch_count <= 0)
2571  {
2572  fetch_count = 100;
2573  }
2574 
2575  err_code =
2576  (*(fetch_func[fetch_func_index])) (srv_handle, cursor_pos, fetch_count, fetch_flag, result_set_index, net_buf,
2577  req_info);
2578 
2579  if (err_code < 0)
2580  {
2581  goto fetch_error;
2582  }
2583 
2584  return 0;
2585 
2586 fetch_error:
2587  NET_BUF_ERR_SET (net_buf);
2588 
2589  if (cas_shard_flag == ON
2590  && (srv_handle != NULL && srv_handle->auto_commit_mode == TRUE && srv_handle->forward_only_cursor == TRUE))
2591  {
2592  req_info->need_auto_commit = TRAN_AUTOROLLBACK;
2593  }
2594 
2596  return err_code;
2597 }
2598 
2599 int
2600 ux_oid_get (int argc, void **argv, T_NET_BUF * net_buf)
2601 {
2602  DB_OBJECT *obj;
2603  int err_code = 0;
2604  int attr_num;
2605  char **attr_name = NULL;
2606  char *class_name;
2607 
2608  net_arg_get_dbobject (&obj, argv[0]);
2609  if ((err_code = ux_check_object (obj, net_buf)) < 0)
2610  {
2611  goto oid_get_error;
2612  }
2613 
2614  if (argc > 1)
2615  {
2616  attr_num = get_attr_name_from_argv (argc, argv, &attr_name);
2617  }
2618  else
2619  {
2620  attr_num = get_attr_name (obj, &attr_name);
2621  }
2622 
2623  if (attr_num < 0)
2624  {
2625  err_code = attr_num;
2626  goto oid_get_error;
2627  }
2628 
2629  net_buf_cp_int (net_buf, 0, NULL); /* result code */
2630 
2631  class_name = (char *) db_get_class_name (obj);
2632  if (class_name == NULL)
2633  {
2634  net_buf_cp_int (net_buf, 1, NULL);
2635  net_buf_cp_byte (net_buf, '\0');
2636  }
2637  else
2638  {
2639  net_buf_cp_int (net_buf, strlen (class_name) + 1, NULL);
2640  net_buf_cp_str (net_buf, class_name, strlen (class_name) + 1);
2641  }
2642 
2643  net_buf_cp_int (net_buf, attr_num, NULL);
2644 
2645  err_code = oid_attr_info_set (net_buf, obj, attr_num, attr_name);
2646  if (err_code < 0)
2647  {
2648  goto oid_get_error;
2649  }
2650  if (oid_data_set (net_buf, obj, attr_num, attr_name) < 0)
2651  {
2652  goto oid_get_error;
2653  }
2654 
2655  FREE_MEM (attr_name);
2656  obj = NULL;
2657  return 0;
2658 
2659 oid_get_error:
2660  NET_BUF_ERR_SET (net_buf);
2662  FREE_MEM (attr_name);
2663  obj = NULL;
2664 
2665  if (err_code >= 0)
2666  {
2667  err_code = -1;
2668  }
2669 
2670  return err_code;
2671 }
2672 
2673 int
2674 ux_cursor (int srv_h_id, int offset, int origin, T_NET_BUF * net_buf)
2675 {
2676  T_SRV_HANDLE *srv_handle;
2677  int err_code;
2678  int count;
2679  char *err_str = NULL;
2680  T_QUERY_RESULT *cur_result;
2681 
2682  srv_handle = hm_find_srv_handle (srv_h_id);
2683  if (srv_handle == NULL || srv_handle->schema_type >= CCI_SCH_FIRST)
2684  {
2686  goto cursor_error;
2687  }
2688 
2689  cur_result = (T_QUERY_RESULT *) srv_handle->cur_result;
2690  if (cur_result == NULL)
2691  {
2693  goto cursor_error;
2694  }
2695 
2696  count = cur_result->tuple_count;
2697  net_buf_cp_int (net_buf, 0, NULL); /* result code */
2698  net_buf_cp_int (net_buf, count, NULL); /* result msg */
2699 
2700  return 0;
2701 
2702 cursor_error:
2703  NET_BUF_ERR_SET (net_buf);
2705  FREE_MEM (err_str);
2706  return err_code;
2707 }
2708 
2709 int
2710 ux_cursor_update (T_SRV_HANDLE * srv_handle, int cursor_pos, int argc, void **argv, T_NET_BUF * net_buf)
2711 {
2712  int col_idx;
2713  int err_code;
2714  DB_VALUE *attr_val = NULL;
2715  DB_VALUE oid_val;
2716  T_QUERY_RESULT *q_result = NULL;
2717  DB_QUERY_RESULT *result;
2718  DB_OBJECT *obj_p = NULL;
2719  char desired_type;
2720  char *attr_name;
2721 
2722  if (srv_handle == NULL || srv_handle->schema_type >= CCI_SCH_FIRST || srv_handle->cur_result == NULL)
2723  {
2725  goto cursor_update_error;
2726  }
2727 
2728  q_result = (T_QUERY_RESULT *) (srv_handle->cur_result);
2729  result = (DB_QUERY_RESULT *) q_result->result;
2730 
2731  net_buf_cp_int (net_buf, 0, NULL); /* result code */
2732 
2733  if (result == NULL || q_result->col_updatable == FALSE || q_result->col_update_info == NULL)
2734  {
2735  return 0;
2736  }
2737 
2738  if (db_query_seek_tuple (result, cursor_pos - 1, 1) != DB_CURSOR_SUCCESS)
2739  {
2740  return 0;
2741  }
2742 
2743  err_code = db_query_get_tuple_oid (result, &oid_val);
2744  if (err_code < 0)
2745  {
2746  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
2747  goto cursor_update_error;
2748  }
2749  obj_p = db_get_object (&oid_val);
2750 
2751  argc -= 2;
2752  argv += 2;
2753 
2754  for (; argc >= 3; argc -= 3, argv += 3)
2755  {
2756  net_arg_get_int (&col_idx, argv[0]);
2757 
2758  attr_name = q_result->col_update_info[col_idx - 1].attr_name;
2759  if (attr_name == NULL)
2760  {
2761  continue;
2762  }
2763 
2764  desired_type = get_attr_type (obj_p, attr_name);
2765  err_code = make_bind_value (1, 2, argv + 1, &attr_val, net_buf, desired_type);
2766  if (err_code < 0)
2767  {
2768  goto cursor_update_error;
2769  }
2770 
2771  err_code = db_put (obj_p, attr_name, attr_val);
2772  if (err_code < 0)
2773  {
2774  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
2775  goto cursor_update_error;
2776  }
2777 
2778  db_value_clear (attr_val);
2779  FREE_MEM (attr_val);
2780  }
2781 
2782  db_value_clear (&oid_val);
2783  obj_p = NULL;
2784 
2785  return 0;
2786 cursor_update_error:
2787  NET_BUF_ERR_SET (net_buf);
2789  if (attr_val)
2790  {
2791  db_value_clear (attr_val);
2792  FREE_MEM (attr_val);
2793  }
2794 
2795  if (obj_p)
2796  {
2797  db_value_clear (&oid_val);
2798  obj_p = NULL;
2799  }
2800 
2801  return err_code;
2802 }
2803 
2804 void
2806 {
2807  int idx = 0;
2808 
2809  if (srv_handle == NULL)
2810  {
2811  return;
2812  }
2813 
2814  idx = srv_handle->cur_result_index - 1;
2815  if (idx < 0)
2816  {
2817  return;
2818  }
2819 
2820  ux_free_result (srv_handle->q_result[idx].result);
2821  srv_handle->q_result[idx].result = NULL;
2822 
2823  if (srv_handle->q_result[idx].is_holdable == true)
2824  {
2825  srv_handle->q_result[idx].is_holdable = false;
2826 #if !defined(LIBCAS_FOR_JSP)
2828 #endif
2829  }
2830 }
2831 
2832 int
2834 {
2835  char *p;
2836 
2837  p = (char *) rel_build_number ();
2838 
2839  net_buf_cp_int (net_buf, 0, NULL); /* result code */
2840  if (p == NULL)
2841  {
2842  net_buf_cp_byte (net_buf, '\0');
2843  }
2844  else
2845  {
2846  net_buf_cp_str (net_buf, p, strlen (p) + 1);
2847  }
2848 
2849  return 0;
2850 }
2851 
2852 int
2854 {
2855  DB_OBJECT *class_obj;
2856  int err_code;
2857  int num_objs, num_pages;
2858 
2859  class_obj = db_find_class (class_name);
2860  if (class_obj == NULL)
2861  {
2863  goto class_num_objs_error;
2864  }
2865 
2866  err_code = db_get_class_num_objs_and_pages (class_obj, flag, &num_objs, &num_pages);
2867 
2868  if (err_code < 0)
2869  {
2870  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
2871  goto class_num_objs_error;
2872  }
2873 
2874  net_buf_cp_int (net_buf, 0, NULL); /* result code */
2875  net_buf_cp_int (net_buf, num_objs, NULL);
2876  net_buf_cp_int (net_buf, num_pages, NULL);
2877 
2878  class_obj = NULL;
2879  return 0;
2880 
2881 class_num_objs_error:
2882  NET_BUF_ERR_SET (net_buf);
2884  class_obj = NULL;
2885  return err_code;
2886 }
2887 
2888 void
2889 ux_col_get (DB_COLLECTION * col, char col_type, char ele_type, DB_DOMAIN * ele_domain, T_NET_BUF * net_buf)
2890 {
2891  int col_size, i;
2892  DB_VALUE ele_val;
2893 
2894  if (col == NULL)
2895  {
2896  col_size = -1;
2897  }
2898  else
2899  {
2900  col_size = db_col_size (col);
2901  }
2902 
2903  net_buf_cp_int (net_buf, 0, NULL);
2904 
2905  net_buf_cp_byte (net_buf, col_type); /* set type (set, multiset, sequence) */
2906 
2907  net_buf_cp_int (net_buf, 1, NULL); /* num column info */
2908  net_buf_column_info_set (net_buf, ele_type, (short) db_domain_scale (ele_domain), db_domain_precision (ele_domain),
2909  db_domain_codeset (ele_domain), NULL);
2910 
2911  net_buf_cp_int (net_buf, col_size, NULL); /* set size */
2912  if (col_size > 0)
2913  {
2914  for (i = 0; i < col_size; i++)
2915  {
2916  if (db_col_get (col, i, &ele_val) < 0)
2917  {
2918  db_make_null (&ele_val);
2919  }
2920  dbval_to_net_buf (&ele_val, net_buf, 1, 0, 0);
2921  db_value_clear (&ele_val);
2922  }
2923  }
2924 }
2925 
2926 void
2928 {
2929  int col_size;
2930 
2931  if (col == NULL)
2932  {
2933  col_size = -1;
2934  }
2935  else
2936  {
2937  col_size = db_col_size (col);
2938  }
2939 
2940  net_buf_cp_int (net_buf, 0, NULL); /* result code */
2941 
2942  net_buf_cp_int (net_buf, col_size, NULL); /* result msg */
2943 }
2944 
2945 int
2946 ux_col_set_drop (DB_COLLECTION * col, DB_VALUE * ele_val, T_NET_BUF * net_buf)
2947 {
2948  int err_code = 0;
2949 
2950  if (col != NULL)
2951  {
2952  err_code = db_set_drop (col, ele_val);
2953  if (err_code < 0)
2954  {
2957  NET_BUF_ERR_SET (net_buf);
2958  return -1;
2959  }
2960  }
2961  net_buf_cp_int (net_buf, 0, NULL); /* result code */
2962  return 0;
2963 }
2964 
2965 int
2966 ux_col_set_add (DB_COLLECTION * col, DB_VALUE * ele_val, T_NET_BUF * net_buf)
2967 {
2968  int err_code = 0;
2969 
2970  if (col != NULL)
2971  {
2972  err_code = db_set_add (col, ele_val);
2973  if (err_code < 0)
2974  {
2977  NET_BUF_ERR_SET (net_buf);
2978  return -1;
2979  }
2980  }
2981  net_buf_cp_int (net_buf, 0, NULL); /* result code */
2982  return 0;
2983 }
2984 
2985 int
2987 {
2988  int err_code = 0;
2989 
2990  if (col != NULL)
2991  {
2992  err_code = db_seq_drop (col, index - 1);
2993  if (err_code < 0)
2994  {
2997  NET_BUF_ERR_SET (net_buf);
2998  return -1;
2999  }
3000  }
3001  net_buf_cp_int (net_buf, 0, NULL); /* result code */
3002  return 0;
3003 }
3004 
3005 int
3006 ux_col_seq_insert (DB_COLLECTION * col, int index, DB_VALUE * ele_val, T_NET_BUF * net_buf)
3007 {
3008  int err_code = 0;
3009 
3010  if (col != NULL)
3011  {
3012  err_code = db_seq_insert (col, index - 1, ele_val);
3013  if (err_code < 0)
3014  {
3017  NET_BUF_ERR_SET (net_buf);
3018  return -1;
3019  }
3020  }
3021  net_buf_cp_int (net_buf, 0, NULL); /* result code */
3022  return 0;
3023 }
3024 
3025 int
3026 ux_col_seq_put (DB_COLLECTION * col, int index, DB_VALUE * ele_val, T_NET_BUF * net_buf)
3027 {
3028  int err_code = 0;
3029 
3030  if (col != NULL)
3031  {
3032  err_code = db_seq_put (col, index - 1, ele_val);
3033  if (err_code < 0)
3034  {
3037  NET_BUF_ERR_SET (net_buf);
3038  return -1;
3039  }
3040  }
3041  net_buf_cp_int (net_buf, 0, NULL); /* result code */
3042  return 0;
3043 }
3044 
3045 int
3046 ux_oid_put (int argc, void **argv, T_NET_BUF * net_buf)
3047 {
3048  DB_OBJECT *obj;
3049  int err_code;
3050  char *attr_name;
3051  int name_size;
3052  char attr_type;
3053  DB_VALUE *attr_val = NULL;
3054  DB_OTMPL *otmpl;
3055 
3056  net_arg_get_dbobject (&obj, argv[0]);
3057  err_code = ux_check_object (obj, net_buf);
3058  if (err_code < 0)
3059  {
3060  goto oid_put_error;
3061  }
3062 
3063  argc--;
3064  argv++;
3065 
3066  otmpl = dbt_edit_object (obj);
3067  if (otmpl == NULL)
3068  {
3070  goto oid_put_error;
3071  }
3072 
3073  for (; argc >= 3; argc -= 3, argv += 3)
3074  {
3075  net_arg_get_str (&attr_name, &name_size, argv[0]);
3076  if (name_size < 1)
3077  {
3078  continue;
3079  }
3080 
3081  attr_type = get_attr_type (obj, attr_name);
3082  err_code = make_bind_value (1, 2, argv + 1, &attr_val, net_buf, attr_type);
3083  if (err_code < 0)
3084  {
3085  dbt_abort_object (otmpl);
3086  goto oid_put_error;
3087  }
3088 
3089  err_code = dbt_put (otmpl, attr_name, attr_val);
3090  if (err_code < 0)
3091  {
3092  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
3093  db_value_clear (attr_val);
3094  FREE_MEM (attr_val);
3095  dbt_abort_object (otmpl);
3096  goto oid_put_error;
3097  }
3098 
3099  db_value_clear (attr_val);
3100  FREE_MEM (attr_val);
3101  }
3102 
3103  obj = dbt_finish_object (otmpl);
3104  if (obj == NULL)
3105  {
3107  goto oid_put_error;
3108  }
3109 
3110  net_buf_cp_int (net_buf, 0, NULL);
3111 
3112  obj = NULL;
3113  return 0;
3114 
3115 oid_put_error:
3116  NET_BUF_ERR_SET (net_buf);
3118  obj = NULL;
3119  return err_code;
3120 }
3121 
3122 char
3123 get_set_domain (DB_DOMAIN * set_domain, int *precision, short *scale, char *db_type, char *charset)
3124 {
3125  DB_DOMAIN *ele_domain;
3126  int set_domain_count = 0;
3127  int set_type = DB_TYPE_NULL;
3128 
3129  if (precision)
3130  {
3131  *precision = 0;
3132  }
3133  if (scale)
3134  {
3135  *scale = 0;
3136  }
3137  if (charset)
3138  {
3139  *charset = lang_charset ();
3140  }
3141 
3142  ele_domain = db_domain_set (set_domain);
3143  for (; ele_domain; ele_domain = db_domain_next (ele_domain))
3144  {
3145  set_domain_count++;
3146  set_type = TP_DOMAIN_TYPE (ele_domain);
3147  if (precision)
3148  {
3149  *precision = db_domain_precision (ele_domain);
3150  }
3151 
3152  if (scale)
3153  {
3154  *scale = (short) db_domain_scale (ele_domain);
3155  }
3156  if (charset)
3157  {
3158  *charset = db_domain_codeset (ele_domain);
3159  }
3160  }
3161 
3162  if (db_type)
3163  {
3164  *db_type = (set_domain_count != 1) ? DB_TYPE_NULL : set_type;
3165  }
3166 
3167  if (set_domain_count != 1)
3168  {
3169  return 0;
3170  }
3171 
3172  return (ux_db_type_to_cas_type (set_type));
3173 }
3174 
3175 int
3176 make_bind_value (int num_bind, int argc, void **argv, DB_VALUE ** ret_val, T_NET_BUF * net_buf, char desired_type)
3177 {
3178  DB_VALUE *value_list = NULL;
3179  int i, type_idx, val_idx;
3180  int err_code;
3181 
3182  *ret_val = NULL;
3183 
3184  if (num_bind != (argc / 2))
3185  {
3187  }
3188 
3189  value_list = (DB_VALUE *) MALLOC (sizeof (DB_VALUE) * num_bind);
3190  if (value_list == NULL)
3191  {
3193  }
3194 
3195  memset (value_list, 0, sizeof (DB_VALUE) * num_bind);
3196 
3197  for (i = 0; i < num_bind; i++)
3198  {
3199  type_idx = 2 * i;
3200  val_idx = 2 * i + 1;
3201  err_code = netval_to_dbval (argv[type_idx], argv[val_idx], &(value_list[i]), net_buf, desired_type);
3202  if (err_code < 0)
3203  {
3204  for (i--; i >= 0; i--)
3205  {
3206  db_value_clear (&(value_list[i]));
3207  }
3208  FREE_MEM (value_list);
3209  return err_code;
3210  }
3211  }
3212 
3213  *ret_val = value_list;
3214 
3215  return 0;
3216 }
3217 
3218 int
3219 ux_get_attr_type_str (char *class_name, char *attr_name, T_NET_BUF * net_buf, T_REQ_INFO * req_info)
3220 {
3221  int err_code;
3222  DB_OBJECT *class_obj;
3223  DB_ATTRIBUTE *attribute;
3224  DB_DOMAIN *domain;
3225  char *domain_str = NULL;
3226 
3227  class_obj = db_find_class (class_name);
3228  if (class_obj == NULL)
3229  {
3232  goto ux_get_attr_type_str_error;
3233  }
3234 
3235  attribute = db_get_attribute (class_obj, attr_name);
3236  if (attr_name == NULL)
3237  {
3240  goto ux_get_attr_type_str_error;
3241  }
3242 
3243  domain = db_attribute_domain (attribute);
3244  if (domain == NULL)
3245  {
3248  goto ux_get_attr_type_str_error;
3249  }
3250 
3251  net_buf_cp_int (net_buf, 0, NULL); /* result code */
3252 
3253  domain_str = get_domain_str (domain);
3254  if (domain_str == NULL)
3255  {
3256  net_buf_cp_byte (net_buf, '\0');
3257  }
3258  else
3259  {
3260  net_buf_cp_str (net_buf, domain_str, strlen (domain_str) + 1);
3261  FREE_MEM (domain_str);
3262  }
3263 
3264  return 0;
3265 
3266 ux_get_attr_type_str_error:
3267  NET_BUF_ERR_SET (net_buf);
3268  return err_code;
3269 }
3270 
3271 int
3272 ux_get_query_info (int srv_h_id, char info_type, T_NET_BUF * net_buf)
3273 {
3274  T_SRV_HANDLE *srv_handle;
3275  int err_code;
3276  char *file_name;
3277  int fd = -1;
3278  char read_buf[1024];
3279  int read_len;
3280 
3281  srv_handle = hm_find_srv_handle (srv_h_id);
3282  if (srv_handle == NULL)
3283  {
3286  NET_BUF_ERR_SET (net_buf);
3287  return err_code;
3288  }
3289 
3290  if (srv_handle->query_info_flag == FALSE || info_type != CAS_GET_QUERY_INFO_PLAN)
3291  {
3292  /* Before R4.0, one more type "CAS_GET_QUERY_INFO_HISTOGRAM" was supported. So we should check info_type for
3293  * backward compatibility. */
3294  file_name = NULL;
3295  }
3296  else
3297  {
3298  file_name = cas_log_query_plan_file (srv_h_id);
3299  }
3300 
3301  if (file_name)
3302  {
3303  fd = open (file_name, O_RDONLY);
3304  }
3305 
3306  net_buf_cp_int (net_buf, 0, NULL); /* result code */
3307 
3308  if (file_name == NULL || fd < 0)
3309  {
3310  net_buf_cp_byte (net_buf, '\0');
3311  return 0;
3312  }
3313 
3314  while ((read_len = read (fd, read_buf, sizeof (read_buf))) > 0)
3315  {
3316  net_buf_cp_str (net_buf, read_buf, read_len);
3317  }
3318  net_buf_cp_byte (net_buf, '\0');
3319  close (fd);
3320 
3321  return 0;
3322 }
3323 
3324 int
3325 ux_get_parameter_info (int srv_h_id, T_NET_BUF * net_buf)
3326 {
3327  T_SRV_HANDLE *srv_handle;
3328  int err_code;
3329  DB_SESSION *session;
3330  int stmt_id, num_markers;
3331  DB_MARKER *param;
3332  DB_TYPE db_type;
3333  char param_mode;
3334  unsigned char cas_type;
3335  char charset;
3336  int precision;
3337  short scale;
3338  int i;
3339  DB_DOMAIN *domain;
3340 
3341  srv_handle = hm_find_srv_handle (srv_h_id);
3342  if (srv_handle == NULL || srv_handle->schema_type >= CCI_SCH_FIRST)
3343  {
3345  goto parameter_info_error;
3346  }
3347 
3348  if (srv_handle->schema_type >= CCI_SCH_FIRST)
3349  {
3350  session = NULL;
3351  num_markers = 0;
3352  stmt_id = 0;
3353  }
3354  else
3355  {
3356  session = (DB_SESSION *) srv_handle->session;
3357  stmt_id = srv_handle->q_result->stmt_id;
3358  num_markers = srv_handle->num_markers;
3359  }
3360 
3361  param = NULL;
3362  if (session != NULL && stmt_id > 0)
3363  {
3364  param = db_get_input_markers (session, stmt_id);
3365  }
3366 
3367  net_buf_cp_int (net_buf, num_markers, NULL); /* result code */
3368 
3369  for (i = 0; i < num_markers; i++)
3370  {
3371  domain = NULL;
3372  param_mode = CCI_PARAM_MODE_UNKNOWN;
3373  db_type = DB_TYPE_NULL;
3374  precision = 0;
3375  scale = 0;
3376  charset = 0;
3377 
3378  if (param != NULL)
3379  {
3380  domain = db_marker_domain (param);
3381  db_type = TP_DOMAIN_TYPE (domain);
3382 
3383  if (db_type != DB_TYPE_NULL)
3384  {
3385  param_mode = CCI_PARAM_MODE_IN;
3386  precision = db_domain_precision (domain);
3387  scale = db_domain_scale (domain);
3388  charset = db_domain_codeset (domain);
3389  }
3390 
3391  param = db_marker_next (param);
3392  }
3393 
3394  if (TP_IS_SET_TYPE (db_type))
3395  {
3396  char set_type;
3397  set_type = get_set_domain (domain, NULL, NULL, NULL, &charset);
3398 
3399  cas_type = set_extended_cas_type ((T_CCI_U_TYPE) set_type, db_type);
3400  }
3401  else
3402  {
3403  cas_type = set_extended_cas_type (CCI_U_TYPE_UNKNOWN, db_type);
3404  }
3405 
3406  net_buf_cp_byte (net_buf, param_mode);
3407  net_buf_cp_cas_type_and_charset (net_buf, cas_type, charset);
3408  net_buf_cp_short (net_buf, scale);
3409  net_buf_cp_int (net_buf, precision, NULL);
3410  }
3411 
3412  return 0;
3413 
3414 parameter_info_error:
3416  NET_BUF_ERR_SET (net_buf);
3417  return err_code;
3418 }
3419 
3420 int
3422 {
3423  int err_code;
3424 
3425  if (obj == NULL)
3426  {
3428  }
3429 
3430  er_clear ();
3431 
3432  err_code = db_is_instance (obj);
3433  if (err_code < 0)
3434  {
3435  return ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
3436  }
3437  if (err_code > 0)
3438  {
3439  return 0;
3440  }
3441 
3442  err_code = db_error_code ();
3443  if (err_code < 0)
3444  {
3445  return ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
3446  }
3447 
3449 }
3450 
3451 void
3452 ux_free_result (void *res)
3453 {
3454  db_query_end ((DB_QUERY_RESULT *) res);
3455 }
3456 
3457 char
3459 {
3460  /* todo: T_CCI_U_TYPE duplicates db types. */
3461  if (db_type < DB_TYPE_FIRST || db_type > DB_TYPE_LAST)
3462  {
3463  return CCI_U_TYPE_NULL;
3464  }
3465 
3466  return (cas_u_type[db_type]);
3467 }
3468 
3469 void
3471 {
3472  cas_u_type[DB_TYPE_ENUMERATION] = u_type;
3473 }
3474 
3475 void
3477 {
3478  cas_u_type[DB_TYPE_TIMESTAMPTZ] = u_type;
3479 }
3480 
3481 void
3483 {
3484  cas_u_type[DB_TYPE_DATETIMETZ] = u_type;
3485 }
3486 
3487 void
3489 {
3490  cas_u_type[DB_TYPE_TIMESTAMPLTZ] = u_type;
3491 }
3492 
3493 void
3495 {
3496  cas_u_type[DB_TYPE_DATETIMELTZ] = u_type;
3497 }
3498 
3499 void
3501 {
3502  cas_u_type[DB_TYPE_JSON] = u_type;
3503 }
3504 
3505 int
3506 ux_schema_info (int schema_type, char *arg1, char *arg2, char flag, T_NET_BUF * net_buf, T_REQ_INFO * req_info,
3507  unsigned int query_seq_num)
3508 {
3509  int srv_h_id;
3510  int err_code = 0;
3511  T_SRV_HANDLE *srv_handle = NULL;
3512  T_BROKER_VERSION client_version = req_info->client_version;
3513 
3514  srv_h_id = hm_new_srv_handle (&srv_handle, query_seq_num);
3515  if (srv_h_id < 0)
3516  {
3517  err_code = srv_h_id;
3518  goto schema_info_error;
3519  }
3520  srv_handle->schema_type = schema_type;
3521 
3522  net_buf_cp_int (net_buf, srv_h_id, NULL); /* result code */
3523 
3524  switch (schema_type)
3525  {
3526  case CCI_SCH_CLASS:
3527  err_code = sch_class_info (net_buf, arg1, flag, 0, srv_handle, client_version);
3528  break;
3529  case CCI_SCH_VCLASS:
3530  err_code = sch_class_info (net_buf, arg1, flag, 1, srv_handle, client_version);
3531  break;
3532  case CCI_SCH_QUERY_SPEC:
3533  err_code = sch_queryspec (net_buf, arg1, srv_handle);
3534  break;
3535  case CCI_SCH_ATTRIBUTE:
3536  err_code = sch_attr_info (net_buf, arg1, arg2, flag, 0, srv_handle);
3537  break;
3538  case CCI_SCH_CLASS_ATTRIBUTE:
3539  err_code = sch_attr_info (net_buf, arg1, arg2, flag, 1, srv_handle);
3540  break;
3541  case CCI_SCH_METHOD:
3542  sch_method_info (net_buf, arg1, 0, &(srv_handle->session));
3543  break;
3544  case CCI_SCH_CLASS_METHOD:
3545  sch_method_info (net_buf, arg1, 1, &(srv_handle->session));
3546  break;
3547  case CCI_SCH_METHOD_FILE:
3548  sch_methfile_info (net_buf, arg1, &(srv_handle->session));
3549  break;
3550  case CCI_SCH_SUPERCLASS:
3551  err_code = sch_superclass (net_buf, arg1, 1, srv_handle);
3552  break;
3553  case CCI_SCH_SUBCLASS:
3554  err_code = sch_superclass (net_buf, arg1, 0, srv_handle);
3555  break;
3556  case CCI_SCH_CONSTRAINT:
3557  sch_constraint (net_buf, arg1, &(srv_handle->session));
3558  break;
3559  case CCI_SCH_TRIGGER:
3560  sch_trigger (net_buf, arg1, flag, &(srv_handle->session));
3561  break;
3562  case CCI_SCH_CLASS_PRIVILEGE:
3563  err_code = sch_class_priv (net_buf, arg1, flag, srv_handle);
3564  break;
3565  case CCI_SCH_ATTR_PRIVILEGE:
3566  err_code = sch_attr_priv (net_buf, arg1, arg2, flag, srv_handle);
3567  break;
3568  case CCI_SCH_DIRECT_SUPER_CLASS:
3569  err_code = sch_direct_super_class (net_buf, arg1, flag, srv_handle);
3570  break;
3571  case CCI_SCH_PRIMARY_KEY:
3572  err_code = sch_primary_key (net_buf, arg1, srv_handle);
3573  break;
3574  case CCI_SCH_IMPORTED_KEYS:
3575  err_code = sch_imported_keys (net_buf, arg1, &(srv_handle->session));
3576  break;
3577  case CCI_SCH_EXPORTED_KEYS:
3578  err_code = sch_exported_keys_or_cross_reference (net_buf, false, arg1, NULL, &(srv_handle->session));
3579  break;
3580  case CCI_SCH_CROSS_REFERENCE:
3581  err_code = sch_exported_keys_or_cross_reference (net_buf, true, arg1, arg2, &(srv_handle->session));
3582  break;
3583  default:
3585  goto schema_info_error;
3586  }
3587 
3588  if (err_code < 0)
3589  {
3590  goto schema_info_error;
3591  }
3592 
3593  if (schema_type == CCI_SCH_CLASS || schema_type == CCI_SCH_VCLASS || schema_type == CCI_SCH_ATTRIBUTE
3594  || schema_type == CCI_SCH_CLASS_ATTRIBUTE || schema_type == CCI_SCH_QUERY_SPEC
3595  || schema_type == CCI_SCH_DIRECT_SUPER_CLASS || schema_type == CCI_SCH_PRIMARY_KEY)
3596  {
3597  srv_handle->cursor_pos = 0;
3598  }
3599  else
3600  {
3601  srv_handle->cur_result = srv_handle->session;
3602  if (srv_handle->cur_result == NULL)
3603  {
3604  srv_handle->cursor_pos = 0;
3605  }
3606  else
3607  {
3608  srv_handle->cursor_pos = 1;
3609  }
3610  }
3611 
3612  return srv_h_id;
3613 
3614 schema_info_error:
3615  NET_BUF_ERR_SET (net_buf);
3617  if (srv_handle)
3618  {
3619  hm_srv_handle_free (srv_h_id);
3620  }
3621 
3622  return err_code;
3623 }
3624 
3625 void
3627 {
3628  if (call_info)
3629  {
3630  int i;
3631 
3632  prepare_call_info_dbval_clear (call_info);
3633  FREE_MEM (call_info->dbval_ret);
3634  for (i = 0; i < call_info->num_args; i++)
3635  {
3636  FREE_MEM (((DB_VALUE **) call_info->dbval_args)[i]);
3637  }
3638  FREE_MEM (call_info->dbval_args);
3639  FREE_MEM (call_info->param_mode);
3640  FREE_MEM (call_info);
3641  }
3642 }
3643 
3644 void
3645 ux_call_info_cp_param_mode (T_SRV_HANDLE * srv_handle, char *param_mode, int num_param)
3646 {
3647  T_PREPARE_CALL_INFO *call_info = srv_handle->prepare_call_info;
3648 
3649  if (call_info == NULL)
3650  {
3651  return;
3652  }
3653 
3654  memcpy (call_info->param_mode, param_mode, MIN (num_param, call_info->num_args));
3655 }
3656 
3657 static void
3658 prepare_column_info_set (T_NET_BUF * net_buf, char ut, short scale, int prec, char charset, const char *col_name,
3659  const char *default_value, char auto_increment, char unique_key, char primary_key,
3660  char reverse_index, char reverse_unique, char foreign_key, char shared, const char *attr_name,
3661  const char *class_name, char is_non_null, T_BROKER_VERSION client_version)
3662 {
3663  const char *attr_name_p, *class_name_p;
3664  int attr_name_len, class_name_len;
3665 
3666  net_buf_column_info_set (net_buf, ut, scale, prec, charset, col_name);
3667 
3668  attr_name_p = (attr_name != NULL) ? attr_name : "";
3669  attr_name_len = strlen (attr_name_p);
3670 
3671  class_name_p = (class_name != NULL) ? class_name : "";
3672  class_name_len = strlen (class_name_p);
3673 
3674  net_buf_cp_int (net_buf, attr_name_len + 1, NULL);
3675  net_buf_cp_str (net_buf, attr_name_p, attr_name_len + 1);
3676 
3677  net_buf_cp_int (net_buf, class_name_len + 1, NULL);
3678  net_buf_cp_str (net_buf, class_name_p, class_name_len + 1);
3679 
3680  if (is_non_null >= 1)
3681  {
3682  is_non_null = 1;
3683  }
3684  else if (is_non_null < 0)
3685  {
3686  is_non_null = 0;
3687  }
3688 
3689  net_buf_cp_byte (net_buf, is_non_null);
3690 
3691  if (client_version < CAS_MAKE_VER (8, 3, 0))
3692  {
3693  return;
3694  }
3695 
3696  if (default_value == NULL)
3697  {
3698  net_buf_cp_int (net_buf, 1, NULL);
3699  net_buf_cp_byte (net_buf, '\0');
3700  }
3701  else
3702  {
3703  int len = strlen (default_value) + 1;
3704 
3705  net_buf_cp_int (net_buf, len, NULL);
3706  net_buf_cp_str (net_buf, default_value, len);
3707  }
3708 
3709  net_buf_cp_byte (net_buf, auto_increment);
3710  net_buf_cp_byte (net_buf, unique_key);
3711  net_buf_cp_byte (net_buf, primary_key);
3712  net_buf_cp_byte (net_buf, reverse_index);
3713  net_buf_cp_byte (net_buf, reverse_unique);
3714  net_buf_cp_byte (net_buf, foreign_key);
3715  net_buf_cp_byte (net_buf, shared);
3716 }
3717 
3718 static const char *
3720 {
3721  DB_VALUE *def = NULL;
3722  int err;
3723  char *default_value_string = NULL;
3724  const char *default_value_expr_type_string = NULL, *default_expr_format = NULL;
3725  const char *default_value_expr_op_string = NULL;
3726 
3727  *alloc = false;
3728 
3729  /* Get default value string */
3730  def = db_attribute_default (attr);
3731  if (def == NULL)
3732  {
3733  return default_value_string;
3734  }
3735 
3736  default_value_expr_type_string = db_default_expression_string (attr->default_value.default_expr.default_expr_type);
3737  if (default_value_expr_type_string != NULL)
3738  {
3739  /* default expression case */
3740  int len;
3741 
3743  {
3744  /* We now accept only T_TO_CHAR for attr->default_value.default_expr.default_expr_op */
3745 
3746  default_value_expr_op_string = "TO_CHAR"; /* FIXME - remove this hard code */
3747  }
3748 
3749  default_expr_format = attr->default_value.default_expr.default_expr_format;
3750  len = ((default_value_expr_op_string ? strlen (default_value_expr_op_string) : 0)
3751  + 6 /* parenthesis, a comma, a blank and quotes */ + strlen (default_value_expr_type_string)
3752  + (default_expr_format ? strlen (default_expr_format) : 0));
3753 
3754  default_value_string = (char *) malloc (len + 1);
3755  if (default_value_string == NULL)
3756  {
3757  return NULL;
3758  }
3759  *alloc = true;
3760 
3761  if (default_value_expr_op_string != NULL)
3762  {
3763  strcpy (default_value_string, default_value_expr_op_string);
3764  strcat (default_value_string, "(");
3765  strcat (default_value_string, default_value_expr_type_string);
3766  if (default_expr_format)
3767  {
3768  strcat (default_value_string, ", \'");
3769  strcat (default_value_string, default_expr_format);
3770  strcat (default_value_string, "\'");
3771  }
3772 
3773  strcat (default_value_string, ")");
3774  }
3775  else
3776  {
3777  strcpy (default_value_string, default_value_expr_type_string);
3778  }
3779 
3780  return default_value_string;
3781  }
3782 
3783  if (db_value_is_null (def))
3784  {
3785  return "NULL";
3786  }
3787 
3788  /* default value case */
3789  switch (db_value_type (def))
3790  {
3791  case DB_TYPE_UNKNOWN:
3792  break;
3793 
3794  case DB_TYPE_SET:
3795  case DB_TYPE_MULTISET:
3796  case DB_TYPE_SEQUENCE: /* DB_TYPE_LIST */
3797  *alloc = true;
3798  serialize_collection_as_string (def, &default_value_string);
3799  break;
3800 
3801  case DB_TYPE_CHAR:
3802  case DB_TYPE_NCHAR:
3803  case DB_TYPE_VARCHAR:
3804  case DB_TYPE_VARNCHAR:
3805  {
3806  int def_size = db_get_string_size (def);
3807  const char *def_str_p = db_get_string (def);
3808  if (def_str_p)
3809  {
3810  default_value_string = (char *) malloc (def_size + 3);
3811  if (default_value_string != NULL)
3812  {
3813  *alloc = true;
3814  default_value_string[0] = '\'';
3815  memcpy (default_value_string + 1, def_str_p, def_size);
3816  default_value_string[def_size + 1] = '\'';
3817  default_value_string[def_size + 2] = '\0';
3818  }
3819  }
3820  }
3821  break;
3822 
3823  default:
3824  {
3825  DB_VALUE tmp_val;
3826 
3827  err = db_value_coerce (def, &tmp_val, db_type_to_db_domain (DB_TYPE_VARCHAR));
3828  if (err == NO_ERROR)
3829  {
3830  int def_size = db_get_string_size (&tmp_val);
3831  const char *def_str_p = db_get_string (&tmp_val);
3832 
3833  default_value_string = (char *) malloc (def_size + 1);
3834  if (default_value_string != NULL)
3835  {
3836  *alloc = true;
3837  memcpy (default_value_string, def_str_p, def_size);
3838  default_value_string[def_size] = '\0';
3839  }
3840  }
3841 
3842  db_value_clear (&tmp_val);
3843  }
3844  break;
3845  }
3846 
3847  return default_value_string;
3848 }
3849 
3850 static void
3851 set_column_info (T_NET_BUF * net_buf, char ut, short scale, int prec, char charset, const char *col_name,
3852  const char *attr_name, const char *class_name, char is_non_null, T_BROKER_VERSION client_version)
3853 {
3854  DB_OBJECT *class_obj;
3855  DB_ATTRIBUTE *attr;
3856  char auto_increment = 0;
3857  char unique_key = 0;
3858  char primary_key = 0;
3859  char reverse_index = 0;
3860  char reverse_unique = 0;
3861  char foreign_key = 0;
3862  char shared = 0;
3863  const char *default_value_string = NULL;
3864  bool alloced_default_value_string = false;
3865 
3866  if (client_version >= CAS_MAKE_VER (8, 3, 0))
3867  {
3868  class_obj = db_find_class (class_name);
3869  attr = db_get_attribute (class_obj, col_name);
3870 
3871  auto_increment = db_attribute_is_auto_increment (attr);
3872  unique_key = db_attribute_is_unique (attr);
3873  primary_key = db_attribute_is_primary_key (attr);
3874  reverse_index = db_attribute_is_reverse_indexed (attr);
3875  reverse_unique = db_attribute_is_reverse_unique (attr);
3876  shared = db_attribute_is_shared (attr);
3877  foreign_key = db_attribute_is_foreign_key (attr);
3878  default_value_string = get_column_default_as_string (attr, &alloced_default_value_string);
3879  }
3880 
3881  prepare_column_info_set (net_buf, ut, scale, prec, charset, col_name, default_value_string, auto_increment,
3882  unique_key, primary_key, reverse_index, reverse_unique, foreign_key, shared, attr_name,
3883  class_name, is_non_null, client_version);
3884 
3885  if (alloced_default_value_string)
3886  {
3887  free ((char *) default_value_string);
3888  }
3889 }
3890 
3891 static int
3892 netval_to_dbval (void *net_type, void *net_value, DB_VALUE * out_val, T_NET_BUF * net_buf, char desired_type)
3893 {
3894  char type;
3895  int err_code = 0;
3896  int data_size;
3897  DB_VALUE db_val;
3898  char coercion_flag = TRUE;
3899 
3900  net_arg_get_char (type, net_type);
3901 
3902  if (type == CCI_U_TYPE_STRING || type == CCI_U_TYPE_CHAR || type == CCI_U_TYPE_ENUM)
3903  {
3904  if (desired_type == DB_TYPE_NUMERIC)
3905  {
3906  type = CCI_U_TYPE_NUMERIC;
3907  }
3908  else if (desired_type == DB_TYPE_NCHAR || desired_type == DB_TYPE_VARNCHAR)
3909  {
3910  type = CCI_U_TYPE_NCHAR;
3911  }
3912  else if (desired_type == DB_TYPE_JSON)
3913  {
3914  type = CCI_U_TYPE_JSON;
3915  }
3916  }
3917 
3918  if (type == CCI_U_TYPE_DATETIME)
3919  {
3920  if (desired_type == DB_TYPE_TIMESTAMP)
3921  {
3922  type = CCI_U_TYPE_TIMESTAMP;
3923  }
3924  else if (desired_type == DB_TYPE_DATE)
3925  {
3926  type = CCI_U_TYPE_DATE;
3927  }
3928  else if (desired_type == DB_TYPE_TIME)
3929  {
3930  type = CCI_U_TYPE_TIME;
3931  }
3932  }
3933  else if (type == CCI_U_TYPE_DATETIMETZ)
3934  {
3935  if (desired_type == DB_TYPE_TIMESTAMPTZ || desired_type == DB_TYPE_TIMESTAMPLTZ)
3936  {
3937  type = CCI_U_TYPE_TIMESTAMPTZ;
3938  }
3939  }
3940 
3941  net_arg_get_size (&data_size, net_value);
3942  if (data_size <= 0)
3943  {
3944  type = CCI_U_TYPE_NULL;
3945  data_size = 0;
3946  }
3947 
3948  switch (type)
3949  {
3950  case CCI_U_TYPE_NULL:
3951  err_code = db_make_null (&db_val);
3952  coercion_flag = FALSE;
3953  break;
3954  case CCI_U_TYPE_CHAR:
3955  case CCI_U_TYPE_STRING:
3956  case CCI_U_TYPE_ENUM:
3957  {
3958  char *value, *invalid_pos = NULL;
3959  int val_size;
3960  int val_length;
3961  bool is_composed = false;
3962  int composed_size;
3963 
3964  net_arg_get_str (&value, &val_size, net_value);
3965 
3966  val_size--;
3967 
3968  if (intl_check_string (value, val_size, &invalid_pos, lang_get_client_charset ()) != INTL_UTF8_VALID)
3969  {
3970  char msg[12];
3971  off_t p = invalid_pos != NULL ? (invalid_pos - value) : 0;
3972  snprintf (msg, sizeof (msg), "%llu", (long long unsigned int) p);
3974  }
3975 
3977  && unicode_string_need_compose (value, val_size, &composed_size, lang_get_generic_unicode_norm ()))
3978  {
3979  char *composed = NULL;
3980 
3981  composed = (char *) malloc (composed_size + 1);
3982  if (composed == NULL)
3983  {
3985  }
3986 
3987  unicode_compose_string (value, val_size, composed, &composed_size, &is_composed,
3989  assert (composed_size <= val_size);
3990  composed[composed_size] = '\0';
3991 
3992  if (is_composed)
3993  {
3994  value = composed;
3995  }
3996  else
3997  {
3998  free (composed);
3999  }
4000  }
4001 
4002  if (desired_type == DB_TYPE_OBJECT)
4003  {
4004  DB_OBJECT *obj_p;
4005  obj_p = ux_str_to_obj (value);
4006  if (obj_p == NULL)
4007  {
4009  }
4010  err_code = db_make_object (&db_val, obj_p);
4011  obj_p = NULL;
4012  coercion_flag = FALSE;
4013  }
4014  else
4015  {
4016  intl_char_count ((unsigned char *) value, val_size, lang_get_client_charset (), &val_length);
4017  err_code =
4018  db_make_varchar (&db_val, val_length, value, val_size, lang_get_client_charset (),
4021  db_val.need_clear = is_composed;
4022  }
4023  }
4024  break;
4025  case CCI_U_TYPE_NCHAR:
4026  case CCI_U_TYPE_VARNCHAR:
4027  {
4028  char *value, *invalid_pos = NULL;
4029  int val_size;
4030  int val_length;
4031  bool is_composed = false;
4032  int composed_size;
4033 
4034  net_arg_get_str (&value, &val_size, net_value);
4035 
4036  val_size--;
4037 
4038  if (intl_check_string (value, val_size, &invalid_pos, lang_get_client_charset ()) != INTL_UTF8_VALID)
4039  {
4040  char msg[12];
4041  off_t p = invalid_pos != NULL ? (invalid_pos - value) : 0;
4042  snprintf (msg, sizeof (msg), "%llu", (long long unsigned int) p);
4044  }
4045 
4047  && unicode_string_need_compose (value, val_size, &composed_size, lang_get_generic_unicode_norm ()))
4048  {
4049  char *composed = NULL;
4050 
4051  composed = (char *) malloc (composed_size + 1);
4052  if (composed == NULL)
4053  {
4055  }
4056 
4057  unicode_compose_string (value, val_size, composed, &composed_size, &is_composed,
4059  assert (composed_size <= val_size);
4060  composed[composed_size] = '\0';
4061 
4062  if (is_composed)
4063  {
4064  value = composed;
4065  val_size = composed_size;
4066  }
4067  else
4068  {
4069  free (composed);
4070  }
4071  }
4072 
4073  intl_char_count ((unsigned char *) value, val_size, LANG_COERCIBLE_CODESET, &val_length);
4074  err_code =
4075  db_make_nchar (&db_val, val_length, value, val_size, lang_get_client_charset (),
4077  db_val.need_clear = is_composed;
4078  }
4079  break;
4080  case CCI_U_TYPE_BIT:
4081  case CCI_U_TYPE_VARBIT:
4082  {
4083  char *value;
4084  int val_size;
4085  net_arg_get_str (&value, &val_size, net_value);
4086  err_code = db_make_bit (&db_val, val_size * 8, value, val_size * 8);
4087  }
4088  break;
4089  case CCI_U_TYPE_NUMERIC:
4090  {
4091  char *value, *p;
4092  int val_size;
4093  int precision, scale;
4094  char tmp[BUFSIZ];
4095 
4096  net_arg_get_str (&value, &val_size, net_value);
4097  if (value != NULL)
4098  {
4099  strcpy (tmp, value);
4100  }
4101  tmp[val_size] = '\0';
4102  ut_trim (tmp);
4103  precision = strlen (tmp);
4104  p = strchr (tmp, '.');
4105  if (p == NULL)
4106  {
4107  scale = 0;
4108  }
4109  else
4110  {
4111  scale = strlen (p + 1);
4112  precision--;
4113  }
4114  if (tmp[0] == '-')
4115  {
4116  precision--;
4117  }
4118 
4119  err_code = db_value_domain_init (&db_val, DB_TYPE_NUMERIC, precision, scale);
4120  if (err_code == 0)
4121  {
4122  err_code = db_value_put (&db_val, DB_TYPE_C_CHAR, tmp, strlen (tmp));
4123  }
4124  }
4125  coercion_flag = FALSE;
4126  break;
4127  case CCI_U_TYPE_BIGINT:
4128  {
4129  DB_BIGINT bi_val;
4130 
4131  net_arg_get_bigint (&bi_val, net_value);
4132  err_code = db_make_bigint (&db_val, bi_val);
4133  }
4134  break;
4135  case CCI_U_TYPE_INT:
4136  {
4137  int i_val;
4138 
4139  net_arg_get_int (&i_val, net_value);
4140  err_code = db_make_int (&db_val, i_val);
4141  }
4142  break;
4143  case CCI_U_TYPE_SHORT:
4144  {
4145  short s_val;
4146 
4147  net_arg_get_short (&s_val, net_value);
4148  err_code = db_make_short (&db_val, s_val);
4149  }
4150  break;
4151  case CCI_U_TYPE_MONETARY:
4152  {
4153  double d_val;
4154  net_arg_get_double (&d_val, net_value);
4155  err_code = db_make_monetary (&db_val, db_get_currency_default (), d_val);
4156  }
4157  break;
4158  case CCI_U_TYPE_FLOAT:
4159  {
4160  float f_val;
4161  net_arg_get_float (&f_val, net_value);
4162  err_code = db_make_float (&db_val, f_val);
4163  }
4164  break;
4165  case CCI_U_TYPE_DOUBLE:
4166  {
4167  double d_val;
4168  net_arg_get_double (&d_val, net_value);
4169  err_code = db_make_double (&db_val, d_val);
4170  }
4171  break;
4172  case CCI_U_TYPE_DATE:
4173  {
4174  short month, day, year;
4175  net_arg_get_date (&year, &month, &day, net_value);
4176  err_code = db_make_date (&db_val, month, day, year);
4177  }
4178  break;
4179  case CCI_U_TYPE_TIME:
4180  {
4181  short hh, mm, ss;
4182  net_arg_get_time (&hh, &mm, &ss, net_value);
4183  err_code = db_make_time (&db_val, hh, mm, ss);
4184  }
4185  break;
4186  case CCI_U_TYPE_TIMESTAMP:
4187  {
4188  short yr, mon, day, hh, mm, ss;
4189  DB_DATE date;
4190  DB_TIME time;
4191  DB_TIMESTAMP ts;
4192 
4193  net_arg_get_timestamp (&yr, &mon, &day, &hh, &mm, &ss, net_value);
4194  err_code = db_date_encode (&date, mon, day, yr);
4195  if (err_code != NO_ERROR)
4196  {
4197  break;
4198  }
4199  err_code = db_time_encode (&time, hh, mm, ss);
4200  if (err_code != NO_ERROR)
4201  {
4202  break;
4203  }
4204  err_code = db_timestamp_encode_ses (&date, &time, &ts, NULL);
4205  if (err_code != NO_ERROR)
4206  {
4207  break;
4208  }
4209  err_code = db_make_timestamp (&db_val, ts);
4210  }
4211  break;
4212  case CCI_U_TYPE_TIMESTAMPTZ:
4213  case CCI_U_TYPE_TIMESTAMPLTZ:
4214  {
4215  short yr, mon, day, hh, mm, ss;
4216  DB_DATE date;
4217  DB_TIME time;
4218  DB_TIMESTAMPTZ ts_tz;
4219  TZ_REGION ses_tz_region;
4220  char *tz_str_p;
4221  int tz_size;
4222 
4223  net_arg_get_timestamptz (&yr, &mon, &day, &hh, &mm, &ss, &tz_str_p, &tz_size, net_value);
4224  if (tz_size > CCI_TZ_SIZE)
4225  {
4227  }
4228 
4229  err_code = db_date_encode (&date, mon, day, yr);
4230  if (err_code != NO_ERROR)
4231  {
4232  break;
4233  }
4234  err_code = db_time_encode (&time, hh, mm, ss);
4235  if (err_code != NO_ERROR)
4236  {
4237  break;
4238  }
4239  tz_get_session_tz_region (&ses_tz_region);
4240 
4241  err_code = tz_create_timestamptz (&date, &time, tz_str_p, tz_size, &ses_tz_region, &ts_tz, NULL);
4242  if (err_code != NO_ERROR)
4243  {
4244  break;
4245  }
4246  err_code = db_make_timestamptz (&db_val, &ts_tz);
4247  }
4248  break;
4249  case CCI_U_TYPE_DATETIME:
4250  {
4251  short yr, mon, day, hh, mm, ss, ms;
4252  DB_DATETIME dt;
4253 
4254  net_arg_get_datetime (&yr, &mon, &day, &hh, &mm, &ss, &ms, net_value);
4255  err_code = db_datetime_encode (&dt, mon, day, yr, hh, mm, ss, ms);
4256  if (err_code != NO_ERROR)
4257  {
4258  break;
4259  }
4260  err_code = db_make_datetime (&db_val, &dt);
4261  }
4262  break;
4263  case CCI_U_TYPE_DATETIMELTZ:
4264  case CCI_U_TYPE_DATETIMETZ:
4265  {
4266  short yr, mon, day, hh, mm, ss, ms;
4267  DB_DATETIME dt;
4268  DB_DATETIMETZ dt_tz;
4269  TZ_REGION ses_tz_region;
4270  char *tz_str_p;
4271  int tz_size;
4272 
4273  net_arg_get_datetimetz (&yr, &mon, &day, &hh, &mm, &ss, &ms, &tz_str_p, &tz_size, net_value);
4274  if (tz_size > CCI_TZ_SIZE)
4275  {
4277  }
4278 
4279  err_code = db_datetime_encode (&dt, mon, day, yr, hh, mm, ss, ms);
4280  if (err_code != NO_ERROR)
4281  {
4282  break;
4283  }
4284  tz_get_session_tz_region (&ses_tz_region);
4285 
4286  err_code = tz_create_datetimetz (&dt, tz_str_p, tz_size, &ses_tz_region, &dt_tz, NULL);
4287  if (err_code != NO_ERROR)
4288  {
4289  break;
4290  }
4291  err_code = db_make_datetimetz (&db_val, &dt_tz);
4292  }
4293  break;
4294  case CCI_U_TYPE_SET:
4295  case CCI_U_TYPE_MULTISET:
4296  case CCI_U_TYPE_SEQUENCE:
4297  {
4298  char *cur_p;
4299  int remain_size = data_size;
4300  void *ele_type_arg = net_value;
4301  int ele_size;
4302  DB_VALUE ele_val;
4303  DB_SET *set = NULL;
4304  DB_SEQ *seq = NULL;
4305  int seq_index = 0;
4306 
4307  cur_p = ((char *) net_value) + NET_SIZE_INT; /* data size */
4308  cur_p += 1; /* element type */
4309  remain_size -= 1;
4310 
4311  if (type == CCI_U_TYPE_SET)
4312  {
4313  set = db_set_create_basic (NULL, NULL);
4314  }
4315  else if (type == CCI_U_TYPE_MULTISET)
4316  {
4317  set = db_set_create_multi (NULL, NULL);
4318  }
4319  else
4320  {
4321  seq = db_seq_create (NULL, NULL, 0);
4322  }
4323 
4324  while (remain_size > 0)
4325  {
4326  net_arg_get_size (&ele_size, cur_p);
4327  if (ele_size + NET_SIZE_INT > remain_size)
4328  {
4329  break;
4330  }
4331 
4332  ele_size = netval_to_dbval (ele_type_arg, cur_p, &ele_val, net_buf, desired_type);
4333  if (ele_size < 0)
4334  {
4335  return ele_size;
4336  }
4337  ele_size += NET_SIZE_INT;
4338  cur_p += ele_size;
4339  remain_size -= ele_size;
4340 
4341  if (type == CCI_U_TYPE_SEQUENCE)
4342  {
4343  db_seq_insert (seq, seq_index++, &ele_val);
4344  }
4345  else
4346  {
4347  db_set_add (set, &ele_val);
4348  }
4349  }
4350 
4351  if (type == CCI_U_TYPE_SEQUENCE)
4352  {
4353  err_code = db_make_sequence (&db_val, seq);
4354  }
4355  else
4356  {
4357  err_code = db_make_set (&db_val, set);
4358  }
4359 
4360  type = CCI_U_TYPE_SET;
4361  }
4362  coercion_flag = FALSE;
4363  break;
4364  case CCI_U_TYPE_OBJECT:
4365  {
4366  DB_OBJECT *obj_p;
4367  net_arg_get_dbobject (&obj_p, net_value);
4368  if (ux_check_object (obj_p, NULL) < 0)
4369  {
4370  err_code = db_make_null (&db_val);
4371  }
4372  else
4373  {
4374  err_code = db_make_object (&db_val, obj_p);
4375  }
4376  }
4377  coercion_flag = FALSE;
4378  break;
4379 
4380  case CCI_U_TYPE_BLOB:
4381  case CCI_U_TYPE_CLOB:
4382  {
4383  T_LOB_HANDLE cas_lob;
4384 
4385  net_arg_get_lob_handle (&cas_lob, net_value);
4386  caslob_to_dblob (&cas_lob, &db_val);
4387  coercion_flag = FALSE;
4388  }
4389  break;
4390  case CCI_U_TYPE_JSON:
4391  {
4392  char *value;
4393  int val_size;
4394 
4395  net_arg_get_str (&value, &val_size, net_value);
4396 
4397  err_code = db_json_val_from_str (value, val_size, &db_val);
4398  }
4399  break;
4400 
4401  case CCI_U_TYPE_USHORT:
4402  case CCI_U_TYPE_UINT:
4403  case CCI_U_TYPE_UBIGINT:
4404  default:
4406  }
4407 
4408  if (err_code < 0)
4409  {
4410  return ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
4411  }
4412 
4413  if (desired_type == DB_TYPE_NULL || coercion_flag == FALSE)
4414  {
4415  db_value_clone (&db_val, out_val);
4416  }
4417  else
4418  {
4419  DB_DOMAIN *domain;
4420 
4421  domain = db_type_to_db_domain ((DB_TYPE) desired_type);
4422  if (domain == NULL)
4423  {
4425  }
4426  err_code = db_value_coerce (&db_val, out_val, domain);
4427  if (err_code < 0)
4428  {
4429  return ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
4430  }
4431  }
4432 
4433  db_value_clear (&db_val);
4434 
4435  return data_size;
4436 }
4437 
4438 static int
4439 cur_tuple (T_QUERY_RESULT * q_result, int max_col_size, char sensitive_flag, DB_OBJECT * tuple_obj, T_NET_BUF * net_buf)
4440 {
4441  int ncols;
4442  DB_VALUE val;
4443  int i;
4444  int error;
4445  int data_size = 0;
4446  DB_QUERY_RESULT *result = (DB_QUERY_RESULT *) q_result->result;
4447  T_COL_UPDATE_INFO *col_update_info = q_result->col_update_info;
4448  char *null_type_column = q_result->null_type_column;
4449  int err_code;
4450 
4451  ncols = db_query_column_count (result);
4452  for (i = 0; i < ncols; i++)
4453  {
4454  if (sensitive_flag == TRUE && col_update_info[i].updatable == TRUE)
4455  {
4456  if (tuple_obj == NULL)
4457  {
4458  error = db_make_null (&val);
4459  }
4460  else
4461  {
4462  error = db_get (tuple_obj, col_update_info[i].attr_name, &val);
4463  }
4464  }
4465  else
4466  {
4467  error = db_query_get_tuple_value (result, i, &val);
4468  }
4469 
4470  if (error < 0)
4471  {
4472  err_code = ERROR_INFO_SET (error, DBMS_ERROR_INDICATOR);
4473  tuple_obj = NULL;
4474  return err_code;
4475  }
4476 
4477  data_size += dbval_to_net_buf (&val, net_buf, 1, max_col_size, null_type_column ? null_type_column[i] : 0);
4478  db_value_clear (&val);
4479  }
4480 
4481  tuple_obj = NULL;
4482  return data_size;
4483 }
4484 
4485 static int
4486 dbval_to_net_buf (DB_VALUE * val, T_NET_BUF * net_buf, char fetch_flag, int max_col_size, char column_type_flag)
4487 {
4488  int data_size = 0;
4489  unsigned char ext_col_type;
4490  bool client_support_tz = true;
4491 
4492  if (db_value_is_null (val) == true)
4493  {
4494  net_buf_cp_int (net_buf, -1, NULL);
4495  return NET_SIZE_INT;
4496  }
4497 
4499  {
4500  client_support_tz = false;
4501  }
4502 
4503  /* set extended type for primary types; for collection types this values is set in switch-case code */
4504  if (column_type_flag && !TP_IS_SET_TYPE (db_value_type (val)))
4505  {
4506  ext_col_type = set_extended_cas_type (CCI_U_TYPE_NULL, db_value_type (val));
4507  }
4508  else
4509  {
4510  ext_col_type = 0;
4511  }
4512 
4513  switch (db_value_type (val))
4514  {
4515  case DB_TYPE_OBJECT:
4516  {
4517  DB_OBJECT *obj;
4518  T_OBJECT cas_obj;
4519 
4520  obj = db_get_object (val);
4521  dbobj_to_casobj (obj, &cas_obj);
4522  add_res_data_object (net_buf, &cas_obj, ext_col_type, &data_size);
4523  }
4524  break;
4525  case DB_TYPE_VARBIT:
4526  case DB_TYPE_BIT:
4527  {
4528  int length = 0;
4529 
4530  DB_CONST_C_BIT bit = db_get_bit (val, &length);
4531  length = (length + 7) / 8;
4532  if (max_col_size > 0)
4533  {
4534  length = MIN (length, max_col_size);
4535  }
4536  /* do not append NULL terminator */
4537  add_res_data_bytes (net_buf, bit, length, ext_col_type, &data_size);
4538  }
4539  break;
4540  case DB_TYPE_VARCHAR:
4541  case DB_TYPE_CHAR:
4542  {
4543  DB_CONST_C_CHAR str;
4544  int dummy = 0;
4545  int bytes_size = 0;
4546  int decomp_size;
4547  char *decomposed = NULL;
4548  bool need_decomp = false;
4549 
4550  str = db_get_char (val, &dummy);
4551  bytes_size = db_get_string_size (val);
4552  if (max_col_size > 0)
4553  {
4554  bytes_size = MIN (bytes_size, max_col_size);
4555  }
4556 
4558  {
4559  need_decomp =
4560  unicode_string_need_decompose (str, bytes_size, &decomp_size, lang_get_generic_unicode_norm ());
4561  }
4562 
4563 
4564  if (need_decomp)
4565  {
4566  decomposed = (char *) MALLOC (decomp_size * sizeof (char));
4567  if (decomposed != NULL)
4568  {
4569  unicode_decompose_string (str, bytes_size, decomposed, &decomp_size, lang_get_generic_unicode_norm ());
4570 
4571  str = decomposed;
4572  bytes_size = decomp_size;
4573  }
4574  else
4575  {
4576  /* set error indicator and send empty string */
4578  bytes_size = 0;
4579  }
4580  }
4581 
4582  add_res_data_string (net_buf, str, bytes_size, ext_col_type, db_get_string_codeset (val), &data_size);
4583 
4584  if (decomposed != NULL)
4585  {
4586  FREE (decomposed);
4587  decomposed = NULL;
4588  }
4589  }
4590  break;
4591  case DB_TYPE_VARNCHAR:
4592  case DB_TYPE_NCHAR:
4593  {
4594  DB_CONST_C_NCHAR nchar;
4595  int dummy = 0;
4596  int bytes_size = 0;
4597  int decomp_size;
4598  char *decomposed = NULL;
4599  bool need_decomp = false;
4600 
4601  nchar = db_get_nchar (val, &dummy);
4602  bytes_size = db_get_string_size (val);
4603  if (max_col_size > 0)
4604  {
4605  bytes_size = MIN (bytes_size, max_col_size);
4606  }
4607 
4609  {
4610  need_decomp =
4611  unicode_string_need_decompose (nchar, bytes_size, &decomp_size, lang_get_generic_unicode_norm ());
4612  }
4613 
4614  if (need_decomp)
4615  {
4616  decomposed = (char *) MALLOC (decomp_size * sizeof (char));
4617  if (decomposed != NULL)
4618  {
4619  unicode_decompose_string (nchar, bytes_size, decomposed, &decomp_size,
4621 
4622  nchar = decomposed;
4623  bytes_size = decomp_size;
4624  }
4625  else
4626  {
4627  /* set error indicator and send empty string */
4629  bytes_size = 0;
4630  }
4631  }
4632 
4633  add_res_data_string (net_buf, nchar, bytes_size, ext_col_type, db_get_string_codeset (val), &data_size);
4634 
4635  if (decomposed != NULL)
4636  {
4637  FREE (decomposed);
4638  decomposed = NULL;
4639  }
4640  }
4641  break;
4642  case DB_TYPE_ENUMERATION:
4643  {
4644  int bytes_size = 0;
4645  int decomp_size;
4646  char *decomposed = NULL;
4647  bool need_decomp = false;
4648 
4649  const char *str = db_get_enum_string (val);
4650  bytes_size = db_get_enum_string_size (val);
4651  if (max_col_size > 0)
4652  {
4653  bytes_size = MIN (bytes_size, max_col_size);
4654  }
4655 
4657  {
4658  need_decomp =
4659  unicode_string_need_decompose (str, bytes_size, &decomp_size, lang_get_generic_unicode_norm ());
4660  }
4661 
4662  if (need_decomp)
4663  {
4664  decomposed = (char *) MALLOC (decomp_size * sizeof (char));
4665  if (decomposed != NULL)
4666  {
4667  unicode_decompose_string (str, bytes_size, decomposed, &decomp_size, lang_get_generic_unicode_norm ());
4668 
4669  str = decomposed;
4670  bytes_size = decomp_size;
4671  }
4672  else
4673  {
4674  /* set error indicator and send empty string */
4676  bytes_size = 0;
4677  }
4678  }
4679 
4680  add_res_data_string (net_buf, str, bytes_size, ext_col_type, db_get_enum_codeset (val), &data_size);
4681 
4682  if (decomposed != NULL)
4683  {
4684  FREE (decomposed);
4685  decomposed = NULL;
4686  }
4687 
4688  break;
4689  }
4690  case DB_TYPE_SMALLINT:
4691  {
4692  short smallint;
4693  smallint = db_get_short (val);
4694  add_res_data_short (net_buf, smallint, ext_col_type, &data_size);
4695  }
4696  break;
4697  case DB_TYPE_INTEGER:
4698  {
4699  int int_val;
4700  int_val = db_get_int (val);
4701  add_res_data_int (net_buf, int_val, ext_col_type, &data_size);
4702  }
4703  break;
4704  case DB_TYPE_BIGINT:
4705  {
4706  DB_BIGINT bigint_val;
4707  bigint_val = db_get_bigint (val);
4708  add_res_data_bigint (net_buf, bigint_val, ext_col_type, &data_size);
4709  }
4710  break;
4711  case DB_TYPE_DOUBLE:
4712  {
4713  double d_val;
4714  d_val = db_get_double (val);
4715  add_res_data_double (net_buf, d_val, ext_col_type, &data_size);
4716  }
4717  break;
4718  case DB_TYPE_MONETARY:
4719  {
4720  double d_val;
4722  add_res_data_double (net_buf, d_val, ext_col_type, &data_size);
4723  }
4724  break;
4725  case DB_TYPE_FLOAT:
4726  {
4727  float f_val;
4728  f_val = db_get_float (val);
4729  add_res_data_float (net_buf, f_val, ext_col_type, &data_size);
4730  }
4731  break;
4732  case DB_TYPE_DATE:
4733  {
4734  DB_DATE *db_date;
4735  int yr, mon, day;
4736  db_date = db_get_date (val);
4737  db_date_decode (db_date, &mon, &day, &yr);
4738  add_res_data_date (net_buf, (short) yr, (short) mon, (short) day, ext_col_type, &data_size);
4739  }
4740  break;
4741  case DB_TYPE_TIME:
4742  {
4743  DB_TIME *time;
4744  int hour, minute, second;
4745  time = db_get_time (val);
4746  db_time_decode (time, &hour, &minute, &second);
4747  add_res_data_time (net_buf, (short) hour, (short) minute, (short) second, ext_col_type, &data_size);
4748  }
4749  break;
4750  case DB_TYPE_TIMESTAMP:
4751  {
4752  DB_TIMESTAMP *ts;
4753  DB_DATE date;
4754  DB_TIME time;
4755  int yr, mon, day, hh, mm, ss;
4756  ts = db_get_timestamp (val);
4757  (void) db_timestamp_decode_ses (ts, &date, &time);
4758  db_date_decode (&date, &mon, &day, &yr);
4759  db_time_decode (&time, &hh, &mm, &ss);
4760  add_res_data_timestamp (net_buf, (short) yr, (short) mon, (short) day, (short) hh, (short) mm, (short) ss,
4761  ext_col_type, &data_size);
4762  }
4763  break;
4764  case DB_TYPE_TIMESTAMPLTZ:
4765  case DB_TYPE_TIMESTAMPTZ:
4766  {
4767  DB_TIMESTAMP ts, *ts_p;
4768  DB_TIMESTAMPTZ *ts_tz;
4769  DB_DATE date;
4770  DB_TIME time;
4771  int err;
4772  int yr, mon, day, hh, mm, ss;
4773  TZ_ID tz_id;
4774  char tz_str[CCI_TZ_SIZE + 1];
4775 
4776  if (db_value_type (val) == DB_TYPE_TIMESTAMPLTZ)
4777  {
4778  ts_p = db_get_timestamp (val);
4779  ts = *ts_p;
4780  err = tz_create_session_tzid_for_timestamp (&ts, &tz_id);
4781  if (err != NO_ERROR)
4782  {
4783  net_buf_cp_int (net_buf, -1, NULL);
4784  data_size = NET_SIZE_INT;
4785  break;
4786  }
4787  }
4788  else
4789  {
4790  ts_tz = db_get_timestamptz (val);
4791  ts = ts_tz->timestamp;
4792  tz_id = ts_tz->tz_id;
4793  }
4794 
4795  err = db_timestamp_decode_w_tz_id (&ts, &tz_id, &date, &time);
4796  if (err != NO_ERROR)
4797  {
4798  net_buf_cp_int (net_buf, -1, NULL);
4799  data_size = NET_SIZE_INT;
4800  break;
4801  }
4802 
4803  if (tz_id_to_str (&tz_id, tz_str, CCI_TZ_SIZE) < 0)
4804  {
4805  net_buf_cp_int (net_buf, -1, NULL);
4806  data_size = NET_SIZE_INT;
4807  break;
4808  }
4809 
4810  db_date_decode (&date, &mon, &day, &yr);
4811  db_time_decode (&time, &hh, &mm, &ss);
4812  if (client_support_tz == true)
4813  {
4814  add_res_data_timestamptz (net_buf, (short) yr, (short) mon, (short) day, (short) hh, (short) mm, (short) ss,
4815  tz_str, ext_col_type, &data_size);
4816  }
4817  else
4818  {
4819  add_res_data_timestamp (net_buf, (short) yr, (short) mon, (short) day, (short) hh, (short) mm, (short) ss,
4820  ext_col_type, &data_size);
4821  }
4822  }
4823  break;
4824  case DB_TYPE_DATETIME:
4825  {
4826  DB_DATETIME *dt;
4827  int yr, mon, day, hh, mm, ss, ms;
4828  dt = db_get_datetime (val);
4829  db_datetime_decode (dt, &mon, &day, &yr, &hh, &mm, &ss, &ms);
4830  add_res_data_datetime (net_buf, (short) yr, (short) mon, (short) day, (short) hh, (short) mm, (short) ss,
4831  (short) ms, ext_col_type, &data_size);
4832  }
4833  break;
4834  case DB_TYPE_DATETIMELTZ:
4835  case DB_TYPE_DATETIMETZ:
4836  {
4837  DB_DATETIME dt_local, dt_utc, *dt_utc_p;
4838  TZ_ID tz_id;
4839  DB_DATETIMETZ *dt_tz;
4840  int err;
4841  int yr, mon, day, hh, mm, ss, ms;
4842  char tz_str[CCI_TZ_SIZE + 1];
4843 
4844  if (db_value_type (val) == DB_TYPE_DATETIMELTZ)
4845  {
4846  dt_utc_p = db_get_datetime (val);
4847  dt_utc = *dt_utc_p;
4848  err = tz_create_session_tzid_for_datetime (&dt_utc, true, &tz_id);
4849  if (err != NO_ERROR)
4850  {
4851  net_buf_cp_int (net_buf, -1, NULL);
4852  data_size = NET_SIZE_INT;
4853  break;
4854  }
4855  }
4856  else
4857  {
4858  dt_tz = db_get_datetimetz (val);
4859  dt_utc = dt_tz->datetime;
4860  tz_id = dt_tz->tz_id;
4861  }
4862 
4863  err = tz_utc_datetimetz_to_local (&dt_utc, &tz_id, &dt_local);
4864  if (err == ER_QPROC_TIME_UNDERFLOW)
4865  {
4866  db_datetime_encode (&dt_local, 0, 0, 0, 0, 0, 0, 0);
4867  err = NO_ERROR;
4868  er_clear ();
4869  }
4870 
4871  if (err != NO_ERROR)
4872  {
4873  net_buf_cp_int (net_buf, -1, NULL);
4874  data_size = NET_SIZE_INT;
4875  break;
4876  }
4877 
4878  if (tz_id_to_str (&tz_id, tz_str, CCI_TZ_SIZE) < 0)
4879  {
4880  net_buf_cp_int (net_buf, -1, NULL);
4881  data_size = NET_SIZE_INT;
4882  break;
4883  }
4884 
4885  db_datetime_decode (&dt_local, &mon, &day, &yr, &hh, &mm, &ss, &ms);
4886  if (client_support_tz == true)
4887  {
4888  add_res_data_datetimetz (net_buf, (short) yr, (short) mon, (short) day, (short) hh, (short) mm, (short) ss,
4889  (short) ms, tz_str, ext_col_type, &data_size);
4890  }
4891  else
4892  {
4893  add_res_data_datetime (net_buf, (short) yr, (short) mon, (short) day, (short) hh, (short) mm, (short) ss,
4894  (short) ms, ext_col_type, &data_size);
4895  }
4896  }
4897  break;
4898  case DB_TYPE_NUMERIC:
4899  {
4900  DB_DOMAIN *char_domain;
4901  DB_VALUE v;
4902  const char *str;
4903  int len, err;
4904  char buf[128];
4905 
4906  char_domain = db_type_to_db_domain (DB_TYPE_VARCHAR);
4907  err = db_value_coerce (val, &v, char_domain);
4908  if (err < 0)
4909  {
4910  net_buf_cp_int (net_buf, -1, NULL);
4911  data_size = NET_SIZE_INT;
4912  }
4913  else
4914  {
4915  str = db_get_char (&v, &len);
4916  if (str != NULL)
4917  {
4918  strncpy (buf, str, sizeof (buf) - 1);
4919  buf[sizeof (buf) - 1] = '\0';
4920  ut_trim (buf);
4921  add_res_data_string (net_buf, buf, strlen (buf), ext_col_type, CAS_SCHEMA_DEFAULT_CHARSET, &data_size);
4922  }
4923  else
4924  {
4925  net_buf_cp_int (net_buf, -1, NULL);
4926  data_size = NET_SIZE_INT;
4927  }
4928  db_value_clear (&v);
4929  }
4930  }
4931  break;
4932  case DB_TYPE_SET:
4933  case DB_TYPE_MULTISET:
4934  case DB_TYPE_SEQUENCE: /* DB_TYPE_LIST */
4935  {
4936  DB_SET *set;
4937  int i;
4938  DB_VALUE *element;
4939  int num_element;
4940  char cas_type = CCI_U_TYPE_NULL;
4941  char err_flag = 0;
4942  char set_dbtype = DB_TYPE_NULL;
4943  unsigned char charset = CAS_SCHEMA_DEFAULT_CHARSET;
4944 
4945  set = db_get_set (val);
4946 
4947  num_element = db_set_size (set);
4948  element = (DB_VALUE *) malloc (sizeof (DB_VALUE) * num_element);
4949  if (element == NULL)
4950  {
4951  err_flag = 1;
4952  }
4953 
4954  if (!err_flag)
4955  {
4956  if (num_element <= 0)
4957  {
4958  DB_DOMAIN *set_domain;
4959  char element_type;
4960  set_domain = db_col_domain (set);
4961  element_type = get_set_domain (set_domain, NULL, NULL, &set_dbtype, (char *) &charset);
4962  if (element_type > 0)
4963  {
4964  cas_type = element_type;
4965  }
4966  }
4967  else
4968  {
4969  for (i = 0; i < num_element; i++)
4970  {
4971  db_set_get (set, i, &(element[i]));
4972  set_dbtype = db_value_type (&(element[i]));
4973  charset = db_get_string_codeset (&(element[i]));
4974  if (i == 0 || cas_type == CCI_U_TYPE_NULL)
4975  {
4976  cas_type = ux_db_type_to_cas_type (set_dbtype);
4977  }
4978  else
4979  {
4980  char tmp_type;
4981  tmp_type = ux_db_type_to_cas_type (set_dbtype);
4982  if (db_value_is_null (&(element[i])) == false && cas_type != tmp_type)
4983  {
4984  err_flag = 1;
4985  break;
4986  }
4987  }
4988  } /* end of for */
4989  }
4990 
4991  if ((err_flag) && (element != NULL))
4992  {
4993  for (; i >= 0; i--)
4994  {
4995  db_value_clear (&(element[i]));
4996  }
4997  FREE_MEM (element);
4998  }
4999  }
5000 
5001  if (err_flag)
5002  {
5003  net_buf_cp_int (net_buf, -1, NULL);
5004  data_size = NET_SIZE_INT;
5005  }
5006  else
5007  {
5008  int set_data_size;
5009  int set_size_msg_offset;
5010 
5011  set_data_size = 0;
5012  net_buf_cp_int (net_buf, set_data_size, &set_size_msg_offset);
5013 
5014  if (column_type_flag)
5015  {
5016  ext_col_type = set_extended_cas_type ((T_CCI_U_TYPE) set_dbtype, db_value_type (val));
5017 
5018  net_buf_cp_cas_type_and_charset (net_buf, ext_col_type, charset);
5019  set_data_size++;
5021  {
5022  set_data_size++;
5023  }
5024  }
5025 
5026  net_buf_cp_byte (net_buf, cas_type);
5027  set_data_size++;
5028 
5029  net_buf_cp_int (net_buf, num_element, NULL);
5030  set_data_size += NET_SIZE_INT;
5031 
5032  for (i = 0; i < num_element; i++)
5033  {
5034  set_data_size += dbval_to_net_buf (&(element[i]), net_buf, 1, max_col_size, 0);
5035  db_value_clear (&(element[i]));
5036  }
5037  FREE_MEM (element);
5038 
5039  net_buf_overwrite_int (net_buf, set_size_msg_offset, set_data_size);
5040  data_size = NET_SIZE_INT + set_data_size;
5041  }
5042 
5043  if (fetch_flag)
5044  db_set_free (set);
5045  }
5046  break;
5047 
5048  case DB_TYPE_RESULTSET:
5049  {
5050  int h_id;
5051 
5052  h_id = db_get_resultset (val);
5053  add_res_data_int (net_buf, h_id, ext_col_type, &data_size);
5054  }
5055  break;
5056 
5057  case DB_TYPE_BLOB:
5058  case DB_TYPE_CLOB:
5059  {
5060  T_LOB_HANDLE cas_lob;
5061 
5062  dblob_to_caslob (val, &cas_lob);
5063  add_res_data_lob_handle (net_buf, &cas_lob, ext_col_type, &data_size);
5064  }
5065  break;
5066  case DB_TYPE_JSON:
5067  {
5068  char *str;
5069  int bytes_size = 0;
5070 
5071  str = db_get_json_raw_body (val);
5072  bytes_size = strlen (str);
5073 
5074  /* no matter which column type is returned to client (JSON or STRING, depending on client version),
5075  * the data is always encoded as string */
5076  add_res_data_string (net_buf, str, bytes_size, 0, INTL_CODESET_UTF8, &data_size);
5077  db_private_free (NULL, str);
5078  }
5079  break;
5080  default:
5081  net_buf_cp_int (net_buf, -1, NULL); /* null */
5082  data_size = 4;
5083  break;
5084  }
5085 
5086  return data_size;
5087 }
5088 
5089 static void
5091 {
5092  DB_IDENTIFIER *oid;
5093 
5094  oid = db_identifier (obj);
5095 
5096  if (oid == NULL)
5097  {
5098  cas_obj->pageid = 0;
5099  cas_obj->volid = 0;
5100  cas_obj->slotid = 0;
5101  }
5102  else
5103  {
5104  cas_obj->pageid = oid->pageid;
5105  cas_obj->volid = oid->volid;
5106  cas_obj->slotid = oid->slotid;
5107  }
5108 }
5109 
5110 static void
5112 {
5113  DB_IDENTIFIER oid;
5114 
5115  oid.pageid = cas_obj->pageid;
5116  oid.volid = cas_obj->volid;
5117  oid.slotid = cas_obj->slotid;
5118 
5119  *obj = db_object (&oid);
5120 }
5121 
5122 static void
5124 {
5125  DB_ELO *elo;
5126 
5127  cas_lob->db_type = db_value_type (lob);
5128  assert (cas_lob->db_type == DB_TYPE_BLOB || cas_lob->db_type == DB_TYPE_CLOB);
5129  elo = db_get_elo (lob);
5130  if (elo == NULL)
5131  {
5132  cas_lob->lob_size = -1;
5133  cas_lob->locator_size = 0;
5134  cas_lob->locator = NULL;
5135  }
5136  else
5137  {
5138  cas_lob->lob_size = elo->size;
5139  cas_lob->locator_size = elo->locator ? strlen (elo->locator) + 1 : 0;
5140  /* including null character */
5141  cas_lob->locator = elo->locator;
5142  }
5143 }
5144 
5145 static void
5147 {
5148  DB_ELO elo;
5149 
5150  assert (cas_lob->db_type == DB_TYPE_BLOB || cas_lob->db_type == DB_TYPE_CLOB);
5151  elo_init_structure (&elo);
5152  elo.size = cas_lob->lob_size;
5153  elo.type = ELO_FBO;
5154  elo.locator = db_private_strdup (NULL, cas_lob->locator);
5155  db_make_elo (db_lob, (DB_TYPE) (cas_lob->db_type), &elo);
5156  db_lob->need_clear = true;
5157 }
5158 
5159 static int
5160 get_attr_name (DB_OBJECT * obj, char ***ret_attr_name)
5161 {
5162  DB_ATTRIBUTE *attributes, *att;
5163  char **attr_name = NULL;
5164  int num_attr;
5165  int alloc_num;
5166 
5167  attributes = db_get_attributes (obj);
5168 
5169  alloc_num = 100;
5170  attr_name = (char **) MALLOC (sizeof (char *) * alloc_num);
5171  if (attr_name == NULL)
5172  {
5174  }
5175 
5176  for (num_attr = 0, att = attributes; att; att = db_attribute_next (att))
5177  {
5178  if (num_attr >= alloc_num)
5179  {
5180  alloc_num += 100;
5181  attr_name = (char **) REALLOC (attr_name, sizeof (char *) * alloc_num);
5182  if (attr_name == NULL)
5183  {
5185  }
5186  }
5187  attr_name[num_attr] = (char *) db_attribute_name (att);
5188  num_attr++;
5189  }
5190 
5191  *ret_attr_name = attr_name;
5192  return num_attr;
5193 }
5194 
5195 static int
5196 get_attr_name_from_argv (int argc, void **argv, char ***ret_attr_name)
5197 {
5198  int attr_num;
5199  char **attr_name = NULL;
5200  int i;
5201 
5202  attr_num = argc - 1;
5203  attr_name = (char **) MALLOC (sizeof (char *) * attr_num);
5204  if (attr_name == NULL)
5205  {
5207  }
5208  for (i = 0; i < attr_num; i++)
5209  {
5210  int name_size;
5211  char *tmp_p;
5212 
5213  net_arg_get_str (&tmp_p, &name_size, argv[i + 1]);
5214  if (name_size <= 1 || tmp_p[name_size - 1] != '\0')
5215  {
5216  FREE_MEM (attr_name);
5218  }
5219  attr_name[i] = tmp_p;
5220  }
5221 
5222  *ret_attr_name = attr_name;
5223  return attr_num;
5224 }
5225 
5226 static int
5227 oid_attr_info_set (T_NET_BUF * net_buf, DB_OBJECT * obj, int attr_num, char **attr_name)
5228 {
5229  DB_ATTRIBUTE *attr = NULL;
5230  DB_DOMAIN *domain;
5231  int i;
5232  int db_type;
5233  unsigned char cas_type;
5234  int precision;
5235  short scale;
5236  char *p;
5237  char charset;
5238 
5239  for (i = 0; i < attr_num; i++)
5240  {
5241  p = strrchr (attr_name[i], '.');
5242  if (p == NULL)
5243  {
5244  attr = db_get_attribute (obj, attr_name[i]);
5245  if (attr == NULL)
5246  {
5248  }
5249  }
5250  else
5251  {
5252  DB_VALUE path_val;
5253  int err_code;
5254  DB_OBJECT *path_obj;
5255  *p = '\0';
5256  err_code = db_get (obj, attr_name[i], &path_val);
5257  if (err_code < 0 || db_value_is_null (&path_val) == true)
5258  {
5259  attr = NULL;
5260  }
5261  else
5262  {
5263  path_obj = db_get_object (&path_val);
5264  attr = db_get_attribute (path_obj, p + 1);
5265  if (attr == NULL)
5266  {
5268  }
5269  }
5270  *p = '.';
5271  path_obj = NULL;
5272  db_value_clear (&path_val);
5273  }
5274 
5275  if (attr == NULL)
5276  {
5277  cas_type = CCI_U_TYPE_NULL;
5278  scale = 0;
5279  precision = 0;
5280  charset = 0;
5281  }
5282  else
5283  {
5284  domain = db_attribute_domain (attr);
5285  db_type = TP_DOMAIN_TYPE (domain);
5286 
5287  if (TP_IS_SET_TYPE (db_type))
5288  {
5289  char set_type;
5290  set_type = get_set_domain (domain, NULL, NULL, NULL, &charset);
5291 
5292  cas_type = set_extended_cas_type ((T_CCI_U_TYPE) set_type, (DB_TYPE) db_type);
5293  precision = 0;
5294  scale = 0;
5295  }
5296  else
5297  {
5298  cas_type = set_extended_cas_type (CCI_U_TYPE_UNKNOWN, (DB_TYPE) db_type);
5299  precision = db_domain_precision (domain);
5300  scale = (short) db_domain_scale (domain);
5301  charset = db_domain_codeset (domain);
5302  }
5303  }
5304  net_buf_column_info_set (net_buf, cas_type, scale, precision, charset, attr_name[i]);
5305  }
5306 
5307  return 0;
5308 }
5309 
5310 static int
5311 oid_data_set (T_NET_BUF * net_buf, DB_OBJECT * obj, int attr_num, char **attr_name)
5312 {
5313  int err_code;
5314  int i;
5315  DB_VALUE val;
5316 
5317  for (i = 0; i < attr_num; i++)
5318  {
5319  err_code = db_get (obj, attr_name[i], &val);
5320  if (err_code < 0)
5321  {
5322  db_make_null (&val);
5323  }
5324  dbval_to_net_buf (&val, net_buf, 1, 0, 0);
5325  db_value_clear (&val);
5326  }
5327 
5328  return 0;
5329 }
5330 
5331 static int
5332 fetch_result (T_SRV_HANDLE * srv_handle, int cursor_pos, int fetch_count, char fetch_flag, int result_set_idx,
5333  T_NET_BUF * net_buf, T_REQ_INFO * req_info)
5334 {
5335  T_OBJECT tuple_obj;
5336  int err_code;
5337  int num_tuple_msg_offset;
5338  int num_tuple;
5339  int net_buf_size;
5340  char fetch_end_flag = 0;
5341  DB_QUERY_RESULT *result;
5342  T_QUERY_RESULT *q_result;
5343  char sensitive_flag = fetch_flag & CCI_FETCH_SENSITIVE;
5344  DB_OBJECT *db_obj;
5345  T_BROKER_VERSION client_version = req_info->client_version;
5346 
5347  if (result_set_idx <= 0)
5348  {
5349  q_result = (T_QUERY_RESULT *) (srv_handle->cur_result);
5350  if (q_result == NULL)
5351  {
5353  }
5354  }
5355  else
5356  {
5357  if (result_set_idx > srv_handle->cur_result_index)
5358  {
5360  }
5361  q_result = srv_handle->q_result + (result_set_idx - 1);
5362  }
5363 
5364  if ((sensitive_flag) && (q_result->col_updatable == TRUE) && (q_result->col_update_info != NULL))
5365  {
5366  sensitive_flag = TRUE;
5368  }
5369  else
5370  {
5371  sensitive_flag = FALSE;
5372  }
5373 
5374  result = (DB_QUERY_RESULT *) q_result->result;
5375  if (result == NULL || has_stmt_result_set (q_result->stmt_type) == false)
5376  {
5378  }
5379 
5380  if (srv_handle->cursor_pos != cursor_pos)
5381  {
5382  if (cursor_pos == 1)
5383  {
5384  err_code = db_query_first_tuple (result);
5385  }
5386  else
5387  {
5388  err_code = db_query_seek_tuple (result, cursor_pos - 1, 1);
5389  }
5390 
5391  if (err_code == DB_CURSOR_SUCCESS)
5392  {
5393  net_buf_cp_int (net_buf, 0, &num_tuple_msg_offset); /* tuple num */
5394  }
5395  else if (err_code == DB_CURSOR_END)
5396  {
5397  fetch_end_flag = 1;
5398 
5399  net_buf_cp_int (net_buf, 0, NULL);
5400 
5401  if (check_auto_commit_after_getting_result (srv_handle) == true)
5402  {
5403  ux_cursor_close (srv_handle);
5404  req_info->need_auto_commit = TRAN_AUTOCOMMIT;
5405  }
5406 
5407 
5408  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V5))
5409  {
5410  net_buf_cp_byte (net_buf, fetch_end_flag);
5411  }
5412 
5413  return 0;
5414  }
5415  else
5416  {
5417  return ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
5418  }
5419  }
5420  else
5421  {
5422  net_buf_cp_int (net_buf, 0, &num_tuple_msg_offset);
5423  }
5424 
5425  if (cas_shard_flag == ON)
5426  {
5427  net_buf_size = SHARD_NET_BUF_SIZE;
5428  }
5429  else
5430  {
5431  net_buf_size = NET_BUF_SIZE;
5432  }
5433 
5434  num_tuple = 0;
5435  while (CHECK_NET_BUF_SIZE (net_buf, net_buf_size))
5436  { /* currently, don't check fetch_count */
5437  memset ((char *) &tuple_obj, 0, sizeof (T_OBJECT));
5438 
5439  net_buf_cp_int (net_buf, cursor_pos, NULL);
5440 
5441  db_obj = NULL;
5442 
5443  if (q_result->include_oid)
5444  {
5445  DB_VALUE oid_val;
5446 
5447  er_clear ();
5448 
5449  if (db_query_get_tuple_oid (result, &oid_val) >= 0)
5450  {
5451  if (db_value_type (&oid_val) == DB_TYPE_OBJECT)
5452  {
5453  db_obj = db_get_object (&oid_val);
5454  if (db_is_instance (db_obj) > 0)
5455  {
5456  dbobj_to_casobj (db_obj, &tuple_obj);
5457  }
5458  else if (db_error_code () == 0 || db_error_code () == -48)
5459  {
5460  memset ((char *) &tuple_obj, 0xff, sizeof (T_OBJECT));
5461  db_obj = NULL;
5462  }
5463  else
5464  {
5466  }
5467  }
5468  db_value_clear (&oid_val);
5469  }
5470  }
5471 
5472  net_buf_cp_object (net_buf, &tuple_obj);
5473 
5474  err_code = cur_tuple (q_result, srv_handle->max_col_size, sensitive_flag, db_obj, net_buf);
5475  if (err_code < 0)
5476  {
5477  return err_code;
5478  }
5479 
5480  num_tuple++;
5481  cursor_pos++;
5482  if (srv_handle->max_row > 0 && cursor_pos > srv_handle->max_row)
5483  {
5484  if (check_auto_commit_after_getting_result (srv_handle) == true)
5485  {
5486  ux_cursor_close (srv_handle);
5487  req_info->need_auto_commit = TRAN_AUTOCOMMIT;
5488  }
5489  break;
5490  }
5491 
5492  err_code = db_query_next_tuple (result);
5493  if (err_code == DB_CURSOR_SUCCESS)
5494  {
5495  }
5496  else if (err_code == DB_CURSOR_END)
5497  {
5498  fetch_end_flag = 1;
5499 
5500  if (check_auto_commit_after_getting_result (srv_handle) == true)
5501  {
5502  ux_cursor_close (srv_handle);
5503  req_info->need_auto_commit = TRAN_AUTOCOMMIT;
5504  }
5505  break;
5506  }
5507  else
5508  {
5509  return ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
5510  }
5511  }
5512 
5513  /* Be sure that cursor is closed, if query executed with commit and not holdable. */
5514  assert (!tran_was_latest_query_committed () || srv_handle->is_holdable == true || err_code == DB_CURSOR_END);
5515 
5516  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V5))
5517  {
5518  net_buf_cp_byte (net_buf, fetch_end_flag);
5519  }
5520 
5521  net_buf_overwrite_int (net_buf, num_tuple_msg_offset, num_tuple);
5522 
5523  srv_handle->cursor_pos = cursor_pos;
5524 
5525  db_obj = NULL;
5526  return 0;
5527 }
5528 
5529 static int
5530 fetch_class (T_SRV_HANDLE * srv_handle, int cursor_pos, int fetch_count, char fetch_flag, int result_set_idx,
5531  T_NET_BUF * net_buf, T_REQ_INFO * req_info)
5532 {
5533  T_OBJECT dummy_obj;
5534  int tuple_num, tuple_num_msg_offset;
5535  int i;
5536  int num_result;
5538  char fetch_end_flag = 0;
5539  T_BROKER_VERSION client_version = req_info->client_version;
5540 
5541  class_table = (T_CLASS_TABLE *) (srv_handle->session);
5542  if (class_table == NULL)
5543  {
5545  }
5546  num_result = srv_handle->sch_tuple_num;
5547 
5548  memset (&dummy_obj, 0, sizeof (T_OBJECT));
5549 
5550  if (num_result < cursor_pos)
5551  {
5553  }
5554 
5555  tuple_num = 0;
5556  net_buf_cp_int (net_buf, tuple_num, &tuple_num_msg_offset);
5557  for (i = 0; (i < fetch_count) && (cursor_pos <= num_result); i++)
5558  {
5559  char *p;
5560 
5561  net_buf_cp_int (net_buf, cursor_pos, NULL);
5562  net_buf_cp_object (net_buf, &dummy_obj);
5563 
5564  /* 1. name */
5565  p = class_table[cursor_pos - 1].class_name;
5567 
5568  /* 2. type */
5569  add_res_data_short (net_buf, class_table[cursor_pos - 1].class_type, 0, NULL);
5570 
5571  tuple_num++;
5572  cursor_pos++;
5573  }
5574 
5575  if (cursor_pos > num_result)
5576  {
5577  fetch_end_flag = 1;
5578  }
5579 
5580  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V5))
5581  {
5582  net_buf_cp_byte (net_buf, fetch_end_flag);
5583  }
5584 
5585  net_buf_overwrite_int (net_buf, tuple_num_msg_offset, tuple_num);
5586 
5587  return 0;
5588 }
5589 
5590 static int
5591 fetch_attribute (T_SRV_HANDLE * srv_handle, int cursor_pos, int fetch_count, char fetch_flag, int result_set_idx,
5592  T_NET_BUF * net_buf, T_REQ_INFO * req_info)
5593 {
5594  T_OBJECT tuple_obj;
5595  int err_code;
5596  int num_tuple_msg_offset;
5597  int num_tuple;
5598  int i;
5599  char fetch_end_flag = 0;
5600  DB_QUERY_RESULT *result;
5601  T_QUERY_RESULT *q_result;
5602  DB_VALUE val_class, val_attr;
5603  DB_OBJECT *class_obj;
5604  DB_ATTRIBUTE *db_attr;
5605  const char *attr_name;
5606  const char *class_name, *p;
5607  T_ATTR_TABLE attr_info;
5608  T_BROKER_VERSION client_version = req_info->client_version;
5609  char *default_value_string = NULL;
5610  bool alloced_default_value_string = false;
5611 
5612  q_result = (T_QUERY_RESULT *) (srv_handle->cur_result);
5613  if (q_result == NULL)
5614  {
5616  }
5617 
5618  result = (DB_QUERY_RESULT *) q_result->result;
5619  if (result == NULL || q_result->stmt_type != CUBRID_STMT_SELECT)
5620  {
5622  }
5623 
5624  if (srv_handle->cursor_pos != cursor_pos)
5625  {
5626  err_code = db_query_seek_tuple (result, cursor_pos - 1, 1);
5627  if (err_code == DB_CURSOR_SUCCESS)
5628  {
5629  net_buf_cp_int (net_buf, 0, &num_tuple_msg_offset); /* tuple num */
5630  }
5631  else if (err_code == DB_CURSOR_END)
5632  {
5633  net_buf_cp_int (net_buf, 0, NULL);
5634  return 0;
5635  }
5636  else
5637  {
5638  return ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
5639  }
5640  }
5641  else
5642  {
5643  net_buf_cp_int (net_buf, 0, &num_tuple_msg_offset);
5644  }
5645 
5646  memset ((char *) &tuple_obj, 0, sizeof (T_OBJECT));
5647  num_tuple = 0;
5648  for (i = 0; i < fetch_count; i++)
5649  {
5650  net_buf_cp_int (net_buf, cursor_pos, NULL);
5651  net_buf_cp_object (net_buf, &tuple_obj);
5652 
5653  err_code = db_query_get_tuple_value (result, 0, &val_class);
5654  if (err_code < 0)
5655  {
5656  return ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
5657  }
5658 
5659  class_name = db_get_string (&val_class);
5660  class_obj = db_find_class (class_name);
5661  if (class_obj == NULL)
5662  {
5664  }
5665 
5666  err_code = db_query_get_tuple_value (result, 1, &val_attr);
5667  if (err_code < 0)
5668  {
5669  return ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
5670  }
5671 
5672  attr_name = db_get_string (&val_attr);
5673  if (srv_handle->schema_type == CCI_SCH_CLASS_ATTRIBUTE)
5674  {
5675  db_attr = db_get_class_attribute (class_obj, attr_name);
5676  }
5677  else
5678  {
5679  db_attr = db_get_attribute (class_obj, attr_name);
5680  }
5681 
5682  if (db_attr == NULL)
5683  {
5685  }
5686 
5687  memset (&attr_info, 0, sizeof (attr_info));
5688  class_attr_info (class_name, db_attr, NULL, 0, &attr_info);
5689 
5690  /* 1. attr name */
5691  p = attr_info.attr_name;
5693 
5694  /* 2. domain */
5695  add_res_data_short (net_buf, encode_ext_type_to_short (client_version, attr_info.domain), 0, NULL);
5696 
5697  /* 3. scale */
5698  add_res_data_short (net_buf, (short) attr_info.scale, 0, NULL);
5699 
5700  /* 4. precision */
5701  add_res_data_int (net_buf, attr_info.precision, 0, NULL);
5702 
5703  /* 5. indexed */
5704  add_res_data_short (net_buf, (short) attr_info.indexed, 0, NULL);
5705 
5706  /* 6. non_null */
5707  add_res_data_short (net_buf, (short) attr_info.non_null, 0, NULL);
5708 
5709  /* 7. shared */
5710  add_res_data_short (net_buf, (short) attr_info.shared, 0, NULL);
5711 
5712  /* 8. unique */
5713  add_res_data_short (net_buf, (short) attr_info.unique, 0, NULL);
5714 
5715  /* 9. default */
5716  default_value_string = (char *) get_column_default_as_string (db_attr, &alloced_default_value_string);
5717  add_res_data_string (net_buf, default_value_string, strlen (default_value_string), 0, CAS_SCHEMA_DEFAULT_CHARSET,
5718  NULL);
5719 
5720  if (alloced_default_value_string)
5721  {
5722  FREE_MEM (default_value_string);
5723  }
5724 
5725  /* 10. order */
5726  add_res_data_int (net_buf, (int) attr_info.attr_order, 0, NULL);
5727 
5728  /* 11. class name */
5729  p = attr_info.class_name;
5730  if (p == NULL)
5731  {
5732  add_res_data_string (net_buf, "", 0, 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
5733  }
5734  else
5735  {
5737  }
5738 
5739  /* 12. source class */
5740  p = attr_info.source_class;
5741  if (p == NULL)
5742  {
5743  add_res_data_string (net_buf, "", 0, 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
5744  }
5745  else
5746  {
5748  }
5749 
5750  /* 13. is_key */
5751  add_res_data_short (net_buf, (short) attr_info.is_key, 0, NULL);
5752 
5753  /* 14. remarks */
5754  p = attr_info.comment;
5755  if (p == NULL)
5756  {
5757  add_res_data_string (net_buf, "", 0, 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
5758  }
5759  else
5760  {
5762  }
5763 
5764  db_value_clear (&val_class);
5765  db_value_clear (&val_attr);
5766 
5767  num_tuple++;
5768  cursor_pos++;
5769  err_code = db_query_next_tuple (result);
5770  if (err_code == DB_CURSOR_SUCCESS)
5771  {
5772  }
5773  else if (err_code == DB_CURSOR_END)
5774  {
5775  fetch_end_flag = 1;
5776  break;
5777  }
5778  else
5779  {
5780  return ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
5781  }
5782  }
5783 
5784  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V5))
5785  {
5786  net_buf_cp_byte (net_buf, fetch_end_flag);
5787  }
5788 
5789  net_buf_overwrite_int (net_buf, num_tuple_msg_offset, num_tuple);
5790 
5791  srv_handle->cursor_pos = cursor_pos;
5792 
5793  return 0;
5794 }
5795 
5796 static int
5797 fetch_method (T_SRV_HANDLE * srv_handle, int cursor_pos, int fetch_count, char fetch_flag, int result_set_idx,
5798  T_NET_BUF * net_buf, T_REQ_INFO * req_info)
5799 {
5800  T_OBJECT dummy_obj;
5801  DB_METHOD *tmp_p;
5802  int tuple_num, tuple_num_msg_offset;
5803  int i, j;
5804  char fetch_end_flag = 0;
5805  DB_DOMAIN *domain;
5806  char *name;
5807  int db_type;
5808  std::string arg_str;
5809  int num_args;
5810  T_BROKER_VERSION client_version = req_info->client_version;
5811 
5812  memset (&dummy_obj, 0, sizeof (T_OBJECT));
5813 
5814  if (srv_handle->cursor_pos != cursor_pos)
5815  {
5816  tmp_p = (DB_METHOD *) (srv_handle->session);
5817  for (i = 1; (i < cursor_pos) && (tmp_p); i++)
5818  {
5819  tmp_p = db_method_next (tmp_p);
5820  }
5821  if (i != cursor_pos)
5822  {
5824  }
5825  }
5826  else
5827  {
5828  tmp_p = (DB_METHOD *) (srv_handle->cur_result);
5829  }
5830 
5831  tuple_num = 0;
5832  net_buf_cp_int (net_buf, tuple_num, &tuple_num_msg_offset);
5833 
5834  for (i = 0; (tmp_p) && (i < fetch_count); i++)
5835  {
5836  char set_type;
5837  unsigned char cas_type;
5838 
5839  net_buf_cp_int (net_buf, cursor_pos, NULL);
5840  net_buf_cp_object (net_buf, &dummy_obj);
5841 
5842  /* 1. name */
5843  name = (char *) db_method_name (tmp_p);
5844  add_res_data_string (net_buf, name, strlen (name), 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
5845 
5846  /* 2. ret domain */
5847  domain = db_method_arg_domain (tmp_p, 0);
5848  db_type = TP_DOMAIN_TYPE (domain);
5849 
5850  if (TP_IS_SET_TYPE (db_type))
5851  {
5852  set_type = get_set_domain (domain, NULL, NULL, NULL, NULL);
5853  cas_type = set_extended_cas_type ((T_CCI_U_TYPE) set_type, (DB_TYPE) db_type);
5854  }
5855  else
5856  {
5857  cas_type = set_extended_cas_type (CCI_U_TYPE_UNKNOWN, (DB_TYPE) db_type);
5858  }
5859  add_res_data_short (net_buf, cas_type, 0, NULL);
5860 
5861  /* 3. arg domain */
5862  num_args = db_method_arg_count (tmp_p);
5863  for (j = 1; j <= num_args; j++)
5864  {
5865  domain = db_method_arg_domain (tmp_p, j);
5866  db_type = TP_DOMAIN_TYPE (domain);
5867 
5868  if (TP_IS_SET_TYPE (db_type))
5869  {
5870  set_type = get_set_domain (domain, NULL, NULL, NULL, NULL);
5871  cas_type = set_extended_cas_type ((T_CCI_U_TYPE) set_type, (DB_TYPE) db_type);
5872  }
5873  else
5874  {
5875  cas_type = set_extended_cas_type (CCI_U_TYPE_UNKNOWN, (DB_TYPE) db_type);
5876  }
5877  arg_str.push_back (cas_type);
5878  arg_str.push_back (' ');
5879  }
5880  add_res_data_string (net_buf, arg_str.c_str (), arg_str.size (), 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
5881 
5882  tuple_num++;
5883  cursor_pos++;
5884 
5885  tmp_p = db_method_next (tmp_p);
5886  }
5887 
5888  if (tmp_p == NULL)
5889  {
5890  fetch_end_flag = 1;
5891  }
5892 
5893  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V5))
5894  {
5895  net_buf_cp_byte (net_buf, fetch_end_flag);
5896  }
5897 
5898  net_buf_overwrite_int (net_buf, tuple_num_msg_offset, tuple_num);
5899 
5900  srv_handle->cur_result = (void *) tmp_p;
5901  srv_handle->cursor_pos = cursor_pos;
5902 
5903  return 0;
5904 }
5905 
5906 static int
5907 fetch_methfile (T_SRV_HANDLE * srv_handle, int cursor_pos, int fetch_count, char fetch_flag, int result_set_idx,
5908  T_NET_BUF * net_buf, T_REQ_INFO * req_info)
5909 {
5910  T_OBJECT dummy_obj;
5911  DB_METHFILE *tmp_p;
5912  char *name;
5913  int tuple_num, tuple_num_msg_offset;
5914  int i;
5915  char fetch_end_flag = 0;
5916  T_BROKER_VERSION client_version = req_info->client_version;
5917 
5918  memset (&dummy_obj, 0, sizeof (T_OBJECT));
5919 
5920  if (srv_handle->cursor_pos != cursor_pos)
5921  {
5922  tmp_p = (DB_METHFILE *) (srv_handle->session);
5923  for (i = 1; (i < cursor_pos) && (tmp_p); i++)
5924  {
5925  tmp_p = db_methfile_next (tmp_p);
5926  }
5927 
5928  if (i != cursor_pos)
5929  {
5931  }
5932  }
5933  else
5934  {
5935  tmp_p = (DB_METHFILE *) (srv_handle->cur_result);
5936  }
5937 
5938  tuple_num = 0;
5939  net_buf_cp_int (net_buf, tuple_num, &tuple_num_msg_offset);
5940 
5941  for (i = 0; (tmp_p) && (i < fetch_count); i++)
5942  {
5943  net_buf_cp_int (net_buf, cursor_pos, NULL);
5944  net_buf_cp_object (net_buf, &dummy_obj);
5945 
5946  /* 1. name */
5947  name = (char *) db_methfile_name (tmp_p);
5948  add_res_data_string (net_buf, name, strlen (name), 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
5949 
5950  tuple_num++;
5951  cursor_pos++;
5952 
5953  tmp_p = db_methfile_next (tmp_p);
5954  }
5955 
5956  if (tmp_p == NULL)
5957  {
5958  fetch_end_flag = 1;
5959  }
5960 
5961  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V5))
5962  {
5963  net_buf_cp_byte (net_buf, fetch_end_flag);
5964  }
5965 
5966  net_buf_overwrite_int (net_buf, tuple_num_msg_offset, tuple_num);
5967 
5968  srv_handle->cur_result = (void *) tmp_p;
5969  srv_handle->cursor_pos = cursor_pos;
5970 
5971  return 0;
5972 }
5973 
5974 static int
5975 fetch_constraint (T_SRV_HANDLE * srv_handle, int cursor_pos, int fetch_count, char fetch_flag, int result_set_idx,
5976  T_NET_BUF * net_buf, T_REQ_INFO * req_info)
5977 {
5978  T_OBJECT dummy_obj;
5979  DB_CONSTRAINT *tmp_p;
5980  int tuple_num, tuple_num_msg_offset;
5981  int i, j;
5982  DB_ATTRIBUTE **attr = NULL;
5983  short type;
5984  char *name, *attr_name;
5985  int bt_total_pages, bt_num_keys, bt_leaf_pages, bt_height;
5986  int asc_desc;
5987  char fetch_end_flag = 0;
5988  T_BROKER_VERSION client_version = req_info->client_version;
5989 
5990  memset (&dummy_obj, 0, sizeof (T_OBJECT));
5991 
5992  tmp_p = (DB_CONSTRAINT *) (srv_handle->session);
5993 
5994  tuple_num = 0;
5995  cursor_pos = 1;
5996  net_buf_cp_int (net_buf, tuple_num, &tuple_num_msg_offset);
5997 
5998  for (i = 1; tmp_p; i++)
5999  {
6000  type = db_constraint_type (tmp_p);
6001  switch (type)
6002  {
6003  case DB_CONSTRAINT_UNIQUE:
6004  case DB_CONSTRAINT_INDEX:
6005  asc_desc = 0; /* 'A' */
6006  break;
6009  asc_desc = 1; /* 'D' */
6010  break;
6011  default:
6012  goto const_next;
6013  }
6014 
6015  name = (char *) db_constraint_name (tmp_p);
6016  bt_total_pages = bt_num_keys = bt_leaf_pages = bt_height = 0;
6017 
6018  attr = db_constraint_attributes (tmp_p);
6019  for (j = 0; attr[j]; j++)
6020  {
6021  attr_name = (char *) db_attribute_name (attr[j]);
6022 
6023  net_buf_cp_int (net_buf, cursor_pos, NULL);
6024  net_buf_cp_object (net_buf, &dummy_obj);
6025 
6026  /* 1. type */
6028 
6029  /* 2. const name */
6030  add_res_data_string (net_buf, name, strlen (name), 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6031 
6032  /* 3. attr name */
6033  add_res_data_string (net_buf, attr_name, strlen (attr_name), 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6034 
6035  /* 4. num pages */
6036  add_res_data_int (net_buf, bt_total_pages, 0, NULL);
6037 
6038  /* 5. num keys */
6039  add_res_data_int (net_buf, bt_num_keys, 0, NULL);
6040 
6041  /* 6. primary key */
6042  add_res_data_short (net_buf, 0, 0, NULL);
6043 
6044  /* 7. key_order */
6045  add_res_data_short (net_buf, j + 1, 0, NULL);
6046 
6047  /* 8. asc_desc */
6048  add_res_data_string (net_buf, asc_desc ? "D" : "A", 1, 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6049 
6050  tuple_num++;
6051  cursor_pos++;
6052  }
6053  const_next:
6054  tmp_p = db_constraint_next (tmp_p);
6055  }
6056 
6057  if (tmp_p == NULL)
6058  {
6059  fetch_end_flag = 1;
6060  }
6061 
6062  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V5))
6063  {
6064  net_buf_cp_byte (net_buf, fetch_end_flag);
6065  }
6066 
6067  net_buf_overwrite_int (net_buf, tuple_num_msg_offset, tuple_num);
6068 
6069  return 0;
6070 }
6071 
6072 static int
6073 fetch_trigger (T_SRV_HANDLE * srv_handle, int cursor_pos, int fetch_count, char fetch_flag, int result_set_idx,
6074  T_NET_BUF * net_buf, T_REQ_INFO * req_info)
6075 {
6076  T_OBJECT dummy_obj;
6077  DB_OBJLIST *tmp_p;
6078  int i;
6079  int tuple_num, tuple_num_msg_offset;
6080  char fetch_end_flag = 0;
6081  T_BROKER_VERSION client_version = req_info->client_version;
6082 
6083  memset (&dummy_obj, 0, sizeof (T_OBJECT));
6084 
6085  if (srv_handle->cursor_pos != cursor_pos)
6086  {
6087  tmp_p = (DB_OBJLIST *) (srv_handle->session);
6088  for (i = 1; (i < cursor_pos) && (tmp_p); i++)
6089  {
6090  tmp_p = tmp_p->next;
6091  }
6092  if (i != cursor_pos)
6093  {
6095  }
6096  }
6097  else
6098  {
6099  tmp_p = (DB_OBJLIST *) (srv_handle->cur_result);
6100  }
6101 
6102  tuple_num = 0;
6103  net_buf_cp_int (net_buf, tuple_num, &tuple_num_msg_offset);
6104 
6105  for (i = 0; (tmp_p) && (i < fetch_count); i++, tmp_p = tmp_p->next)
6106  {
6107  char *tmp_str;
6108  DB_OBJECT *target_class_obj;
6109  char str_buf[32];
6110  double trig_priority;
6111  DB_TRIGGER_STATUS trig_status;
6112  DB_TRIGGER_EVENT trig_event;
6113  DB_TRIGGER_TIME trig_time;
6114 
6115  net_buf_cp_int (net_buf, cursor_pos, NULL);
6116  net_buf_cp_object (net_buf, &dummy_obj);
6117 
6118  /* 1. name */
6119  if (db_trigger_name (tmp_p->op, &tmp_str) < 0)
6120  {
6121  add_res_data_string (net_buf, "", 0, 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6122  }
6123  else
6124  {
6125  if (tmp_str != NULL)
6126  {
6127  add_res_data_string (net_buf, tmp_str, strlen (tmp_str), 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6128  db_string_free (tmp_str);
6129  }
6130  }
6131 
6132  /* 2. status */
6133  if (db_trigger_status (tmp_p->op, &trig_status) < 0)
6134  {
6135  str_buf[0] = '\0';
6136  }
6137  else
6138  {
6139  trigger_status_str (trig_status, str_buf);
6140  }
6141  add_res_data_string (net_buf, str_buf, strlen (str_buf), 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6142 
6143  /* 3. event */
6144  if (db_trigger_event (tmp_p->op, &trig_event) < 0)
6145  {
6146  str_buf[0] = '\0';
6147  }
6148  else
6149  {
6150  trigger_event_str (trig_event, str_buf);
6151  }
6152  add_res_data_string (net_buf, str_buf, strlen (str_buf), 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6153 
6154  /* 4. target class */
6155  if (db_trigger_class (tmp_p->op, &target_class_obj) < 0)
6156  {
6157  add_res_data_string (net_buf, "", 0, 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6158  }
6159  else
6160  {
6161  tmp_str = (char *) db_get_class_name (target_class_obj);
6162  if (tmp_str == NULL)
6163  {
6164  tmp_str = (char *) "";
6165  }
6166  add_res_data_string (net_buf, tmp_str, strlen (tmp_str), 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6167  }
6168 
6169  /* 5. target attribute */
6170  tmp_str = NULL;
6171  if ((db_trigger_attribute (tmp_p->op, &tmp_str) < 0) || (tmp_str == NULL))
6172  {
6173  add_res_data_string (net_buf, "", 0, 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6174  }
6175  else
6176  {
6177  add_res_data_string (net_buf, tmp_str, strlen (tmp_str), 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6178  db_string_free (tmp_str);
6179  }
6180 
6181  /* 6. action time */
6182  if (db_trigger_action_time (tmp_p->op, &trig_time) < 0)
6183  {
6184  str_buf[0] = '\0';
6185  }
6186  else
6187  {
6188  trigger_time_str (trig_time, str_buf);
6189  }
6190  add_res_data_string (net_buf, str_buf, strlen (str_buf), 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6191 
6192  /* 7. action */
6193  tmp_str = NULL;
6194  if ((db_trigger_action (tmp_p->op, &tmp_str) < 0) || (tmp_str == NULL))
6195  {
6196  add_res_data_string (net_buf, "", 0, 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6197  }
6198  else
6199  {
6200  add_res_data_string (net_buf, tmp_str, strlen (tmp_str), 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6201  db_string_free (tmp_str);
6202  }
6203 
6204  /* 8. priority */
6205  trig_priority = 0;
6206  db_trigger_priority (tmp_p->op, &trig_priority);
6207  add_res_data_float (net_buf, (float) trig_priority, 0, NULL);
6208 
6209  /* 9. condition time */
6210  if (db_trigger_condition_time (tmp_p->op, &trig_time) < 0)
6211  {
6212  str_buf[0] = '\0';
6213  }
6214  else
6215  {
6216  trigger_time_str (trig_time, str_buf);
6217  }
6218  add_res_data_string (net_buf, str_buf, strlen (str_buf), 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6219 
6220  /* 10. condition */
6221  tmp_str = NULL;
6222  if ((db_trigger_condition (tmp_p->op, &tmp_str) < 0) || (tmp_str == NULL))
6223  {
6224  add_res_data_string (net_buf, "", 0, 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6225  }
6226  else
6227  {
6228  add_res_data_string (net_buf, tmp_str, strlen (tmp_str), 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6229  db_string_free (tmp_str);
6230  }
6231 
6232  /* 11. comment */
6233  tmp_str = NULL;
6234  if ((db_trigger_comment (tmp_p->op, &tmp_str) < 0) || (tmp_str == NULL))
6235  {
6236  add_res_data_string (net_buf, "", 0, 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6237  }
6238  else
6239  {
6240  add_res_data_string (net_buf, tmp_str, strlen (tmp_str), 0, CAS_SCHEMA_DEFAULT_CHARSET, NULL);
6241  db_string_free (tmp_str);
6242  }
6243 
6244  tuple_num++;
6245  cursor_pos++;
6246  }
6247 
6248  if (tmp_p == NULL)
6249  {
6250  fetch_end_flag = 1;
6251  }
6252 
6253  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V5))
6254  {
6255  net_buf_cp_byte (net_buf, fetch_end_flag);
6256  }
6257 
6258  net_buf_overwrite_int (net_buf, tuple_num_msg_offset, tuple_num);
6259 
6260  srv_handle->cur_result = (void *) tmp_p;
6261  srv_handle->cursor_pos = cursor_pos;
6262 
6263  return 0;
6264 }
6265 
6266 static int
6267 fetch_privilege (T_SRV_HANDLE * srv_handle, int cursor_pos, int fetch_count, char fetch_flag, int result_set_idx,
6268  T_NET_BUF * net_buf, T_REQ_INFO * req_info)
6269 {
6270  T_OBJECT dummy_obj;
6271  int num_result;
6272  int tuple_num, tuple_num_msg_offset;
6273  int i;
6274  T_PRIV_TABLE *priv_table;
6275  char fetch_end_flag = 0;
6276  T_BROKER_VERSION client_version = req_info->client_version;
6277 
6278  priv_table = (T_PRIV_TABLE *) (srv_handle->session);
6279  if (priv_table == NULL)
6280  {
6282  }
6283 
6284  num_result = srv_handle->sch_tuple_num;
6285 
6286  memset (&dummy_obj, 0, sizeof (T_OBJECT));
6287 
6288  if (num_result < cursor_pos)
6289  {
6291  }
6292 
6293  tuple_num = 0;
6294  net_buf_cp_int (net_buf, tuple_num, &tuple_num_msg_offset);
6295 
6296  for (i = 0; (i < fetch_count) && (cursor_pos <= num_result); i++)
6297  {
6298  const char *p;
6299  int index;
6300 
6301  index = cursor_pos - 1;
6302 
6303  net_buf_cp_int (net_buf, cursor_pos, NULL);
6304  net_buf_cp_object (net_buf, &dummy_obj);
6305 
6306  /* 1. name */
6307  p = priv_table[index].class_name;
6309 
6310  /* 2. privilege */
6311  switch (priv_table[index].priv)
6312  {
6313  case DB_AUTH_SELECT:
6314  p = "SELECT";
6315  break;
6316  case DB_AUTH_INSERT:
6317  p = "INSERT";
6318  break;
6319  case DB_AUTH_UPDATE:
6320  p = "UPDATE";
6321  break;
6322  case DB_AUTH_DELETE:
6323  p = "DELETE";
6324  break;
6325  case DB_AUTH_ALTER:
6326  p = "ALTER";
6327  break;
6328  case DB_AUTH_INDEX:
6329  p = "INDEX";
6330  break;
6331  case DB_AUTH_EXECUTE:
6332  p = "EXECUTE";
6333  break;
6334  default:
6335  p = "NONE";
6336  break;
6337  }
6339 
6340  /* 3. grantable */
6341  if (priv_table[index].grant)
6342  {
6343  p = "YES";
6344  }
6345  else
6346  {
6347  p = "NO";
6348  }
6350 
6351  tuple_num++;
6352  cursor_pos++;
6353  }
6354 
6355  if (cursor_pos > num_result)
6356  {
6357  fetch_end_flag = 1;
6358  }
6359 
6360  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V5))
6361  {
6362  net_buf_cp_byte (net_buf, fetch_end_flag);
6363  }
6364 
6365  net_buf_overwrite_int (net_buf, tuple_num_msg_offset, tuple_num);
6366 
6367  return 0;
6368 }
6369 
6370 static int
6371 fetch_foreign_keys (T_SRV_HANDLE * srv_handle, int cursor_pos, int fetch_count, char fetch_flag, int result_set_idx,
6372  T_NET_BUF * net_buf, T_REQ_INFO * req_info)
6373 {
6374  T_OBJECT dummy_obj = { 0, 0, 0 };
6375  T_FK_INFO_RESULT *fk_res;
6376  int tuple_num_msg_offset;
6377  char fetch_end_flag = 0;
6378  T_BROKER_VERSION client_version = req_info->client_version;
6379 
6380  cursor_pos = 1;
6381  net_buf_cp_int (net_buf, 0, &tuple_num_msg_offset);
6382 
6383  for (fk_res = (T_FK_INFO_RESULT *) srv_handle->session; fk_res != NULL; fk_res = fk_res->next)
6384  {
6385  net_buf_cp_int (net_buf, cursor_pos, NULL);
6386  net_buf_cp_object (net_buf, &dummy_obj);
6387 
6388  /* 1. PKTABLE_NAME */
6390 
6391  /* 2. PKCOLUMN_NAME */
6393 
6394  /* 3. FKTABLE_NAME */
6396 
6397  /* 4. FKCOLUMN_NAME */
6399 
6400  /* 5. KEY_SEQ */
6401  add_res_data_short (net_buf, fk_res->key_seq, 0, NULL);
6402 
6403  /* 6. UPDATE_RULE */
6404  add_res_data_short (net_buf, fk_res->update_action, 0, NULL);
6405 
6406  /* 7. DELETE_RULE */
6407  add_res_data_short (net_buf, fk_res->delete_action, 0, NULL);
6408 
6409  /* 8. FK_NAME */
6411 
6412  /* 9. PK_NAME */
6414 
6415  cursor_pos++;
6416  }
6417 
6418  if (fk_res == NULL)
6419  {
6420  fetch_end_flag = 1;
6421  }
6422 
6423  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V5))
6424  {
6425  net_buf_cp_byte (net_buf, fetch_end_flag);
6426  }
6427 
6428  net_buf_overwrite_int (net_buf, tuple_num_msg_offset, cursor_pos - 1);
6429 
6430  return 0;
6431 }
6432 
6433 static void
6434 add_res_data_bytes (T_NET_BUF * net_buf, const char *str, int size, unsigned char ext_type, int *net_size)
6435 {
6436  if (ext_type)
6437  {
6438  net_buf_cp_int (net_buf, NET_BUF_TYPE_SIZE (net_buf) + size, NULL); /* type */
6440  }
6441  else
6442  {
6443  net_buf_cp_int (net_buf, size, NULL);
6444  }
6445 
6446  /* do not append NULL terminator */
6447  net_buf_cp_str (net_buf, str, size);
6448 
6449  if (net_size)
6450  {
6451  *net_size = NET_SIZE_INT + (ext_type ? NET_BUF_TYPE_SIZE (net_buf) : 0) + size;
6452  }
6453 }
6454 
6455 static void
6456 add_res_data_string (T_NET_BUF * net_buf, const char *str, int size, unsigned char ext_type, unsigned char charset,
6457  int *net_size)
6458 {
6459  if (ext_type)
6460  {
6461  net_buf_cp_int (net_buf, NET_BUF_TYPE_SIZE (net_buf) + size + 1, NULL); /* type, NULL terminator */
6462  net_buf_cp_cas_type_and_charset (net_buf, ext_type, charset);
6463  }
6464  else
6465  {
6466  net_buf_cp_int (net_buf, size + 1, NULL); /* NULL terminator */
6467  }
6468 
6469  net_buf_cp_str (net_buf, str, size);
6470  net_buf_cp_byte (net_buf, '\0');
6471 
6472  if (net_size)
6473  {
6474  *net_size = NET_SIZE_INT + (ext_type ? NET_BUF_TYPE_SIZE (net_buf) : 0) + size + NET_SIZE_BYTE;
6475  }
6476 }
6477 
6478 static void
6479 add_res_data_string_safe (T_NET_BUF * net_buf, const char *str, unsigned char ext_type, unsigned char charset,
6480  int *net_size)
6481 {
6482  if (str != NULL)
6483  {
6484  add_res_data_string (net_buf, str, strlen (str), ext_type, charset, net_size);
6485  }
6486  else
6487  {
6488  add_res_data_string (net_buf, "", 0, ext_type, charset, net_size);
6489  }
6490 }
6491 
6492 static void
6493 add_res_data_int (T_NET_BUF * net_buf, int value, unsigned char ext_type, int *net_size)
6494 {
6495  if (ext_type)
6496  {
6497  net_buf_cp_int (net_buf, NET_BUF_TYPE_SIZE (net_buf) + NET_SIZE_INT, NULL);
6499  net_buf_cp_int (net_buf, value, NULL);
6500  }
6501  else
6502  {
6503  net_buf_cp_int (net_buf, NET_SIZE_INT, NULL);
6504  net_buf_cp_int (net_buf, value, NULL);
6505  }
6506 
6507  if (net_size)
6508  {
6509  *net_size = NET_SIZE_INT + (ext_type ? NET_BUF_TYPE_SIZE (net_buf) : 0) + NET_SIZE_INT;
6510  }
6511 }
6512 
6513 static void
6514 add_res_data_bigint (T_NET_BUF * net_buf, DB_BIGINT value, unsigned char ext_type, int *net_size)
6515 {
6516  if (ext_type)
6517  {
6518  net_buf_cp_int (net_buf, NET_BUF_TYPE_SIZE (net_buf) + NET_SIZE_BIGINT, NULL);
6520  net_buf_cp_bigint (net_buf, value, NULL);
6521  }
6522  else
6523  {
6524  net_buf_cp_int (net_buf, NET_SIZE_BIGINT, NULL);
6525  net_buf_cp_bigint (net_buf, value, NULL);
6526  }
6527 
6528  if (net_size)
6529  {
6530  *net_size = NET_SIZE_INT + (ext_type ? NET_BUF_TYPE_SIZE (net_buf) : 0) + NET_SIZE_BIGINT;
6531  }
6532 }
6533 
6534 static void
6535 add_res_data_short (T_NET_BUF * net_buf, short value, unsigned char ext_type, int *net_size)
6536 {
6537  if (ext_type)
6538  {
6539  net_buf_cp_int (net_buf, NET_BUF_TYPE_SIZE (net_buf) + NET_SIZE_SHORT, NULL);
6541  net_buf_cp_short (net_buf, value);
6542  }
6543  else
6544  {
6545  net_buf_cp_int (net_buf, NET_SIZE_SHORT, NULL);
6546  net_buf_cp_short (net_buf, value);
6547  }
6548 
6549  if (net_size)
6550  {
6551  *net_size = NET_SIZE_INT + (ext_type ? NET_BUF_TYPE_SIZE (net_buf) : 0) + NET_SIZE_SHORT;
6552  }
6553 }
6554 
6555 static void
6556 add_res_data_float (T_NET_BUF * net_buf, float value, unsigned char ext_type, int *net_size)
6557 {
6558  if (ext_type)
6559  {
6560  net_buf_cp_int (net_buf, NET_BUF_TYPE_SIZE (net_buf) + NET_SIZE_FLOAT, NULL);
6562  net_buf_cp_float (net_buf, value);
6563  }
6564  else
6565  {
6566  net_buf_cp_int (net_buf, NET_SIZE_FLOAT, NULL);
6567  net_buf_cp_float (net_buf, value);
6568  }
6569 
6570  if (net_size)
6571  {
6572  *net_size = NET_SIZE_INT + (ext_type ? NET_BUF_TYPE_SIZE (net_buf) : 0) + NET_SIZE_FLOAT;
6573  }
6574 }
6575 
6576 static void
6577 add_res_data_double (T_NET_BUF * net_buf, double value, unsigned char ext_type, int *net_size)
6578 {
6579  if (ext_type)
6580  {
6581  net_buf_cp_int (net_buf, NET_BUF_TYPE_SIZE (net_buf) + NET_SIZE_DOUBLE, NULL);
6583  net_buf_cp_double (net_buf, value);
6584  }
6585  else
6586  {
6587  net_buf_cp_int (net_buf, NET_SIZE_DOUBLE, NULL);
6588  net_buf_cp_double (net_buf, value);
6589  }
6590 
6591  if (net_size)
6592  {
6593  *net_size = NET_SIZE_INT + (ext_type ? NET_BUF_TYPE_SIZE (net_buf) : 0) + NET_SIZE_DOUBLE;
6594  }
6595 }
6596 
6597 static void
6598 add_res_data_timestamp (T_NET_BUF * net_buf, short yr, short mon, short day, short hh, short mm, short ss,
6599  unsigned char ext_type, int *net_size)
6600 {
6601  if (ext_type)
6602  {
6603  net_buf_cp_int (net_buf, NET_BUF_TYPE_SIZE (net_buf) + NET_SIZE_TIMESTAMP, NULL);
6605  }
6606  else
6607  {
6609  }
6610 
6611  net_buf_cp_short (net_buf, yr);
6612  net_buf_cp_short (net_buf, mon);
6613  net_buf_cp_short (net_buf, day);
6614  net_buf_cp_short (net_buf, hh);
6615  net_buf_cp_short (net_buf, mm);
6616  net_buf_cp_short (net_buf, ss);
6617 
6618  if (net_size)
6619  {
6620  *net_size = (NET_SIZE_INT + (ext_type ? NET_BUF_TYPE_SIZE (net_buf) : 0) + NET_SIZE_TIMESTAMP);
6621  }
6622 }
6623 
6624 static void
6625 add_res_data_timestamptz (T_NET_BUF * net_buf, short yr, short mon, short day, short hh, short mm, short ss,
6626  char *tz_str, unsigned char ext_type, int *net_size)
6627 {
6628  int tz_size;
6629 
6630  tz_size = strlen (tz_str);
6631 
6632  if (ext_type)
6633  {
6634  net_buf_cp_int (net_buf, (NET_BUF_TYPE_SIZE (net_buf) + NET_SIZE_TIMESTAMP + tz_size + 1), NULL);
6636  }
6637  else
6638  {
6639  net_buf_cp_int (net_buf, NET_SIZE_TIMESTAMP + tz_size + 1, NULL);
6640  }
6641 
6642  net_buf_cp_short (net_buf, yr);
6643  net_buf_cp_short (net_buf, mon);
6644  net_buf_cp_short (net_buf, day);
6645  net_buf_cp_short (net_buf, hh);
6646  net_buf_cp_short (net_buf, mm);
6647  net_buf_cp_short (net_buf, ss);
6648 
6649  net_buf_cp_str (net_buf, tz_str, tz_size);
6650  net_buf_cp_byte (net_buf, '\0');
6651 
6652  if (net_size)
6653  {
6654  *net_size = (NET_SIZE_INT + (ext_type ? NET_BUF_TYPE_SIZE (net_buf) : 0) + NET_SIZE_TIMESTAMP + tz_size + 1);
6655  }
6656 }
6657 
6658 static void
6659 add_res_data_datetime (T_NET_BUF * net_buf, short yr, short mon, short day, short hh, short mm, short ss, short ms,
6660  unsigned char ext_type, int *net_size)
6661 {
6662  if (ext_type)
6663  {
6664  net_buf_cp_int (net_buf, NET_BUF_TYPE_SIZE (net_buf) + NET_SIZE_DATETIME, NULL);
6666  }
6667  else
6668  {
6670  }
6671 
6672  net_buf_cp_short (net_buf, yr);
6673  net_buf_cp_short (net_buf, mon);
6674  net_buf_cp_short (net_buf, day);
6675  net_buf_cp_short (net_buf, hh);
6676  net_buf_cp_short (net_buf, mm);
6677  net_buf_cp_short (net_buf, ss);
6678  net_buf_cp_short (net_buf, ms);
6679 
6680  if (net_size)
6681  {
6682  *net_size = (NET_SIZE_INT + (ext_type ? NET_BUF_TYPE_SIZE (net_buf) : 0) + NET_SIZE_DATETIME);
6683  }
6684 }
6685 
6686 static void
6687 add_res_data_datetimetz (T_NET_BUF * net_buf, short yr, short mon, short day, short hh, short mm, short ss, short ms,
6688  char *tz_str, unsigned char ext_type, int *net_size)
6689 {
6690  int tz_size;
6691  int net_buf_type_size = NET_BUF_TYPE_SIZE (net_buf);
6692 
6693  tz_size = strlen (tz_str);
6694 
6695 
6696  if (ext_type)
6697  {
6698  net_buf_cp_int (net_buf, (net_buf_type_size + NET_SIZE_DATETIME + tz_size + 1), NULL);
6700  }
6701  else
6702  {
6703  net_buf_cp_int (net_buf, NET_SIZE_DATETIME + tz_size + 1, NULL);
6704  }
6705 
6706  net_buf_cp_short (net_buf, yr);
6707  net_buf_cp_short (net_buf, mon);
6708  net_buf_cp_short (net_buf, day);
6709  net_buf_cp_short (net_buf, hh);
6710  net_buf_cp_short (net_buf, mm);
6711  net_buf_cp_short (net_buf, ss);
6712  net_buf_cp_short (net_buf, ms);
6713 
6714  net_buf_cp_str (net_buf, tz_str, tz_size);
6715  net_buf_cp_byte (net_buf, '\0');
6716 
6717  if (net_size)
6718  {
6719  *net_size = (NET_SIZE_INT + (ext_type ? net_buf_type_size : 0) + NET_SIZE_DATETIME + tz_size + 1);
6720  }
6721 }
6722 
6723 static void
6724 add_res_data_time (T_NET_BUF * net_buf, short hh, short mm, short ss, unsigned char ext_type, int *net_size)
6725 {
6726  if (ext_type)
6727  {
6728  net_buf_cp_int (net_buf, NET_BUF_TYPE_SIZE (net_buf) + NET_SIZE_TIME, NULL);
6730  }
6731  else
6732  {
6733  net_buf_cp_int (net_buf, NET_SIZE_TIME, NULL);
6734  }
6735 
6736  net_buf_cp_short (net_buf, hh);
6737  net_buf_cp_short (net_buf, mm);
6738  net_buf_cp_short (net_buf, ss);
6739 
6740  if (net_size)
6741  {
6742  *net_size = NET_SIZE_INT + (ext_type ? NET_BUF_TYPE_SIZE (net_buf) : 0) + NET_SIZE_TIME;
6743  }
6744 }
6745 
6746 static void
6747 add_res_data_date (T_NET_BUF * net_buf, short yr, short mon, short day, unsigned char ext_type, int *net_size)
6748 {
6749  if (ext_type)
6750  {
6751  net_buf_cp_int (net_buf, NET_BUF_TYPE_SIZE (net_buf) + NET_SIZE_DATE, NULL);
6753  }
6754  else
6755  {
6756  net_buf_cp_int (net_buf, NET_SIZE_DATE, NULL);
6757  }
6758 
6759  net_buf_cp_short (net_buf, yr);
6760  net_buf_cp_short (net_buf, mon);
6761  net_buf_cp_short (net_buf, day);
6762 
6763  if (net_size)
6764  {
6765  *net_size = NET_SIZE_INT + (ext_type ? NET_BUF_TYPE_SIZE (net_buf) : 0) + NET_SIZE_DATE;
6766  }
6767 }
6768 
6769 static void
6770 add_res_data_object (T_NET_BUF * net_buf, T_OBJECT * obj, unsigned char ext_type, int *net_size)
6771 {
6772  if (ext_type)
6773  {
6774  net_buf_cp_int (net_buf, NET_BUF_TYPE_SIZE (net_buf) + NET_SIZE_OBJECT, NULL);
6776  }
6777  else
6778  {
6779  net_buf_cp_int (net_buf, NET_SIZE_OBJECT, NULL);
6780  }
6781 
6782  net_buf_cp_object (net_buf, obj);
6783 
6784  if (net_size)
6785  {
6786  *net_size = NET_SIZE_INT + (ext_type ? NET_BUF_TYPE_SIZE (net_buf) : 0) + NET_SIZE_OBJECT;
6787  }
6788 }
6789 
6790 static void
6791 add_res_data_lob_handle (T_NET_BUF * net_buf, T_LOB_HANDLE * lob, unsigned char ext_type, int *net_size)
6792 {
6793  int lob_handle_size = (NET_SIZE_INT + NET_SIZE_INT64 + NET_SIZE_INT + lob->locator_size);
6794 
6795  /* db_type + lob_size + locator_size + locator including null character */
6796  if (ext_type)
6797  {
6798  net_buf_cp_int (net_buf, NET_BUF_TYPE_SIZE (net_buf) + lob_handle_size, NULL);
6800  }
6801  else
6802  {
6803  net_buf_cp_int (net_buf, lob_handle_size, NULL);
6804  }
6805  net_buf_cp_lob_handle (net_buf, lob);
6806  if (net_size)
6807  {
6808  *net_size = NET_SIZE_INT + (ext_type ? NET_BUF_TYPE_SIZE (net_buf) : 0) + lob_handle_size;
6809  }
6810 }
6811 
6812 static void
6813 trigger_event_str (DB_TRIGGER_EVENT trig_event, char *buf)
6814 {
6815  if (trig_event == TR_EVENT_UPDATE)
6816  {
6817  strcpy (buf, "UPDATE");
6818  }
6819  else if (trig_event == TR_EVENT_STATEMENT_UPDATE)
6820  {
6821  strcpy (buf, "STATEMENT_UPDATE");
6822  }
6823  else if (trig_event == TR_EVENT_DELETE)
6824  {
6825  strcpy (buf, "DELETE");
6826  }
6827  else if (trig_event == TR_EVENT_STATEMENT_DELETE)
6828  {
6829  strcpy (buf, "STATEMENT_DELETE");
6830  }
6831  else if (trig_event == TR_EVENT_INSERT)
6832  {
6833  strcpy (buf, "INSERT");
6834  }
6835  else if (trig_event == TR_EVENT_STATEMENT_INSERT)
6836  {
6837  strcpy (buf, "STATEMENT_INSERT");
6838  }
6839  else if (trig_event == TR_EVENT_ALTER)
6840  {
6841  strcpy (buf, "ALTER");
6842  }
6843  else if (trig_event == TR_EVENT_DROP)
6844  {
6845  strcpy (buf, "DROP");
6846  }
6847  else if (trig_event == TR_EVENT_COMMIT)
6848  {
6849  strcpy (buf, "COMMIT");
6850  }
6851  else if (trig_event == TR_EVENT_ROLLBACK)
6852  {
6853  strcpy (buf, "ROLLBACK");
6854  }
6855  else if (trig_event == TR_EVENT_ABORT)
6856  {
6857  strcpy (buf, "ABORT");
6858  }
6859  else if (trig_event == TR_EVENT_TIMEOUT)
6860  {
6861  strcpy (buf, "TIMEOUT");
6862  }
6863  else if (trig_event == TR_EVENT_ALL)
6864  {
6865  strcpy (buf, "ALL");
6866  }
6867  else
6868  {
6869  strcpy (buf, "NULL");
6870  }
6871 }
6872 
6873 static void
6874 trigger_status_str (DB_TRIGGER_STATUS trig_status, char *buf)
6875 {
6876  if (trig_status == TR_STATUS_INACTIVE)
6877  {
6878  strcpy (buf, "INACTIVE");
6879  }
6880  else if (trig_status == TR_STATUS_ACTIVE)
6881  {
6882  strcpy (buf, "ACTIVE");
6883  }
6884  else if (trig_status == TR_STATUS_INVALID)
6885  {
6886  strcpy (buf, "INVALID");
6887  }
6888  else
6889  {
6890  strcpy (buf, "");
6891  }
6892 }
6893 
6894 static void
6895 trigger_time_str (DB_TRIGGER_TIME trig_time, char *buf)
6896 {
6897  if (trig_time == TR_TIME_BEFORE)
6898  {
6899  strcpy (buf, "BEFORE");
6900  }
6901  else if (trig_time == TR_TIME_AFTER)
6902  {
6903  strcpy (buf, "AFTER");
6904  }
6905  else if (trig_time == TR_TIME_DEFERRED)
6906  {
6907  strcpy (buf, "DEFERRED");
6908  }
6909  else
6910  {
6911  strcpy (buf, "");
6912  }
6913 }
6914 
6915 static int
6917 {
6918  char *p;
6919  int num_markers = 0;
6920 
6921  for (p = stmt; *p; p++)
6922  {
6923  if (*p == '?')
6924  {
6925  num_markers++;
6926  }
6927  else if (*p == '-' && *(p + 1) == '-')
6928  {
6929  p = consume_tokens (p + 2, SQL_STYLE_COMMENT);
6930  }
6931  else if (*p == '/' && *(p + 1) == '*')
6932  {
6933  p = consume_tokens (p + 2, C_STYLE_COMMENT);
6934  }
6935  else if (*p == '/' && *(p + 1) == '/')
6936  {
6937  p = consume_tokens (p + 2, CPP_STYLE_COMMENT);
6938  }
6939  else if (*p == '\'')
6940  {
6941  p = consume_tokens (p + 1, SINGLE_QUOTED_STRING);
6942  }
6943  else if (cas_default_ansi_quotes == false && *p == '\"')
6944  {
6945  p = consume_tokens (p + 1, DOUBLE_QUOTED_STRING);
6946  }
6947 
6948  if (*p == '\0')
6949  {
6950  break;
6951  }
6952  }
6953 
6954  return num_markers;
6955 }
6956 
6957 static char *
6959 {
6960  char *p = stmt;
6961 
6962  if (stmt_status == SQL_STYLE_COMMENT || stmt_status == CPP_STYLE_COMMENT)
6963  {
6964  for (; *p; p++)
6965  {
6966  if (*p == '\n')
6967  {
6968  break;
6969  }
6970  }
6971  }
6972  else if (stmt_status == C_STYLE_COMMENT)
6973  {
6974  for (; *p; p++)
6975  {
6976  if (*p == '*' && *(p + 1) == '/')
6977  {
6978  p++;
6979  break;
6980  }
6981  }
6982  }
6983  else if (stmt_status == SINGLE_QUOTED_STRING)
6984  {
6985  for (; *p; p++)
6986  {
6987  if (*p == '\'' && *(p + 1) == '\'')
6988  {
6989  p++;
6990  }
6991  else if (cas_default_no_backslash_escapes == false && *p == '\\')
6992  {
6993  p++;
6994  }
6995  else if (*p == '\'')
6996  {
6997  break;
6998  }
6999  }
7000  }
7001  else if (stmt_status == DOUBLE_QUOTED_STRING)
7002  {
7003  for (; *p; p++)
7004  {
7005  if (*p == '\"' && *(p + 1) == '\"')
7006  {
7007  p++;
7008  }
7009  else if (cas_default_no_backslash_escapes == false && *p == '\\')
7010  {
7011  p++;
7012  }
7013  else if (*p == '\"')
7014  {
7015  break;
7016  }
7017  }
7018  }
7019 
7020  return p;
7021 }
7022 
7023 static char
7025 {
7026  if (strncasecmp (stmt, "insert", 6) == 0)
7027  {
7028  return CUBRID_STMT_INSERT;
7029  }
7030  else if (strncasecmp (stmt, "update", 6) == 0)
7031  {
7032  return CUBRID_STMT_UPDATE;
7033  }
7034  else if (strncasecmp (stmt, "delete", 6) == 0)
7035  {
7036  return CUBRID_STMT_DELETE;
7037  }
7038  else if (strncasecmp (stmt, "call", 4) == 0)
7039  {
7040  return CUBRID_STMT_CALL;
7041  }
7042  else if (strncasecmp (stmt, "evaluate", 8) == 0)
7043  {
7044  return CUBRID_STMT_EVALUATE;
7045  }
7046  else
7047  {
7048  return CUBRID_MAX_STMT_TYPE;
7049  }
7050 }
7051 
7052 static int
7053 prepare_column_list_info_set (DB_SESSION * session, char prepare_flag, T_QUERY_RESULT * q_result, T_NET_BUF * net_buf,
7054  T_BROKER_VERSION client_version)
7055 {
7056  DB_QUERY_TYPE *column_info = NULL, *col;
7057  DB_DOMAIN *domain;
7058  int num_cols;
7059  DB_TYPE db_type;
7060  int num_col_offset;
7061  char *col_name, *attr_name, *class_name;
7062  T_COL_UPDATE_INFO *col_update_info = NULL;
7063  char stmt_type = q_result->stmt_type;
7064  int stmt_id = q_result->stmt_id;
7065  char updatable_flag = prepare_flag & CCI_PREPARE_UPDATABLE;
7066  char *null_type_column = NULL;
7067 
7068  q_result->col_updatable = FALSE;
7069  q_result->include_oid = FALSE;
7070  if (q_result->null_type_column != NULL)
7071  {
7072  FREE_MEM (q_result->null_type_column);
7073  }
7074 
7075  if (stmt_type == CUBRID_STMT_SELECT)
7076  {
7077  if (updatable_flag)
7078  updatable_flag = TRUE;
7079 
7080  if (prepare_flag)
7081  {
7082  if (db_query_produce_updatable_result (session, stmt_id) <= 0)
7083  {
7084  updatable_flag = FALSE;
7085  }
7086  else
7087  {
7088  q_result->include_oid = TRUE;
7089  }
7090  }
7091 
7092  column_info = db_get_query_type_list (session, stmt_id);
7093  if (column_info == NULL)
7094  {
7096  }
7097 
7098  net_buf_cp_byte (net_buf, updatable_flag);
7099 
7100  num_cols = 0;
7101  net_buf_cp_int (net_buf, num_cols, &num_col_offset);
7102  for (col = column_info; col != NULL; col = db_query_format_next (col))
7103  {
7104  char set_type;
7105  unsigned char cas_type;
7106  int precision;
7107  short scale;
7108  char *temp_column = NULL;
7109  char charset;
7110 
7111  temp_column = (char *) REALLOC (null_type_column, num_cols + 1);
7112  if (temp_column == NULL)
7113  {
7114  if (null_type_column != NULL)
7115  {
7116  FREE_MEM (null_type_column);
7117  }
7118  FREE_MEM (col_update_info);
7120  }
7121  null_type_column = temp_column;
7122  null_type_column[num_cols] = 0;
7123 
7125  {
7126  col_name = (char *) db_query_format_name (col);
7127  }
7128  else
7129  {
7130  col_name = (char *) db_query_format_original_name (col);
7131  if (strchr (col_name, '*') != NULL)
7132  {
7133  col_name = (char *) db_query_format_name (col);
7134  }
7135  }
7136  class_name = (char *) db_query_format_class_name (col);
7137  attr_name = (char *) db_query_format_attr_name (col);
7138 
7139  if (updatable_flag)
7140  {
7141  col_update_info =
7142  (T_COL_UPDATE_INFO *) REALLOC (col_update_info, sizeof (T_COL_UPDATE_INFO) * (num_cols + 1));
7143  if (col_update_info == NULL)
7144  {
7145  updatable_flag = FALSE;
7146  }
7147  else
7148  {
7149  hm_col_update_info_clear (&(col_update_info[num_cols]));
7150 
7151  col_update_info[num_cols].updatable = FALSE;
7153  {
7154  ALLOC_COPY (col_update_info[num_cols].attr_name, attr_name);
7155  ALLOC_COPY (col_update_info[num_cols].class_name, class_name);
7156  if (col_update_info[num_cols].attr_name != NULL && col_update_info[num_cols].class_name != NULL)
7157  {
7158  col_update_info[num_cols].updatable = TRUE;
7159  }
7160  }
7161  }
7162  }
7163 
7164  if (updatable_flag == FALSE || col_update_info[num_cols].updatable == FALSE)
7165  {
7166  attr_name = (char *) "";
7167  }
7168 
7169  domain = db_query_format_domain (col);
7170  db_type = TP_DOMAIN_TYPE (domain);
7171 
7172 
7173  if (TP_IS_SET_TYPE (db_type))
7174  {
7175  set_type = get_set_domain (domain, NULL, NULL, NULL, &charset);
7176 
7177  cas_type = set_extended_cas_type ((T_CCI_U_TYPE) set_type, db_type);
7178  precision = 0;
7179  scale = 0;
7180  }
7181  else
7182  {
7183  cas_type = set_extended_cas_type (CCI_U_TYPE_UNKNOWN, db_type);
7184  precision = db_domain_precision (domain);
7185  scale = (short) db_domain_scale (domain);
7186  charset = db_domain_codeset (domain);
7187  }
7188 
7189  if (IS_NULL_CAS_TYPE (cas_type))
7190  {
7191  null_type_column[num_cols] = 1;
7192  }
7193 
7194  /*
7195  * if (cas_type == CCI_U_TYPE_CHAR && precision < 0)
7196  * precision = 0;
7197  */
7198 #ifndef LIBCAS_FOR_JSP
7199  if (shm_appl->max_string_length >= 0)
7200  {
7201  if (precision < 0 || precision > shm_appl->max_string_length)
7202  {
7203  precision = shm_appl->max_string_length;
7204  }
7205  }
7206 #else /* !LIBCAS_FOR_JSP */
7207  /* precision = DB_MAX_STRING_LENGTH; */
7208 #endif /* !LIBCAS_FOR_JSP */
7209 
7210  set_column_info (net_buf, cas_type, scale, precision, charset, col_name, attr_name, class_name,
7211  (char) db_query_format_is_non_null (col), client_version);
7212 
7213  num_cols++;
7214  }
7215 
7216  q_result->null_type_column = null_type_column;
7217  net_buf_overwrite_int (net_buf, num_col_offset, num_cols);
7218  if (column_info)
7219  {
7220  db_query_format_free (column_info);
7221  }
7222  q_result->col_updatable = updatable_flag;
7223  q_result->num_column = num_cols;
7224  q_result->col_update_info = col_update_info;
7225  }
7226  else if (stmt_type == CUBRID_STMT_CALL || stmt_type == CUBRID_STMT_GET_STATS || stmt_type == CUBRID_STMT_EVALUATE)
7227  {
7228  q_result->null_type_column = (char *) MALLOC (1);
7229  if (q_result->null_type_column == NULL)
7230  {
7232  }
7233  q_result->null_type_column[0] = 1;
7234 
7235  updatable_flag = 0;
7236  net_buf_cp_byte (net_buf, updatable_flag);
7237  net_buf_cp_int (net_buf, 1, NULL);
7238  prepare_column_info_set (net_buf, 0, 0, 0, CAS_SCHEMA_DEFAULT_CHARSET, "", "", 0, 0, 0, 0, 0, 0, 0, "", "", 0,
7239  client_version);
7240  }
7241  else
7242  {
7243  updatable_flag = 0;
7244  net_buf_cp_byte (net_buf, updatable_flag);
7245  net_buf_cp_int (net_buf, 0, NULL);
7246  }
7247 
7248  return 0;
7249 }
7250 
7251 static int
7252 execute_info_set (T_SRV_HANDLE * srv_handle, T_NET_BUF * net_buf, T_BROKER_VERSION client_version, char exec_flag)
7253 {
7254  int i, tuple_count, error;
7255  char stmt_type;
7256  T_OBJECT ins_oid;
7257  DB_VALUE val;
7258  DB_OBJECT *ins_obj_p;
7259  int retval = 0;
7260  CACHE_TIME srv_cache_time;
7261 
7262  net_buf_cp_int (net_buf, srv_handle->num_q_result, NULL);
7263 
7264  for (i = 0; i < srv_handle->num_q_result; i++)
7265  {
7266  stmt_type = srv_handle->q_result[i].stmt_type;
7267  tuple_count = srv_handle->q_result[i].tuple_count;
7268 
7269  net_buf_cp_byte (net_buf, stmt_type);
7270  net_buf_cp_int (net_buf, tuple_count, NULL);
7271 
7272  if (stmt_type == CUBRID_STMT_INSERT && srv_handle->q_result[i].result != NULL)
7273  {
7274  DB_QUERY_RESULT *qres = (DB_QUERY_RESULT *) srv_handle->q_result[i].result;
7275 
7276  if (qres->type == T_SELECT)
7277  {
7278  /* result of a GET_GENERATED_KEYS request, server insert */
7279  memset (&ins_oid, 0, sizeof (T_OBJECT));
7280  }
7281  else
7282  {
7283  error = db_query_get_tuple_value ((DB_QUERY_RESULT *) srv_handle->q_result[i].result, 0, &val);
7284  if (error < 0)
7285  {
7286  memset (&ins_oid, 0, sizeof (T_OBJECT));
7287  }
7288  else
7289  {
7290  if (DB_VALUE_DOMAIN_TYPE (&val) == DB_TYPE_OBJECT)
7291  {
7292  ins_obj_p = db_get_object (&val);
7293  dbobj_to_casobj (ins_obj_p, &ins_oid);
7294  db_value_clear (&val);
7295  }
7296  else if (DB_VALUE_DOMAIN_TYPE (&val) == DB_TYPE_SEQUENCE)
7297  {
7298  /* result of a GET_GENERATED_KEYS request, client insert */
7299  DB_VALUE value;
7300  DB_SEQ *seq = db_get_set (&val);
7301 
7302  if (seq != NULL && db_col_size (seq) == 1)
7303  {
7304  db_col_get (seq, 0, &value);
7305  ins_obj_p = db_get_object (&value);
7306  dbobj_to_casobj (ins_obj_p, &ins_oid);
7307  db_value_clear (&value);
7308  }
7309  else
7310  {
7311  memset (&ins_oid, 0, sizeof (T_OBJECT));
7312  }
7313  db_value_clear (&val);
7314  }
7315  else
7316  {
7317  memset (&ins_oid, 0, sizeof (T_OBJECT));
7318  }
7319  }
7320  }
7321  }
7322  else
7323  {
7324  memset (&ins_oid, 0, sizeof (T_OBJECT));
7325  }
7326  net_buf_cp_object (net_buf, &ins_oid);
7327 
7328  db_query_get_cache_time ((DB_QUERY_RESULT *) srv_handle->q_result[i].result, &srv_cache_time);
7329  /* send CT */
7330  net_buf_cp_int (net_buf, srv_cache_time.sec, NULL);
7331  net_buf_cp_int (net_buf, srv_cache_time.usec, NULL);
7332  }
7333 
7334  return retval;
7335 }
7336 
7337 static char
7338 get_attr_type (DB_OBJECT * obj_p, char *attr_name)
7339 {
7340  DB_ATTRIBUTE *attribute;
7341  DB_DOMAIN *attr_domain;
7342  char db_type;
7343 
7344  attribute = db_get_attribute (obj_p, attr_name);
7345  if (attribute == NULL)
7346  {
7347  return DB_TYPE_NULL;
7348  }
7349 
7350  attr_domain = db_attribute_domain (attribute);
7351  if (attr_domain == NULL)
7352  {
7353  return DB_TYPE_NULL;
7354  }
7355 
7356  db_type = TP_DOMAIN_TYPE (attr_domain);
7357 
7358  if (TP_IS_SET_TYPE (db_type))
7359  {
7360  if (get_set_domain (attr_domain, NULL, NULL, &db_type, NULL) < 0)
7361  {
7362  db_type = DB_TYPE_NULL;
7363  }
7364  }
7365 
7366  return db_type;
7367 }
7368 
7369 static char *
7371 {
7372  DB_TYPE dtype;
7373  DB_DOMAIN *set_domain;
7374  DB_OBJECT *dclass;
7375  char precision_str[16], scale_str[16];
7376  int prec, scale;
7377  char *domain_str = NULL;
7378  const char *p = "";
7379  int size;
7380  int is_first = TRUE;
7381  const char *collection_str;
7382  char *set_dom_name_p;
7383 
7384  precision_str[0] = scale_str[0] = '\0';
7385  dtype = TP_DOMAIN_TYPE (domain);
7386  prec = db_domain_precision (domain);
7387  scale = db_domain_scale (domain);
7388 
7389  if (prec > 0)
7390  {
7391  sprintf (precision_str, "%d", prec);
7392  }
7393 
7394  if (scale > 0)
7395  {
7396  sprintf (scale_str, "%d", scale);
7397  }
7398 
7399  collection_str = NULL;
7400 
7401  switch (dtype)
7402  {
7403  case DB_TYPE_OBJECT:
7404  dclass = db_domain_class (domain);
7405  if (dclass == NULL)
7406  {
7407  p = "object";
7408  }
7409  else
7410  {
7411  p = db_get_class_name (dclass);
7412  }
7413  break;
7414 
7415  case DB_TYPE_SET:
7416  collection_str = "set";
7417  /* fall through */
7418  case DB_TYPE_MULTISET:
7419  if (collection_str == NULL)
7420  {
7421  collection_str = "multiset";
7422  }
7423  /* fall through */
7424  case DB_TYPE_SEQUENCE: /* DB_TYPE_LIST */
7425  if (collection_str == NULL)
7426  {
7427  collection_str = "sequence";
7428  }
7429  set_domain = db_domain_set (domain);
7430  size = strlen (collection_str) + 3;
7431 
7432  domain_str = (char *) malloc (size);
7433  if (domain_str == NULL)
7434  {
7435  return NULL;
7436  }
7437 
7438  sprintf (domain_str, "%s(", collection_str);
7439  for (; set_domain; set_domain = db_domain_next (set_domain))
7440  {
7441  set_dom_name_p = get_domain_str (set_domain);
7442  if (set_dom_name_p == NULL)
7443  {
7444  continue;
7445  }
7446 
7447  if (is_first == TRUE)
7448  {
7449  size += (strlen (set_dom_name_p) + 1);
7450  }
7451  else
7452  {
7453  size += (strlen (set_dom_name_p) + 3);
7454  }
7455 
7456  domain_str = (char *) realloc (domain_str, size);
7457  if (domain_str == NULL)
7458  {
7459  FREE_MEM (set_dom_name_p);
7460  return NULL;
7461  }
7462 
7463  if (is_first == TRUE)
7464  {
7465  is_first = FALSE;
7466  }
7467  else
7468  {
7469  strcat (domain_str, ", ");
7470  }
7471  strcat (domain_str, set_dom_name_p);
7472  FREE_MEM (set_dom_name_p);
7473  }
7474  strcat (domain_str, ")");
7475  break;
7476 
7477  case DB_TYPE_NUMERIC:
7478  sprintf (scale_str, "%d", scale);
7479  /* fall through */
7480  default:
7481  p = (char *) db_get_type_name (dtype);
7482  if (p == NULL)
7483  {
7484  p = "";
7485  }
7486  }
7487 
7488  if (domain_str == NULL)
7489  {
7490  int avail_size;
7491  char *domain_str_p;
7492 
7493  size = strlen (p) + 1;
7494  if (precision_str[0] != '\0')
7495  {
7496  size += strlen (precision_str) + 2;
7497  }
7498 
7499  if (scale_str[0] != '\0')
7500  {
7501  size += strlen (scale_str) + 1;
7502  }
7503 
7504  domain_str = (char *) malloc (size);
7505  if (domain_str == NULL)
7506  {
7507  return NULL;
7508  }
7509 
7510  domain_str_p = domain_str;
7511  avail_size = size;
7512  STRING_APPEND (domain_str_p, avail_size, "%s", p);
7513  if (precision_str[0] != '\0')
7514  {
7515  STRING_APPEND (domain_str_p, avail_size, "(%s", precision_str);
7516  if (scale_str[0] != '\0')
7517  {
7518  STRING_APPEND (domain_str_p, avail_size, ",%s", scale_str);
7519  }
7520  STRING_APPEND (domain_str_p, avail_size, ")");
7521  }
7522  }
7523 
7524  return domain_str;
7525 }
7526 
7527 static DB_OBJECT *
7528 ux_str_to_obj (char *str)
7529 {
7530  DB_OBJECT *obj;
7531  DB_IDENTIFIER oid;
7532  int page, slot, vol;
7533  int read;
7534  char del1, del2, del3;
7535 
7536  if (str == NULL)
7537  {
7538  return NULL;
7539  }
7540 
7541  read = sscanf (str, "%c%d%c%d%c%d", &del1, &page, &del2, &slot, &del3, &vol);
7542  if (read != 6)
7543  {
7544  return NULL;
7545  }
7546 
7547  if (del1 != '@' || del2 != '|' || del3 != '|')
7548  {
7549  return NULL;
7550  }
7551 
7552  if (page < 0 || slot < 0 || vol < 0)
7553  {
7554  return NULL;
7555  }
7556 
7557  oid.pageid = page;
7558  oid.slotid = slot;
7559  oid.volid = vol;
7560  obj = db_object (&oid);
7561  if (db_is_instance (obj) > 0)
7562  {
7563  return obj;
7564  }
7565 
7566  return NULL;
7567 }
7568 
7569 static int
7570 sch_class_info (T_NET_BUF * net_buf, char *class_name, char pattern_flag, char v_class_flag, T_SRV_HANDLE * srv_handle,
7571  T_BROKER_VERSION client_version)
7572 {
7573  char sql_stmt[QUERY_BUFFER_MAX], *sql_p = sql_stmt;
7574  int avail_size = sizeof (sql_stmt) - 1;
7575  int num_result;
7576  const char *case_stmt;
7577  const char *where_vclass;
7578 
7579  ut_tolower (class_name);
7580 
7582  {
7583  case_stmt = "CASE WHEN is_system_class = 'YES' THEN 0 \
7584  WHEN class_type = 'CLASS' THEN 2 \
7585  ELSE 1 END";
7586  }
7587  else
7588  {
7589  case_stmt = "CASE WHEN is_system_class = 'YES' THEN 0 \
7590  WHEN class_type = 'CLASS' THEN 2 \
7591  ELSE 1 END";
7592  }
7593  where_vclass = "class_type = 'VCLASS'";
7594 
7595  STRING_APPEND (sql_p, avail_size, "SELECT class_name, CAST(%s AS short), comment FROM db_class ", case_stmt);
7596  if (pattern_flag & CCI_CLASS_NAME_PATTERN_MATCH)
7597  {
7598  if (v_class_flag)
7599  {
7600  if (class_name)
7601  {
7602  STRING_APPEND (sql_p, avail_size, "WHERE class_name LIKE '%s' ESCAPE '%s' AND %s", class_name,
7603  get_backslash_escape_string (), where_vclass);
7604  }
7605  else
7606  {
7607  STRING_APPEND (sql_p, avail_size, "WHERE %s", where_vclass);
7608  }
7609  }
7610  else
7611  {
7612  if (class_name)
7613  {
7614  STRING_APPEND (sql_p, avail_size, "WHERE class_name LIKE '%s' ESCAPE '%s' ", class_name,
7616  }
7617  }
7618  }
7619  else
7620  {
7621  if (class_name == NULL)
7622  {
7623  class_name = (char *) "";
7624  }
7625 
7626  if (v_class_flag)
7627  {
7628  STRING_APPEND (sql_p, avail_size, "WHERE class_name = '%s' AND %s", class_name, where_vclass);
7629  }
7630  else
7631  {
7632  STRING_APPEND (sql_p, avail_size, "WHERE class_name = '%s'", class_name);
7633  }
7634  }
7635 
7636  num_result = sch_query_execute (srv_handle, sql_stmt, net_buf);
7637  if (num_result < 0)
7638  {
7639  return num_result;
7640  }
7641 
7642  net_buf_cp_int (net_buf, num_result, NULL);
7643  schema_table_meta (net_buf);
7644 
7645  return 0;
7646 }
7647 
7648 static int
7649 sch_attr_info (T_NET_BUF * net_buf, char *class_name, char *attr_name, char pattern_flag, char class_attr_flag,
7650  T_SRV_HANDLE * srv_handle)
7651 {
7652  char sql_stmt[QUERY_BUFFER_MAX], *sql_p = sql_stmt;
7653  int avail_size = sizeof (sql_stmt) - 1;
7654  int num_result;
7655 
7656  ut_tolower (class_name);
7657  ut_tolower (attr_name);
7658 
7659  STRING_APPEND (sql_p, avail_size, "SELECT class_name, attr_name FROM db_attribute WHERE ");
7660 
7661  if (class_attr_flag)
7662  {
7663  STRING_APPEND (sql_p, avail_size, " attr_type = 'CLASS' ");
7664  }
7665  else
7666  {
7667  STRING_APPEND (sql_p, avail_size, " attr_type in {'INSTANCE', 'SHARED'} ");
7668  }
7669 
7670  if (pattern_flag & CCI_CLASS_NAME_PATTERN_MATCH)
7671  {
7672  if (class_name)
7673  {
7674  STRING_APPEND (sql_p, avail_size, " AND class_name LIKE '%s' ESCAPE '%s' ", class_name,
7676  }
7677  }
7678  else
7679  {
7680  if (class_name == NULL)
7681  {
7682  class_name = (char *) "";
7683  }
7684  STRING_APPEND (sql_p, avail_size, " AND class_name = '%s' ", class_name);
7685  }
7686 
7687  if (pattern_flag & CCI_ATTR_NAME_PATTERN_MATCH)
7688  {
7689  if (attr_name)
7690  {
7691  STRING_APPEND (sql_p, avail_size, " AND attr_name LIKE '%s' ESCAPE '%s' ", attr_name,
7693  }
7694  }
7695  else
7696  {
7697  if (attr_name == NULL)
7698  {
7699  attr_name = (char *) "";
7700  }
7701  STRING_APPEND (sql_p, avail_size, " AND attr_name = '%s' ", attr_name);
7702  }
7703  STRING_APPEND (sql_p, avail_size, " ORDER BY class_name, def_order");
7704 
7705  num_result = sch_query_execute (srv_handle, sql_stmt, net_buf);
7706  if (num_result < 0)
7707  {
7708  return num_result;
7709  }
7710 
7711  net_buf_cp_int (net_buf, num_result, NULL);
7712  schema_attr_meta (net_buf);
7713 
7714  return 0;
7715 }
7716 
7717 static int
7718 sch_queryspec (T_NET_BUF * net_buf, char *class_name, T_SRV_HANDLE * srv_handle)
7719 {
7720  char sql_stmt[1024];
7721  int num_result;
7722 
7723  if (class_name == NULL)
7724  class_name = (char *) "";
7725  ut_tolower (class_name);
7726 
7727  sprintf (sql_stmt, "SELECT vclass_def FROM db_vclass WHERE vclass_name = '%s'", class_name);
7728 
7729  num_result = sch_query_execute (srv_handle, sql_stmt, net_buf);
7730  if (num_result < 0)
7731  {
7732  return num_result;
7733  }
7734 
7735  net_buf_cp_int (net_buf, num_result, NULL);
7736  schema_query_spec_meta (net_buf);
7737 
7738  return 0;
7739 }
7740 
7741 static void
7742 sch_method_info (T_NET_BUF * net_buf, char *class_name, char flag, void **result)
7743 {
7744  DB_OBJECT *class_obj;
7745  DB_METHOD *method, *method_list;
7746  int num_method;
7747 
7748  class_obj = db_find_class (class_name);
7749 
7750  if (flag)
7751  {
7752  method_list = db_get_class_methods (class_obj);
7753  }
7754  else
7755  {
7756  method_list = db_get_methods (class_obj);
7757  }
7758 
7759  num_method = 0;
7760  for (method = method_list; method; method = db_method_next (method))
7761  {
7762  num_method++;
7763  }
7764 
7765  net_buf_cp_int (net_buf, num_method, NULL);
7766  schema_method_meta (net_buf);
7767 
7768  *result = (void *) method_list;
7769 }
7770 
7771 static void
7772 sch_methfile_info (T_NET_BUF * net_buf, char *class_name, void **result)
7773 {
7774  DB_METHFILE *method_files, *mf;
7775  DB_OBJECT *class_obj;
7776  int num_mf;
7777 
7778  class_obj = db_find_class (class_name);
7779  method_files = db_get_method_files (class_obj);
7780 
7781  num_mf = 0;
7782  for (mf = method_files; mf; mf = db_methfile_next (mf))
7783  {
7784  num_mf++;
7785  }
7786 
7787  net_buf_cp_int (net_buf, num_mf, NULL);
7788  schema_methodfile_meta (net_buf);
7789 
7790  *result = (void *) method_files;
7791 }
7792 
7793 static int
7794 sch_superclass (T_NET_BUF * net_buf, char *class_name, char flag, T_SRV_HANDLE * srv_handle)
7795 {
7796  DB_OBJECT *class_obj;
7797  DB_OBJLIST *obj_list, *obj_tmp;
7798  int num_obj;
7800  int alloc_table_size = 0;
7801  int cls_type;
7802 
7803  class_obj = db_find_class (class_name);
7804  if (flag)
7805  {
7806  obj_list = db_get_superclasses (class_obj);
7807  }
7808  else
7809  {
7810  obj_list = db_get_subclasses (class_obj);
7811  }
7812 
7813  num_obj = 0;
7814  for (obj_tmp = obj_list; obj_tmp; obj_tmp = obj_tmp->next)
7815  {
7816  char *p;
7817 
7818  if (num_obj + 1 > alloc_table_size)
7819  {
7820  alloc_table_size += 10;
7821  class_table = (T_CLASS_TABLE *) REALLOC (class_table, sizeof (T_CLASS_TABLE) * alloc_table_size);
7822  if (class_table == NULL)
7823  {
7824  db_objlist_free (obj_list);
7826  }
7827  }
7828 
7829  p = (char *) db_get_class_name (obj_tmp->op);
7830 
7831  class_table[num_obj].class_name = p;
7832  cls_type = class_type (obj_tmp->op);
7833  if (cls_type < 0)
7834  {
7835  db_objlist_free (obj_list);
7836  return cls_type;
7837  }
7838  class_table[num_obj].class_type = cls_type;
7839 
7840  num_obj++;
7841  }
7842  db_objlist_free (obj_list);
7843 
7844  net_buf_cp_int (net_buf, num_obj, NULL);
7845  schema_superclasss_meta (net_buf);
7846 
7847  srv_handle->session = (void *) class_table;
7848  srv_handle->sch_tuple_num = num_obj;
7849  return 0;
7850 }
7851 
7852 static void
7853 sch_constraint (T_NET_BUF * net_buf, char *class_name, void **result)
7854 {
7855  DB_OBJECT *class_obj;
7856  DB_CONSTRAINT *constraint, *tmp_c;
7857  DB_ATTRIBUTE **attr;
7858  int num_const;
7859  int i;
7860  int type;
7861 
7862  class_obj = db_find_class (class_name);
7863  constraint = db_get_constraints (class_obj);
7864  num_const = 0;
7865  for (tmp_c = constraint; tmp_c; tmp_c = db_constraint_next (tmp_c))
7866  {
7867  type = db_constraint_type (tmp_c);
7868  switch (type)
7869  {
7870  case DB_CONSTRAINT_UNIQUE:
7871  case DB_CONSTRAINT_INDEX:
7874  attr = db_constraint_attributes (tmp_c);
7875  for (i = 0; attr[i]; i++)
7876  {
7877  num_const++;
7878  }
7879  default:
7880  break;
7881  }
7882  }
7883 
7884  net_buf_cp_int (net_buf, num_const, NULL);
7885  schema_constraint_meta (net_buf);
7886 
7887  *result = (void *) constraint;
7888 }
7889 
7890 static void
7891 sch_trigger (T_NET_BUF * net_buf, char *class_name, char flag, void **result)
7892 {
7893  DB_OBJLIST *all_trigger = NULL, *tmp_trigger = NULL, *tmp_t;
7894  int num_trig = 0;
7895  MOP tmp_obj;
7896  DB_OBJECT *obj_trigger_target = NULL;
7897  const char *name_trigger_target = NULL;
7898  TR_TRIGGER *trigger = NULL;
7899  int error = NO_ERROR;
7900  bool is_pattern_match;
7901 
7902  is_pattern_match = (flag & CCI_CLASS_NAME_PATTERN_MATCH) ? true : false;
7903 
7904  if (class_name == NULL && !is_pattern_match)
7905  {
7906  goto end;
7907  }
7908 
7909  if (db_find_all_triggers (&tmp_trigger) < 0)
7910  {
7911  goto end;
7912  }
7913 
7914  if (class_name == NULL)
7915  {
7916  all_trigger = tmp_trigger;
7917  num_trig = db_list_length ((DB_LIST *) all_trigger);
7918  }
7919  else
7920  {
7921  for (tmp_t = tmp_trigger; tmp_t; tmp_t = tmp_t->next)
7922  {
7923  tmp_obj = tmp_t->op;
7924  assert (tmp_obj != NULL);
7925 
7926  trigger = tr_map_trigger (tmp_obj, 1);
7927  if (trigger == NULL)
7928  {
7929  assert (er_errid () != NO_ERROR);
7930  error = er_errid ();
7931  break;
7932  }
7933 
7934  obj_trigger_target = trigger->class_mop;
7935  assert (obj_trigger_target != NULL);
7936 
7937  name_trigger_target = sm_get_ch_name (obj_trigger_target);
7938  if (name_trigger_target == NULL)
7939  {
7940  assert (er_errid () != NO_ERROR);
7941  error = er_errid ();
7942  break;
7943  }
7944 
7945  if (is_pattern_match)
7946  {
7947  if (str_like ((char *) name_trigger_target, class_name, '\\') == 1)
7948  {
7949  error = ml_ext_add (&all_trigger, tmp_obj, NULL);
7950  if (error != NO_ERROR)
7951  {
7952  break;
7953  }
7954  num_trig++;
7955  }
7956  }
7957  else
7958  {
7959  if (strcmp (class_name, name_trigger_target) == 0)
7960  {
7961  error = ml_ext_add (&all_trigger, tmp_obj, NULL);
7962  if (error != NO_ERROR)
7963  {
7964  break;
7965  }
7966  num_trig++;
7967  }
7968  }
7969  }
7970 
7971  if (tmp_trigger)
7972  {
7973  ml_ext_free (tmp_trigger);
7974  }
7975 
7976  if (error != NO_ERROR && all_trigger)
7977  {
7978  ml_ext_free (all_trigger);
7979  all_trigger = NULL;
7980  num_trig = 0;
7981  }
7982  }
7983 
7984 end:
7985  net_buf_cp_int (net_buf, num_trig, NULL);
7986  schema_trigger_meta (net_buf);
7987 
7988  *result = (void *) all_trigger;
7989 }
7990 
7991 static int
7992 sch_class_priv (T_NET_BUF * net_buf, char *class_name, char pat_flag, T_SRV_HANDLE * srv_handle)
7993 {
7994  T_PRIV_TABLE *priv_table = NULL;
7995  int num_tuple = 0;
7996  int priv_table_alloc_num = 0;
7997  unsigned int class_priv;
7998 
7999  if ((pat_flag & CCI_CLASS_NAME_PATTERN_MATCH) == 0)
8000  {
8001  DB_OBJECT *class_obj;
8002 
8003  num_tuple = 0;
8004 
8005  if (class_name)
8006  {
8007  class_obj = db_find_class (class_name);
8008  if (class_obj != NULL)
8009  {
8010  priv_table = (T_PRIV_TABLE *) MALLOC (sizeof (T_PRIV_TABLE) * 8);
8011  if (priv_table == NULL)
8012  {
8013  class_obj = NULL;
8015  }
8016  if (db_get_class_privilege (class_obj, &class_priv) >= 0)
8017  {
8018  num_tuple = set_priv_table (class_priv, (char *) db_get_class_name (class_obj), priv_table, 0);
8019  }
8020  }
8021  }
8022  }
8023  else
8024  {
8025  DB_OBJLIST *obj_list, *obj_tmp;
8026 
8027  obj_list = db_get_all_classes ();
8028 
8029  num_tuple = 0;
8030  for (obj_tmp = obj_list; obj_tmp; obj_tmp = obj_tmp->next)
8031  {
8032  char *p;
8033 
8034  p = (char *) db_get_class_name (obj_tmp->op);
8035  if (class_name != NULL && str_like (p, class_name, '\\') < 1)
8036  {
8037  continue;
8038  }
8039 
8040  if (num_tuple + 8 > priv_table_alloc_num)
8041  {
8042  priv_table = (T_PRIV_TABLE *) REALLOC (priv_table, sizeof (T_PRIV_TABLE) * (priv_table_alloc_num + 128));
8043  priv_table_alloc_num += 128;
8044  if (priv_table == NULL)
8045  {
8047  }
8048  }
8049 
8050  if (db_get_class_privilege (obj_tmp->op, &class_priv) >= 0)
8051  {
8052  num_tuple += set_priv_table (class_priv, (char *) db_get_class_name (obj_tmp->op), priv_table, num_tuple);
8053  }
8054  }
8055 
8056  db_objlist_free (obj_list);
8057  }
8058 
8059  if (num_tuple == 0)
8060  FREE_MEM (priv_table);
8061 
8062  net_buf_cp_int (net_buf, num_tuple, NULL);
8063  schema_classpriv_meta (net_buf);
8064 
8065  srv_handle->session = (void *) priv_table;
8066  srv_handle->sch_tuple_num = num_tuple;
8067  return 0;
8068 }
8069 
8070 static int
8071 sch_attr_priv (T_NET_BUF * net_buf, char *class_name, char *attr_name_pat, char pat_flag, T_SRV_HANDLE * srv_handle)
8072 {
8073  DB_OBJECT *class_obj;
8074  int num_tuple = 0;
8075  T_PRIV_TABLE *priv_table = NULL;
8076  int priv_table_alloc_num = 0;
8077  unsigned int class_priv;
8078  char *attr_name;
8079  DB_ATTRIBUTE *attributes, *attr;
8080 
8081  class_obj = db_find_class (class_name);
8082  if (class_obj == NULL)
8083  {
8084  goto attr_priv_finale;
8085  }
8086 
8087  if (db_get_class_privilege (class_obj, &class_priv) < 0)
8088  {
8089  goto attr_priv_finale;
8090  }
8091 
8092  attributes = db_get_attributes (class_obj);
8093  for (attr = attributes; attr; attr = db_attribute_next (attr))
8094  {
8095  attr_name = (char *) db_attribute_name (attr);
8096  if (pat_flag & CCI_ATTR_NAME_PATTERN_MATCH)
8097  {
8098  if (attr_name_pat != NULL && str_like (attr_name, attr_name_pat, '\\') < 1)
8099  {
8100  continue;
8101  }
8102  }
8103  else
8104  {
8105  if (attr_name_pat == NULL || strcmp (attr_name, attr_name_pat) != 0)
8106  {
8107  continue;
8108  }
8109  }
8110 
8111  if (num_tuple + 8 > priv_table_alloc_num)
8112  {
8113  priv_table_alloc_num += 100;
8114  priv_table = (T_PRIV_TABLE *) REALLOC (priv_table, sizeof (T_PRIV_TABLE) * priv_table_alloc_num);
8115  if (priv_table == NULL)
8116  {
8117  class_obj = NULL;
8119  }
8120  }
8121 
8122  num_tuple += set_priv_table (class_priv, attr_name, priv_table, num_tuple);
8123  }
8124 
8125 attr_priv_finale:
8126 
8127  if (num_tuple == 0)
8128  {
8129  FREE_MEM (priv_table);
8130  }
8131 
8132  net_buf_cp_int (net_buf, num_tuple, NULL);
8133  schema_attrpriv_meta (net_buf);
8134 
8135  srv_handle->session = (void *) priv_table;
8136  srv_handle->sch_tuple_num = num_tuple;
8137 
8138  class_obj = NULL;
8139  return 0;
8140 }
8141 
8142 static int
8143 class_type (DB_OBJECT * class_obj)
8144 {
8145  int error = db_is_system_class (class_obj);
8146 
8147  if (error < 0)
8148  {
8149  return ERROR_INFO_SET (error, DBMS_ERROR_INDICATOR);
8150  }
8151  if (error > 0)
8152  {
8153  return 0;
8154  }
8155 
8156  error = db_is_vclass (class_obj);
8157  if (error < 0)
8158  {
8159  return ERROR_INFO_SET (error, DBMS_ERROR_INDICATOR);
8160  }
8161  if (error > 0)
8162  {
8163  return 1;
8164  }
8165 
8166  return 2;
8167 }
8168 
8169 static int
8170 class_attr_info (const char *class_name, DB_ATTRIBUTE * attr, char *attr_pattern, char pat_flag,
8171  T_ATTR_TABLE * attr_table)
8172 {
8173  const char *p;
8174  int db_type;
8175  DB_DOMAIN *domain;
8176  DB_OBJECT *class_obj;
8177  int set_type = CCI_U_TYPE_UNKNOWN;
8178  int precision;
8179  short scale;
8180 
8181  p = db_attribute_name (attr);
8182 
8183  domain = db_attribute_domain (attr);
8184  db_type = TP_DOMAIN_TYPE (domain);
8185 
8186  attr_table->class_name = class_name;
8187  attr_table->attr_name = p;
8188 
8189  p = db_attribute_comment (attr);
8190  attr_table->comment = p;
8191 
8192  if (TP_IS_SET_TYPE (db_type))
8193  {
8194  set_type = get_set_domain (domain, &precision, &scale, NULL, NULL);
8195  attr_table->domain = set_extended_cas_type ((T_CCI_U_TYPE) set_type, (DB_TYPE) db_type);
8196  precision = 0;
8197  scale = 0;
8198  }
8199  else
8200  {
8201  attr_table->domain = set_extended_cas_type (CCI_U_TYPE_UNKNOWN, (DB_TYPE) db_type);
8202  precision = db_domain_precision (domain);
8203  scale = (short) db_domain_scale (domain);
8204  }
8205 
8206  attr_table->scale = scale;
8207  attr_table->precision = precision;
8208 
8209  if (db_attribute_is_indexed (attr))
8210  {
8211  attr_table->indexed = 1;
8212  }
8213  else
8214  {
8215  attr_table->indexed = 0;
8216  }
8217 
8218  if (db_attribute_is_non_null (attr))
8219  {
8220  attr_table->non_null = 1;
8221  }
8222  else
8223  {
8224  attr_table->non_null = 0;
8225  }
8226 
8227  if (db_attribute_is_shared (attr))
8228  {
8229  attr_table->shared = 1;
8230  }
8231  else
8232  {
8233  attr_table->shared = 0;
8234  }
8235 
8237  {
8238  attr_table->unique = 1;
8239  }
8240  else
8241  {
8242  attr_table->unique = 0;
8243  }
8244 
8245  attr_table->default_val = db_attribute_default (attr);
8246  class_obj = db_attribute_class (attr);
8247  if (class_obj == NULL)
8248  {
8249  attr_table->source_class = NULL;
8250  }
8251  else
8252  {
8253  attr_table->source_class = db_get_class_name (class_obj);
8254  }
8255 
8256  attr_table->attr_order = db_attribute_order (attr) + 1;
8257 
8258  attr_table->set_domain = set_type;
8259 
8260  if (db_attribute_is_primary_key (attr))
8261  {
8262  attr_table->is_key = 1;
8263  }
8264  else
8265  {
8266  attr_table->is_key = 0;
8267  }
8268 
8269  return 1;
8270 }
8271 
8272 static int
8273 set_priv_table (unsigned int class_priv, char *name, T_PRIV_TABLE * priv_table, int index)
8274 {
8275  int grant_opt, priv_type;
8276  int num_tuple;
8277  int i;
8278 
8279  grant_opt = class_priv >> 8;
8280 
8281  num_tuple = 0;
8282  priv_type = 1;
8283  for (i = 0; i < 7; i++)
8284  {
8285  if (class_priv & priv_type)
8286  {
8287  priv_table[index].class_name = name;
8288  priv_table[index].priv = priv_type;
8289 
8290  if (grant_opt & priv_type)
8291  {
8292  priv_table[index].grant = 1;
8293  }
8294  else
8295  {
8296  priv_table[index].grant = 0;
8297  }
8298 
8299  num_tuple++;
8300  index++;
8301  }
8302  priv_type <<= 1;
8303  }
8304 
8305  return num_tuple;
8306 }
8307 
8308 static int
8309 sch_query_execute (T_SRV_HANDLE * srv_handle, char *sql_stmt, T_NET_BUF * net_buf)
8310 {
8311  DB_SESSION *session = NULL;
8312  int stmt_id, num_result, stmt_type;
8313  DB_QUERY_RESULT *result = NULL;
8314  T_QUERY_RESULT *q_result = NULL;
8315  int err_code;
8316 
8318 
8319  session = db_open_buffer (sql_stmt);
8320  if (!session)
8321  {
8324  }
8325 
8326  stmt_id = db_compile_statement (session);
8327  if (stmt_id < 0)
8328  {
8329  err_code = ERROR_INFO_SET (stmt_id, DBMS_ERROR_INDICATOR);
8330  db_close_session (session);
8331  return err_code;
8332  }
8333 
8334  stmt_type = db_get_statement_type (session, stmt_id);
8336  num_result = db_execute_statement (session, stmt_id, &result);
8338 
8339 #ifndef LIBCAS_FOR_JSP
8341 #endif /* !LIBCAS_FOR_JSP */
8342 
8343  if (num_result < 0)
8344  {
8345  err_code = ERROR_INFO_SET (stmt_id, DBMS_ERROR_INDICATOR);
8346  db_close_session (session);
8347  return err_code;
8348  }
8349 
8350  /* success; peek the values in tuples */
8351  (void) db_query_set_copy_tplvalue (result, 0 /* peek */ );
8352 
8353  q_result = (T_QUERY_RESULT *) malloc (sizeof (T_QUERY_RESULT));
8354  if (q_result == NULL)
8355  {
8356  db_query_end (result);
8357  db_close_session (session);
8359  }
8360  hm_qresult_clear (q_result);
8361  q_result->stmt_type = stmt_type;
8362  q_result->stmt_id = stmt_id;
8363  q_result->tuple_count = num_result;
8364  q_result->result = (void *) result;
8365  q_result->col_updatable = FALSE;
8366  q_result->include_oid = FALSE;
8367  q_result->col_update_info = NULL;
8368 
8369  srv_handle->max_col_size = -1;
8370  srv_handle->session = (void *) session;
8371  srv_handle->q_result = q_result;
8372  srv_handle->cur_result = (void *) srv_handle->q_result;
8373  srv_handle->num_q_result = 1;
8374  srv_handle->has_result_set = true;
8375  srv_handle->cur_result_index = 1;
8376  srv_handle->sql_stmt = NULL;
8377 
8378  return num_result;
8379 }
8380 
8381 static int
8382 sch_direct_super_class (T_NET_BUF * net_buf, char *class_name, int pattern_flag, T_SRV_HANDLE * srv_handle)
8383 {
8384  int num_result = 0;
8385  char sql_stmt[QUERY_BUFFER_MAX], *sql_p = sql_stmt;
8386  int avail_size = sizeof (sql_stmt) - 1;
8387 
8388  ut_tolower (class_name);
8389 
8390  STRING_APPEND (sql_p, avail_size, "SELECT class_name, super_class_name \
8391  FROM db_direct_super_class ");
8392  if (pattern_flag & CCI_CLASS_NAME_PATTERN_MATCH)
8393  {
8394  if (class_name)
8395  {
8396  STRING_APPEND (sql_p, avail_size, "WHERE class_name LIKE '%s' ESCAPE '%s' ", class_name,
8398  }
8399  }
8400  else
8401  {
8402  if (class_name == NULL)
8403  {
8404  class_name = (char *) "";
8405  }
8406  STRING_APPEND (sql_p, avail_size, "WHERE class_name = '%s'", class_name);
8407  }
8408 
8409  num_result = sch_query_execute (srv_handle, sql_stmt, net_buf);
8410  if (num_result < 0)
8411  {
8412  return num_result;
8413  }
8414 
8415  net_buf_cp_int (net_buf, num_result, NULL);
8416  schema_directsuper_meta (net_buf);
8417 
8418  return 0;
8419 }
8420 
8421 static int
8422 sch_primary_key (T_NET_BUF * net_buf, char *class_name, T_SRV_HANDLE * srv_handle)
8423 {
8424  char sql_stmt[QUERY_BUFFER_MAX], *sql_p = sql_stmt;
8425  int avail_size = sizeof (sql_stmt) - 1;
8426  int num_result;
8427  DB_OBJECT *class_object;
8428 
8429  ut_tolower (class_name);
8430 
8431  /* is it existing class? */
8432  class_object = db_find_class (class_name);
8433  if (class_object == NULL)
8434  {
8435  net_buf_cp_int (net_buf, 0, NULL);
8436  schema_primarykey_meta (net_buf);
8437  return 0;
8438  }
8439 
8440  STRING_APPEND (sql_p, avail_size, "SELECT a.class_name, b.key_attr_name, b.key_order+1, a.index_name");
8441  STRING_APPEND (sql_p, avail_size, " FROM db_index a, db_index_key b WHERE ");
8442  STRING_APPEND (sql_p, avail_size, " a.class_name = b.class_name ");
8443  STRING_APPEND (sql_p, avail_size, " AND a.index_name = b.index_name ");
8444  STRING_APPEND (sql_p, avail_size, " AND a.is_primary_key = 'YES' ");
8445  STRING_APPEND (sql_p, avail_size, " AND a.class_name = '%s'", class_name);
8446  STRING_APPEND (sql_p, avail_size, " ORDER BY b.key_attr_name");
8447 
8448  if ((num_result = sch_query_execute (srv_handle, sql_stmt, net_buf)) < 0)
8449  {
8450  return num_result;
8451  }
8452 
8453  net_buf_cp_int (net_buf, num_result, NULL);
8454  schema_primarykey_meta (net_buf);
8455 
8456  return 0;
8457 }
8458 
8459 void
8461 {
8462  T_FK_INFO_RESULT *fk, *fk_release;
8463 
8464  fk = fk_res;
8465  while (fk != NULL)
8466  {
8467  fk_release = fk;
8468  fk = fk->next;
8469 
8470  FREE_MEM (fk_release->pktable_name);
8471  FREE_MEM (fk_release->pkcolumn_name);
8472  FREE_MEM (fk_release->fktable_name);
8473  FREE_MEM (fk_release->fkcolumn_name);
8474  FREE_MEM (fk_release->fk_name);
8475  FREE_MEM (fk_release->pk_name);
8476  FREE_MEM (fk_release);
8477  }
8478 }
8479 
8480 static void
8482 {
8483  assert (pivot != NULL && pnew != NULL);
8484  pnew->prev = pivot->prev;
8485  if (pnew->prev != NULL)
8486  {
8487  pnew->prev->next = pnew;
8488  }
8489  pivot->prev = pnew;
8490  pnew->next = pivot;
8491 }
8492 
8493 static void
8495 {
8496  assert (pivot != NULL && pnew != NULL);
8497  pnew->next = pivot->next;
8498  if (pnew->next != NULL)
8499  {
8500  pnew->next->prev = pnew;
8501  }
8502  pivot->next = pnew;
8503  pnew->prev = pivot;
8504 }
8505 
8506 static T_FK_INFO_RESULT *
8507 add_fk_info_result (T_FK_INFO_RESULT * fk_res, const char *pktable_name, const char *pkcolumn_name,
8508  const char *fktable_name, const char *fkcolumn_name, short key_seq,
8509  SM_FOREIGN_KEY_ACTION update_action, SM_FOREIGN_KEY_ACTION delete_action, const char *fk_name,
8510  const char *pk_name, int sort_by)
8511 {
8512  T_FK_INFO_RESULT *new_res, *t, *last;
8513  int cmp;
8514 
8515  assert (pktable_name != NULL && fktable_name != NULL);
8516  new_res = (T_FK_INFO_RESULT *) MALLOC (sizeof (T_FK_INFO_RESULT));
8517  if (new_res == NULL)
8518  {
8519  release_all_fk_info_results (fk_res);
8520  return NULL;
8521  }
8522 
8523  new_res->next = NULL;
8524  new_res->prev = NULL;
8525 
8526  new_res->pktable_name = pktable_name ? strdup (pktable_name) : NULL;
8527  new_res->pkcolumn_name = pkcolumn_name ? strdup (pkcolumn_name) : NULL;
8528  new_res->fktable_name = fktable_name ? strdup (fktable_name) : NULL;
8529  new_res->fkcolumn_name = fkcolumn_name ? strdup (fkcolumn_name) : NULL;
8530  new_res->key_seq = key_seq;
8531  new_res->update_action = update_action;
8532  new_res->delete_action = delete_action;
8533  new_res->fk_name = fk_name ? strdup (fk_name) : NULL;
8534  new_res->pk_name = pk_name ? strdup (pk_name) : NULL;
8535 
8536  if (fk_res == NULL)
8537  {
8538  return new_res;
8539  }
8540 
8541  /* insert new result into ordered list */
8542  t = last = fk_res;
8543  while (t != NULL)
8544  {
8545  if (sort_by == FK_INFO_SORT_BY_PKTABLE_NAME)
8546  {
8547  cmp = intl_identifier_casecmp (t->pktable_name, new_res->pktable_name);
8548  }
8549  else
8550  {
8551  cmp = intl_identifier_casecmp (t->fktable_name, new_res->fktable_name);
8552  }
8553  if (cmp > 0 || (cmp == 0 && t->key_seq > new_res->key_seq))
8554  {
8555  add_fk_info_before (t, new_res);
8556  if (t == fk_res)
8557  {
8558  fk_res = new_res;
8559  }
8560  break;
8561  }
8562 
8563  last = t;
8564  t = t->next;
8565  }
8566  if (t == NULL)
8567  {
8568  add_fk_info_after (last, new_res);
8569  }
8570 
8571  return fk_res;
8572 }
8573 
8574 static int
8575 sch_imported_keys (T_NET_BUF * net_buf, char *fktable_name, void **result)
8576 {
8577  DB_OBJECT *pktable_obj, *fktable_obj;
8578  DB_ATTRIBUTE **fk_attr = NULL, **pk_attr = NULL;
8579  DB_CONSTRAINT *fk_const = NULL, *pk = NULL;
8580  DB_CONSTRAINT *pktable_cons = NULL;
8581  DB_CONSTRAINT_TYPE type;
8582  SM_FOREIGN_KEY_INFO *fk_info;
8583  T_FK_INFO_RESULT *fk_res = NULL;
8584  const char *pktable_name, *pk_name;
8585  int num_fk_info = 0, error = NO_ERROR, i;
8586 
8587  assert (result != NULL);
8588  *result = (void *) NULL;
8589 
8590  if (fktable_name == NULL)
8591  {
8593  }
8594 
8595  fktable_obj = db_find_class (fktable_name);
8596  if (fktable_obj == NULL)
8597  {
8598  /* The followings are possible situations. - A table matching fktable_name does not exist. - User has no
8599  * authorization on the table. - Other error we do not expect. In these cases, we will send an empty result. And
8600  * this rule is also applied to CCI_SCH_EXPORTED_KEYS and CCI_SCH_CROSS_REFERENCE. */
8601  goto send_response;
8602  }
8603 
8604  for (fk_const = db_get_constraints (fktable_obj); fk_const != NULL; fk_const = db_constraint_next (fk_const))
8605  {
8606  type = db_constraint_type (fk_const);
8607  if (type != DB_CONSTRAINT_FOREIGN_KEY)
8608  {
8609  continue;
8610  }
8611 
8612  fk_info = fk_const->fk_info;
8613 
8614  /* Find referenced table to get table name and columns. */
8615  pktable_obj = db_get_foreign_key_ref_class (fk_const);
8616  if (pktable_obj == NULL)
8617  {
8619  goto exit_on_error;
8620  }
8621 
8622  pktable_name = db_get_class_name (pktable_obj);
8623  if (pktable_name == NULL)
8624  {
8626  goto exit_on_error;
8627  }
8628 
8629  pktable_cons = db_get_constraints (pktable_obj);
8630 
8631  error = db_error_code ();
8632  if (error != NO_ERROR)
8633  {
8635  goto exit_on_error;
8636  }
8637 
8638  pk = db_constraint_find_primary_key (pktable_cons);
8639  if (pk == NULL)
8640  {
8641  error =
8643  "Referenced class has no primary key.");
8644  goto exit_on_error;
8645  }
8646 
8647  pk_name = db_constraint_name (pk);
8648 
8649  pk_attr = db_constraint_attributes (pk);
8650  if (pk_attr == NULL)
8651  {
8652  error =
8653  ERROR_INFO_SET_WITH_MSG (ER_SM_INVALID_CONSTRAINT, DBMS_ERROR_INDICATOR, "Primary key has no attribute.");
8654  goto exit_on_error;
8655  }
8656 
8657  fk_attr = db_constraint_attributes (fk_const);
8658  if (fk_attr == NULL)
8659  {
8660  error =
8661  ERROR_INFO_SET_WITH_MSG (ER_SM_INVALID_CONSTRAINT, DBMS_ERROR_INDICATOR, "Foreign key has no attribute.");
8662  goto exit_on_error;
8663  }
8664 
8665  for (i = 0; pk_attr[i] != NULL && fk_attr[i] != NULL; i++)
8666  {
8667  fk_res =
8668  add_fk_info_result (fk_res, pktable_name, db_attribute_name (pk_attr[i]), fktable_name,
8669  db_attribute_name (fk_attr[i]), (short) i + 1, fk_info->update_action,
8670  fk_info->delete_action, fk_info->name, pk_name, FK_INFO_SORT_BY_PKTABLE_NAME);
8671  if (fk_res == NULL)
8672  {
8674  goto exit_on_error;
8675  }
8676 
8677  num_fk_info++;
8678  }
8679 
8680  /* pk_attr and fk_attr is null-terminated array. So, they should be null at this time. If one of them is not
8681  * null, it means that they have different number of attributes. */
8682  assert (pk_attr[i] == NULL && fk_attr[i] == NULL);
8683  if (pk_attr[i] != NULL || fk_attr[i] != NULL)
8684  {
8685  error =
8687  "The number of keys of the foreign " "key is different from that of the "
8688  "primary key.");
8689  goto exit_on_error;
8690  }
8691  }
8692 
8693  *result = (void *) fk_res;
8694 
8695 send_response:
8696  net_buf_cp_int (net_buf, num_fk_info, NULL);
8697  schema_fk_info_meta (net_buf);
8698 
8699  return NO_ERROR;
8700 
8701 exit_on_error:
8702  if (fk_res != NULL)
8703  {
8704  release_all_fk_info_results (fk_res);
8705  }
8706  return error;
8707 }
8708 
8709 static int
8710 sch_exported_keys_or_cross_reference (T_NET_BUF * net_buf, bool find_cross_ref, char *pktable_name, char *fktable_name,
8711  void **result)
8712 {
8713  DB_OBJECT *pktable_obj, *fktable_obj = NULL;
8714  DB_ATTRIBUTE **pk_attr = NULL, **fk_attr;
8715  DB_CONSTRAINT *fk_const = NULL, *pk = NULL;
8716  SM_FOREIGN_KEY_INFO *fk_info;
8717  T_FK_INFO_RESULT *fk_res = NULL;
8718  const char *pk_name;
8719  int num_fk_info = 0, error = NO_ERROR, i;
8720 
8721  assert (result != NULL);
8722  *result = (void *) NULL;
8723 
8724  if (pktable_name == NULL)
8725  {
8727  }
8728 
8729  pktable_obj = db_find_class (pktable_name);
8730  if (pktable_obj == NULL)
8731  {
8732  goto send_response;
8733  }
8734 
8735  if (find_cross_ref)
8736  {
8737  /* If find_cross_ref is true, we will try to find cross reference between primary table and foreign table.
8738  * Otherwise, we will find all foreign keys referring primary key of given table. */
8739  if (fktable_name == NULL)
8740  {
8742  }
8743 
8744  fktable_obj = db_find_class (fktable_name);
8745  if (fktable_obj == NULL)
8746  {
8747  goto send_response;
8748  }
8749  }
8750 
8751  /* If there is no primary key, we will send an empty result. */
8753  if (pk == NULL)
8754  {
8755  goto send_response;
8756  }
8757 
8758  pk_name = db_constraint_name (pk);
8759 
8760  pk_attr = db_constraint_attributes (pk);
8761  if (pk_attr == NULL)
8762  {
8763  return ERROR_INFO_SET_WITH_MSG (ER_SM_INVALID_CONSTRAINT, DBMS_ERROR_INDICATOR, "Primary key has no attribute.");
8764  }
8765 
8766  for (fk_info = pk->fk_info; fk_info != NULL; fk_info = fk_info->next)
8767  {
8768  if (find_cross_ref)
8769  {
8770  if (WS_ISVID (fktable_obj) || oid_compare (WS_REAL_OID (fktable_obj), &(fk_info->self_oid)) != 0)
8771  {
8772  continue;
8773  }
8774  }
8775  else
8776  {
8777  fktable_obj = ws_mop (&(fk_info->self_oid), NULL);
8778  if (fktable_obj == NULL)
8779  {
8781  goto exit_on_error;
8782  }
8783 
8784  fktable_name = (char *) db_get_class_name (fktable_obj);
8785  if (fktable_name == NULL)
8786  {
8788  goto exit_on_error;
8789  }
8790  }
8791 
8792  /* Traverse all constraints in foreign table to find a foreign key referring the primary key. If there is no one,
8793  * return an error. */
8794  fk_attr = NULL;
8795  for (fk_const = db_get_constraints (fktable_obj); fk_const != NULL; fk_const = db_constraint_next (fk_const))
8796  {
8797  if ((int) db_constraint_type (fk_const) == (int) SM_CONSTRAINT_FOREIGN_KEY
8798  && BTID_IS_EQUAL (&(fk_const->fk_info->ref_class_pk_btid), &(pk->index_btid)))
8799  {
8800  fk_attr = db_constraint_attributes (fk_const);
8801  if (fk_attr == NULL)
8802  {
8803  error =
8805  "Foreign key has no attribute.");
8806  goto exit_on_error;
8807  }
8808  break;
8809  }
8810  }
8811  if (fk_attr == NULL)
8812  {
8813  error =
8815  "Primary key has foreign key information, " "but there is no one referring it.");
8816  goto exit_on_error;
8817  }
8818 
8819  for (i = 0; pk_attr[i] != NULL && fk_attr[i] != NULL; i++)
8820  {
8821  fk_res =
8822  add_fk_info_result (fk_res, pktable_name, db_attribute_name (pk_attr[i]), fktable_name,
8823  db_attribute_name (fk_attr[i]), (short) i + 1, fk_info->update_action,
8824  fk_info->delete_action, fk_info->name, pk_name, FK_INFO_SORT_BY_FKTABLE_NAME);
8825  if (fk_res == NULL)
8826  {
8828  goto exit_on_error;
8829  }
8830 
8831  num_fk_info++;
8832  }
8833 
8834  /* pk_attr and fk_attr is null-terminated array. So, they should be null at this time. If one of them is not
8835  * null, it means that they have different number of attributes. */
8836  assert (pk_attr[i] == NULL && fk_attr[i] == NULL);
8837  if (pk_attr[i] != NULL || fk_attr[i] != NULL)
8838  {
8839  error =
8841  "The number of keys of the foreign " "key is different from that of the "
8842  "primary key.");
8843  goto exit_on_error;
8844  }
8845  }
8846 
8847  *result = (void *) fk_res;
8848 
8849 send_response:
8850  net_buf_cp_int (net_buf, num_fk_info, NULL);
8851  schema_fk_info_meta (net_buf);
8852 
8853  return NO_ERROR;
8854 
8855 exit_on_error:
8856  if (fk_res != NULL)
8857  {
8858  release_all_fk_info_results (fk_res);
8859  }
8860  return error;
8861 }
8862 
8863 static short
8864 constraint_dbtype_to_castype (int db_const_type)
8865 {
8866  if (db_const_type == DB_CONSTRAINT_UNIQUE)
8867  {
8868  return CCI_CONSTRAINT_TYPE_UNIQUE;
8869  }
8870 
8871  if (db_const_type == DB_CONSTRAINT_REVERSE_UNIQUE)
8872  {
8873  return CCI_CONSTRAINT_TYPE_UNIQUE;
8874  }
8875 
8876  return CCI_CONSTRAINT_TYPE_INDEX;
8877 }
8878 
8879 static T_PREPARE_CALL_INFO *
8880 make_prepare_call_info (int num_args, int is_first_out)
8881 {
8882  T_PREPARE_CALL_INFO *call_info;
8883  DB_VALUE *ret_val = NULL;
8884  DB_VALUE **arg_val = NULL;
8885  char *param_mode = NULL;
8886  int i;
8887 
8888  call_info = (T_PREPARE_CALL_INFO *) MALLOC (sizeof (T_PREPARE_CALL_INFO));
8889  if (call_info == NULL)
8890  {
8891  return NULL;
8892  }
8893 
8894  memset (call_info, 0, sizeof (T_PREPARE_CALL_INFO));
8895 
8896  ret_val = (DB_VALUE *) MALLOC (sizeof (DB_VALUE));
8897  if (ret_val == NULL)
8898  {
8899  goto exit_on_error;
8900  }
8901  db_make_null (ret_val);
8902 
8903  if (num_args > 0)
8904  {
8905  arg_val = (DB_VALUE **) MALLOC (sizeof (DB_VALUE *) * (num_args + 1));
8906  if (arg_val == NULL)
8907  {
8908  goto exit_on_error;
8909  }
8910  memset (arg_val, 0, sizeof (DB_VALUE *) * (num_args + 1));
8911 
8912  param_mode = (char *) MALLOC (sizeof (char) * num_args);
8913  if (param_mode == NULL)
8914  {
8915  goto exit_on_error;
8916  }
8917 
8918  for (i = 0; i < num_args; i++)
8919  {
8920  arg_val[i] = (DB_VALUE *) MALLOC (sizeof (DB_VALUE));
8921  if (arg_val[i] == NULL)
8922  {
8923  goto exit_on_error;
8924  }
8925  db_make_null (arg_val[i]);
8926  param_mode[i] = CCI_PARAM_MODE_UNKNOWN;
8927  }
8928  }
8929 
8930  call_info->dbval_ret = ret_val;
8931  call_info->dbval_args = arg_val;
8932  call_info->num_args = num_args;
8933  call_info->param_mode = param_mode;
8934  call_info->is_first_out = is_first_out;
8935 
8936  return call_info;
8937 
8938 exit_on_error:
8939  FREE_MEM (call_info);
8940  FREE_MEM (ret_val);
8941  FREE_MEM (param_mode);
8942  if (arg_val != NULL)
8943  {
8944  for (i = 0; i < num_args; i++)
8945  {
8946  FREE_MEM (arg_val[i]);
8947  }
8948  FREE_MEM (arg_val);
8949  }
8950  return NULL;
8951 }
8952 
8953 static void
8955 {
8956  DB_VALUE **args;
8957  int i = 0;
8958 
8959  if (call_info)
8960  {
8961  if (call_info->dbval_ret)
8962  {
8963  db_value_clear ((DB_VALUE *) call_info->dbval_ret);
8964  db_make_null ((DB_VALUE *) call_info->dbval_ret);
8965  }
8966 
8967  args = (DB_VALUE **) call_info->dbval_args;
8968 
8969  if (call_info->is_first_out)
8970  {
8971  db_value_clear (args[0]);
8972  i++;
8973  }
8974 
8975  for (; i < call_info->num_args; i++)
8976  {
8977  if (args[i])
8978  {
8979  db_make_null (args[i]);
8980  }
8981  }
8982  }
8983 }
8984 
8985 static int
8987 {
8988  T_OBJECT tuple_obj;
8989  DB_VALUE **out_vals, null_val, *val_ptr;
8990  int i;
8991  T_PREPARE_CALL_INFO *call_info = srv_handle->prepare_call_info;
8992  T_BROKER_VERSION client_version = req_info->client_version;
8993 
8994  if (call_info == NULL)
8995  {
8996  int err_code;
8998  NET_BUF_ERR_SET (net_buf);
8999  return err_code;
9000  }
9001 
9002  net_buf_cp_int (net_buf, 1, NULL); /* tuple count */
9003  net_buf_cp_int (net_buf, 1, NULL); /* cursor position */
9004  memset (&tuple_obj, 0, sizeof (T_OBJECT));
9005  net_buf_cp_object (net_buf, &tuple_obj);
9006 
9007  val_ptr = (DB_VALUE *) call_info->dbval_ret;
9008  dbval_to_net_buf (val_ptr, net_buf, 0, srv_handle->max_col_size, 1);
9009 
9010  out_vals = (DB_VALUE **) call_info->dbval_args;
9011  db_make_null (&null_val);
9012 
9013  for (i = 0; i < call_info->num_args; i++)
9014  {
9015  val_ptr = &null_val;
9016  if (call_info->param_mode[i] & CCI_PARAM_MODE_OUT)
9017  {
9018  val_ptr = out_vals[i];
9019  }
9020 
9021  dbval_to_net_buf (val_ptr, net_buf, 0, srv_handle->max_col_size, 1);
9022  }
9023 
9024  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V5))
9025  {
9026  net_buf_cp_byte (net_buf, 1); /* fetch_end_flag */
9027  }
9028 
9029  return 0;
9030 }
9031 
9032 static int
9034  unsigned int query_seq_num)
9035 {
9036  int srv_h_id;
9037  int err_code = 0;
9038  T_SRV_HANDLE *srv_handle = NULL;
9039  T_QUERY_RESULT *q_result = NULL;
9040 
9041  srv_h_id = hm_new_srv_handle (&srv_handle, query_seq_num);
9042  if (srv_h_id < 0)
9043  {
9044  err_code = srv_h_id;
9045  goto error;
9046  }
9047  srv_handle->schema_type = -1;
9048 
9049  q_result = (T_QUERY_RESULT *) malloc (sizeof (T_QUERY_RESULT));
9050  if (q_result == NULL)
9051  {
9053  goto error;
9054  }
9055  hm_qresult_clear (q_result);
9056  srv_handle->q_result = q_result;
9057 
9058  q_result->result = src_q_result->result;
9059  q_result->tuple_count = db_query_tuple_count ((DB_QUERY_RESULT *) src_q_result->result);
9060  q_result->stmt_type = src_q_result->stmt_type;
9061  q_result->col_updatable = FALSE;
9062  q_result->include_oid = FALSE;
9063  q_result->num_column = src_q_result->num_column;
9064  q_result->column_info = column_info;
9065  q_result->is_holdable = src_q_result->is_holdable;
9066 
9067  srv_handle->cur_result = (void *) srv_handle->q_result;
9068  srv_handle->cur_result_index = 1;
9069  srv_handle->num_q_result = 1;
9070  srv_handle->has_result_set = true;
9071  srv_handle->max_row = q_result->tuple_count;
9072 
9073  return srv_h_id;
9074 
9075 error:
9076  if (srv_handle)
9077  {
9078  hm_srv_handle_free (srv_h_id);
9079  }
9080  return err_code;
9081 }
9082 
9083 extern void *jsp_get_db_result_set (int h_id);
9084 extern void jsp_srv_handle_free (int h_id);
9085 
9086 static int
9087 ux_use_sp_out (int srv_h_id)
9088 {
9089  T_SRV_HANDLE *srv_handle;
9090  T_QUERY_RESULT *q_result;
9091  DB_QUERY_TYPE *column_info;
9092  int new_handle_id = 0;
9093 
9094  srv_handle = (T_SRV_HANDLE *) jsp_get_db_result_set (srv_h_id);
9095  if (srv_handle == NULL || srv_handle->cur_result == NULL)
9096  {
9097  jsp_srv_handle_free (srv_h_id);
9098  return CAS_ER_SRV_HANDLE;
9099  }
9100 
9101  q_result = (T_QUERY_RESULT *) srv_handle->cur_result;
9102  if (srv_handle->session != NULL && q_result->stmt_id >= 0)
9103  {
9104  column_info = db_get_query_type_list ((DB_SESSION *) srv_handle->session, q_result->stmt_id);
9105  }
9106  else
9107  {
9108  column_info = NULL;
9109  }
9110 
9111  if (q_result->result != NULL && column_info != NULL)
9112  {
9113  new_handle_id = create_srv_handle_with_query_result (q_result, column_info, srv_handle->query_seq_num);
9114  if (new_handle_id > 0)
9115  {
9116  q_result->copied = TRUE;
9117  }
9118  else
9119  {
9120  FREE_MEM (column_info);
9121  }
9122  }
9123 
9124  jsp_srv_handle_free (srv_h_id);
9125 
9126  return new_handle_id;
9127 }
9128 
9129 int
9131 {
9132  int err_code = CAS_NO_ERROR;
9133  DB_QUERY_RESULT *qres = NULL;
9134 
9135  qres = (DB_QUERY_RESULT *) srv_handle->q_result->result;
9136 
9137  if (qres == NULL)
9138  {
9139  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
9140  goto ux_get_generated_keys_error;
9141  }
9142 
9143  if (qres->type == T_SELECT)
9144  {
9145  return ux_get_generated_keys_server_insert (srv_handle, net_buf);
9146  }
9147  if (qres->type == T_CALL)
9148  {
9149  return ux_get_generated_keys_client_insert (srv_handle, net_buf);
9150  }
9151 
9152 ux_get_generated_keys_error:
9153  NET_BUF_ERR_SET (net_buf);
9154  return err_code;
9155 }
9156 
9157 static int
9159 {
9160  T_NET_BUF *tuple_buf, temp_buf;
9161  DB_OBJECT *obj;
9162  DB_OBJECT *class_obj;
9163  DB_ATTRIBUTE *attributes, *attr;
9164  DB_VALUE oid_val, value;
9165  const char *attr_name = "";
9166  char updatable_flag = TRUE;
9167  int err_code = CAS_NO_ERROR;
9168  int num_col_offset, num_cols = 0;
9169  int tuple_count_offset, fetched_offset;
9170  int tuple_count = 0;
9171  T_OBJECT t_object_autoincrement;
9172  DB_QUERY_RESULT *qres = NULL;
9173  int save_stmt_type;
9174 
9175  qres = (DB_QUERY_RESULT *) srv_handle->q_result->result;
9176 
9177  assert (qres != NULL && qres->type == T_SELECT);
9178 
9179  /* save original statement type, since it should not create a resultset */
9180  save_stmt_type = srv_handle->q_result->stmt_type;
9181 
9182  srv_handle->q_result->stmt_type = qres->res.s.stmt_type;
9183  srv_handle->q_result->include_oid = 0;
9184 
9185  net_buf_cp_int (net_buf, 0, NULL); /* result code */
9186 
9187  /* Result Set make */
9188  net_buf_cp_byte (net_buf, srv_handle->q_result->stmt_type); /* commandTypeIs */
9189  net_buf_cp_int (net_buf, srv_handle->q_result->tuple_count, &tuple_count_offset); /* totalTupleNumber */
9190  net_buf_cp_byte (net_buf, updatable_flag); /* isUpdatable */
9191  net_buf_cp_int (net_buf, 0, &num_col_offset); /* columnNumber */
9192 
9193  err_code = db_query_next_tuple (qres);
9194  if (err_code < 0)
9195  {
9196  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
9197  goto ux_get_generated_keys_error;
9198  }
9199 
9200  while (qres->res.s.cursor_id.position == C_ON)
9201  {
9202  tuple_count++;
9203 
9204  tuple_buf = &temp_buf;
9205  net_buf_init (tuple_buf, cas_get_client_version ());
9206 
9207  err_code = db_query_get_tuple_value ((DB_QUERY_RESULT *) srv_handle->q_result->result, 0, &oid_val);
9208  if (err_code < 0)
9209  {
9210  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
9211  goto ux_get_generated_keys_error;
9212  }
9213 
9214  obj = db_get_object (&oid_val);
9215  dbobj_to_casobj (obj, &t_object_autoincrement);
9216 
9217  class_obj = db_get_class (obj);
9218  attributes = db_get_attributes (class_obj);
9219  num_cols = 0;
9220 
9221  for (attr = attributes; attr; attr = db_attribute_next (attr))
9222  {
9223  if (db_attribute_is_auto_increment (attr))
9224  {
9225  attr_name = (char *) db_attribute_name (attr);
9226  err_code = db_get (obj, attr_name, &value);
9227  if (err_code < 0)
9228  {
9229  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
9230  goto ux_get_generated_keys_error;
9231  }
9232 
9233  if (tuple_count == 1)
9234  {
9235  DB_DOMAIN *domain;
9236  char set_type;
9237  short scale;
9238  int precision;
9239  int temp_type;
9240 
9241  domain = db_attribute_domain (attr);
9242  precision = db_domain_precision (domain);
9243  scale = db_domain_scale (domain);
9244  temp_type = TP_DOMAIN_TYPE (domain);
9245  set_type = ux_db_type_to_cas_type (temp_type);
9246 
9247  net_buf_cp_byte (net_buf, set_type);
9248  net_buf_cp_short (net_buf, scale);
9249  net_buf_cp_int (net_buf, precision, NULL);
9250  net_buf_cp_int (net_buf, strlen (attr_name) + 1, NULL);
9251  net_buf_cp_str (net_buf, attr_name, strlen (attr_name) + 1);
9252  }
9253 
9254  /* tuple data */
9255  dbval_to_net_buf (&value, tuple_buf, 1, 0, 0);
9256  num_cols++;
9257  }
9258  }
9259  net_buf_overwrite_int (net_buf, num_col_offset, num_cols);
9260 
9261  /* UTuples make */
9262  if (tuple_count == 1)
9263  {
9264  net_buf_cp_int (net_buf, 1, &fetched_offset); /* fetchedTupleNumber */
9265  }
9266 
9267  net_buf_cp_int (net_buf, tuple_count, NULL); /* index */
9268  net_buf_cp_object (net_buf, &t_object_autoincrement); /* readOID 8 byte */
9269  net_buf_cp_str (net_buf, tuple_buf->data + NET_BUF_HEADER_SIZE, tuple_buf->data_size);
9270  net_buf_clear (tuple_buf);
9271  net_buf_destroy (tuple_buf);
9272 
9273  err_code = db_query_next_tuple (qres);
9274  if (err_code < 0)
9275  {
9276  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
9277  goto ux_get_generated_keys_error;
9278  }
9279  }
9280 
9281  net_buf_overwrite_int (net_buf, tuple_count_offset, tuple_count);
9282  if (tuple_count > 0)
9283  {
9284  net_buf_overwrite_int (net_buf, fetched_offset, tuple_count);
9285  }
9286  else
9287  {
9288  net_buf_cp_int (net_buf, 0, NULL); /* fetchedTupleNumber */
9289  }
9290 
9291  /* restore original statement type */
9292  srv_handle->q_result->stmt_type = save_stmt_type;
9293 
9294  return NO_ERROR;
9295 
9296 ux_get_generated_keys_error:
9297  srv_handle->q_result->stmt_type = save_stmt_type;
9298  NET_BUF_ERR_SET (net_buf);
9299  return err_code;
9300 }
9301 
9302 static int
9304 {
9305  T_NET_BUF *tuple_buf, temp_buf;
9306  DB_OBJECT *obj;
9307  DB_OBJECT *class_obj;
9308  DB_ATTRIBUTE *attributes, *attr;
9309  DB_VALUE oid_val, value;
9310  const char *attr_name = "";
9311  char updatable_flag = TRUE;
9312  int err_code = CAS_NO_ERROR;
9313  int num_col_offset, num_cols = 0;
9314  int tuple_count = 0;
9315  T_OBJECT t_object_autoincrement;
9316  DB_QUERY_RESULT *qres = NULL;
9317  DB_SEQ *seq = NULL;
9318  int i;
9319 
9320  qres = (DB_QUERY_RESULT *) srv_handle->q_result->result;
9321 
9322  assert (qres != NULL && qres->type == T_CALL);
9323 
9325  {
9326  seq = db_get_set (qres->res.c.val_ptr);
9327  if (seq == NULL)
9328  {
9329  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
9330  goto ux_get_generated_keys_error;
9331  }
9332 
9333  tuple_count = db_col_size (seq);
9334  }
9335  else if (DB_VALUE_DOMAIN_TYPE (qres->res.c.val_ptr) == DB_TYPE_OBJECT)
9336  {
9337  /* the default result, when the generated keys have not been requested */
9338  tuple_count = 1;
9339  db_make_object (&oid_val, db_get_object (qres->res.c.val_ptr));
9340  }
9341  else
9342  {
9343  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
9344  goto ux_get_generated_keys_error;
9345  }
9346 
9347  net_buf_cp_int (net_buf, 0, NULL); /* result code */
9348 
9349  /* Result Set make */
9350  net_buf_cp_byte (net_buf, srv_handle->q_result->stmt_type); /* commandTypeIs */
9351  net_buf_cp_int (net_buf, tuple_count, NULL); /* totalTupleNumber */
9352  net_buf_cp_byte (net_buf, updatable_flag); /* isUpdatable */
9353  net_buf_cp_int (net_buf, 0, &num_col_offset); /* columnNumber */
9354 
9355  if (tuple_count == 0)
9356  {
9357  net_buf_cp_int (net_buf, 0, NULL); /* fetchedTupleNumber */
9358  }
9359 
9360  for (i = 0; i < tuple_count; i++)
9361  {
9362  tuple_buf = &temp_buf;
9363  net_buf_init (tuple_buf, CAS_PROTO_CURRENT_VER);
9364 
9365  if (seq != NULL)
9366  {
9367  err_code = db_col_get (seq, i, &oid_val);
9368  if (err_code < 0)
9369  {
9370  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
9371  goto ux_get_generated_keys_error;
9372  }
9373  }
9374 
9375  obj = db_get_object (&oid_val);
9376  dbobj_to_casobj (obj, &t_object_autoincrement);
9377 
9378  class_obj = db_get_class (obj);
9379  attributes = db_get_attributes (class_obj);
9380  num_cols = 0;
9381 
9382  for (attr = attributes; attr; attr = db_attribute_next (attr))
9383  {
9384  if (db_attribute_is_auto_increment (attr))
9385  {
9386  attr_name = (char *) db_attribute_name (attr);
9387  err_code = db_get (obj, attr_name, &value);
9388  if (err_code < 0)
9389  {
9390  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
9391  goto ux_get_generated_keys_error;
9392  }
9393 
9394  if (i == 0)
9395  {
9396  DB_DOMAIN *domain;
9397  char set_type;
9398  short scale;
9399  int precision;
9400  int temp_type;
9401 
9402  domain = db_attribute_domain (attr);
9403  precision = db_domain_precision (domain);
9404  scale = db_domain_scale (domain);
9405  temp_type = TP_DOMAIN_TYPE (domain);
9406  set_type = ux_db_type_to_cas_type (temp_type);
9407 
9408  net_buf_cp_byte (net_buf, set_type);
9409  net_buf_cp_short (net_buf, scale);
9410  net_buf_cp_int (net_buf, precision, NULL);
9411  net_buf_cp_int (net_buf, strlen (attr_name) + 1, NULL);
9412  net_buf_cp_str (net_buf, attr_name, strlen (attr_name) + 1);
9413  }
9414 
9415  /* tuple data */
9416  dbval_to_net_buf (&value, tuple_buf, 1, 0, 0);
9417  num_cols++;
9418  }
9419  }
9420  net_buf_overwrite_int (net_buf, num_col_offset, num_cols);
9421 
9422  /* UTuples make */
9423  if (i == 0)
9424  {
9425  net_buf_cp_int (net_buf, tuple_count, NULL); /* fetchedTupleNumber */
9426  }
9427 
9428  net_buf_cp_int (net_buf, i + 1, NULL); /* index */
9429  net_buf_cp_object (net_buf, &t_object_autoincrement); /* readOID 8 byte */
9430  net_buf_cp_str (net_buf, tuple_buf->data + NET_BUF_HEADER_SIZE, tuple_buf->data_size);
9431  net_buf_clear (tuple_buf);
9432  net_buf_destroy (tuple_buf);
9433  db_value_clear (&oid_val);
9434  }
9435 
9436  return NO_ERROR;
9437 
9438 ux_get_generated_keys_error:
9439  NET_BUF_ERR_SET (net_buf);
9440  return err_code;
9441 }
9442 
9443 int
9444 ux_make_out_rs (int srv_h_id, T_NET_BUF * net_buf, T_REQ_INFO * req_info)
9445 {
9446  T_SRV_HANDLE *srv_handle;
9447  int err_code;
9448  T_QUERY_RESULT *q_result;
9449  char updatable_flag = FALSE;
9450  int i;
9451  DB_QUERY_TYPE *col;
9452  int new_handle_id = 0;
9453  T_BROKER_VERSION client_version = req_info->client_version;
9454 
9455  new_handle_id = ux_use_sp_out (srv_h_id);
9456  srv_handle = hm_find_srv_handle (new_handle_id);
9457 
9458  if (srv_handle == NULL || srv_handle->cur_result == NULL)
9459  {
9461  goto ux_make_out_rs_error;
9462  }
9463 
9464  q_result = (T_QUERY_RESULT *) srv_handle->cur_result;
9465  if (q_result->stmt_type != CUBRID_STMT_SELECT)
9466  {
9468  goto ux_make_out_rs_error;
9469  }
9470 
9471  net_buf_cp_int (net_buf, 0, NULL); /* result code */
9472 
9473  net_buf_cp_int (net_buf, new_handle_id, NULL);
9474  net_buf_cp_byte (net_buf, q_result->stmt_type);
9475  net_buf_cp_int (net_buf, srv_handle->max_row, NULL);
9476  net_buf_cp_byte (net_buf, updatable_flag);
9477  net_buf_cp_int (net_buf, q_result->num_column, NULL);
9478 
9479  q_result->null_type_column = (char *) MALLOC (q_result->num_column);
9480  if (q_result->null_type_column == NULL)
9481  {
9483  goto ux_make_out_rs_error;
9484  }
9485 
9486  for (i = 0, col = (DB_QUERY_TYPE *) q_result->column_info; i < q_result->num_column;
9487  i++, col = db_query_format_next (col))
9488  {
9489  char set_type;
9490  unsigned char cas_type;
9491  int precision;
9492  short scale;
9493  const char *col_name, *attr_name, *class_name;
9494  DB_DOMAIN *domain;
9495  DB_TYPE db_type;
9496  char charset;
9497 
9498  if (col == NULL)
9499  {
9501  goto ux_make_out_rs_error;
9502  }
9503 
9504  q_result->null_type_column[i] = 0;
9505 
9507  {
9508  col_name = db_query_format_name (col);
9509  }
9510  else
9511  {
9512  col_name = db_query_format_original_name (col);
9513  if (strchr (col_name, '*') != NULL)
9514  {
9515  col_name = db_query_format_name (col);
9516  }
9517  }
9518  class_name = db_query_format_class_name (col);
9519  attr_name = "";
9520 
9521  domain = db_query_format_domain (col);
9522  db_type = TP_DOMAIN_TYPE (domain);
9523 
9524  if (TP_IS_SET_TYPE (db_type))
9525  {
9526  set_type = get_set_domain (domain, NULL, NULL, NULL, &charset);
9527  cas_type = set_extended_cas_type ((T_CCI_U_TYPE) set_type, db_type);
9528  precision = 0;
9529  scale = 0;
9530  }
9531  else
9532  {
9533  cas_type = set_extended_cas_type (CCI_U_TYPE_UNKNOWN, db_type);
9534  precision = db_domain_precision (domain);
9535  scale = (short) db_domain_scale (domain);
9536  charset = db_domain_codeset (domain);
9537  }
9538 
9539  if (IS_NULL_CAS_TYPE (cas_type))
9540  {
9541  q_result->null_type_column[i] = 1;
9542  }
9543 
9544 #ifndef LIBCAS_FOR_JSP
9545  if (shm_appl->max_string_length >= 0)
9546  {
9547  if (precision < 0 || precision > shm_appl->max_string_length)
9548  {
9549  precision = shm_appl->max_string_length;
9550  }
9551  }
9552 #else /* !LIBCAS_FOR_JSP */
9553  /* precision = DB_MAX_STRING_LENGTH; */
9554 #endif /* !LIBCAS_FOR_JSP */
9555 
9556  set_column_info (net_buf, cas_type, scale, precision, charset, col_name, attr_name, class_name,
9557  (char) db_query_format_is_non_null (col), client_version);
9558  }
9559 
9560  return 0;
9561 ux_make_out_rs_error:
9562  NET_BUF_ERR_SET (net_buf);
9563  return err_code;
9564 }
9565 
9566 static int
9568 {
9569 #ifdef LIBCAS_FOR_JSP
9570  return -1;
9571 #else /* !LIBCAS_FOR_JSP */
9572 
9573  bool jdbc_cache_is_hint;
9574  int jdbc_cache_life_time = shm_appl->jdbc_cache_life_time;
9575 
9576  if (shm_appl->jdbc_cache == 0 || db_get_statement_type (session, stmt_id) != CUBRID_STMT_SELECT
9578  {
9579  return -1;
9580  }
9581 
9582  jdbc_cache_is_hint = db_get_jdbccachehint (session, stmt_id, &jdbc_cache_life_time);
9583 
9584  if (shm_appl->jdbc_cache_only_hint && !jdbc_cache_is_hint)
9585  {
9586  return -1;
9587  }
9588 
9589  return jdbc_cache_life_time;
9590 #endif
9591 }
9592 
9593 int
9595 {
9596 
9597 #ifndef LIBCAS_FOR_JSP
9598  int err_code;
9599  int elapsed_sec = 0, elapsed_msec = 0;
9600 
9601  if (req_info->need_auto_commit == TRAN_AUTOCOMMIT)
9602  {
9603  cas_log_write (0, false, "auto_commit %s", tran_was_latest_query_committed ()? "(local)" : "(server)");
9604  err_code = ux_end_tran (CCI_TRAN_COMMIT, true);
9605  cas_log_write (0, false, "auto_commit %d", err_code);
9606  logddl_set_msg ("auto_commit %d", err_code);
9607  }
9608  else if (req_info->need_auto_commit == TRAN_AUTOROLLBACK)
9609  {
9610  cas_log_write (0, false, "auto_commit %s", tran_was_latest_query_aborted ()? "(local)" : "(server)");
9611  err_code = ux_end_tran (CCI_TRAN_ROLLBACK, true);
9612  cas_log_write (0, false, "auto_rollback %d", err_code);
9613  logddl_set_msg ("auto_rollback %d", err_code);
9614  }
9615  else
9616  {
9618  }
9619 
9620  if (err_code < 0)
9621  {
9622  NET_BUF_ERR_SET (net_buf);
9623  req_info->need_rollback = TRUE;
9625  }
9626  else
9627  {
9628  req_info->need_rollback = FALSE;
9629  }
9630 
9631  tran_timeout =
9632  ut_check_timeout (&tran_start_time, NULL, shm_appl->long_transaction_time, &elapsed_sec, &elapsed_msec);
9633  if (tran_timeout >= 0)
9634  {
9637  }
9638  if (err_code < 0 || errors_in_transaction > 0)
9639  {
9640  cas_log_end (SQL_LOG_MODE_ERROR, elapsed_sec, elapsed_msec);
9642  }
9643  else
9644  {
9645  if (tran_timeout >= 0 || query_timeout >= 0)
9646  {
9647  cas_log_end (SQL_LOG_MODE_TIMEOUT, elapsed_sec, elapsed_msec);
9648  }
9649  else
9650  {
9651  cas_log_end (SQL_LOG_MODE_NONE, elapsed_sec, elapsed_msec);
9652  }
9653  }
9654  gettimeofday (&tran_start_time, NULL);
9655  gettimeofday (&query_start_time, NULL);
9656  tran_timeout = 0;
9657  query_timeout = 0;
9658 
9659  return err_code;
9660 #endif /* !LIBCAS_FOR_JSP */
9661 
9662  return -1;
9663 }
9664 
9665 static bool
9666 has_stmt_result_set (char stmt_type)
9667 {
9668  switch (stmt_type)
9669  {
9670  case CUBRID_STMT_SELECT:
9671  case CUBRID_STMT_CALL:
9672  case CUBRID_STMT_GET_STATS:
9673  case CUBRID_STMT_EVALUATE:
9674  return true;
9675 
9676  default:
9677  break;
9678  }
9679 
9680  return false;
9681 }
9682 
9683 static bool
9685 {
9686  // To close an updatable cursor is dangerous since it lose locks and updating cursor is allowed before closing it.
9687 
9688  if (srv_handle->auto_commit_mode == TRUE && srv_handle->cur_result_index == srv_handle->num_q_result
9689  && srv_handle->forward_only_cursor == TRUE && srv_handle->is_updatable == FALSE)
9690  {
9691  return true;
9692  }
9693 
9694  return false;
9695 }
9696 
9697 #if !(defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL))
9698 void
9700 {
9701  db_set_connect_status (status);
9702 }
9703 
9704 int
9706 {
9707  return db_get_connect_status ();
9708 }
9709 #endif
9710 
9711 void
9713 {
9714  if (cas_EHCTX == NULL)
9715  {
9716  return;
9717  }
9718 
9719  if (cas_EHCTX->from == 0)
9720  {
9721  cas_EHCTX->from = eid;
9722  }
9723  else
9724  {
9725  cas_EHCTX->to = eid;
9726  }
9727 }
9728 
9729 /*****************************
9730  move from cas_log.c
9731  *****************************/
9732 void
9734 {
9736 
9737  ectx = (CAS_ERROR_LOG_HANDLE_CONTEXT *) malloc (sizeof (*ectx));
9738  if (ectx == NULL)
9739  {
9740  return;
9741  }
9742 
9743  ectx->from = 0;
9744  ectx->to = 0;
9745 
9746  if (cas_EHCTX != NULL)
9747  {
9748  free (cas_EHCTX);
9749  }
9750 
9751  cas_EHCTX = ectx;
9753 }
9754 
9755 void
9757 {
9758  if (cas_EHCTX != NULL)
9759  {
9760  free (cas_EHCTX);
9761  cas_EHCTX = NULL;
9763  }
9764 }
9765 
9766 void
9768 {
9769  if (cas_EHCTX == NULL)
9770  {
9771  return;
9772  }
9773 
9774  cas_EHCTX->from = 0;
9775  cas_EHCTX->to = 0;
9776 }
9777 
9778 
9779 char *
9780 cas_log_error_handler_asprint (char *buf, size_t bufsz, bool clear)
9781 {
9782  char *buf_p;
9783  unsigned int from, to;
9784 
9785  if (buf == NULL || bufsz <= 0)
9786  {
9787  return NULL;
9788  }
9789 
9790  if (cas_EHCTX == NULL || cas_EHCTX->from == 0)
9791  {
9792  buf[0] = '\0';
9793  return buf;
9794  }
9795 
9796  from = cas_EHCTX->from;
9797  to = cas_EHCTX->to;
9798 
9799  if (clear)
9800  {
9801  cas_EHCTX->from = 0;
9802  cas_EHCTX->to = 0;
9803  }
9804 
9805  /* ", EID = <int> ~ <int>" : 32 bytes suffice */
9806  if (bufsz < 32)
9807  {
9808  buf_p = (char *) malloc (32);
9809 
9810  if (buf_p == NULL)
9811  {
9812  return NULL;
9813  }
9814  }
9815  else
9816  {
9817  buf_p = buf;
9818  }
9819 
9820  /* actual print */
9821  if (to != 0)
9822  {
9823  snprintf (buf_p, 32, ", EID = %u ~ %u", from, to);
9824  }
9825  else
9826  {
9827  snprintf (buf_p, 32, ", EID = %u", from);
9828  }
9829 
9830  return buf_p;
9831 }
9832 
9833 int
9835 {
9836  return srv_handle->q_result->tuple_count;
9837 }
9838 
9839 /*****************************
9840  move from cas_sql_log2.c
9841  *****************************/
9842 void
9844 {
9847 }
9848 
9849 void
9851 {
9853  {
9855  }
9856  else
9857  {
9859  }
9861 }
9862 
9863 int
9864 ux_lob_new (int lob_type, T_NET_BUF * net_buf)
9865 {
9866  DB_VALUE lob_dbval;
9867  int err_code;
9868  T_LOB_HANDLE cas_lob;
9869  int lob_handle_size;
9870  DB_ELO *elo_debug;
9871 
9872  err_code = db_create_fbo (&lob_dbval, (lob_type == CCI_U_TYPE_BLOB) ? DB_TYPE_BLOB : DB_TYPE_CLOB);
9873  cas_log_debug (ARG_FILE_LINE, "ux_lob_new: result_code=%d", err_code);
9874  if (err_code < 0)
9875  {
9877  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
9878  NET_BUF_ERR_SET (net_buf);
9879  return err_code;
9880  }
9881 
9882  /* set result */
9883  dblob_to_caslob (&lob_dbval, &cas_lob);
9884  lob_handle_size = NET_SIZE_INT + NET_SIZE_INT64 + NET_SIZE_INT + cas_lob.locator_size;
9885  net_buf_cp_int (net_buf, lob_handle_size, NULL);
9886  net_buf_cp_lob_handle (net_buf, &cas_lob);
9887 
9888  elo_debug = db_get_elo (&lob_dbval);
9889 
9890  cas_log_debug (ARG_FILE_LINE, "ux_lob_new: locator=%s, size=%lld, type=%u", elo_debug->locator,
9891  elo_debug->size, elo_debug->type);
9892 
9893  db_value_clear (&lob_dbval);
9894  return 0;
9895 }
9896 
9897 int
9898 ux_lob_write (DB_VALUE * lob_dbval, INT64 offset, int size, char *data, T_NET_BUF * net_buf)
9899 {
9900  DB_BIGINT size_written;
9901  int err_code;
9902  DB_ELO *elo_debug;
9903 
9904  elo_debug = db_get_elo (lob_dbval);
9905  cas_log_debug (ARG_FILE_LINE, "ux_lob_write: locator=%s, size=%lld, type=%u", elo_debug->locator,
9906  elo_debug->size, elo_debug->type);
9907 
9908  err_code = db_elo_write (elo_debug, offset, data, size, &size_written);
9909  cas_log_debug (ARG_FILE_LINE, "ux_lob_write: result_code=%d", size_written);
9910  if (err_code < 0)
9911  {
9913  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
9914  NET_BUF_ERR_SET (net_buf);
9915  return err_code;
9916  }
9917 
9918  /* set result: on success, bytes written */
9919  net_buf_cp_int (net_buf, (int) size_written, NULL);
9920 
9921  return 0;
9922 }
9923 
9924 int
9925 ux_lob_read (DB_VALUE * lob_dbval, INT64 offset, int size, T_NET_BUF * net_buf)
9926 {
9927  DB_BIGINT size_read;
9928  int err_code;
9929  char *data = NET_BUF_CURR_PTR (net_buf) + NET_SIZE_INT;
9930  DB_ELO *elo_debug;
9931 
9932  elo_debug = db_get_elo (lob_dbval);
9933  cas_log_debug (ARG_FILE_LINE, "ux_lob_read: locator=%s, size=%lld, type=%u", elo_debug->locator,
9934  elo_debug->size, elo_debug->type);
9935 
9936  if (size + NET_SIZE_INT > NET_BUF_FREE_SIZE (net_buf))
9937  {
9938  size = NET_BUF_FREE_SIZE (net_buf) - NET_SIZE_INT;
9939  cas_log_debug (ARG_FILE_LINE, "ux_lob_read: length reduced to %d", size);
9940  }
9941 
9942  err_code = db_elo_read (elo_debug, offset, data, size, &size_read);
9943  cas_log_debug (ARG_FILE_LINE, "ux_lob_read: result_code=%d size_read=%lld", err_code, size_read);
9944  if (err_code < 0)
9945  {
9947  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
9948  NET_BUF_ERR_SET (net_buf);
9949  return err_code;
9950  }
9951 
9952  /* set result: on success, bytes read */
9953  net_buf_cp_int (net_buf, (int) size_read, NULL);
9954  net_buf->data_size += (int) size_read;
9955 
9956  return 0;
9957 }
9958 
9959 /* converting a DB_VALUE to a char taking care of nchar strings */
9960 static const char *
9962 {
9963  const char *val_str = NULL;
9964  DB_TYPE val_type;
9965  int err, len;
9966 
9967  val_type = db_value_type (value);
9968 
9969  if (val_type == DB_TYPE_NCHAR || val_type == DB_TYPE_VARNCHAR)
9970  {
9971  err = db_value_coerce (value, value_string, db_type_to_db_domain (DB_TYPE_VARNCHAR));
9972  if (err >= 0)
9973  {
9974  val_str = db_get_nchar (value_string, &len);
9975  }
9976  }
9977  else
9978  {
9979  err = db_value_coerce (value, value_string, db_type_to_db_domain (DB_TYPE_VARCHAR));
9980  if (err >= 0)
9981  {
9982  val_str = db_get_char (value_string, &len);
9983  }
9984  }
9985 
9986  return val_str;
9987 }
9988 
9989 /*
9990  * serialize_collection_as_string() - This function builds a string with all
9991  * the values in the collection converted to string.
9992  * col(in): collection value
9993  * out(out): out string
9994  */
9995 static void
9997 {
9999  DB_VALUE value, value_string;
10000  int i, size;
10001  int needed_size = 0;
10002  const char *single_value = NULL;
10003 
10004  *out = NULL;
10005 
10006  if (!TP_IS_SET_TYPE (db_value_type (col)))
10007  {
10008  return;
10009  }
10010 
10011  db_set = db_get_collection (col);
10012  size = db_set_size (db_set);
10013 
10014  /* first compute the size of the result */
10015  for (i = 0; i < size; i++)
10016  {
10017  if (db_set_get (db_set, i, &value) != NO_ERROR)
10018  {
10019  return;
10020  }
10021 
10022  single_value = convert_db_value_to_string (&value, &value_string);
10023  if (single_value == NULL)
10024  {
10025  db_value_clear (&value);
10026  return;
10027  }
10028 
10029  needed_size += strlen (single_value);
10030 
10031  db_value_clear (&value_string);
10032  db_value_clear (&value);
10033  }
10034 
10035  /* now compute the result */
10036  needed_size += 2 * size; /* for ", " */
10037  needed_size += 2 + 1; /* for {} and \0 */
10038 
10039  *out = (char *) MALLOC (needed_size);
10040  if (*out == NULL)
10041  {
10042  return;
10043  }
10044 
10045  strcpy (*out, "{");
10046 
10047  for (i = 0; i < size; i++)
10048  {
10049  if (db_set_get (db_set, i, &value) != NO_ERROR)
10050  {
10051  FREE (*out);
10052  *out = NULL;
10053  return;
10054  }
10055 
10056  single_value = convert_db_value_to_string (&value, &value_string);
10057  if (single_value == NULL)
10058  {
10059  db_value_clear (&value);
10060 
10061  FREE (*out);
10062  *out = NULL;
10063  return;
10064  }
10065 
10066  strcat (*out, single_value);
10067  if (i != size - 1)
10068  {
10069  strcat (*out, ", ");
10070  }
10071 
10072  db_value_clear (&value_string);
10073  db_value_clear (&value);
10074  }
10075 
10076  strcat (*out, "}");
10077 }
10078 
10079 /*
10080  * get_backslash_escape_string() - This function returns proper backslash escape
10081  * string according to the value of 'no_backslash_escapes' configuration.
10082  */
10083 static char *
10085 {
10087  {
10088  return (char *) "\\";
10089  }
10090  else
10091  {
10092  return (char *) "\\\\";
10093  }
10094 }
10095 
10096 static void
10098 {
10099  assert (as_info_p != NULL);
10100 
10102  as_info_p->num_queries_processed++;
10103 
10104  switch (stmt_type)
10105  {
10106  case CUBRID_STMT_SELECT:
10108  as_info_p->num_select_queries++;
10109  break;
10110  case CUBRID_STMT_INSERT:
10112  as_info_p->num_insert_queries++;
10113  break;
10114  case CUBRID_STMT_UPDATE:
10116  as_info_p->num_update_queries++;
10117  break;
10118  case CUBRID_STMT_DELETE:
10120  as_info_p->num_delete_queries++;
10121  break;
10122  default:
10123  break;
10124  }
10125 }
10126 
10127 static bool
10129 {
10130 #if !defined(LIBCAS_FOR_JSP)
10131  if (shm_appl->cas_rctime > 0 && db_need_reconnect ())
10132  {
10133  if ((time (NULL) - as_info->last_connect_time) > shm_appl->cas_rctime)
10134  {
10135  return true;
10136  }
10137  }
10138 #endif /* !LIBCAS_FOR_JSP */
10139  return false;
10140 }
10141 
10142 static void
10144 {
10145 #if !defined(LIBCAS_FOR_JSP)
10146  bool reset_after_endtran = false;
10147  char *hostlist[MAX_NUM_DB_HOSTS * 2 + 1];
10148  char **hostlist_p;
10149  char buf[LINE_MAX], *p, *last;
10150  int list_size = DIM (hostlist);
10151 
10152  if (db_get_host_list_with_given_status (hostlist, list_size, DB_HS_CONN_FAILURE) > 0)
10153  {
10154  hostlist_p = hostlist;
10155 
10156  p = buf;
10157  last = p + sizeof (buf);
10158  p += snprintf (p, MAX (last - p, 0), "WARNING: failed to connect to %s", *hostlist_p++);
10159  while (*hostlist_p != NULL)
10160  {
10161  p += snprintf (p, MAX (last - p, 0), ", %s", *hostlist_p++);
10162  }
10163  snprintf (p, MAX (last - p, 0), ".");
10164 
10165  cas_log_write_and_end (0, false, buf);
10166  }
10167 
10168  if (db_get_host_list_with_given_status (hostlist, list_size, DB_HS_CONN_TIMEOUT) > 0)
10169  {
10170  hostlist_p = hostlist;
10171 
10172  p = buf;
10173  last = p + sizeof (buf);
10174  p += snprintf (p, MAX (last - p, 0), "WARNING: attempt to connect to %s", *hostlist_p++);
10175  while (*hostlist_p != NULL)
10176  {
10177  p += snprintf (p, MAX (last - p, 0), ", %s", *hostlist_p++);
10178  }
10179  snprintf (p, MAX (last - p, 0), " timed out.");
10180 
10181  cas_log_write_and_end (0, false, buf);
10182  }
10183 
10184  if (db_get_host_list_with_given_status (hostlist, list_size, DB_HS_UNUSABLE_DATABASES) > 0)
10185  {
10186  hostlist_p = hostlist;
10187 
10188  p = buf;
10189  last = p + sizeof (buf);
10190  p += snprintf (p, MAX (last - p, 0), "WARNING: skipped unusable databases at %s", *hostlist_p++);
10191  while (*hostlist_p != NULL)
10192  {
10193  p += snprintf (p, MAX (last - p, 0), ", %s", *hostlist_p++);
10194  }
10195  snprintf (p, MAX (last - p, 0), ".");
10196 
10197  cas_log_write_and_end (0, false, buf);
10198  }
10199 
10200  if (err_code == NO_ERROR && db_need_reconnect () == true)
10201  {
10203  {
10205  {
10206  reset_after_endtran = true;
10207  cas_log_write_and_end (0, false, "WARNING: connected to HA standby DB host.");
10208  }
10209  else
10210  {
10211  cas_log_write_and_end (0, false, "WARNING: connected to HA active DB host.");
10212  }
10213  }
10214 
10215  if (db_get_host_list_with_given_status (hostlist, list_size, DB_HS_HA_DELAYED) > 0)
10216  {
10217  hostlist_p = hostlist;
10218  p = buf;
10219  last = p + sizeof (buf);
10220  p += snprintf (p, MAX (last - p, 0), "WARNING: HA replication delay detected on %s", *hostlist_p++);
10221 
10222  while (*hostlist_p != NULL)
10223  {
10224  p += snprintf (p, MAX (last - p, 0), ", %s", *hostlist_p++);
10225  }
10226  snprintf (p, MAX (last - p, 0), ".");
10227 
10228  cas_log_write_and_end (0, false, buf);
10229  }
10230 
10232  {
10233  cas_log_write_and_end (0, false, "WARNING: connected to host " "with HA replication delay.");
10234  }
10235 
10237  {
10238  cas_log_write_and_end (0, false, "WARNING: connected to non-preferred host.");
10239  }
10240 
10241  if (reset_after_endtran == false && shm_appl->cas_rctime > 0)
10242  {
10243  cas_log_write_and_end (0, false, "WARNING: connection will be reset " "in %d sec(s) or later.",
10244  shm_appl->cas_rctime);
10245  }
10246  }
10247 #endif /* !LIBCAS_FOR_JSP */
10248 }
10249 
10250 /*
10251  * set_host_variables ()
10252  *
10253  * return: error code or NO_ERROR
10254  * db_session(in):
10255  * num_bind(in):
10256  * in_values(in):
10257  */
10258 static int
10259 set_host_variables (DB_SESSION * session, int num_bind, DB_VALUE * in_values)
10260 {
10261  int err_code;
10262  DB_CLASS_MODIFICATION_STATUS cls_status;
10263  int stmt_id, stmt_count;
10264 
10265  err_code = db_push_values (session, num_bind, in_values);
10266  if (err_code != NO_ERROR)
10267  {
10268  stmt_count = db_statement_count (session);
10269  for (stmt_id = 0; stmt_id < stmt_count; stmt_id++)
10270  {
10271  cls_status = db_has_modified_class (session, stmt_id);
10272  if (cls_status == DB_CLASS_MODIFIED)
10273  {
10275 
10276  return err_code;
10277  }
10278  else if (cls_status == DB_CLASS_ERROR)
10279  {
10280  assert (er_errid () != NO_ERROR);
10281  err_code = er_errid ();
10282  if (err_code == NO_ERROR)
10283  {
10284  err_code = ER_FAILED;
10285  }
10286  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
10287 
10288  return err_code;
10289  }
10290  }
10291 
10292  err_code = ERROR_INFO_SET (err_code, DBMS_ERROR_INDICATOR);
10293  }
10294 
10295  return err_code;
10296 }
10297 
10298 /*
10299  * set_extended_cas_type () - returns the extended cas type
10300  * TCCT TTTT : T = type bits, CC = collection bits
10301  *
10302  * return: cas_type
10303  * set_type(in): cas type from collection (if db_type is a collection)
10304  * db_type(in): basic type
10305  */
10306 static unsigned char
10307 set_extended_cas_type (T_CCI_U_TYPE u_set_type, DB_TYPE db_type)
10308 {
10309  /* todo: T_CCI_U_TYPE duplicates db types. */
10310  unsigned char u_set_type_lsb, u_set_type_msb;
10311 
10312  if (TP_IS_SET_TYPE (db_type))
10313  {
10314  unsigned char cas_ext_type;
10315 
10316  u_set_type_lsb = u_set_type & 0x1f;
10317  u_set_type_msb = (u_set_type & 0x20) << 2;
10318 
10319  u_set_type = (T_CCI_U_TYPE) (u_set_type_lsb | u_set_type_msb);
10320 
10321  cas_ext_type = CAS_TYPE_COLLECTION (db_type, u_set_type);
10322  return cas_ext_type;
10323  }
10324 
10325  u_set_type = (T_CCI_U_TYPE) ux_db_type_to_cas_type (db_type);
10326 
10327  u_set_type_lsb = u_set_type & 0x1f;
10328  u_set_type_msb = (u_set_type & 0x20) << 2;
10329 
10330  u_set_type = (T_CCI_U_TYPE) (u_set_type_lsb | u_set_type_msb);
10331 
10332  return u_set_type;
10333 }
10334 
10335 static short
10336 encode_ext_type_to_short (T_BROKER_VERSION client_version, unsigned char cas_type)
10337 {
10338  short ret_type;
10339  if (DOES_CLIENT_UNDERSTAND_THE_PROTOCOL (client_version, PROTOCOL_V7))
10340  {
10341  unsigned char msb_byte, lsb_byte;
10342 
10343  msb_byte = cas_type & CCI_CODE_COLLECTION;
10345 
10346  lsb_byte = CCI_GET_COLLECTION_DOMAIN (cas_type);
10347 
10348  ret_type = ((short) msb_byte << 8) | ((short) lsb_byte);
10349  }
10350  else
10351  {
10352  assert (cas_type < 0x80);
10353  ret_type = (short) cas_type;
10354  }
10355 
10356  return ret_type;
10357 }
10358 
10359 //
10360 // do_commit_after_execute () - commit transaction immediately after executing query or queries.
10361 //
10362 // return : true to commit, false otherwise
10363 // server_handle (in) : server handle
10364 //
10365 static bool
10366 do_commit_after_execute (const t_srv_handle & server_handle)
10367 {
10368  // theoretically, when auto-commit is set to on, transactions should be committed automatically after query
10369  // execution.
10370  //
10371  // in practice, "immediately" after execution can be different moments. ideally, from performance point of view,
10372  // server commits transaction after query execution. however, that is not always possible.
10373  //
10374  // in some cases, the client does this commit. in other cases, even client cannot do commit (e.g. large result set),
10375  // and commit comes when cursor reaches the end of result set.
10376  //
10377  // here, it is decided when client does the commit. the curent condition is no result set.
10378  //
10379  // IMPORTANT EXCEPTION: server commit must always be followed by a client commit! when result set is small (less than
10380  // one page) and when other conditions are met too, server commits automatically.
10381  //
10382 
10383  if (server_handle.auto_commit_mode != TRUE)
10384  {
10385  return false;
10386  }
10387 
10388  // safe-guard: do not commit an aborted query; this function should not be called for error cases.
10390 
10392  {
10393  return true;
10394  }
10395 
10396  if (server_handle.has_result_set)
10397  {
10398  return false;
10399  }
10400  else
10401  {
10402  return true;
10403  }
10404 }
DB_OBJECT * db_find_class(const char *name)
Definition: db_info.c:133
unsigned int TZ_ID
Definition: dbtype_def.h:756
char * class_name
Definition: cas_execute.c:153
int db_trigger_comment(DB_OBJECT *trobj, char **comment)
Definition: db_obj.c:1763
DB_C_FLOAT db_get_float(const DB_VALUE *value)
void schema_classpriv_meta(T_NET_BUF *net_buf)
#define NET_SIZE_BYTE
Definition: cas_network.h:41
INT64 num_long_transactions
Definition: broker_shm.h:347
bool cas_default_ansi_quotes
Definition: cas.c:178
#define CHK_OPTIMIZATION_LEVEL_VALID(level)
Definition: cas_execute.c:142
T_QUERY_RESULT * q_result
Definition: cas_handle.h:159
static int fetch_constraint(T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *)
Definition: cas_execute.c:5975
DB_OBJECT * db_attribute_class(DB_ATTRIBUTE *attribute)
Definition: db_info.c:1189
db_error_log_handler_t db_register_error_log_handler(db_error_log_handler_t f)
Definition: db_admin.c:2183
void logddl_set_msg(const char *fmt,...)
Definition: ddl_log.c:392
#define CAS_TYPE_COLLECTION(DB_TYPE, SET_TYPE)
Definition: cas_execute.h:43
char database_name[SRV_CON_DBNAME_SIZE]
Definition: broker_shm.h:352
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
int db_make_datetime(DB_VALUE *value, const DB_DATETIME *datetime)
#define ER_TP_CANT_COERCE
Definition: error_code.h:250
T_BROKER_VERSION client_version
Definition: cas_net_buf.h:100
int cas_default_isolation_level
Definition: cas.c:176
int db_value_coerce(const DB_VALUE *src, DB_VALUE *dest, const DB_DOMAIN *desired_domain)
Definition: db_macro.c:1779
#define NO_ERROR
Definition: error_code.h:46
T_BROKER_VERSION client_version
Definition: cas.h:75
char * pktable_name
Definition: cas_execute.h:65
#define TRUE
Definition: broker_admin.c:49
static char * consume_tokens(char *stmt, STATEMENT_STATUS stmt_status)
Definition: cas_execute.c:6958
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
#define DB_ROW_COUNT_NOT_SET
Definition: dbtype_def.h:486
static int oid_data_set(T_NET_BUF *net_buf, DB_OBJECT *obj, int attr_num, char **attr_name)
Definition: cas_execute.c:5311
DB_COLLECTION * db_get_set(const DB_VALUE *value)
#define NET_SIZE_FLOAT
Definition: cas_network.h:44
int ux_get_class_num_objs(char *class_name, int flag, T_NET_BUF *net_buf)
Definition: cas_execute.c:2853
static char * dbuser
int sch_tuple_num
Definition: cas_handle.h:181
bool unicode_string_need_compose(const char *str_in, const int size_in, int *size_out, const UNICODE_NORMALIZATION *norm)
void ux_database_shutdown()
Definition: cas_execute.c:710
DB_CALL_RESULT c
Definition: db_query.h:125
#define DB_HS_MISMATCHED_RW_MODE
Definition: connection_cl.h:40
#define NET_BUF_ERR_SET(NET_BUF)
Definition: cas_execute.h:55
int db_attribute_is_indexed(DB_ATTRIBUTE *attribute)
Definition: db_info.c:1375
void schema_query_spec_meta(T_NET_BUF *net_buf)
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
SM_FOREIGN_KEY_INFO * fk_info
Definition: class_object.h:537
int db_find_all_triggers(DB_OBJLIST **list)
Definition: db_obj.c:1394
int db_elo_write(DB_ELO *elo, off_t pos, const void *buf, size_t count, DB_BIGINT *written_bytes)
Definition: db_elo.c:177
CURSOR_ID cursor_id
Definition: db_query.h:74
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
void ux_set_utype_for_datetimeltz(char u_type)
Definition: cas_execute.c:3494
static const char * get_column_default_as_string(DB_ATTRIBUTE *attr, bool *alloc)
Definition: cas_execute.c:3719
short attr_order
Definition: cas_execute.c:173
DB_DOMAIN * db_col_domain(DB_COLLECTION *col)
Definition: db_set.c:1421
int db_domain_scale(const DB_DOMAIN *domain)
Definition: db_macro.c:4098
int ux_lob_write(DB_VALUE *lob_dbval, INT64 offset, int size, char *data, T_NET_BUF *net_buf)
Definition: cas_execute.c:9898
MOP ws_mop(const OID *oid, MOP class_mop)
Definition: work_space.c:614
const char * db_get_type_name(DB_TYPE type_id)
Definition: db_info.c:722
int db_query_seek_tuple(DB_QUERY_RESULT *result, int offset, int seek_mode)
Definition: db_query.c:2455
DB_ATTRIBUTE * db_get_attributes(DB_OBJECT *obj)
Definition: db_info.c:908
char stripped_column_name
Definition: cas.c:168
void tran_get_tran_settings(int *lock_wait_in_msecs, TRAN_ISOLATION *tran_isolation, bool *async_ws)
int ux_set_isolation_level(int new_isol_level, T_NET_BUF *net_buf)
Definition: cas_execute.c:2496
DB_VALUE * db_get_hostvars(DB_SESSION *session)
Definition: db_vdb.c:1562
DB_OBJECT * db_object(DB_IDENTIFIER *oid)
Definition: db_admin.c:2641
static int class_attr_info(const char *class_name, DB_ATTRIBUTE *attr, char *attr_pattern, char pat_flag, T_ATTR_TABLE *attr_table)
Definition: cas_execute.c:8170
void histo_print(FILE *stream)
DB_ATTRIBUTE * db_get_class_attribute(DB_OBJECT *obj, const char *name)
Definition: db_info.c:878
DB_SET * db_seq_create(MOP classop, const char *name, int size)
Definition: db_set.c:252
DB_CONST_C_BIT db_get_bit(const DB_VALUE *value, int *length)
static void add_res_data_float(T_NET_BUF *net_buf, float value, unsigned char ext_type, int *net_size)
Definition: cas_execute.c:6556
#define TP_IS_SET_TYPE(typenum)
void cas_log_error_handler(unsigned int eid)
Definition: cas_execute.c:9712
DB_CONST_C_NCHAR db_get_nchar(const DB_VALUE *value, int *length)
const char * source_class
Definition: cas_execute.c:170
int ux_col_set_drop(DB_COLLECTION *col, DB_VALUE *ele_val, T_NET_BUF *net_buf)
Definition: cas_execute.c:2946
int db_domain_precision(const DB_DOMAIN *domain)
Definition: db_macro.c:4079
int cur_result_index
Definition: cas_handle.h:173
int argc
Definition: dynamic_load.c:951
int db_get_int(const DB_VALUE *value)
int db_make_bigint(DB_VALUE *value, const DB_BIGINT num)
static int sch_class_info(T_NET_BUF *net_buf, char *class_name, char pattern_flag, char flag, T_SRV_HANDLE *, T_BROKER_VERSION client_version)
Definition: cas_execute.c:7570
int db_trigger_class(DB_OBJECT *trobj, DB_OBJECT **class_)
Definition: db_obj.c:1623
DB_TIMESTAMP timestamp
Definition: dbtype_def.h:766
int db_is_vclass(DB_OBJECT *op)
Definition: db_virt.c:681
static int fetch_foreign_keys(T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *)
Definition: cas_execute.c:6371
static unsigned char set_extended_cas_type(T_CCI_U_TYPE u_set_type, DB_TYPE db_type)
#define db_get_collection
Definition: dbtype.h:60
DB_TYPE
Definition: dbtype_def.h:670
SESSION_ID db_get_session_id(void)
Definition: db_admin.c:2859
DB_CONSTRAINT * db_constraint_next(DB_CONSTRAINT *constraint)
Definition: db_info.c:1938
DB_C_DOUBLE db_get_double(const DB_VALUE *value)
#define ER_FAILED
Definition: error_code.h:47
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
static CAS_ERROR_LOG_HANDLE_CONTEXT * cas_EHCTX
Definition: cas_execute.c:403
#define BROKER_PATH_MAX
Definition: broker_config.h:91
int db_make_varchar(DB_VALUE *value, const int max_char_length, DB_CONST_C_CHAR str, const int char_str_byte_size, const int codeset, const int collation_id)
int db_seq_put(DB_SET *set, int index, DB_VALUE *value)
Definition: db_set.c:745
#define WS_REAL_OID(mop)
Definition: work_space.h:294
int db_datetime_decode(const DB_DATETIME *datetime, int *month, int *day, int *year, int *hour, int *minute, int *second, int *millisecond)
Definition: db_date.c:4574
int db_method_arg_count(DB_METHOD *method)
Definition: db_info.c:1710
char forward_only_cursor
Definition: cas_handle.h:192
#define NET_SIZE_DATETIME
Definition: cas_network.h:52
void cas_log_write_nonl(unsigned int seq_num, bool unit_start, const char *fmt,...)
Definition: cas_log.c:442
char cas_client_type
Definition: cas.c:169
#define SQL_LOG2_EXEC_END(SQL_LOG2_VALUE, STMT_ID, RES)
Definition: cas_sql_log2.h:54
DB_ELO_TYPE type
Definition: dbtype_def.h:950
void * default_val
Definition: cas_execute.c:174
static int execute_info_set(T_SRV_HANDLE *srv_handle, T_NET_BUF *net_buf, T_BROKER_VERSION client_version, char exec_flag)
Definition: cas_execute.c:7252
int db_timestamp_encode_ses(const DB_DATE *date, const DB_TIME *timeval, DB_TIMESTAMP *utime, TZ_ID *dest_tz_id)
Definition: db_date.c:597
DB_CONSTRAINT * db_constraint_find_primary_key(DB_CONSTRAINT *constraint)
Definition: db_info.c:1956
static int netval_to_dbval(void *type, void *value, DB_VALUE *db_val, T_NET_BUF *net_buf, char desired_type)
Definition: cas_execute.c:3892
bool is_holdable
Definition: cas_handle.h:196
int db_value_clone(DB_VALUE *src, DB_VALUE *dest)
Definition: db_macro.c:1564
static int sch_queryspec(T_NET_BUF *net_buf, char *class_name, T_SRV_HANDLE *)
Definition: cas_execute.c:7718
#define ER_QPROC_INVALID_XASLNODE
Definition: error_code.h:532
int db_trigger_event(DB_OBJECT *trobj, DB_TRIGGER_EVENT *event)
Definition: db_obj.c:1603
int db_is_instance(MOP obj)
Definition: db_info.c:394
char need_rollback
Definition: cas.h:78
int db_col_get(DB_COLLECTION *col, int element_index, DB_VALUE *value)
Definition: db_set.c:1222
SM_FOREIGN_KEY_ACTION
void histo_clear(void)
static void sch_constraint(T_NET_BUF *net_buf, char *class_name, void **result)
Definition: cas_execute.c:7853
int(* T_FETCH_FUNC)(T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *)
Definition: cas_execute.c:148
int db_trigger_action_time(DB_OBJECT *trobj, DB_TRIGGER_TIME *tr_time)
Definition: db_obj.c:1724
void * column_info
Definition: cas_handle.h:137
int db_get_enum_codeset(const DB_VALUE *value)
char * fkcolumn_name
Definition: cas_execute.h:68
DB_DOMAIN * db_domain_next(const DB_DOMAIN *domain)
Definition: db_macro.c:3974
int db_set_system_parameters(const char *data)
Definition: db_admin.c:2682
int ux_get_db_version(T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_execute.c:2833
int db_query_end(DB_QUERY_RESULT *result)
Definition: db_query.c:3362
int db_get_enum_string_size(const DB_VALUE *value)
int db_attribute_order(DB_ATTRIBUTE *attribute)
Definition: db_info.c:1144
void set_optimization_level(int level)
Definition: cas_execute.c:9843
#define QUERY_BUFFER_MAX
Definition: cas_execute.c:85
char * db_get_json_raw_body(const DB_VALUE *value)
Definition: db_macro.c:5082
void tz_get_session_tz_region(TZ_REGION *tz_region)
Definition: tz_support.c:767
#define assert_release(e)
Definition: error_manager.h:96
int db_trigger_condition_time(DB_OBJECT *trobj, DB_TRIGGER_TIME *tr_time)
Definition: db_obj.c:1683
int db_create_fbo(DB_VALUE *value, DB_TYPE type)
Definition: db_elo.c:47
int db_make_object(DB_VALUE *value, DB_C_OBJECT *obj)
void net_arg_get_lob_handle(T_LOB_HANDLE *lob, void *arg)
Definition: cas_net_buf.c:735
static int sch_direct_super_class(T_NET_BUF *net_buf, char *class_name, int pattern_flag, T_SRV_HANDLE *srv_handle)
Definition: cas_execute.c:8382
int db_shutdown(void)
Definition: db_admin.c:964
PT_NODE ** statements
Definition: api_compat.h:38
DB_CONSTRAINT * db_get_constraints(DB_OBJECT *obj)
Definition: db_info.c:1909
static int get_attr_name(DB_OBJECT *obj, char ***ret_attr_name)
Definition: cas_execute.c:5160
static int class_type(DB_OBJECT *class_obj)
Definition: cas_execute.c:8143
DB_ATTRIBUTE ** db_constraint_attributes(DB_CONSTRAINT *constraint)
Definition: db_info.c:2052
Definition: cursor.h:47
static void set_column_info(T_NET_BUF *net_buf, char ut, short scale, int prec, char charset, const char *col_name, const char *attr_name, const char *class_name, char is_non_null, T_BROKER_VERSION client_version)
Definition: cas_execute.c:3851
DB_OBJECT * db_get_foreign_key_ref_class(DB_CONSTRAINT *constraint)
Definition: db_info.c:2124
char database_user[SRV_CON_DBUSER_SIZE]
Definition: broker_shm.h:354
SM_DEFAULT_VALUE default_value
Definition: class_object.h:451
static int ux_get_generated_keys_client_insert(T_SRV_HANDLE *srv_handle, T_NET_BUF *net_buf)
Definition: cas_execute.c:9303
void ux_set_session_id(const SESSION_ID session_id)
Definition: cas_execute.c:455
#define CAS_TYPE_FIRST_BYTE_PROTOCOL_MASK
Definition: cas_protocol.h:314
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
int ux_get_row_count(T_NET_BUF *net_buf)
Definition: cas_execute.c:1076
void db_query_format_free(DB_QUERY_TYPE *query_type)
Definition: db_query.c:1723
char * null_type_column
Definition: cas_handle.h:135
#define WS_ISVID(mop)
Definition: work_space.h:288
void unicode_compose_string(const char *str_in, const int size_in, char *str_out, int *size_out, bool *is_composed, const UNICODE_NORMALIZATION *norm)
void ux_set_default_setting()
Definition: cas_execute.c:686
int db_make_date(DB_VALUE *value, const int month, const int day, const int year)
bool use_query_cache
Definition: cas_handle.h:194
DB_DATETIMETZ * db_get_datetimetz(const DB_VALUE *value)
DB_CONST_C_CHAR db_get_char(const DB_VALUE *value, int *length)
static int eid
Definition: cas_error_log.c:61
INT64 num_queries_processed
Definition: broker_shm.h:345
DB_OBJLIST * db_get_superclasses(DB_OBJECT *obj)
Definition: db_info.c:630
int db_make_sequence(DB_VALUE *value, DB_C_SET *set)
void * jsp_get_db_result_set(int h_id)
Definition: jsp_cl.c:3075
static void add_res_data_double(T_NET_BUF *net_buf, double value, unsigned char ext_type, int *net_size)
Definition: cas_execute.c:6577
DB_OBJECT * dbt_finish_object(DB_OTMPL *def)
Definition: db_obj.c:560
const char * db_default_expression_string(DB_DEFAULT_EXPR_TYPE default_expr_type)
Definition: db_macro.c:4947
int db_json_val_from_str(const char *raw_str, const int str_size, DB_VALUE *json_val)
Definition: parse_dbi.c:3578
INT64 num_delete_queries
Definition: broker_shm.h:367
char * cas_log_error_handler_asprint(char *buf, size_t bufsz, bool clear)
Definition: cas_execute.c:9780
#define SRV_CON_DBPASSWD_SIZE
Definition: cas_protocol.h:56
#define CAS_MAKE_VER(MAJOR, MINOR, PATCH)
Definition: cas_protocol.h:304
#define BTID_IS_EQUAL(b1, b2)
static char cas_u_type[]
Definition: cas_execute.c:327
int er_errid(void)
#define DB_HS_CONN_FAILURE
Definition: connection_cl.h:39
static void prepare_call_info_dbval_clear(T_PREPARE_CALL_INFO *call_info)
Definition: cas_execute.c:8954
void db_string_free(char *string)
Definition: db_admin.c:2596
#define NET_BUF_SIZE
Definition: cas_net_buf.h:72
static bool has_stmt_result_set(char stmt_type)
Definition: cas_execute.c:9666
double db_value_get_monetary_amount_as_double(const DB_VALUE *value)
Definition: db_macro.c:1505
DB_SET * db_set_create_multi(MOP classop, const char *name)
Definition: db_set.c:192
void dbt_abort_object(DB_OTMPL *def)
Definition: db_obj.c:616
static void prepare_column_info_set(T_NET_BUF *net_buf, char ut, short scale, int prec, char charset, const char *col_name, const char *default_value, char auto_increment, char unique_key, char primary_key, char reverse_index, char reverse_unique, char foreign_key, char shared, const char *attr_name, const char *class_name, char nullable, T_BROKER_VERSION client_version)
Definition: cas_execute.c:3658
int db_query_get_tuple_oid(DB_QUERY_RESULT *result, DB_VALUE *db_value)
Definition: db_query.c:3195
void db_rewind_statement(DB_SESSION *session)
Definition: db_vdb.c:785
bool has_result_set
Definition: cas_handle.h:175
static bool need_reconnect_on_rctime(void)
int ux_oid_put(int argc, void **argv, T_NET_BUF *net_buf)
Definition: cas_execute.c:3046
void jsp_set_prepare_call()
Definition: jsp_cl.c:3048
#define SHARD_NET_BUF_SIZE
Definition: cas_net_buf.h:71
void ux_get_default_setting()
Definition: cas_execute.c:628
void prm_set_integer_value(PARAM_ID prm_id, int value)
struct sm_foreign_key_info * next
Definition: class_object.h:474
void net_buf_clear(T_NET_BUF *net_buf)
Definition: cas_net_buf.c:66
int net_buf_cp_float(T_NET_BUF *net_buf, float value)
Definition: cas_net_buf.c:199
void * cur_result
Definition: cas_handle.h:167
const char * db_attribute_name(DB_ATTRIBUTE *attribute)
Definition: db_info.c:1065
SM_DOMAIN * db_query_format_domain(DB_QUERY_TYPE *query_type)
Definition: db_query.c:1661
static T_FK_INFO_RESULT * add_fk_info_result(T_FK_INFO_RESULT *fk_res, const char *pktable_name, const char *pkcolumn_name, const char *fktable_name, const char *fkcolumn_name, short key_seq, SM_FOREIGN_KEY_ACTION update_action, SM_FOREIGN_KEY_ACTION delete_action, const char *fk_name, const char *pk_name, int sort_by)
Definition: cas_execute.c:8507
void logddl_set_sql_text(char *sql_text, int len)
Definition: ddl_log.c:268
int db_attribute_is_shared(DB_ATTRIBUTE *attribute)
Definition: db_info.c:1429
char jdbc_cache_only_hint
Definition: broker_shm.h:570
DB_CLASS_MODIFICATION_STATUS db_has_modified_class(DB_SESSION *session, int stmt_id)
Definition: db_vdb.c:2874
int db_make_elo(DB_VALUE *value, DB_TYPE type, const DB_ELO *elo)
bool db_disable_trigger(void)
Definition: db_admin.c:570
#define DB_HS_HA_DELAYED
Definition: connection_cl.h:41
int db_attribute_is_non_null(DB_ATTRIBUTE *attribute)
Definition: db_info.c:1355
void net_arg_get_int(int *value, void *arg)
Definition: cas_net_buf.c:484
void cas_log_write_query_string_nonl(char *query, int size)
Definition: cas_log.c:641
void release_all_fk_info_results(T_FK_INFO_RESULT *fk_res)
Definition: cas_execute.c:8460
const char * rel_build_number(void)
SM_FOREIGN_KEY_ACTION update_action
Definition: class_object.h:482
int db_attribute_is_reverse_unique(DB_ATTRIBUTE *attribute)
Definition: db_info.c:1328
DB_ELO * db_get_elo(const DB_VALUE *value)
#define ER_FK_REF_CLASS_HAS_NOT_PK
Definition: error_code.h:1150
#define IS_NULL_CAS_TYPE(cas_type)
Definition: cas_execute.c:131
int ux_col_set_add(DB_COLLECTION *col, DB_VALUE *ele_val, T_NET_BUF *net_buf)
Definition: cas_execute.c:2966
void logddl_write_end()
Definition: ddl_log.c:668
int db_set_client_cache_time(DB_SESSION *session, int stmt_ndx, CACHE_TIME *cache_time)
Definition: db_vdb.c:813
void db_set_preferred_hosts(const char *hosts)
Definition: db_admin.c:508
void hm_qresult_clear(T_QUERY_RESULT *q_result)
Definition: cas_handle.c:308
INT64 num_update_queries
Definition: broker_shm.h:366
void logddl_set_execute_type(char exe_type)
Definition: ddl_log.c:404
const char * attr_name
Definition: cas_execute.c:169
int db_get_connect_status(void)
Definition: db_macro.c:4930
void cas_log_error_handler_begin(void)
Definition: cas_execute.c:9733
char * db_get_host_connected(void)
Definition: db_admin.c:2806
int ux_get_last_insert_id(T_NET_BUF *net_buf)
Definition: cas_execute.c:1101
DB_QUERY_TYPE * db_query_format_next(DB_QUERY_TYPE *query_type)
Definition: db_query.c:1577
int db_get_host_list_with_given_status(char **hostlist, int list_size, int status)
Definition: db_admin.c:776
DB_TIMESTAMPTZ * db_get_timestamptz(const DB_VALUE *value)
int db_date_encode(DB_DATE *date, int month, int day, int year)
Definition: db_date.c:275
INT64 num_insert_queries
Definition: broker_shm.h:365
static int oid_attr_info_set(T_NET_BUF *net_buf, DB_OBJECT *obj, int num_attr, char **attr_name)
Definition: cas_execute.c:5227
int db_make_short(DB_VALUE *value, const DB_C_SHORT num)
DB_DEFAULT_EXPR_TYPE default_expr_type
Definition: dbtype_def.h:1204
const char * db_attribute_comment(DB_ATTRIBUTE *attribute)
Definition: db_info.c:1083
void cas_set_db_connect_status(int status)
Definition: cas_execute.c:9699
static int set_priv_table(unsigned int class_priv, char *name, T_PRIV_TABLE *priv_table, int index)
Definition: cas_execute.c:8273
static int get_attr_name_from_argv(int argc, void **argv, char ***ret_attr_name)
Definition: cas_execute.c:5196
void ux_get_system_parameter(const char *param, bool *value)
Definition: cas_execute.c:654
static void add_res_data_timestamp(T_NET_BUF *net_buf, short yr, short mon, short day, short hh, short mm, short ss, unsigned char ext_type, int *net_size)
Definition: cas_execute.c:6598
int db_get_system_parameters(char *data, int len)
Definition: db_admin.c:2770
T_PREPARE_CALL_INFO * prepare_call_info
Definition: cas_handle.h:158
char cur_statement_pooling
Definition: broker_shm.h:313
#define SQL_LOG2_EXEC_BEGIN(SQL_LOG2_VALUE, STMT_ID)
Definition: cas_sql_log2.h:40
int net_buf_cp_cas_type_and_charset(T_NET_BUF *net_buf, unsigned char cas_type, unsigned char charset)
Definition: cas_net_buf.c:846
#define FREE(PTR)
Definition: cas_common.h:56
char * db_query_format_name(DB_QUERY_TYPE *query_type)
Definition: db_query.c:1609
#define ER_PT_SEMANTIC
Definition: error_code.h:581
void net_buf_init(T_NET_BUF *net_buf, T_BROKER_VERSION client_version)
Definition: cas_net_buf.c:54
void jsp_srv_handle_free(int h_id)
Definition: jsp_cl.c:3089
int net_buf_cp_int(T_NET_BUF *net_buf, int value, int *begin_offset)
Definition: cas_net_buf.c:126
DB_RESULTSET db_get_resultset(const DB_VALUE *value)
INTL_CODESET lang_charset(void)
DB_DEFAULT_EXPR default_expr
Definition: class_object.h:395
#define CAS_PROTO_CURRENT_VER
Definition: cas_protocol.h:286
void net_arg_get_timestamp(short *yr, short *mon, short *day, short *hh, short *mm, short *ss, void *arg)
Definition: cas_net_buf.c:582
DB_MARKER * db_marker_next(DB_MARKER *marker)
Definition: db_vdb.c:1238
int tran_reset_wait_times(int wait_in_msecs)
int tz_create_datetimetz(const DB_DATETIME *dt, const char *tz_str, const int tz_size, const TZ_REGION *default_tz_region, DB_DATETIMETZ *dt_tz, const char **end_tz_str)
Definition: tz_support.c:1383
void * session
Definition: cas_handle.h:153
unsigned int DB_TIMESTAMP
Definition: dbtype_def.h:759
static int sch_imported_keys(T_NET_BUF *net_buf, char *class_name, void **result)
Definition: cas_execute.c:8575
static int cur_tuple(T_QUERY_RESULT *q_result, int max_col_size, char sensitive_flag, DB_OBJECT *obj, T_NET_BUF *net_buf)
Definition: cas_execute.c:4439
static int prepare_column_list_info_set(DB_SESSION *session, char prepare_flag, T_QUERY_RESULT *q_result, T_NET_BUF *net_buf, T_BROKER_VERSION client_version)
Definition: cas_execute.c:7053
unsigned char domain
Definition: cas_execute.c:175
DB_ATTRIBUTE * db_get_attribute(DB_OBJECT *obj, const char *name)
Definition: db_info.c:791
static void add_res_data_datetimetz(T_NET_BUF *net_buf, short yr, short mon, short day, short hh, short mm, short ss, short ms, char *tz_str, unsigned char ext_type, int *net_size)
Definition: cas_execute.c:6687
#define NET_SIZE_TIME
Definition: cas_network.h:49
int db_restart_ex(const char *program, const char *db_name, const char *db_user, const char *db_password, const char *preferred_hosts, int client_type)
Definition: db_admin.c:934
const char * DB_CONST_C_NCHAR
Definition: dbtype_def.h:1157
Definition: db_set.h:35
int cas_shard_flag
Definition: cas.c:143
void hm_srv_handle_free(int h_id)
Definition: cas_handle.c:155
void ux_set_utype_for_datetimetz(char u_type)
Definition: cas_execute.c:3482
static int sch_primary_key(T_NET_BUF *net_buf, char *class_name, T_SRV_HANDLE *srv_handle)
Definition: cas_execute.c:8422
void unicode_decompose_string(const char *str_in, const int size_in, char *str_out, int *size_out, const UNICODE_NORMALIZATION *norm)
#define NET_SIZE_INT64
Definition: cas_network.h:46
int db_set_get(DB_SET *set, int index, DB_VALUE *value)
Definition: db_set.c:508
static int saved_Optimization_level
Definition: cas_execute.c:391
#define NET_SIZE_DATE
Definition: cas_network.h:48
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
static int get_num_markers(char *stmt)
Definition: cas_execute.c:6916
DB_SELECT_RESULT s
Definition: db_query.h:124
#define NULL_DEFAULT_EXPRESSION_OPERATOR
Definition: dbtype_def.h:659
int db_query_get_cache_time(DB_QUERY_RESULT *result, CACHE_TIME *cache_time)
Definition: db_query.c:3451
static T_FETCH_FUNC fetch_func[]
Definition: cas_execute.c:364
DB_METHFILE * db_get_method_files(DB_OBJECT *obj)
Definition: db_info.c:2173
#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 hm_qresult_end(T_SRV_HANDLE *srv_handle, char free_flag)
Definition: cas_handle.c:314
int db_make_monetary(DB_VALUE *value, const DB_CURRENCY type, const double amount)
int ux_col_seq_drop(DB_COLLECTION *col, int index, T_NET_BUF *net_buf)
Definition: cas_execute.c:2986
STATEMENT_STATUS
Definition: cas_execute.c:90
DB_CONSTRAINT_TYPE
Definition: dbtype_def.h:452
int tz_create_session_tzid_for_datetime(const DB_DATETIME *src_dt, bool src_is_utc, TZ_ID *tz_id)
Definition: tz_support.c:1037
char database_passwd[SRV_CON_DBPASSWD_SIZE]
Definition: broker_shm.h:355
#define LANG_COERCIBLE_CODESET
char * cas_log_query_plan_file(int id)
Definition: cas_log.c:892
const char * DB_CONST_C_BIT
Definition: dbtype_def.h:1159
void net_buf_overwrite_int(T_NET_BUF *net_buf, int offset, int value)
Definition: cas_net_buf.c:150
bool use_plan_cache
Definition: cas_handle.h:193
short volid
Definition: cas.h:53
void cas_log_write2_nonl(const char *fmt,...)
Definition: cas_log.c:584
DB_DOMAIN * db_marker_domain(DB_MARKER *marker)
Definition: db_vdb.c:1276
int db_make_set(DB_VALUE *value, DB_C_SET *set)
int prm_get_integer_value(PARAM_ID prm_id)
int ux_col_seq_insert(DB_COLLECTION *col, int index, DB_VALUE *ele_val, T_NET_BUF *net_buf)
Definition: cas_execute.c:3006
char * db_private_strdup(THREAD_ENTRY *thrd, const char *s)
Definition: memory_alloc.c:675
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
static void add_res_data_bytes(T_NET_BUF *net_buf, const char *str, int size, unsigned char ext_type, int *net_size)
Definition: cas_execute.c:6434
char * class_name
Definition: cas_execute.c:161
static int sch_class_priv(T_NET_BUF *net_buf, char *class_name, char pat_flag, T_SRV_HANDLE *srv_handle)
Definition: cas_execute.c:7992
void ux_free_result(void *res)
Definition: cas_execute.c:3452
T_COL_UPDATE_INFO * col_update_info
Definition: cas_handle.h:136
int db_end_session(void)
Definition: db_admin.c:1029
LIST_MOPS * class_table
Definition: unloaddb.c:62
static int fetch_privilege(T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *)
Definition: cas_execute.c:6267
struct t_fk_info_result * next
Definition: cas_execute.h:63
DB_IDENTIFIER * db_identifier(DB_OBJECT *obj)
Definition: db_admin.c:2629
#define STRING_APPEND(buffer_p, avail_size_holder,...)
Definition: cas_execute.c:101
int db_query_first_tuple(DB_QUERY_RESULT *result)
Definition: db_query.c:2309
static int fetch_attribute(T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *)
Definition: cas_execute.c:5591
int db_error_code(void)
Definition: db_admin.c:2143
int db_attribute_is_primary_key(DB_ATTRIBUTE *attribute)
Definition: db_info.c:1255
int net_buf_cp_short(T_NET_BUF *net_buf, short value)
Definition: cas_net_buf.c:227
DB_TYPE db_value_type(const DB_VALUE *value)
static int ux_get_generated_keys_server_insert(T_SRV_HANDLE *srv_handle, T_NET_BUF *net_buf)
Definition: cas_execute.c:9158
void net_arg_get_short(short *value, void *arg)
Definition: cas_net_buf.c:495
DB_DOMAIN * db_method_arg_domain(DB_METHOD *method, int arg)
Definition: db_info.c:1671
static char get_attr_type(DB_OBJECT *obj_p, char *attr_name)
Definition: cas_execute.c:7338
struct t_fk_info_result * prev
Definition: cas_execute.h:62
int db_time_encode(DB_TIME *timeval, int hour, int minute, int second)
Definition: db_date.c:370
int ux_end_session(void)
Definition: cas_execute.c:1070
int db_execute_and_keep_statement(DB_SESSION *session, int stmt_ndx, DB_QUERY_RESULT **result)
Definition: db_vdb.c:2906
void lang_set_parser_use_client_charset(bool use)
void db_objlist_free(DB_OBJLIST *list)
Definition: db_admin.c:2612
int db_get_class_num_objs_and_pages(DB_OBJECT *classmop, int approximation, int *nobjs, int *npages)
Definition: db_info.c:2311
short slotid
Definition: cas.h:52
#define NET_BUF_FREE_SIZE(n)
Definition: cas_net_buf.h:81
DB_DATETIME datetime
Definition: dbtype_def.h:783
char * pkcolumn_name
Definition: cas_execute.h:66
DB_MARKER * db_get_input_markers(DB_SESSION *session, int stmt)
Definition: db_vdb.c:1179
int intl_identifier_casecmp(const char *str1, const char *str2)
int tz_id_to_str(const TZ_ID *tz_id, char *tz_str, const int tz_str_size)
Definition: tz_support.c:1789
bool tran_was_latest_query_committed(void)
#define DB_VALUE_DOMAIN_TYPE(value)
Definition: dbtype.h:70
void schema_constraint_meta(T_NET_BUF *net_buf)
void net_arg_get_time(short *hh, short *mm, short *ss, void *arg)
Definition: cas_net_buf.c:565
static bool check_auto_commit_after_getting_result(T_SRV_HANDLE *srv_handle)
Definition: cas_execute.c:9684
#define SQL_LOG2_EXEC_APPEND(SQL_LOG2_VALUE, STMT_ID, RES, PLAN_FILE)
Definition: cas_sql_log2.h:75
bool is_from_current_transaction
Definition: cas_handle.h:197
unsigned int query_seq_num
Definition: cas_handle.h:184
#define NET_BUF_TYPE_SIZE(net_buf)
Definition: cas_net_buf.h:88
int db_put(DB_OBJECT *obj, const char *name, DB_VALUE *value)
Definition: db_obj.c:318
PT_NODE_TYPE node_type
Definition: parse_tree.h:3439
void net_arg_get_str(char **value, int *size, void *arg)
Definition: cas_net_buf.c:528
static T_PREPARE_CALL_INFO * make_prepare_call_info(int num_args, int is_first_out)
Definition: cas_execute.c:8880
void db_session_set_holdable(DB_SESSION *session, bool holdable)
Definition: db_vdb.c:1040
const char * db_error_string(int level)
Definition: db_admin.c:2116
bool db_get_jdbccachehint(DB_SESSION *session, int stmt_ndx, int *life_time)
Definition: db_vdb.c:844
DB_TRAN_ISOLATION
Definition: dbtran_def.h:26
DB_OBJECT * db_domain_class(const DB_DOMAIN *domain)
Definition: db_macro.c:4030
static enum scanner_mode mode
struct timeval query_start_time
Definition: cas.c:158
void unset_xa_prepare_flag(void)
Definition: cas_xa.c:285
static int fetch_method(T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *)
Definition: cas_execute.c:5797
static int sch_query_execute(T_SRV_HANDLE *srv_handle, char *sql_stmt, T_NET_BUF *net_buf)
Definition: cas_execute.c:8309
DB_ATTRIBUTE * db_attribute_next(DB_ATTRIBUTE *attribute)
Definition: db_info.c:1020
void schema_primarykey_meta(T_NET_BUF *net_buf)
void db_session_set_return_generated_keys(DB_SESSION *session, bool return_generated_keys)
Definition: db_vdb.c:1075
const char * sm_get_ch_name(MOP op)
DB_OBJECT * db_get_object(const DB_VALUE *value)
#define DB_HS_CONN_TIMEOUT
Definition: connection_cl.h:38
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
int db_make_timestamptz(DB_VALUE *value, const DB_C_TIMESTAMPTZ *ts_tz_val)
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
int db_string_put_cs_and_collation(DB_VALUE *value, const int codeset, const int collation_id)
Definition: db_macro.c:4164
bool db_is_client_cache_reusable(DB_QUERY_RESULT *result)
Definition: db_query.c:3432
char * data
Definition: cas_net_buf.h:96
#define NET_SIZE_BIGINT
Definition: cas_network.h:47
#define MAX_HA_DBINFO_LENGTH
Definition: cas.h:46
int db_abort_transaction(void)
Definition: db_admin.c:1114
#define FK_INFO_SORT_BY_FKTABLE_NAME
Definition: cas_execute.c:88
int db_trigger_priority(DB_OBJECT *trobj, double *priority)
Definition: db_obj.c:1585
#define TP_DOMAIN_TYPE(dom)
static void sch_trigger(T_NET_BUF *net_buf, char *class_name, char flag, void **result)
Definition: cas_execute.c:7891
#define ERROR_INFO_SET_FORCE(ERR_CODE, ERR_INDICATOR)
Definition: cas_execute.h:51
int db_execute_statement(DB_SESSION *session, int stmt_ndx, DB_QUERY_RESULT **result)
Definition: db_vdb.c:2978
static int fetch_class(T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *)
Definition: cas_execute.c:5530
UNICODE_NORMALIZATION * lang_get_generic_unicode_norm(void)
void ux_set_utype_for_timestampltz(char u_type)
Definition: cas_execute.c:3488
static void add_res_data_date(T_NET_BUF *net_buf, short yr, short mon, short day, unsigned char ext_type, int *net_size)
Definition: cas_execute.c:6747
static void casobj_to_dbobj(T_OBJECT *cas_obj, DB_OBJECT **obj)
Definition: cas_execute.c:5111
#define NULL
Definition: freelistheap.h:34
void schema_trigger_meta(T_NET_BUF *net_buf)
Definition: cas.h:49
int db_domain_codeset(const DB_DOMAIN *domain)
Definition: db_macro.c:4116
void db_session_set_xasl_cache_pinned(DB_SESSION *session, bool is_pinned, bool recompile)
Definition: db_vdb.c:1057
void schema_superclasss_meta(T_NET_BUF *net_buf)
#define strncpy_bufsize(buf, str)
Definition: porting.h:340
#define NET_SIZE_DOUBLE
Definition: cas_network.h:45
#define DB_HS_NON_PREFFERED_HOSTS
Definition: connection_cl.h:42
DB_OBJECT * db_get_class(MOP obj)
Definition: db_info.c:589
void net_buf_destroy(T_NET_BUF *net_buf)
Definition: cas_net_buf.c:75
static char * dbname
if(extra_options)
Definition: dynamic_load.c:958
DB_SESSION * db_open_buffer(const char *buffer)
Definition: db_vdb.c:232
void db_clear_host_connected(void)
Definition: db_admin.c:851
void db_include_oid(DB_SESSION *session, int include_oid)
Definition: db_vdb.c:1508
int db_compile_statement(DB_SESSION *session)
Definition: db_vdb.c:766
static void add_res_data_int(T_NET_BUF *net_buf, int value, unsigned char ext_type, int *net_size)
Definition: cas_execute.c:6493
#define LOGDDL_RUN_EXECUTE_BATCH_FUNC
Definition: ddl_log.h:30
int db_attribute_is_foreign_key(DB_ATTRIBUTE *attribute)
Definition: db_info.c:1282
void db_close_session(DB_SESSION *session)
Definition: db_vdb.c:3319
static void add_res_data_datetime(T_NET_BUF *net_buf, short yr, short mon, short day, short hh, short mm, short ss, short ms, unsigned char ext_type, int *net_size)
Definition: cas_execute.c:6659
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
static void add_res_data_string_safe(T_NET_BUF *net_buf, const char *str, unsigned char ext_type, unsigned char charset, int *net_size)
Definition: cas_execute.c:6479
void net_arg_get_bigint(DB_BIGINT *value, void *arg)
Definition: cas_net_buf.c:472
DB_OBJLIST * db_get_all_classes(void)
Definition: db_info.c:267
static short constraint_dbtype_to_castype(int db_const_type)
Definition: cas_execute.c:8864
int db_set_add(DB_SET *set, DB_VALUE *value)
Definition: db_set.c:465
#define FREE_MEM(PTR)
Definition: cas_common.h:58
#define err(fd,...)
Definition: porting.h:431
static void trigger_time_str(DB_TRIGGER_TIME trig_time, char *buf)
Definition: cas_execute.c:6895
static int sch_superclass(T_NET_BUF *net_buf, char *class_name, char flag, T_SRV_HANDLE *srv_handle)
Definition: cas_execute.c:7794
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 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
int db_savepoint_transaction(const char *savepoint_name)
Definition: db_admin.c:1198
char trigger_action_flag
Definition: broker_shm.h:579
char ux_db_type_to_cas_type(int db_type)
Definition: cas_execute.c:3458
bool db_need_reconnect(void)
Definition: db_admin.c:709
int db_type
Definition: cas.h:59
int db_timestamp_decode_w_tz_id(const DB_TIMESTAMP *utime, const TZ_ID *tz_id, DB_DATE *date, DB_TIME *timeval)
Definition: db_date.c:902
DB_SET * db_set_create_basic(MOP classop, const char *name)
Definition: db_set.c:134
int data_size
Definition: cas_net_buf.h:95
void net_arg_get_size(int *size, void *arg)
Definition: cas_net_buf.c:451
static int set_host_variables(DB_SESSION *session, int num_bind, DB_VALUE *in_values)
int db_set_free(DB_SET *set)
Definition: db_set.c:306
static const char * convert_db_value_to_string(DB_VALUE *value, DB_VALUE *value_string)
Definition: cas_execute.c:9961
int db_attribute_is_auto_increment(DB_ATTRIBUTE *attribute)
Definition: db_info.c:1309
bool cas_default_no_backslash_escapes
Definition: cas.c:180
enum db_class_modification_status DB_CLASS_MODIFICATION_STATUS
void hm_col_update_info_clear(T_COL_UPDATE_INFO *col_update_info)
Definition: cas_handle.c:402
static int sch_attr_priv(T_NET_BUF *net_buf, char *class_name, char *attr_name, char pat_flag, T_SRV_HANDLE *srv_handle)
Definition: cas_execute.c:8071
#define db_private_free(thrd, ptr)
Definition: memory_alloc.h:229
int db_get_class_privilege(DB_OBJECT *mop, unsigned int *auth)
Definition: db_info.c:2346
int get_tuple_count(T_SRV_HANDLE *srv_handle)
Definition: cas_execute.c:9834
#define CAS_SCHEMA_DEFAULT_CHARSET
Definition: cas_common.h:170
int ml_ext_add(DB_OBJLIST **list, MOP mop, int *added_ptr)
Definition: work_space.c:4877
static char * get_backslash_escape_string(void)
void schema_attrpriv_meta(T_NET_BUF *net_buf)
SM_FOREIGN_KEY_ACTION delete_action
Definition: cas_execute.h:71
int db_is_system_class(MOP op)
Definition: db_info.c:502
char col_updatable
Definition: cas_handle.h:143
static T_SHM_APPL_SERVER * shm_appl
Definition: broker.c:311
int ux_check_connection(void)
Definition: cas_execute.c:406
char is_pooled
Definition: cas_handle.h:189
need_clear_type need_clear
Definition: dbtype_def.h:1084
int ux_auto_commit(T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_execute.c:9594
static int fetch_result(T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *)
Definition: cas_execute.c:5332
struct db_objlist * next
Definition: dbtype_def.h:442
char * db_name
int db_set_size(DB_SET *set)
Definition: db_set.c:557
static void add_res_data_bigint(T_NET_BUF *net_buf, DB_BIGINT value, unsigned char ext_type, int *net_size)
Definition: cas_execute.c:6514
int db_col_size(DB_COLLECTION *col)
Definition: db_set.c:1167
int count(int &result, const cub_regex_object &reg, const std::string &src, const int position, const INTL_CODESET codeset)
#define cmp
Definition: mprec.h:351
int db_timestamp_decode_ses(const DB_TIMESTAMP *utime, DB_DATE *date, DB_TIME *timeval)
Definition: db_date.c:764
DB_BIGINT db_get_bigint(const DB_VALUE *value)
int db_set_isolation(DB_TRAN_ISOLATION isolation)
Definition: db_admin.c:1535
void schema_method_meta(T_NET_BUF *net_buf)
DB_DOMAIN * db_type_to_db_domain(const DB_TYPE type)
Definition: db_macro.c:1710
int db_make_time(DB_VALUE *value, const int hour, const int minute, const int second)
static char database_passwd[SRV_CON_DBPASSWD_SIZE]
Definition: cas_execute.c:389
static void add_res_data_time(T_NET_BUF *net_buf, short hh, short mm, short ss, unsigned char ext_type, int *net_size)
Definition: cas_execute.c:6724
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
SM_FOREIGN_KEY_ACTION update_action
Definition: cas_execute.h:70
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
void logddl_write()
Definition: ddl_log.c:706
static int fetch_trigger(T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *)
Definition: cas_execute.c:6073
int ux_is_database_connected(void)
Definition: cas_execute.c:622
int db_make_datetimetz(DB_VALUE *value, const DB_DATETIMETZ *datetimetz)
char database_host[CUB_MAXHOSTNAMELEN]
Definition: broker_shm.h:353
int64_t DB_BIGINT
Definition: dbtype_def.h:751
int ux_cursor(int srv_h_id, int offset, int origin, T_NET_BUF *net_buf)
Definition: cas_execute.c:2674
int db_query_column_count(DB_QUERY_RESULT *result)
Definition: db_query.c:3134
DB_METHOD * db_method_next(DB_METHOD *method)
Definition: db_info.c:1569
int net_buf_cp_double(T_NET_BUF *net_buf, double value)
Definition: cas_net_buf.c:213
static void add_res_data_timestamptz(T_NET_BUF *net_buf, short yr, short mon, short day, short hh, short mm, short ss, char *tz_str, unsigned char ext_type, int *net_size)
Definition: cas_execute.c:6625
void cas_log_error_handler_clear(void)
Definition: cas_execute.c:9767
struct timeval tran_start_time
Definition: cas.c:157
struct db_object * op
Definition: dbtype_def.h:443
DB_TRIGGER_TIME
Definition: dbtype_def.h:388
static void add_res_data_string(T_NET_BUF *net_buf, const char *str, int size, unsigned char ext_type, unsigned char charset, int *net_size)
Definition: cas_execute.c:6456
static short encode_ext_type_to_short(T_BROKER_VERSION client_version, unsigned char cas_type)
DB_CONST_C_CHAR db_get_enum_string(const DB_VALUE *value)
static char cas_db_sys_param[128]
Definition: cas_execute.c:390
void ux_col_size(DB_COLLECTION *col, T_NET_BUF *net_buf)
Definition: cas_execute.c:2927
static void error(const char *msg)
Definition: gencat.c:331
int db_get_statement_type(DB_SESSION *session, int stmt)
Definition: db_vdb.c:1473
const char * class_name
Definition: cas_execute.c:168
int ux_make_out_rs(int srv_h_id, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_execute.c:9444
bool tran_was_latest_query_aborted(void)
int db_make_float(DB_VALUE *value, const DB_C_FLOAT num)
void set_query_timeout(T_SRV_HANDLE *srv_handle, int query_timeout)
void hm_srv_handle_free_all(bool free_holdable)
Definition: cas_handle.c:186
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 schema_table_meta(T_NET_BUF *net_buf)
#define ER_INTERRUPTED
Definition: error_code.h:51
int ux_check_object(DB_OBJECT *obj, T_NET_BUF *net_buf)
Definition: cas_execute.c:3421
int max_col_size
Definition: cas_handle.h:178
int errors_in_transaction
Definition: cas.c:167
void ux_set_lock_timeout(int lock_timeout)
Definition: cas_execute.c:2513
#define ER_FK_NOT_MATCH_KEY_COUNT
Definition: error_code.h:1158
int db_query_next_tuple(DB_QUERY_RESULT *result)
Definition: db_query.c:2088
int tz_utc_datetimetz_to_local(const DB_DATETIME *dt_utc, const TZ_ID *tz_id, DB_DATETIME *dt_local)
Definition: tz_support.c:1571
bool db_value_is_null(const DB_VALUE *value)
static char * dbpasswd
static void add_fk_info_before(T_FK_INFO_RESULT *pivot, T_FK_INFO_RESULT *pnew)
Definition: cas_execute.c:8481
#define NET_BUF_HEADER_SIZE
Definition: cas_net_buf.h:78
#define ARG_FILE_LINE
Definition: error_manager.h:44
#define ER_QPROC_TIME_UNDERFLOW
Definition: error_code.h:653
static char database_name[MAX_HA_DBINFO_LENGTH]
Definition: cas_execute.c:387
const char * db_query_format_class_name(DB_QUERY_TYPE *query_type)
Definition: db_query.c:1740
int max_num_delayed_hosts_lookup
Definition: broker_shm.h:578
time_t last_connect_time
Definition: broker_shm.h:357
static int sch_attr_info(T_NET_BUF *net_buf, char *class_name, char *attr_name, char pattern_flag, char flag, T_SRV_HANDLE *)
Definition: cas_execute.c:7649
#define CAS_GET_QUERY_INFO_PLAN
Definition: cas_protocol.h:138
static void dbobj_to_casobj(DB_OBJECT *obj, T_OBJECT *cas_obj)
Definition: cas_execute.c:5090
static void dblob_to_caslob(DB_VALUE *lob, T_LOB_HANDLE *cas_lob)
Definition: cas_execute.c:5123
int dbt_put(DB_OTMPL *def, const char *name, DB_VALUE *value)
Definition: db_obj.c:635
const char * default_expr_format
Definition: dbtype_def.h:1206
int shm_shard_id
Definition: cas.c:144
SESSION_ID ux_get_session_id(void)
Definition: cas_execute.c:449
bool db_get_cacheinfo(DB_SESSION *session, int stmt_ndx, bool *use_plan_cache, bool *use_query_cache)
Definition: db_vdb.c:878
unsigned int DB_TIME
Definition: dbtype_def.h:754
int pageid
Definition: cas.h:51
void db_set_max_num_delayed_hosts_lookup(int max_num_delayed_hosts_lookup)
Definition: db_admin.c:528
char * db_query_format_original_name(DB_QUERY_TYPE *query_type)
Definition: db_query.c:1648
SM_FOREIGN_KEY_ACTION delete_action
Definition: class_object.h:481
#define DB_HS_UNUSABLE_DATABASES
Definition: connection_cl.h:43
static int fetch_call(T_SRV_HANDLE *srv_handle, T_NET_BUF *net_buf, T_REQ_INFO *req_info)
Definition: cas_execute.c:8986
int db_trigger_name(DB_OBJECT *trobj, char **name)
Definition: db_obj.c:1548
#define CHECK_NET_BUF_SIZE(n, size)
Definition: cas_net_buf.h:85
int hm_new_srv_handle(T_SRV_HANDLE **new_handle, unsigned int seq_num)
Definition: cas_handle.c:62
unsigned int DB_DATE
Definition: dbtype_def.h:771
bool db_does_connected_host_have_status(int status)
Definition: db_admin.c:755
char preferred_hosts[SHM_APPL_SERVER_NAME_MAX]
Definition: broker_shm.h:590
#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
void schema_fk_info_meta(T_NET_BUF *net_buf)
void cas_log_error_handler_end(void)
Definition: cas_execute.c:9756
const char ** argv
Definition: dynamic_load.c:952
#define NET_SIZE_TIMESTAMP
Definition: cas_network.h:51
char * locator
Definition: dbtype_def.h:948
#define SRV_CON_DBUSER_SIZE
Definition: cas_protocol.h:55
int db_query_format_is_non_null(DB_QUERY_TYPE *query_type)
Definition: db_query.c:1766
#define strlen(s1)
Definition: intl_support.c:43
int db_datetime_encode(DB_DATETIME *datetime, int month, int day, int year, int hour, int minute, int second, int millisecond)
Definition: db_date.c:4597
char is_prepared
Definition: cas_handle.h:186
DB_DATE * db_get_date(const DB_VALUE *value)
int oid_compare(const void *a, const void *b)
Definition: oid.c:243
static void caslob_to_dblob(T_LOB_HANDLE *cas_lob, DB_VALUE *lob)
Definition: cas_execute.c:5146
DB_CONSTRAINT_TYPE db_constraint_type(const DB_CONSTRAINT *constraint)
Definition: db_info.c:1978
void cas_log_write(unsigned int seq_num, bool unit_start, const char *fmt,...)
Definition: cas_log.c:506
int db_push_values(DB_SESSION *session, int count, DB_VALUE *in_values)
Definition: db_vdb.c:1527
DB_TRIGGER_EVENT
Definition: dbtype_def.h:356
int ux_get_query_info(int srv_h_id, char info_type, T_NET_BUF *net_buf)
Definition: cas_execute.c:3272
int db_check_single_query(DB_SESSION *session)
Definition: db_vdb.c:3695
int cas_get_db_connect_status(void)
Definition: cas_execute.c:9705
unsigned int SESSION_ID
Definition: dbtype_def.h:480
DB_COL_TYPE db_query_format_col_type(DB_QUERY_TYPE *query_type)
Definition: db_query.c:1590
int db_get_row_count_cache(void)
Definition: db_admin.c:2914
#define ER_HEAP_UNKNOWN_OBJECT
Definition: error_code.h:102
int ux_database_connect(char *db_name, char *db_user, char *db_passwd, char **db_err_msg)
Definition: cas_execute.c:461
int db_value_put(DB_VALUE *value, const DB_TYPE_C c_type, void *input, const int input_length)
Definition: db_macro.c:1256
#define DB_CURSOR_SUCCESS
Definition: dbtype_def.h:166
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
int db_get(DB_OBJECT *object, const char *attpath, DB_VALUE *value)
Definition: db_obj.c:233
int T_BROKER_VERSION
Definition: cas_protocol.h:342
void ml_ext_free(DB_OBJLIST *list)
Definition: work_space.c:4806
static void add_res_data_object(T_NET_BUF *net_buf, T_OBJECT *obj, unsigned char ext_type, int *net_size)
Definition: cas_execute.c:6770
int tran_timeout
Definition: cas.c:159
int db_trigger_attribute(DB_OBJECT *trobj, char **attr)
Definition: db_obj.c:1643
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
static void sch_method_info(T_NET_BUF *net_buf, char *class_name, char flag, void **result)
Definition: cas_execute.c:7742
void ux_set_utype_for_timestamptz(char u_type)
Definition: cas_execute.c:3476
bool prm_get_bool_value(PARAM_ID prm_id)
DB_METHFILE * db_methfile_next(DB_METHFILE *methfile)
Definition: db_info.c:2201
T_BROKER_VERSION cas_get_client_version(void)
Definition: cas.c:2947
DB_METHOD * db_get_class_methods(DB_OBJECT *obj)
Definition: db_info.c:1542
int64_t size
Definition: dbtype_def.h:947
#define FALSE
Definition: broker_admin.c:50
DB_TIMESTAMP * db_get_timestamp(const DB_VALUE *value)
int db_get_string_size(const DB_VALUE *value)
static bool do_commit_after_execute(const t_srv_handle &server_handle)
DB_C_SHORT db_get_short(const DB_VALUE *value)
T_APPL_SERVER_INFO * as_info
Definition: cas.c:153
#define ERROR_INFO_SET(ERR_CODE, ERR_INDICATOR)
Definition: cas_execute.h:49
static void trigger_event_str(DB_TRIGGER_EVENT trig_event, char *buf)
Definition: cas_execute.c:6813
int tz_create_timestamptz(const DB_DATE *date, const DB_TIME *time, const char *tz_str, const int tz_size, const TZ_REGION *default_tz_region, DB_TIMESTAMPTZ *ts_tz, const char **end_tz_str)
Definition: tz_support.c:1435
static void serialize_collection_as_string(DB_VALUE *col, char **out)
Definition: cas_execute.c:9996
#define NET_SIZE_OBJECT
Definition: cas_network.h:50
DB_VALUE * db_attribute_default(DB_ATTRIBUTE *attribute)
Definition: db_info.c:1209
#define DOES_CLIENT_UNDERSTAND_THE_PROTOCOL(CLIENT, REQUIRE)
Definition: cas_protocol.h:290
void er_clear(void)
bool unicode_string_need_decompose(const char *str_in, const int size_in, int *decomp_size, const UNICODE_NORMALIZATION *norm)
DB_QUERY_TYPE * db_get_query_type_list(DB_SESSION *session, int stmt_ndx)
Definition: db_vdb.c:1341
int db_query_set_copy_tplvalue(DB_QUERY_RESULT *result, int copy)
Definition: db_query.c:3386
bool db_enable_trigger(void)
Definition: db_admin.c:558
void elo_init_structure(DB_ELO *elo)
Definition: elo.c:127
void cas_log_write_and_end(unsigned int seq_num, bool unit_start, const char *fmt,...)
Definition: cas_log.c:533
#define ALLOC_COPY(PTR, STR)
Definition: cas_common.h:66
DB_RESULT_TYPE type
Definition: db_query.h:115
#define DBMS_ERROR_INDICATOR
Definition: cas.h:40
static void sch_methfile_info(T_NET_BUF *net_buf, char *class_name, void **result)
Definition: cas_execute.c:7772
void ux_get_tran_setting(int *lock_wait, int *isol_level)
Definition: cas_execute.c:2476
DB_OBJECT * class_mop
void net_arg_get_timestamptz(short *yr, short *mon, short *day, short *hh, short *mm, short *ss, char **tz, int *tz_size, void *arg)
Definition: cas_net_buf.c:608
TR_TRIGGER * tr_map_trigger(DB_OBJECT *object, int fetch)
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 db_trigger_condition(DB_OBJECT *trobj, char **condition)
Definition: db_obj.c:1663
#define NET_BUF_CURR_PTR(n)
Definition: cas_net_buf.h:83
int au_login(const char *name, const char *password, bool ignore_dba_privilege)
char * db_query_format_attr_name(DB_QUERY_TYPE *query_type)
Definition: db_query.c:1622
#define FK_INFO_SORT_BY_PKTABLE_NAME
Definition: cas_execute.c:87
int i
Definition: dynamic_load.c:954
int db_make_null(DB_VALUE *value)
static void add_res_data_short(T_NET_BUF *net_buf, short value, unsigned char ext_type, int *net_size)
Definition: cas_execute.c:6535
Definition: cas.h:73
int ux_end_tran(int tran_type, bool reset_con_status)
Definition: cas_execute.c:984
int locator_size
Definition: cas.h:61
void hm_srv_handle_qresult_end_all(bool end_holdable)
Definition: cas_handle.c:246
int num_q_result
Definition: cas_handle.h:174
DB_OTMPL * dbt_edit_object(MOP object)
Definition: db_obj.c:533
#define NET_SIZE_SHORT
Definition: cas_network.h:42
void ut_tolower(char *str)
int db_trigger_action(DB_OBJECT *trobj, char **action)
Definition: db_obj.c:1742
INT64 num_select_queries
Definition: broker_shm.h:364
#define ER_SM_INVALID_CONSTRAINT
Definition: error_code.h:871
static DB_OBJECT * ux_str_to_obj(char *str)
Definition: cas_execute.c:7528
#define IS_VALID_ISOLATION_LEVEL(isolation_level)
Definition: dbtran_def.h:54
#define MAX_DIAG_DATA_VALUE
Definition: perf_monitor.h:50
int db_find_or_create_session(const char *db_user, const char *program_name)
Definition: db_admin.c:2885
int db_make_double(DB_VALUE *value, const DB_C_DOUBLE num)
INTL_CODESET lang_get_client_charset(void)
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
char * locator
Definition: cas.h:62
static int create_srv_handle_with_query_result(T_QUERY_RESULT *src_q_result, DB_QUERY_TYPE *column_info, unsigned int query_seq_num)
Definition: cas_execute.c:9033
char * strdup(const char *str)
Definition: porting.c:901
DB_TRIGGER_STATUS
Definition: dbtype_def.h:344
void db_date_decode(const DB_DATE *date, int *monthp, int *dayp, int *yearp)
Definition: db_date.c:338
int db_elo_read(const DB_ELO *elo, off_t pos, void *buf, size_t count, DB_BIGINT *read_bytes)
Definition: db_elo.c:145
DB_DATETIME * db_get_datetime(const DB_VALUE *value)
DB_VALUE * val_ptr
Definition: db_query.h:82
void ux_set_utype_for_json(char u_type)
Definition: cas_execute.c:3500
static int sch_exported_keys_or_cross_reference(T_NET_BUF *net_buf, bool find_cross_ref, char *pktable_name, char *fktable_name, void **result)
Definition: cas_execute.c:8710
DB_CURRENCY db_get_currency_default()
Definition: db_macro.c:1870
char is_updatable
Definition: cas_handle.h:187
void db_set_session_id(const SESSION_ID session_id)
Definition: db_admin.c:2870
short class_type
Definition: cas_execute.c:162
static void add_fk_info_after(T_FK_INFO_RESULT *pivot, T_FK_INFO_RESULT *pnew)
Definition: cas_execute.c:8494
#define NET_SIZE_INT
Definition: cas_network.h:43
static char database_user[SRV_CON_DBUSER_SIZE]
Definition: cas_execute.c:388
#define ER_IS_SERVER_DOWN_ERROR(err)
int db_value_clear(DB_VALUE *value)
Definition: db_macro.c:1588
int db_make_timestamp(DB_VALUE *value, const DB_C_TIMESTAMP timeval)
int db_make_int(DB_VALUE *value, const int num)
int db_query_get_tuple_value(DB_QUERY_RESULT *result, int index, DB_VALUE *value)
Definition: db_query.c:2873
static int fetch_methfile(T_SRV_HANDLE *, int, int, char, int, T_NET_BUF *, T_REQ_INFO *)
Definition: cas_execute.c:5907
int net_buf_cp_lob_handle(T_NET_BUF *net_buf, T_LOB_HANDLE *lob)
Definition: cas_net_buf.c:256
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
static void add_res_data_lob_handle(T_NET_BUF *net_buf, T_LOB_HANDLE *lob, unsigned char ext_type, int *net_size)
Definition: cas_execute.c:6791
int net_buf_cp_bigint(T_NET_BUF *net_buf, DB_BIGINT value, int *begin_offset)
Definition: cas_net_buf.c:161
const char * db_constraint_name(DB_CONSTRAINT *constraint)
Definition: db_info.c:2031
int cas_default_lock_timeout
Definition: cas.c:177
void ux_prepare_call_info_free(T_PREPARE_CALL_INFO *call_info)
Definition: cas_execute.c:3626
static void trigger_status_str(DB_TRIGGER_STATUS trig_status, char *buf)
Definition: cas_execute.c:6874
void net_arg_get_date(short *year, short *mon, short *day, void *arg)
Definition: cas_net_buf.c:548
const char * db_methfile_name(DB_METHFILE *methfile)
Definition: db_info.c:2219
int db_set_drop(DB_SET *set, DB_VALUE *value)
Definition: db_set.c:530
int db_set_statement_auto_commit(DB_SESSION *session, bool auto_commit)
Definition: db_vdb.c:4030
DB_TIME * db_get_time(const DB_VALUE *value)
INTL_UTF8_VALIDITY intl_check_string(const char *buf, int size, char **pos, const INTL_CODESET codeset)
int db_seq_insert(DB_SET *set, int index, DB_VALUE *value)
Definition: db_set.c:786
void cas_log_write2(const char *fmt,...)
Definition: cas_log.c:604
CURSOR_POSITION position
Definition: cursor.h:59
char auto_commit_mode
Definition: cas_handle.h:191
int net_buf_cp_object(T_NET_BUF *net_buf, T_OBJECT *oid)
Definition: cas_net_buf.c:241
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
int db_get_row_count(int *row_count)
Definition: db_admin.c:1046
void logddl_set_err_code(int err_code)
Definition: ddl_log.c:361
const char * program_name
Definition: cas.c:147
static int dbval_to_net_buf(DB_VALUE *val, T_NET_BUF *net_buf, char fetch_flag, int max_col_size, char column_type_flag)
Definition: cas_execute.c:4486
#define ERROR_INFO_SET_WITH_MSG(ERR_CODE, ERR_INDICATOR, ERR_MSG)
Definition: cas_execute.h:53
int db_trigger_status(DB_OBJECT *trobj, DB_TRIGGER_STATUS *status)
Definition: db_obj.c:1567
DB_VALUE * default_value
Definition: esql_cli.c:348
void db_time_decode(DB_TIME *timeval, int *hourp, int *minutep, int *secondp)
Definition: db_date.c:432
static T_REQ_INFO req_info
Definition: cas.c:333
#define MAX_NUM_DB_HOSTS
void db_set_connect_order(int connect_order)
Definition: db_admin.c:522
void jsp_unset_prepare_call()
Definition: jsp_cl.c:3061
int tz_create_session_tzid_for_timestamp(const DB_UTIME *src_ts, TZ_ID *tz_id)
Definition: tz_support.c:1068
#define ER_INVALID_CHAR
Definition: error_code.h:1350
void schema_methodfile_meta(T_NET_BUF *net_buf)
char * ut_trim(char *str)
#define DB_CURSOR_END
Definition: dbtype_def.h:167
const char * db_method_name(DB_METHOD *method)
Definition: db_info.c:1587
const char * DB_CONST_C_CHAR
Definition: dbtype_def.h:1155
int db_attribute_is_unique(DB_ATTRIBUTE *attribute)
Definition: db_info.c:1228
const char * comment
Definition: cas_execute.c:182
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
int db_query_produce_updatable_result(DB_SESSION *session, int stmt_ndx)
Definition: db_vdb.c:3825
int db_list_length(DB_LIST *list)
Definition: db_old.c:69
static char * get_domain_str(DB_DOMAIN *domain)
Definition: cas_execute.c:7370
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
char * fktable_name
Definition: cas_execute.h:67
static void update_query_execution_count(T_APPL_SERVER_INFO *as_info_p, char stmt_type)
int db_make_bit(DB_VALUE *value, const int bit_length, DB_CONST_C_BIT bit_str, const int bit_str_bit_size)
int db_seq_drop(DB_SET *set, int index)
Definition: db_set.c:823
int db_ping_server(int client_val, int *server_val)
Definition: db_admin.c:983
void schema_attr_meta(T_NET_BUF *net_buf)
int db_get_string_codeset(const DB_VALUE *value)
int db_get_last_insert_id(DB_VALUE *value)
Definition: db_admin.c:1058
DB_METHOD * db_get_methods(DB_OBJECT *obj)
Definition: db_info.c:1513
int str_like(char *src, char *pattern, char esc_char)
Definition: cas_str_like.c:72
int ux_col_seq_put(DB_COLLECTION *col, int index, DB_VALUE *ele_val, T_NET_BUF *net_buf)
Definition: cas_execute.c:3026
static void report_abnormal_host_status(int err_code)
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
static int ux_use_sp_out(int srv_h_id)
Definition: cas_execute.c:9087
static int get_client_result_cache_lifetime(DB_SESSION *session, int stmt_id)
Definition: cas_execute.c:9567
void db_synchronize_cache(void)
Definition: db_admin.c:1586
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
const char ** p
Definition: dynamic_load.c:945
int db_attribute_is_reverse_indexed(DB_ATTRIBUTE *attribute)
Definition: db_info.c:1402
DB_CONST_C_CHAR db_get_string(const DB_VALUE *value)
int db_statement_count(DB_SESSION *session)
Definition: db_vdb.c:132
void db_set_connect_status(int status)
Definition: db_macro.c:4936
#define ER_IS_ABORTED_DUE_TO_DEADLOCK(err)
#define net_arg_get_char(value, arg)
Definition: cas_net_buf.h:146
static char get_stmt_type(char *stmt)
Definition: cas_execute.c:7024
int lang_get_client_collation(void)
int db_make_nchar(DB_VALUE *value, const int nchar_length, DB_CONST_C_NCHAR str, const int nchar_str_byte_size, const int codeset, const int collation_id)
DB_DOMAIN * db_domain_set(const DB_DOMAIN *domain)
Definition: db_macro.c:4060
int db_query_tuple_count(DB_QUERY_RESULT *result)
Definition: db_query.c:3089
int db_commit_transaction(void)
Definition: db_admin.c:1091
void schema_directsuper_meta(T_NET_BUF *net_buf)
int ux_lob_new(int lob_type, T_NET_BUF *net_buf)
Definition: cas_execute.c:9864
int db_value_domain_init(DB_VALUE *value, const DB_TYPE type, const int precision, const int scale)
Definition: db_macro.c:153
#define CAS_NO_ERROR
Definition: cas.h:41
#define REALLOC(PTR, SIZE)
Definition: cas_common.h:54
union db_query_result::@47 res
void clear(cub_regex_object *&regex, char *&pattern)
void reset_optimization_level_as_saved(void)
Definition: cas_execute.c:9850
void net_buf_column_info_set(T_NET_BUF *net_buf, char ut, short scale, int prec, char charset, const char *name)
Definition: cas_net_buf.c:396
INT64 lob_size
Definition: cas.h:60
void ux_set_utype_for_enum(char u_type)
Definition: cas_execute.c:3470
DB_OBJLIST * db_get_subclasses(DB_OBJECT *obj)
Definition: db_info.c:659
void hm_session_free(T_SRV_HANDLE *srv_handle)
Definition: cas_handle.c:386