CUBRID Engine  latest
db_stub.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  * db_stub.c -
21  */
22 
23 #include "config.h"
24 
25 #include <string.h>
26 #include <stdlib.h>
27 #include <assert.h>
28 #include "api_handle.h"
29 #include "db_stub.h"
30 #include "db.h"
31 #include "parser.h"
32 #include "schema_manager.h"
33 #include "execute_schema.h"
34 #include "execute_statement.h"
35 #include "boot_cl.h"
36 #include "system_parameter.h"
37 #include "authenticate.h"
38 #include "object_accessor.h"
39 #include "jsp_sr.h"
40 
41 #define API_PROGRAM_NAME "CUBRID C API"
42 
43 #define ER_SET_AND_RETURN(X) \
44  do { \
45  if (X != NO_ERROR) { \
46  ci_err_set(X); \
47  return X; \
48  } \
49  } while(0)
50 
51 static int conn_end_tran (BH_INTERFACE * bh_interface, CI_CONN_STRUCTURE * pconn, bool commit);
52 static int stmt_release_children (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt, bool resultset_only);
53 static int stmt_bind_pmeta_handle (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt,
54  CI_PARAM_META_STRUCTURE ** outmeta);
55 static int api_rmeta_get_count (API_RESULTSET_META * impl, int *count);
56 static int api_rmeta_get_info (API_RESULTSET_META * impl, int index, CI_RMETA_INFO_TYPE type, void *arg, size_t size);
58 static int api_rs_fetch (API_RESULTSET * res, int offset, CI_FETCH_POSITION pos);
59 static int api_rs_fetch_tell (API_RESULTSET * res, int *offset);
60 static int api_rs_clear_updates (API_RESULTSET * res);
61 static int api_rs_delete_row (API_RESULTSET * res);
62 static int api_rs_get_value (API_RESULTSET * res, int index, CI_TYPE type, void *addr, size_t len, size_t * outlen,
63  bool * is_null);
64 static int api_rs_get_value_by_name (API_RESULTSET * res, const char *name, CI_TYPE type, void *addr, size_t len,
65  size_t * outlen, bool * isnull);
66 static int api_rs_update_value (API_RESULTSET * res, int index, CI_TYPE type, void *addr, size_t len);
67 static int api_rs_apply_row (API_RESULTSET * res);
68 static void api_rs_destroy (API_RESULTSET * res);
69 static int get_col_count (DB_QUERY_TYPE * query_type);
70 static int create_resultset_value_table (int num_col, BIND_HANDLE conn, CI_RESULTSET_STRUCTURE * prs,
71  VALUE_BIND_TABLE ** value_table);
72 static void conn_destroyf (BH_BIND * ptr);
73 static void stmt_destroyf (BH_BIND * ptr);
74 static void rs_destroyf (BH_BIND * ptr);
75 static void rs_meta_destroyf (BH_BIND * ptr);
76 static void pmeta_destroyf (BH_BIND * ptr);
77 static void batch_res_destroyf (BH_BIND * ptr);
78 static int init_conn_structure (CI_CONN_STRUCTURE * pconn);
79 static int init_stmt_structure (CI_STMT_STRUCTURE * pstmt);
82 static int init_pmeta_structure (CI_PARAM_META_STRUCTURE * ppmeta);
84 static int stmt_exec_immediate_internal (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt, char *sql, size_t len,
85  CI_RESULTSET * rs, int *r);
86 static int stmt_prepare_internal (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt, const char *sql, size_t len);
87 static int stmt_get_parameter_internal (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt, int index, CI_TYPE type,
88  void *addr, size_t len, size_t * outlen, bool * isnull);
89 static int stmt_set_parameter_internal (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt, int index, CI_TYPE type,
90  void *val, size_t size);
91 static int stmt_reset_session_and_parse (CI_STMT_STRUCTURE * pstmt, const char *sql, size_t len);
92 static int stmt_exec_internal (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt, CI_RESULTSET * rs, int *r);
93 static int stmt_get_resultset_metadata_internal (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt,
94  CI_RESULTSET_METADATA * r);
96 static API_RESULTSET_IFS *get_query_rs_ifs (void);
97 static int stmt_bind_resultset_meta_handle (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt, int stmt_idx,
98  CI_RESULTSET_META_STRUCTURE ** outmeta);
99 static int res_fetch_internal (BH_INTERFACE * bh_interface, CI_RESULTSET_STRUCTURE * prs, int offset,
100  CI_FETCH_POSITION pos);
101 static int res_delete_row_internal (BH_INTERFACE * bh_interface, CI_RESULTSET_STRUCTURE * prs);
102 static int rs_get_index_by_name (void *impl, const char *name, int *ri);
103 static int rs_get_db_value (void *impl, int index, DB_VALUE * val);
104 static int rs_set_db_value (void *impl, int index, DB_VALUE * val);
105 static int rs_init_domain (void *impl, int index, DB_VALUE * val);
106 static int pmeta_get_info_internal (BH_INTERFACE * bh_interface, CI_PARAM_META_STRUCTURE * ppmeta, int index,
107  CI_PMETA_INFO_TYPE type, void *arg, size_t size);
108 static int stmt_add_batch_param (CI_STMT_STRUCTURE * pstmt, DB_VALUE * val, int num_val);
109 static int stmt_exec_prepared_batch_internal (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt,
110  CI_BATCH_RESULT * br);
111 static int stmt_exec_batch_query_internal (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt,
112  CI_BATCH_RESULT * br);
113 static int conn_restart_client (CI_CONN_STRUCTURE * pconn, const char *program, int print_version, const char *volume,
114  short port);
116 static int stmt_batch_alloc_and_bind_new_result (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt,
117  CI_BATCH_RESULT_STRUCTURE ** out_pbrs, CI_BATCH_RESULT * outhbr);
118 static int stmt_batch_result_free (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt);
119 static int stmt_add_batch_string (CI_STMT_STRUCTURE * pstmt, const char *sql, size_t len);
120 static int stmt_make_error_info (CI_STMT_STRUCTURE * pstmt, int statement_id);
121 static int stmt_remove_error_info (CI_STMT_STRUCTURE * pstmt);
122 
123 static int
124 stmt_make_error_info (CI_STMT_STRUCTURE * pstmt, int statement_id)
125 {
126  DB_SESSION_ERROR *db_err;
127  DB_SESSION *session;
128 
129  session = pstmt->session;
130 
131  db_err = db_get_errors (session);
132 
133  do
134  {
135  STMT_ERROR_INFO *err_info, *tmp;
136  const char *err_msg;
137  int line, col;
138 
139  line = col = -1;
140 
141  db_err = db_get_next_error (db_err, &line, &col);
142 
143  err_info = (STMT_ERROR_INFO *) malloc (sizeof (STMT_ERROR_INFO));
144  memset (err_info, '\0', sizeof (err_info));
145  if (err_info)
146  {
147  err_info->line = line;
148  err_info->column = col;
149  err_info->err_code = statement_id;
150  err_msg = api_get_errmsg ();
151 
152  if (err_msg)
153  {
154  err_info->err_msg = strdup (err_msg);
155  }
156 
157  if (pstmt->err_info == NULL)
158  {
159  pstmt->err_info = err_info;
160  }
161  else
162  {
163  tmp = pstmt->err_info;
164  while (tmp->next)
165  tmp = tmp->next;
166 
167  tmp->next = err_info;
168  }
169  }
170  }
171  while (db_err);
172 
173  return NO_ERROR;
174 }
175 
179 };
180 
183  api_rs_fetch,
192 };
193 
194 /*
195  * stmt_remove_error_info -
196  * return:
197  * pstmt():
198  */
199 static int
201 {
202  STMT_ERROR_INFO *err_info, *tmp;
203 
204  err_info = pstmt->err_info;
205  while (err_info)
206  {
207  tmp = err_info->next;
208  if (err_info->err_msg)
209  free (err_info->err_msg);
210  free (err_info);
211 
212  err_info = tmp;
213  }
214  pstmt->err_info = NULL;
215 
216  return NO_ERROR;
217 }
218 
219 /*
220  * conn_destroyf -
221  * return:
222  * ptr():
223  */
224 static void
226 {
227  CI_CONN_STRUCTURE *pconn;
228  assert (ptr);
229 
230  if (ptr)
231  {
232  pconn = (CI_CONN_STRUCTURE *) ptr;
233  if (pconn->handle_type != HANDLE_TYPE_CONNECTION)
234  {
235  return;
236  }
237 
238  if (pconn->opool)
239  {
240  pconn->opool->destroy (pconn->opool);
241  }
242  free (ptr);
243  }
244 }
245 
246 /*
247  * stmt_destroyf -
248  * return:
249  * ptr():
250  */
251 static void
253 {
254  int i, param_count;
255  CI_STMT_STRUCTURE *pstmt;
256 
257  assert (ptr);
258 
259  if (ptr)
260  {
261  pstmt = (CI_STMT_STRUCTURE *) ptr;
262  if (pstmt->handle_type != HANDLE_TYPE_STATEMENT)
263  return;
264 
265  stmt_remove_error_info (pstmt);
266 
267  if (pstmt->rs_info != NULL)
268  {
269  free (pstmt->rs_info);
270  }
271 
272  if (pstmt->batch_data)
273  {
274  bool is_prepared_batch;
275  CI_BATCH_DATA *batch_data, *tmp;
276  is_prepared_batch = (pstmt->stmt_status & CI_STMT_STATUS_PREPARED) ? true : false;
277 
278  batch_data = pstmt->batch_data;
279  for (i = 0; i < pstmt->batch_count && batch_data; i++)
280  {
281  if (is_prepared_batch)
282  {
283  if (batch_data->data.val)
284  {
285  DB_VALUE *val;
286  param_count = pstmt->session->parser->host_var_count;
287 
288  for (i = 0, val = batch_data->data.val; i < param_count; i++, val++)
289  {
290  pr_clear_value (val);
291  }
292 
293  free (batch_data->data.val);
294  }
295  }
296  else
297  {
298  free (batch_data->data.query_string);
299  }
300 
301  tmp = batch_data;
302  batch_data = tmp->next;
303  free (tmp);
304  }
305  }
306 
307  if (pstmt->param_val)
308  {
309  DB_VALUE *val;
310  param_count = pstmt->session->parser->host_var_count;
311 
312  for (i = 0, val = pstmt->param_val; i < param_count; i++, val++)
313  {
314  pr_clear_value (val);
315  }
316 
317  free (pstmt->param_val);
318  }
319 
320  if (pstmt->session != NULL)
322  free (pstmt);
323  }
324 }
325 
326 /*
327  * rs_destroyf -
328  * return:
329  * ptr():
330  */
331 static void
333 {
335  CI_STMT_STRUCTURE *pstmt = NULL;
336  BH_INTERFACE *bh_interface;
337 
338  assert (ptr);
339 
340  if (ptr)
341  {
342  prs = (CI_RESULTSET_STRUCTURE *) ptr;
343  if (prs->handle_type != HANDLE_TYPE_RESULTSET)
344  return;
345 
346  if (prs->result != NULL)
347  {
348  db_query_end (prs->result);
349  }
350 
351  if (prs->value_table != NULL)
352  {
353  prs->value_table->ifs->destroy (prs->value_table);
354  }
355 
356  bh_interface = prs->bh_interface;
357  bh_interface->bind_get_parent (bh_interface, (BH_BIND *) prs, (BH_BIND **) (&pstmt));
358  if (pstmt != NULL)
359  {
360  int retval;
361  int stmt_index = prs->stmt_idx;
363  CI_RESULTSET_METADATA hrsmeta;
364 
365  if (pstmt->rs_info)
366  {
367  prsmeta = pstmt->rs_info[stmt_index].rsmeta;
368  pstmt->rs_info[stmt_index].rs = NULL;
369  }
370 
371  if ((prsmeta != NULL) && !(pstmt->stmt_status | CI_STMT_STATUS_PREPARED))
372  {
373  retval = bh_interface->bind_to_handle (bh_interface, (BH_BIND *) prsmeta, ((BIND_HANDLE *) (&hrsmeta)));
374  if (retval == NO_ERROR)
375  {
376  retval = bh_interface->destroy_handle (bh_interface, (BIND_HANDLE) hrsmeta);
377  pstmt->rs_info[stmt_index].rsmeta = NULL;
378  }
379  }
380  if (pstmt->pconn->opt.autocommit && pstmt->pconn->need_defered_commit)
381  {
382  int i, rs_count;
383 
384  rs_count = pstmt->session->dimension;
385 
386  for (i = 0; i < rs_count; i++)
387  {
388  if (pstmt->rs_info[i].rs != NULL)
389  {
390  break;
391  }
392  }
393 
394  if (i == rs_count)
395  {
396  conn_end_tran (bh_interface, pstmt->pconn, true);
397  pstmt->pconn->need_defered_commit = false;
398  }
399  }
400 
401  }
402 
403  free (prs);
404  }
405 }
406 
407 /*
408  * rs_meta_destroyf -
409  * return:
410  * ptr():
411  */
412 static void
414 {
416 
417  assert (ptr);
418 
419  if (ptr)
420  {
421  prmeta = (CI_RESULTSET_META_STRUCTURE *) ptr;
422  if (prmeta->handle_type != HANDLE_TYPE_RMETA)
423  return;
424 
425  free (prmeta);
426  }
427 }
428 
429 /*
430  * pmeta_destroyf -
431  * return:
432  * ptr():
433  */
434 static void
436 {
437  CI_PARAM_META_STRUCTURE *ppmeta;
438 
439  assert (ptr);
440 
441  if (ptr)
442  {
443  ppmeta = (CI_PARAM_META_STRUCTURE *) ptr;
444  if (ppmeta->handle_type != HANDLE_TYPE_PMETA)
445  return;
446 
447  free (ppmeta);
448  }
449 }
450 
451 /*
452  * batch_res_destroyf -
453  * return:
454  * ptr():
455  */
456 static void
458 {
459  int i;
461 
462  assert (ptr);
463 
464  if (ptr)
465  {
466  pbrs = (CI_BATCH_RESULT_STRUCTURE *) ptr;
467  if (pbrs->handle_type != HANDLE_TYPE_BATCH_RESULT)
468  return;
469 
470  for (i = 0; i < pbrs->rs_count; i++)
471  {
472  if (pbrs->rs_info[i].err_msg != NULL)
473  {
474  free (pbrs->rs_info[i].err_msg);
475  }
476  }
477 
478  if (pbrs->rs_info)
479  free (pbrs->rs_info);
480 
481  free (pbrs);
482  }
483 
484 }
485 
486 /*
487  * init_conn_structure -
488  * return:
489  * pconn():
490  */
491 static int
493 {
494  assert (pconn);
495 
496  memset (pconn, '\0', sizeof (CI_CONN_STRUCTURE));
497 
498  pconn->bind.dtor = conn_destroyf;
499  pconn->handle_type = HANDLE_TYPE_CONNECTION;
500 
501  return NO_ERROR;
502 }
503 
504 /*
505  * init_stmt_structure -
506  * return:
507  * pstmt():
508  */
509 static int
511 {
512  assert (pstmt);
513 
514  memset (pstmt, '\0', sizeof (CI_STMT_STRUCTURE));
515  /* This will set every option to zero(false) pstmt->opt.hold_cursors_over_commit = 0; pstmt->opt.updatable_result =
516  * 0; pstmt->opt.get_generated_key = 0; */
517 
518  pstmt->bind.dtor = stmt_destroyf;
519  pstmt->handle_type = HANDLE_TYPE_STATEMENT;
520 
521  return NO_ERROR;
522 }
523 
524 /*
525  * init_resultset_structure -
526  * return:
527  * prs():
528  */
529 static int
531 {
532  assert (prs);
533  memset (prs, '\0', sizeof (CI_RESULTSET_STRUCTURE));
534 
535  prs->bind.dtor = rs_destroyf;
536  prs->handle_type = HANDLE_TYPE_RESULTSET;
537  prs->ifs = get_query_rs_ifs ();
538 
539  return NO_ERROR;
540 }
541 
542 /*
543  * init_rmeta_structure -
544  * return:
545  * prmeta():
546  */
547 static int
549 {
550  assert (prmeta);
551  memset (prmeta, '\0', sizeof (CI_RESULTSET_META_STRUCTURE));
552 
553  prmeta->bind.dtor = rs_meta_destroyf;
554  prmeta->handle_type = HANDLE_TYPE_RMETA;
555  prmeta->ifs = get_query_rmeta_ifs ();
556 
557  return NO_ERROR;
558 }
559 
560 /*
561  * init_pmeta_structure -
562  * return:
563  * ppmeta():
564  */
565 static int
567 {
568  assert (ppmeta);
569  memset (ppmeta, '\0', sizeof (CI_PARAM_META_STRUCTURE));
570 
571  ppmeta->bind.dtor = pmeta_destroyf;
572  ppmeta->handle_type = HANDLE_TYPE_PMETA;
573 
574  return NO_ERROR;
575 }
576 
577 /*
578  * init_batch_rs_structure -
579  * return:
580  * pbrs():
581  */
582 static int
584 {
585  assert (pbrs);
586  pbrs->handle_type = HANDLE_TYPE_BATCH_RESULT;
587  pbrs->bind.dtor = batch_res_destroyf;
588 
589  pbrs->rs_count = 0;
590 
591  return NO_ERROR;
592 }
593 
594 /*
595  * api_rs_get_resultset_metadata -
596  * return:
597  * res():
598  * rimpl():
599  */
600 static int
602 {
605  CI_STMT_STRUCTURE *pstmt;
606  BH_INTERFACE *bh_interface;
607  int stmt_idx, retval;
608 
609  assert (res && rimpl);
610 
611  prs = (CI_RESULTSET_STRUCTURE *) res;
612 
613  /* 1. find prsmeta from prs structure */
614  prsmeta = prs->prsmeta;
615 
616  if (prsmeta == NULL)
617  {
618  bh_interface = prs->bh_interface;
619 
620  /* 2. find prsmeta from pstmt structure's rs_info */
621  retval = bh_interface->bind_get_parent (bh_interface, (BH_BIND *) prs, (BH_BIND **) (&pstmt));
622 
623  if (retval != NO_ERROR)
624  {
625  ER_SET_AND_RETURN (retval);
626  }
627 
628  if (pstmt->handle_type != HANDLE_TYPE_STATEMENT)
629  {
631  }
632 
633  stmt_idx = prs->stmt_idx;
634 
635  prsmeta = pstmt->rs_info[stmt_idx].rsmeta;
636 
637  if (prsmeta == NULL)
638  {
639  /* 3. there is no prsmeta structure, so now we will make this and return */
640  retval = stmt_bind_resultset_meta_handle (bh_interface, pstmt, stmt_idx, &prsmeta);
641  if (retval != NO_ERROR)
642  {
643  return retval;
644  }
645  }
646  else
647  {
648  prs->prsmeta = pstmt->rs_info[stmt_idx].rsmeta;
649  }
650  }
651 
652  *rimpl = (API_RESULTSET_META *) prsmeta;
653 
654  return NO_ERROR;
655 }
656 
657 /*
658  * api_rs_fetch -
659  * return:
660  * res():
661  * offset():
662  * pos():
663  */
664 static int
665 api_rs_fetch (API_RESULTSET * res, int offset, CI_FETCH_POSITION pos)
666 {
667  int retval;
669 
670  assert (res);
671  prs = (CI_RESULTSET_STRUCTURE *) res;
672 
673  retval = res_fetch_internal (prs->bh_interface, prs, offset, pos);
674 
675  if (retval == NO_ERROR)
676  {
677  prs->value_table->ifs->reset (prs->value_table);
678  prs->current_row_isupdated = prs->current_row_isdeleted = false;
679  }
680 
681  return retval;
682 }
683 
684 /*
685  * api_rs_fetch_tell -
686  * return:
687  * res():
688  * offset():
689  */
690 static int
691 api_rs_fetch_tell (API_RESULTSET * res, int *offset)
692 {
694  int tpl_pos;
695 
696  prs = (CI_RESULTSET_STRUCTURE *) res;
697 
698  tpl_pos = 0;
699  switch (prs->result->type)
700  {
701  case T_SELECT:
702  tpl_pos = prs->result->res.s.cursor_id.tuple_no;
703  break;
704  case T_CALL:
705  case T_OBJFETCH:
706  break;
707  case T_GET:
708  tpl_pos = prs->result->res.g.tpl_idx;
709  break;
710  default:
711  break;
712  }
713  *offset = tpl_pos + 1;
714 
715  return NO_ERROR;
716 }
717 
718 /*
719  * api_rs_clear_updates -
720  * return:
721  * res():
722  */
723 static int
725 {
726  int retval;
728  CI_STMT_STRUCTURE *pstmt;
729 
730  assert (res);
731  prs = (CI_RESULTSET_STRUCTURE *) res;
732 
733  if (prs->current_row_isdeleted == true)
734  {
736  }
737 
738  retval = prs->bh_interface->bind_get_parent (prs->bh_interface, (BH_BIND *) prs, (BH_BIND **) (&pstmt));
739 
740  if (retval != NO_ERROR)
741  {
742  ER_SET_AND_RETURN (retval);
743  }
744 
745  if (pstmt->opt.updatable_result == false)
746  {
748  }
749 
750  if (prs->current_row_isupdated == true)
751  {
752  retval = prs->value_table->ifs->reset (prs->value_table);
753  if (retval == NO_ERROR)
754  {
755  prs->current_row_isupdated = false;
756  }
757  }
758 
759  return retval;
760 }
761 
762 /*
763  * api_rs_delete_row -
764  * return:
765  * res():
766  */
767 static int
769 {
770  int retval;
772  CI_STMT_STRUCTURE *pstmt;
773 
774  assert (res);
775 
776  prs = (CI_RESULTSET_STRUCTURE *) res;
777 
778  if (prs->current_row_isdeleted == true)
779  {
781  }
782 
783  retval = prs->bh_interface->bind_get_parent (prs->bh_interface, (BH_BIND *) prs, (BH_BIND **) (&pstmt));
784 
785  if (retval != NO_ERROR)
786  {
787  ER_SET_AND_RETURN (retval);
788  }
789 
790  if (pstmt->opt.updatable_result == false)
791  {
793  }
794 
795  retval = res_delete_row_internal (prs->bh_interface, prs);
796 
797  if (retval == NO_ERROR)
798  {
799  prs->current_row_isdeleted = true;
800  }
801 
802  return retval;
803 }
804 
805 /*
806  * api_rs_get_value -
807  * return:
808  * res():
809  * index():
810  * type():
811  * addr():
812  * len():
813  * outlen():
814  * is_null():
815  */
816 static int
817 api_rs_get_value (API_RESULTSET * res, int index, CI_TYPE type, void *addr, size_t len, size_t * outlen, bool * is_null)
818 {
819  int retval;
821 
822  assert (res);
823 
824  prs = (CI_RESULTSET_STRUCTURE *) res;
825 
826  /* convert to zero based index */
827  index--;
828 
829  if (prs->current_row_isdeleted == true)
830  {
832  }
833 
834  retval = prs->value_table->ifs->get_value (prs->value_table, index, type, addr, len, outlen, is_null);
835 
836  return retval;
837 }
838 
839 /*
840  * api_rs_get_value_by_name -
841  * return:
842  * res():
843  * name():
844  * type():
845  * addr():
846  * len():
847  * outlen():
848  * isnull():
849  */
850 static int
851 api_rs_get_value_by_name (API_RESULTSET * res, const char *name, CI_TYPE type, void *addr, size_t len, size_t * outlen,
852  bool * isnull)
853 {
854  int retval;
856 
857  assert (res);
858 
859  prs = (CI_RESULTSET_STRUCTURE *) res;
860 
861 
862  if (prs->current_row_isdeleted == true)
863  {
865  }
866 
867  retval = prs->value_table->ifs->get_value_by_name (prs->value_table, name, type, addr, len, outlen, isnull);
868  return retval;
869 }
870 
871 /*
872  * api_rs_update_value -
873  * return:
874  * res():
875  * index():
876  * type():
877  * addr():
878  * len():
879  */
880 static int
881 api_rs_update_value (API_RESULTSET * res, int index, CI_TYPE type, void *addr, size_t len)
882 {
883  int retval;
885  CI_STMT_STRUCTURE *pstmt;
886 
887  assert (res);
888 
889  prs = (CI_RESULTSET_STRUCTURE *) res;
890 
891  if (prs->current_row_isdeleted == true)
892  {
894  }
895 
896  retval = prs->bh_interface->bind_get_parent (prs->bh_interface, (BH_BIND *) prs, (BH_BIND **) (&pstmt));
897 
898  if (retval != NO_ERROR)
899  {
900  ER_SET_AND_RETURN (retval);
901  }
902 
903  if (pstmt->opt.updatable_result == false)
904  {
906  }
907 
908  /* convert to zero based index */
909  index--;
910 
911  retval = prs->value_table->ifs->set_value (prs->value_table, index, type, addr, len);
912 
913  if (retval == NO_ERROR)
914  {
915  prs->current_row_isupdated = true;
916  }
917 
918  return retval;
919 }
920 
921 /*
922  * api_rs_apply_row -
923  * return:
924  * res():
925  */
926 static int
928 {
929  int retval;
931  CI_STMT_STRUCTURE *pstmt;
932 
933  assert (res);
934 
935  prs = (CI_RESULTSET_STRUCTURE *) res;
936 
937  if (prs->current_row_isdeleted == true)
938  {
940  }
941 
942  if (prs->current_row_isupdated == false)
943  {
944  return NO_ERROR;
945  }
946 
947  retval = prs->bh_interface->bind_get_parent (prs->bh_interface, (BH_BIND *) prs, (BH_BIND **) (&pstmt));
948 
949  if (retval != NO_ERROR)
950  {
951  ER_SET_AND_RETURN (retval);
952  }
953 
954  if (pstmt->opt.updatable_result == false)
955  {
957  }
958 
959  retval = prs->value_table->ifs->apply_updates (prs->value_table);
960 
961  return retval;
962 }
963 
964 /*
965  * api_rs_destroy -
966  * return:
967  * res():
968  */
969 static void
971 {
972  return;
973 }
974 
975 /*
976  * api_rmeta_get_count -
977  * return:
978  * impl():
979  * count():
980  */
981 static int
983 {
985 
986  assert (impl && count);
987 
988  prsmeta = (CI_RESULTSET_META_STRUCTURE *) impl;
989 
990  *count = prsmeta->col_count;
991 
992  return NO_ERROR;
993 }
994 
995 /*
996  * api_rmeta_get_info -
997  * return:
998  * impl():
999  * index():
1000  * type():
1001  * arg():
1002  * size():
1003  */
1004 static int
1005 api_rmeta_get_info (API_RESULTSET_META * impl, int index, CI_RMETA_INFO_TYPE type, void *arg, size_t size)
1006 {
1007  CI_RESULTSET_META_STRUCTURE *prsmeta;
1008  DB_QUERY_TYPE *query_type;
1009  int i, retval;
1010  size_t data_size;
1011 
1012  prsmeta = (CI_RESULTSET_META_STRUCTURE *) impl;
1013 
1014  query_type = prsmeta->query_type;
1015 
1016  if (query_type == NULL)
1017  {
1018  /* query_type may be closed */
1020  }
1021 
1022  for (i = 1; i < index; i++)
1023  {
1024  query_type = query_type->next;
1025  }
1026 
1027  switch (type)
1028  {
1029  case CI_RMETA_INFO_COL_LABEL:
1030  {
1031  char *data;
1032 
1033  data = (char *) arg;
1034  if (query_type->original_name == NULL)
1035  {
1036  *data = '\0';
1037  }
1038  else
1039  {
1040  data_size = strlen (query_type->original_name);
1041  if (data_size > size)
1042  {
1044  }
1045 
1046  memcpy (data, query_type->original_name, data_size);
1047  *(data + data_size) = '\0';
1048  }
1049  }
1050  break;
1051  case CI_RMETA_INFO_COL_NAME:
1052  {
1053  char *data;
1054 
1055  data = (char *) arg;
1056  if (query_type->name == NULL)
1057  {
1058  *data = '\0';
1059  }
1060  else
1061  {
1062  data_size = strlen (query_type->name);
1063  if (data_size > size)
1064  {
1066  }
1067 
1068  memcpy (data, query_type->name, data_size);
1069  *(data + data_size) = '\0';
1070  }
1071  }
1072  break;
1073  case CI_RMETA_INFO_COL_TYPE:
1074  {
1075  int *data;
1076  CI_TYPE xtype = CI_TYPE_NULL;
1077 
1078  data = (int *) arg;
1079  retval = (int) db_type_to_type (query_type->db_type, &xtype);
1080  *data = (int) xtype;
1081  }
1082  break;
1083  case CI_RMETA_INFO_PRECISION:
1084  {
1085  int *data;
1086 
1087  data = (int *) arg;
1088  if (query_type->domain)
1089  {
1090  *data = query_type->domain->precision;
1091  }
1092  else
1093  {
1094  *data = -1;
1095  }
1096  }
1097  break;
1098  case CI_RMETA_INFO_SCALE:
1099  {
1100  int *data;
1101  data = (int *) arg;
1102  if (query_type->domain)
1103  {
1104  *data = query_type->domain->scale;
1105  }
1106  else
1107  {
1108  *data = -1;
1109  }
1110  }
1111  break;
1112  case CI_RMETA_INFO_TABLE_NAME:
1113  {
1114  char *data;
1115  const char *class_name;
1116 
1117  data = (char *) arg;
1118  class_name = NULL;
1119 
1120  if (query_type->domain && query_type->domain->class_mop)
1121  {
1122  class_name = sm_get_ch_name (query_type->domain->class_mop);
1123  if (class_name)
1124  {
1125  data_size = strlen (class_name);
1126  if (data_size > size)
1127  {
1129  }
1130  memcpy (data, class_name, data_size);
1131  *(data + data_size) = '\0';
1132  break;
1133  }
1134  }
1135  if (class_name == NULL)
1136  {
1137  *data = '\0';
1138  }
1139  }
1140  break;
1141  case CI_RMETA_INFO_IS_AUTO_INCREMENT:
1142  {
1143  int *data;
1144  SM_ATTRIBUTE *att;
1145  SM_CLASS *class;
1146 
1147  data = (int *) arg;
1148  if (query_type->src_domain && query_type->src_domain->class_mop)
1149  {
1150  retval = au_fetch_class (query_type->src_domain->class_mop, &class, AU_FETCH_READ, AU_SELECT);
1151  if (retval == NO_ERROR)
1152  {
1153  att = classobj_find_attribute (class, query_type->name, 0);
1154  if (att)
1155  {
1156  *data = (att->flags & SM_ATTFLAG_AUTO_INCREMENT) ? 1 : 0;
1157  break;
1158  }
1159  }
1160  }
1161 
1162  /* error condition */
1163  *data = 0;
1164  return NO_ERROR;
1165  }
1166  break;
1167  case CI_RMETA_INFO_IS_NULLABLE:
1168  {
1169  int *data;
1170  SM_ATTRIBUTE *att;
1171  SM_CLASS *class;
1172 
1173  data = (int *) arg;
1174  if (query_type->src_domain && query_type->src_domain->class_mop)
1175  {
1176  retval = au_fetch_class (query_type->src_domain->class_mop, &class, AU_FETCH_READ, AU_SELECT);
1177  if (retval == NO_ERROR)
1178  {
1179  att = classobj_find_attribute (class, query_type->name, 0);
1180  if (att)
1181  {
1182  *data = (att->flags & SM_ATTFLAG_NON_NULL) ? 0 : 1;
1183  break;
1184  }
1185  }
1186  }
1187 
1188  /* error condition */
1189  *data = 0;
1190  return NO_ERROR;
1191  }
1192  break;
1193  case CI_RMETA_INFO_IS_WRITABLE:
1194  {
1195  int *data;
1196  BH_INTERFACE *bh_interface;
1197  CI_STMT_STRUCTURE *pstmt;
1198 
1199  data = (int *) arg;
1200 
1201  bh_interface = prsmeta->bh_interface;
1202  retval = bh_interface->bind_get_parent (bh_interface, (BH_BIND *) prsmeta, (BH_BIND **) (&pstmt));
1203  if (retval != NO_ERROR)
1204  {
1205  *data = 0;
1206  }
1207 
1208  *data = (pstmt->opt.updatable_result == true) ? 1 : 0;
1209  }
1210  break;
1211 
1212  default:
1214  }
1215 
1216  return NO_ERROR;
1217 }
1218 
1219 static int
1220 stmt_exec_one_statement (BH_INTERFACE * bh_interface, int stmt_idx, CI_STMT_STRUCTURE * pstmt, CI_RESULTSET * rs,
1221  int *r)
1222 {
1223  CI_RESULTSET hresult;
1224  CI_RESULTSET_STRUCTURE *rs_ptr;
1225  DB_QUERY_RESULT *db_q_result;
1226  int statement_id, affected_row;
1227  DB_SESSION *session = pstmt->session;
1228  int retval;
1229  CI_CONNECTION conn;
1230 
1231  bh_interface->bind_to_handle (bh_interface, (BH_BIND *) pstmt->pconn, &conn);
1232 
1233  statement_id = db_compile_statement_local (session);
1234  if (statement_id < 0)
1235  {
1236  if (pstmt->opt.exec_continue_on_error == false)
1237  {
1238  stmt_remove_error_info (pstmt);
1239  }
1240 
1241  stmt_make_error_info (pstmt, statement_id);
1242 
1243  if (pstmt->opt.exec_continue_on_error && statement_id != ER_IT_EMPTY_STATEMENT)
1244  {
1245  pstmt->rs_info[stmt_idx].metainfo.affected_row = -1;
1246 
1247  return NO_ERROR;
1248  }
1249  else
1250  {
1251  return statement_id;
1252  }
1253  }
1254  pstmt->rs_info[stmt_idx].metainfo.sql_type = db_get_statement_type (session, stmt_idx + 1);
1255  if (HAS_RESULT (pstmt->rs_info[stmt_idx].metainfo.sql_type))
1256  {
1257  pstmt->rs_info[stmt_idx].metainfo.has_result = true;
1258  pstmt->pconn->need_defered_commit = true;
1259  pstmt->pconn->need_immediate_commit = false;
1260  }
1261  else
1262  {
1263  pstmt->rs_info[stmt_idx].metainfo.has_result = false;
1264  pstmt->pconn->need_defered_commit = false;
1265  pstmt->pconn->need_immediate_commit = true;
1266  }
1267 
1268  retval = db_execute_and_keep_statement (session, statement_id, &db_q_result);
1269  if (retval >= 0)
1270  {
1271  affected_row = retval;
1272 
1273  if (pstmt->rs_info[stmt_idx].metainfo.has_result == true)
1274  {
1275  rs_ptr = (CI_RESULTSET_STRUCTURE *) malloc (sizeof (CI_RESULTSET_STRUCTURE));
1276 
1277  if (rs_ptr == NULL)
1278  {
1280  }
1281 
1282  init_resultset_structure (rs_ptr);
1283  rs_ptr->result = db_q_result;
1284  rs_ptr->stmt_idx = stmt_idx;
1285  rs_ptr->bh_interface = bh_interface;
1286  retval =
1287  create_resultset_value_table (db_q_result->col_cnt, (BIND_HANDLE) conn, rs_ptr, &(rs_ptr->value_table));
1288 
1289  if (retval != NO_ERROR)
1290  {
1291  free (rs_ptr);
1292  ER_SET_AND_RETURN (retval);
1293  }
1294 
1295  retval = bh_interface->alloc_handle (bh_interface, (BH_BIND *) rs_ptr, &hresult);
1296 
1297  if (retval != NO_ERROR)
1298  {
1299  free (rs_ptr);
1300  ER_SET_AND_RETURN (retval);
1301  }
1302 
1303  retval = bh_interface->bind_graft (bh_interface, (BH_BIND *) rs_ptr, (BH_BIND *) pstmt);
1304 
1305  if (retval != NO_ERROR)
1306  {
1307  bh_interface->destroy_handle (bh_interface, hresult);
1308  ER_SET_AND_RETURN (retval);
1309  }
1310  pstmt->rs_info[stmt_idx].rs = rs_ptr;
1311  }
1312 
1313  pstmt->rs_info[stmt_idx].metainfo.affected_row = affected_row;
1314 
1315  if (r)
1316  {
1317  *r = affected_row;
1318  }
1319 
1320  if (rs && pstmt->rs_info[stmt_idx].metainfo.has_result == true)
1321  {
1322  *rs = hresult;
1323  }
1324  }
1325  else
1326  {
1327  pstmt->rs_info[stmt_idx].metainfo.affected_row = -1;
1328 
1329  if (pstmt->opt.exec_continue_on_error == false)
1330  {
1331  stmt_remove_error_info (pstmt);
1332  }
1333 
1334  stmt_make_error_info (pstmt, retval);
1335 
1336  if (pstmt->opt.exec_continue_on_error == false)
1337  {
1338  return retval;
1339  }
1340  }
1341 
1342  return NO_ERROR;
1343 }
1344 
1345 /*
1346  * stmt_exec_immediate_internal -
1347  * return:
1348  * bh_interface():
1349  * pstmt():
1350  * sql():
1351  * rs():
1352  * r():
1353  */
1354 static int
1355 stmt_exec_immediate_internal (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt, char *sql, size_t len,
1356  CI_RESULTSET * rs, int *r)
1357 {
1358  DB_SESSION *session;
1359  int retval, i;
1360  CI_RESULTSET current_rs;
1361  int current_r;
1362 
1363  assert (pstmt && sql);
1364 
1365  if (pstmt->rs_info != NULL)
1366  {
1367  free (pstmt->rs_info);
1368  }
1369 
1370  retval = stmt_reset_session_and_parse (pstmt, sql, len);
1371 
1372  if (retval != NO_ERROR)
1373  {
1374  return retval;
1375  }
1376 
1377  pstmt->current_rs_idx = 0;
1378 
1379  session = pstmt->session;
1380 
1381  pstmt->rs_info = (STMT_RESULT_INFO *) malloc (sizeof (STMT_RESULT_INFO) * session->dimension);
1382 
1383  memset (pstmt->rs_info, '\0', sizeof (STMT_RESULT_INFO) * session->dimension);
1384 
1385  if (!pstmt->rs_info)
1386  {
1388  }
1389 
1390  if (pstmt->opt.lazy_exec == true)
1391  {
1392  retval = stmt_exec_one_statement (bh_interface, 0, pstmt, rs, r);
1393  }
1394  else
1395  {
1396  for (i = 0; i < session->dimension; i++)
1397  {
1398  retval = stmt_exec_one_statement (bh_interface, i, pstmt, &current_rs, &current_r);
1399 
1400  if (i == 0)
1401  {
1402  *rs = current_rs;
1403  *r = current_r;
1404  }
1405  }
1406 
1407  if (pstmt->pconn->opt.autocommit == true)
1408  {
1409  for (i = 0; i < session->dimension; i++)
1410  {
1411  if (pstmt->rs_info[i].metainfo.has_result == true)
1412  {
1413  pstmt->pconn->need_immediate_commit = false;
1414  pstmt->pconn->need_defered_commit = true;
1415  break;
1416  }
1417  else
1418  {
1419  pstmt->pconn->need_immediate_commit = true;
1420  }
1421  }
1422  }
1423  }
1424 
1425  return retval;
1426 }
1427 
1428 /*
1429  * stmt_prepare_internal -
1430  * return:
1431  * bh_interface():
1432  * pstmt():
1433  * sql():
1434  * len():
1435  */
1436 static int
1437 stmt_prepare_internal (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt, const char *sql, size_t len)
1438 {
1439  int retval, i, host_var_count;
1440  DB_SESSION *session;
1441  int statement_id;
1442 
1443  assert (pstmt != NULL);
1444 
1445  if (pstmt->rs_info != NULL)
1446  {
1447  free (pstmt->rs_info);
1448  }
1449 
1450  retval = stmt_reset_session_and_parse (pstmt, sql, len);
1451  session = pstmt->session;
1452 
1453  pstmt->current_rs_idx = 0;
1454 
1455  pstmt->rs_info = (STMT_RESULT_INFO *) malloc (sizeof (STMT_RESULT_INFO) * session->dimension);
1456 
1457  if (!pstmt->rs_info)
1458  {
1460  }
1461 
1462  memset (pstmt->rs_info, '\0', sizeof (pstmt->rs_info));
1463 
1464  if (retval == NO_ERROR)
1465  {
1466  for (i = 0; i < session->dimension; i++)
1467  {
1468  statement_id = db_compile_statement_local (session);
1469 
1470  if (statement_id < 0)
1471  {
1472  stmt_remove_error_info (pstmt);
1473  stmt_make_error_info (pstmt, statement_id);
1474 
1475  return statement_id;
1476  }
1477 
1478  pstmt->rs_info[i].metainfo.sql_type = db_get_statement_type (session, i + 1);
1479  pstmt->rs_info[i].metainfo.has_result = (HAS_RESULT (pstmt->rs_info[i].metainfo.sql_type)) ? true : false;
1480  }
1481 
1482  host_var_count = pstmt->session->parser->host_var_count;
1483 
1484  if (pstmt->param_val != NULL)
1485  {
1486  DB_VALUE *val;
1487  for (i = 0, val = pstmt->param_val; i < host_var_count; i++, val++)
1488  {
1489  pr_clear_value (val);
1490  }
1491 
1492  free (pstmt->param_val);
1493  pstmt->param_val = NULL;
1494  }
1495 
1496  if (pstmt->param_value_is_set != NULL)
1497  {
1498  free (pstmt->param_value_is_set);
1499  pstmt->param_value_is_set = NULL;
1500  }
1501 
1502  if (host_var_count != 0)
1503  {
1504  pstmt->param_val = (DB_VALUE *) malloc (sizeof (DB_VALUE) * host_var_count);
1505  pstmt->param_value_is_set = (bool *) malloc (sizeof (bool) * host_var_count);
1506 
1507  if (!(pstmt->param_val) || !(pstmt->param_value_is_set))
1508  {
1510  }
1511 
1512  memset (pstmt->param_val, '\0', sizeof (pstmt->param_val));
1513  memset (pstmt->param_value_is_set, '\0', sizeof (pstmt->param_value_is_set));
1514  }
1515  }
1516 
1517  return retval;
1518 }
1519 
1520 /*
1521  * stmt_get_parameter_internal -
1522  * return:
1523  * bh_interface():
1524  * pstmt():
1525  * index():
1526  * type():
1527  * addr():
1528  * len():
1529  * outlen():
1530  * isnull():
1531  */
1532 static int
1533 stmt_get_parameter_internal (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt, int index, CI_TYPE type,
1534  void *addr, size_t len, size_t * outlen, bool * isnull)
1535 {
1536  int retval;
1537  DB_VALUE *dbval;
1538 
1539  if (index <= 0 || index > pstmt->session->parser->host_var_count)
1540  {
1542  }
1543 
1544  if (!(pstmt->stmt_status & CI_STMT_STATUS_PREPARED))
1545  {
1547  }
1548 
1550  {
1551  /* read db values from session->parser->host_variables */
1552  dbval = pstmt->session->parser->host_variables;
1553  }
1554  else
1555  {
1556  /* read db values from stmt's val_table if (is_set == true) */
1557  if ((pstmt->param_value_is_set == NULL) || (pstmt->param_value_is_set[index - 1] == false))
1558  {
1560  }
1561  dbval = pstmt->param_val;
1562  }
1563 
1564  dbval += (index - 1);
1565 
1566  retval = coerce_db_value_to_value (dbval, (UINT64) 0, type, addr, len, outlen, isnull);
1567 
1568  return retval;
1569 }
1570 
1571 /*
1572  * stmt_set_parameter_internal -
1573  * return:
1574  * bh_interface():
1575  * pstmt():
1576  * index():
1577  * type():
1578  * val():
1579  * size():
1580  */
1581 static int
1582 stmt_set_parameter_internal (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt, int index, CI_TYPE type, void *val,
1583  size_t size)
1584 {
1585  int retval, i;
1586  DB_VALUE *dbval;
1587 
1588  if (index <= 0 || index > pstmt->session->parser->host_var_count)
1589  {
1591  }
1592 
1593  dbval = pstmt->param_val;
1594  for (i = 1; i < index; i++)
1595  dbval++;
1596 
1597  retval = coerce_value_to_db_value (type, val, size, dbval, false);
1598 
1599  if (retval == NO_ERROR)
1600  {
1601  pstmt->param_value_is_set[index - 1] = true;
1602  }
1603 
1604  return retval;
1605 }
1606 
1607 /*
1608  * stmt_reset_session_and_parse -
1609  * return:
1610  * pstmt():
1611  * sql():
1612  * len():
1613  */
1614 static int
1615 stmt_reset_session_and_parse (CI_STMT_STRUCTURE * pstmt, const char *sql, size_t len)
1616 {
1617  DB_SESSION *session;
1618  DB_SESSION_ERROR *pterror = NULL;
1619 
1620  if (pstmt->session != NULL)
1621  {
1623  }
1624 
1625  pstmt->session = (DB_SESSION *) malloc (sizeof (DB_SESSION));
1626  if (pstmt->session == NULL)
1627  {
1629  }
1630 
1631  memset (pstmt->session, '\0', sizeof (DB_SESSION));
1632  pstmt->session->parser = parser_create_parser ();
1633  if (pstmt->session->parser == NULL)
1634  {
1635  free (pstmt->session);
1636  pstmt->session = NULL;
1638  }
1639 
1640  session = pstmt->session;
1641 
1642  session->include_oid = (pstmt->opt.updatable_result) ? DB_ROW_OIDS : DB_NO_OIDS;
1643  session->statements = parser_parse_binary (session->parser, sql, len);
1644  pterror = pt_get_errors (session->parser);
1645 
1646  if (pterror != NULL)
1647  {
1648  stmt_make_error_info (pstmt, api_get_errid ());
1650  pstmt->session = NULL;
1651  return api_get_errid ();
1652  }
1653 
1654  if (session->statements)
1655  {
1656  PT_NODE **tmp = session->statements;
1657 
1658  if (tmp == NULL)
1659  {
1660  session->dimension = 0;
1661  }
1662  else
1663  {
1664  while (*tmp++)
1665  {
1666  (session->dimension)++;
1667  }
1668  }
1669  }
1670  else
1671  {
1672  STMT_ERROR_INFO *err_info, *tmp;
1673 
1675  err_info = (STMT_ERROR_INFO *) malloc (sizeof (STMT_ERROR_INFO));
1676  memset (err_info, '\0', sizeof (err_info));
1677 
1678  if (err_info)
1679  {
1680  const char *err_msg;
1681 
1682  err_info->line = 0;
1683  err_info->column = 0;
1684  err_info->err_code = ER_IT_EMPTY_STATEMENT;
1685  err_msg = api_get_errmsg ();
1686 
1687  if (err_msg)
1688  {
1689  err_info->err_msg = strdup (err_msg);
1690  }
1691 
1692  if (pstmt->err_info == NULL)
1693  {
1694  pstmt->err_info = err_info;
1695  }
1696  else
1697  {
1698  tmp = pstmt->err_info;
1699  while (tmp->next)
1700  tmp = tmp->next;
1701 
1702  tmp->next = err_info;
1703  }
1704  }
1705 
1707  pstmt->session = NULL;
1708  return ER_IT_EMPTY_STATEMENT;
1709  }
1710 
1711  return NO_ERROR;
1712 }
1713 
1714 /*
1715  * stmt_exec_internal -
1716  * return:
1717  * bh_interface():
1718  * pstmt():
1719  * rs():
1720  * r():
1721  */
1722 static int
1723 stmt_exec_internal (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt, CI_RESULTSET * rs, int *r)
1724 {
1725  DB_SESSION *session;
1726  int retval, i, affected_row, j;
1727  CI_CONNECTION conn;
1728 
1729  assert (pstmt);
1730 
1731  session = pstmt->session;
1732 
1733  memset (pstmt->rs_info, '\0', sizeof (pstmt->rs_info));
1734 
1735  pstmt->current_rs_idx = 0;
1736 
1737  for (j = 0; j < pstmt->session->parser->host_var_count; j++)
1738  {
1739  if (pstmt->param_value_is_set[j] != true)
1740  {
1742  }
1743  }
1744 
1745  db_push_values (session, pstmt->session->parser->host_var_count, pstmt->param_val);
1746 
1747  bh_interface->bind_to_handle (bh_interface, (BH_BIND *) pstmt->pconn, &conn);
1748 
1749  for (i = 0; i < session->dimension; i++)
1750  {
1751  CI_RESULTSET hresult;
1752  CI_RESULTSET_STRUCTURE *rs_ptr;
1753  DB_QUERY_RESULT *db_q_result;
1755 
1756  retval = db_execute_and_keep_statement (session, i + 1, &db_q_result);
1757  if (retval >= 0)
1758  {
1759  affected_row = retval;
1760 
1761  if (pstmt->rs_info[i].metainfo.has_result == true)
1762  {
1763  rs_ptr = (CI_RESULTSET_STRUCTURE *) malloc (sizeof (CI_RESULTSET_STRUCTURE));
1764  if (rs_ptr == NULL)
1765  {
1767  }
1768 
1769  init_resultset_structure (rs_ptr);
1770  rs_ptr->result = db_q_result;
1771  rs_ptr->stmt_idx = i;
1772  rs_ptr->bh_interface = bh_interface;
1773  retval =
1774  create_resultset_value_table (db_q_result->col_cnt, (BIND_HANDLE) conn, rs_ptr, &(rs_ptr->value_table));
1775 
1776  if (retval != NO_ERROR)
1777  {
1778  free (rs_ptr);
1779  ER_SET_AND_RETURN (retval);
1780  }
1781 
1782  retval = bh_interface->bind_get_first_child (bh_interface, (BH_BIND *) pstmt, (BH_BIND **) (&pnext));
1783 
1784  while (pnext != NULL)
1785  {
1786  if ((pnext->handle_type == HANDLE_TYPE_RMETA) && (pnext->stmt_idx == i))
1787  {
1788  rs_ptr->prsmeta = pnext;
1789  break;
1790  }
1791  else
1792  {
1793  BH_BIND *tmp;
1794  tmp = (BH_BIND *) pnext;
1795  retval = bh_interface->bind_get_next_sibling (bh_interface, tmp, (BH_BIND **) (&pnext));
1796  }
1797  }
1798 
1799  retval = bh_interface->alloc_handle (bh_interface, (BH_BIND *) rs_ptr, &hresult);
1800 
1801  if (retval != NO_ERROR)
1802  {
1803  free (rs_ptr);
1804  ER_SET_AND_RETURN (retval);
1805  }
1806 
1807  retval = bh_interface->bind_graft (bh_interface, (BH_BIND *) rs_ptr, (BH_BIND *) pstmt);
1808 
1809  if (retval != NO_ERROR)
1810  {
1811  bh_interface->destroy_handle (bh_interface, hresult);
1812  ER_SET_AND_RETURN (retval);
1813  }
1814 
1815  pstmt->rs_info[i].rs = rs_ptr;
1816 
1817  pstmt->pconn->need_defered_commit = true;
1818  }
1819  else
1820  {
1821  pstmt->pconn->need_immediate_commit = true;
1822  }
1823 
1824  pstmt->rs_info[i].metainfo.affected_row = affected_row;
1825 
1826  if (i == 0)
1827  {
1828  /* set the first query's result info into out param */
1829  if (r)
1830  *r = affected_row;
1831  if (rs && pstmt->rs_info[0].metainfo.has_result == true)
1832  *rs = hresult;
1833  }
1834  }
1835  else
1836  {
1837  pstmt->rs_info[i].metainfo.affected_row = -1;
1838 
1839  if (pstmt->opt.exec_continue_on_error == false)
1840  {
1841  stmt_remove_error_info (pstmt);
1842  }
1843 
1844  stmt_make_error_info (pstmt, retval);
1845 
1846  if (pstmt->opt.exec_continue_on_error == false)
1847  {
1848  return retval;
1849  }
1850  }
1851  }
1852 
1853  return NO_ERROR;
1854 }
1855 
1856 /*
1857  * stmt_get_resultset_metadata_internal -
1858  * return:
1859  * bh_interface():
1860  * pstmt():
1861  * r():
1862  */
1863 static int
1864 stmt_get_resultset_metadata_internal (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt, CI_RESULTSET_METADATA * r)
1865 {
1866  int retval;
1868  STMT_RESULT_INFO *stmt_rs_info;
1869 
1870  assert (pstmt->rs_info);
1871 
1872  stmt_rs_info = &(pstmt->rs_info[pstmt->current_rs_idx]);
1873 
1874  assert (stmt_rs_info);
1875 
1876  if (stmt_rs_info->metainfo.has_result == false)
1877  {
1879  }
1880 
1881  if (stmt_rs_info->rsmeta == NULL)
1882  {
1883  /* make rsmeta handle & structure */
1884  retval = stmt_bind_resultset_meta_handle (bh_interface, pstmt, pstmt->current_rs_idx, &prmeta);
1885  if (retval != NO_ERROR)
1886  {
1887  ER_SET_AND_RETURN (retval);
1888  }
1889  }
1890  else
1891  {
1892  prmeta = stmt_rs_info->rsmeta;
1893  }
1894 
1895  retval = bh_interface->bind_to_handle (bh_interface, (BH_BIND *) prmeta, (BIND_HANDLE *) r);
1896 
1897  if (retval != NO_ERROR)
1898  {
1899  ER_SET_AND_RETURN (retval);
1900  }
1901 
1902  return NO_ERROR;
1903 }
1904 
1905 /*
1906  * get_query_rmeta_ifs -
1907  * return:
1908  */
1909 static API_RESULTSET_META_IFS *
1911 {
1912  return &RMETA_IFS_;
1913 }
1914 
1915 /*
1916  * get_query_rs_ifs -
1917  * return:
1918  */
1919 static API_RESULTSET_IFS *
1921 {
1922  return &RS_IFS_;
1923 }
1924 
1925 /*
1926  * stmt_bind_resultset_meta_handle -
1927  * return:
1928  * bh_interface():
1929  * pstmt():
1930  * stmt_idx():
1931  * outmeta():
1932  */
1933 static int
1934 stmt_bind_resultset_meta_handle (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt, int stmt_idx,
1935  CI_RESULTSET_META_STRUCTURE ** outmeta)
1936 {
1937  int retval;
1938  CI_RESULTSET_META_STRUCTURE *prsmeta;
1939  CI_RESULTSET_METADATA hrmeta;
1940 
1941  prsmeta = (CI_RESULTSET_META_STRUCTURE *) malloc (sizeof (CI_RESULTSET_META_STRUCTURE));
1942 
1943  if (prsmeta == NULL)
1944  {
1946  }
1947 
1948  init_rmeta_structure (prsmeta);
1949  prsmeta->stmt_idx = stmt_idx;
1950  prsmeta->query_type = db_get_query_type_list (pstmt->session, stmt_idx + 1);
1951  prsmeta->col_count = get_col_count (prsmeta->query_type);
1952  prsmeta->bh_interface = bh_interface;
1953 
1954  retval = bh_interface->alloc_handle (bh_interface, (BH_BIND *) prsmeta, (BIND_HANDLE *) (&hrmeta));
1955 
1956  if (retval != NO_ERROR)
1957  {
1958  free (prsmeta);
1959  ER_SET_AND_RETURN (retval);
1960  }
1961 
1962  retval = bh_interface->bind_graft (bh_interface, (BH_BIND *) prsmeta, (BH_BIND *) pstmt);
1963 
1964  if (retval != NO_ERROR)
1965  {
1966  bh_interface->destroy_handle (bh_interface, (BIND_HANDLE) hrmeta);
1967  ER_SET_AND_RETURN (retval);
1968  }
1969 
1970  if (pstmt->rs_info[stmt_idx].rs)
1971  {
1972  pstmt->rs_info[stmt_idx].rs->prsmeta = prsmeta;
1973  prsmeta->query_type = pstmt->rs_info[stmt_idx].rs->result->query_type;
1974  }
1975 
1976  pstmt->rs_info[stmt_idx].rsmeta = prsmeta;
1977 
1978  *outmeta = prsmeta;
1979 
1980  return NO_ERROR;
1981 }
1982 
1983 /*
1984  * res_fetch_internal -
1985  * return:
1986  * bh_interface():
1987  * prs():
1988  * offset():
1989  * pos():
1990  */
1991 static int
1992 res_fetch_internal (BH_INTERFACE * bh_interface, CI_RESULTSET_STRUCTURE * prs, int offset, CI_FETCH_POSITION pos)
1993 {
1994  int retval;
1995  DB_QUERY_RESULT *query_result;
1996  assert (prs);
1997 
1998  query_result = prs->result;
1999 
2000  retval = db_query_seek_tuple (query_result, offset, pos);
2001 
2002  if (retval == DB_CURSOR_END)
2003  {
2005  }
2006 
2007  if (retval != DB_CURSOR_SUCCESS)
2008  {
2009  assert (er_errid () != NO_ERROR);
2010  return er_errid ();
2011  }
2012 
2013 
2014  return NO_ERROR;
2015 }
2016 
2017 /*
2018  * res_delete_row_internal -
2019  * return:
2020  * bh_interface():
2021  * prs():
2022  */
2023 static int
2025 {
2026  int retval;
2027  DB_VALUE tpl_oid;
2028  DB_OBJECT *obj;
2029 
2030  assert (bh_interface && prs);
2031 
2032  retval = cursor_get_current_oid (&(prs->result->res.s.cursor_id), &tpl_oid);
2033 
2034  if (retval != NO_ERROR)
2035  {
2036  assert (er_errid () != NO_ERROR);
2037  return er_errid ();
2038  }
2039 
2040  if ((tpl_oid.domain.general_info.is_null) || (tpl_oid.domain.general_info.type != DB_TYPE_OBJECT))
2041  {
2043  }
2044 
2045  obj = tpl_oid.data.op;
2046 
2047  retval = obj_delete (obj);
2048 
2049  return retval;
2050 }
2051 
2052 /*
2053  * get_col_count -
2054  * return:
2055  * query_type():
2056  */
2057 static int
2059 {
2060  int count;
2061  DB_QUERY_TYPE *tmp;
2062 
2063  tmp = query_type;
2064  count = 0;
2065 
2066  while (tmp)
2067  {
2068  count++;
2069  tmp = tmp->next;
2070  }
2071 
2072  return count;
2073 }
2074 
2075 /*
2076  * rs_get_index_by_name -
2077  * return:
2078  * impl():
2079  * name():
2080  * ri():
2081  */
2082 static int
2083 rs_get_index_by_name (void *impl, const char *name, int *ri)
2084 {
2085  int i, col_count;
2087  DB_QUERY_TYPE *query_type;
2088 
2089  assert (ri);
2090 
2091  prs = (CI_RESULTSET_STRUCTURE *) impl;
2092 
2093  col_count = prs->result->col_cnt;
2094  query_type = prs->result->query_type;
2095  for (i = 0; i < col_count && (query_type != NULL); i++)
2096  {
2097  if (query_type->attr_name != NULL)
2098  {
2099  if (strcasecmp (name, query_type->attr_name) == 0)
2100  {
2101  *ri = i;
2102  return NO_ERROR;
2103  }
2104  else
2105  {
2106  query_type = query_type->next;
2107  }
2108  }
2109  }
2110 
2111  if (query_type == NULL)
2112  {
2114  }
2115 
2116  return NO_ERROR;
2117 }
2118 
2119 /*
2120  * rs_get_db_value -
2121  * return:
2122  * impl():
2123  * index():
2124  * val():
2125  */
2126 static int
2127 rs_get_db_value (void *impl, int index, DB_VALUE * val)
2128 {
2129  int retval;
2131 
2132  assert (impl);
2133 
2134  prs = (CI_RESULTSET_STRUCTURE *) impl;
2135 
2136  retval = db_query_get_tuple_value (prs->result, index, val);
2137 
2138  return retval;
2139 }
2140 
2141 /*
2142  * rs_set_db_value -
2143  * return:
2144  * impl():
2145  * index():
2146  * val():
2147  */
2148 static int
2149 rs_set_db_value (void *impl, int index, DB_VALUE * val)
2150 {
2151  int i, retval;
2152  DB_VALUE tpl_oid;
2153  DB_OBJECT *obj;
2155  DB_QUERY_TYPE *query_type;
2156  const char *att_name;
2157 
2158  assert (impl);
2159 
2160  prs = (CI_RESULTSET_STRUCTURE *) impl;
2161 
2162  assert (prs->handle_type == HANDLE_TYPE_RESULTSET);
2163 
2164  retval = cursor_get_current_oid (&(prs->result->res.s.cursor_id), &tpl_oid);
2165  if (retval != NO_ERROR)
2166  {
2167  assert (er_errid () != NO_ERROR);
2168  return er_errid ();
2169  }
2170 
2171  if ((tpl_oid.domain.general_info.is_null) || (tpl_oid.domain.general_info.type != DB_TYPE_OBJECT))
2172  {
2174  }
2175 
2176  obj = tpl_oid.data.op;
2177 
2178  if (index < 0 || index > prs->result->col_cnt)
2179  {
2181  }
2182 
2183  if (prs->prsmeta != NULL)
2184  {
2185  query_type = prs->prsmeta->query_type;
2186  }
2187  else
2188  {
2189  query_type = prs->result->query_type;
2190 
2191  for (i = 0; i < index; i++)
2192  {
2193  if (query_type == NULL)
2194  {
2196  }
2197 
2198  query_type = query_type->next;
2199  }
2200  }
2201 
2202  att_name = query_type->attr_name;
2203 
2204  if (att_name == NULL)
2205  {
2207  }
2208 
2209  retval = do_check_partitioned_class (db_get_class (obj), CHECK_PARTITION_NONE, (char *) att_name);
2210 
2211  if (retval != NO_ERROR)
2212  {
2213  return retval;
2214  }
2215 
2216  retval = obj_set (obj, att_name, val);
2217 
2218  return retval;
2219 }
2220 
2221 /*
2222  * rs_init_domain -
2223  * return:
2224  * impl():
2225  * index():
2226  * val():
2227  */
2228 static int
2229 rs_init_domain (void *impl, int index, DB_VALUE * val)
2230 {
2231  int i, retval;
2233  DB_QUERY_TYPE *query_type;
2234  int precision, scale;
2235 
2236  assert (impl && val);
2237 
2238  prs = (CI_RESULTSET_STRUCTURE *) impl;
2239 
2240  assert (prs->handle_type == HANDLE_TYPE_RESULTSET);
2241 
2242  if (index < 0 || index > prs->result->col_cnt)
2243  {
2245  }
2246 
2247  if (prs->prsmeta != NULL)
2248  {
2249  query_type = prs->prsmeta->query_type;
2250  }
2251  else
2252  {
2253  query_type = prs->result->query_type;
2254 
2255  for (i = 0; i < index; i++)
2256  {
2257  if (query_type == NULL)
2258  {
2260  }
2261 
2262  query_type = query_type->next;
2263  }
2264  }
2265 
2266  if (query_type == NULL || query_type->domain == NULL)
2267  {
2268  precision = DB_DEFAULT_PRECISION;
2269  scale = DB_DEFAULT_SCALE;
2270  }
2271  else
2272  {
2273  precision = query_type->domain->precision;
2274  scale = query_type->domain->scale;
2275  }
2276 
2277  retval = db_value_domain_init (val, query_type->db_type, precision, scale);
2278 
2279  return retval;
2280 }
2281 
2282 /*
2283  * create_resultset_value_table -
2284  * return:
2285  * num_col():
2286  * conn():
2287  * prs():
2288  * value_table():
2289  */
2290 static int
2292  VALUE_BIND_TABLE ** value_table)
2293 {
2294  return create_db_value_bind_table (num_col, (void *) prs, 0, (BIND_HANDLE) conn, rs_get_index_by_name,
2296 }
2297 
2298 /*
2299  * pmeta_get_info_internal -
2300  * return:
2301  * bh_interface():
2302  * ppmeta():
2303  * index():
2304  * type():
2305  * arg():
2306  * size():
2307  */
2308 static int
2310  CI_PMETA_INFO_TYPE type, void *arg, size_t size)
2311 {
2312  DB_MARKER *marker = NULL;
2313  assert (ppmeta && arg);
2314  DB_TYPE domain_type;
2315  int retval, i;
2316 
2317  if (index <= 0 || index > ppmeta->param_count)
2318  {
2320  }
2321 
2322  marker = ppmeta->marker;
2323 
2324  switch (type)
2325  {
2326  case CI_PMETA_INFO_MODE:
2327  {
2328  int *value;
2329  value = (int *) arg;
2330  *value = (ppmeta->is_out_param[index - 1]) ? 1 : 0;
2331  return NO_ERROR;
2332  }
2333  break;
2334  case CI_PMETA_INFO_COL_TYPE:
2335  {
2336  int *val;
2337  CI_TYPE xtype;
2338  val = (int *) arg;
2339  for (i = 1; i < index; i++)
2340  {
2341  marker = (DB_MARKER *) pt_node_next ((PT_NODE *) marker);
2342  if (marker == NULL)
2343  {
2345  }
2346  }
2347 
2348  domain_type = pt_type_enum_to_db (marker->type_enum);
2349  retval = db_type_to_type (domain_type, &xtype);
2350  if (retval < 0)
2351  {
2352  return retval;
2353  }
2354  *val = xtype;
2355  return NO_ERROR;
2356  }
2357  break;
2358  case CI_PMETA_INFO_PRECISION:
2359  case CI_PMETA_INFO_SCALE:
2360  {
2361  int *val;
2362  val = (int *) arg;
2363  for (i = 1; i < index; i++)
2364  {
2365  marker = (DB_MARKER *) pt_node_next ((PT_NODE *) marker);
2366  if (marker == NULL)
2367  {
2369  }
2370  }
2371  if (marker->expected_domain)
2372  {
2373  *val =
2374  (type == CI_PMETA_INFO_PRECISION) ? marker->expected_domain->precision : marker->expected_domain->scale;
2375  }
2376  else
2377  {
2379  }
2380 
2381  return NO_ERROR;
2382  }
2383  break;
2384  case CI_PMETA_INFO_NULLABLE:
2385  {
2386  int *val;
2387  val = (int *) arg;
2388  *val = 1;
2389  return NO_ERROR;
2390  }
2391  default:
2393  }
2394 
2395  return NO_ERROR;
2396 }
2397 
2398 /*
2399  * stmt_add_batch_param -
2400  * return:
2401  * pstmt():
2402  * val():
2403  * num_val():
2404  */
2405 static int
2406 stmt_add_batch_param (CI_STMT_STRUCTURE * pstmt, DB_VALUE * val, int num_val)
2407 {
2408  CI_BATCH_DATA *batch_data, *tmp;
2409  DB_VALUE *src_val, *dest_val;
2410  int i;
2411 
2412  batch_data = (CI_BATCH_DATA *) malloc (sizeof (CI_BATCH_DATA));
2413 
2414  if (!batch_data)
2415  {
2417  }
2418 
2419  memset (batch_data, '\0', sizeof (CI_BATCH_DATA));
2420 
2421  batch_data->data.val = (DB_VALUE *) malloc (sizeof (DB_VALUE) * num_val);
2422  if (batch_data->data.val == NULL)
2423  {
2425  }
2426 
2427  for (i = 0, src_val = pstmt->param_val, dest_val = batch_data->data.val; i < num_val; i++, src_val++, dest_val++)
2428  {
2429  pr_clone_value (src_val, dest_val);
2430  }
2431 
2432  tmp = pstmt->batch_data;
2433  if (pstmt->batch_data == NULL)
2434  {
2435  pstmt->batch_data = batch_data;
2436  }
2437  else
2438  {
2439  tmp = pstmt->batch_data;
2440  while (tmp->next != NULL)
2441  {
2442  tmp = tmp->next;
2443  }
2444 
2445  tmp->next = batch_data;
2446  }
2447 
2448  return NO_ERROR;
2449 }
2450 
2451 /*
2452  * stmt_exec_prepared_batch_internal -
2453  * return:
2454  * bh_interface():
2455  * pstmt():
2456  * br():
2457  */
2458 static int
2459 stmt_exec_prepared_batch_internal (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt, CI_BATCH_RESULT * br)
2460 {
2461  DB_SESSION *session;
2462  int i, retval;
2463  bool has_result;
2465  CI_BATCH_DATA *batch_data, *tmp;
2466 
2467  session = pstmt->session;
2468  batch_data = pstmt->batch_data;
2469 
2470  retval = stmt_batch_result_free (bh_interface, pstmt);
2471 
2472  if (retval != NO_ERROR)
2473  return retval;
2474 
2475  retval = stmt_batch_alloc_and_bind_new_result (bh_interface, pstmt, &pbrs, br);
2476 
2477  if (retval != NO_ERROR)
2478  return retval;
2479 
2480  session = pstmt->session;
2481 
2482  has_result = (HAS_RESULT (db_get_statement_type (session, 1))) ? true : false;
2483 
2484  for (i = 0; i < pstmt->batch_count; i++)
2485  {
2486  DB_QUERY_RESULT *db_q_result;
2487 
2488  db_push_values (session, pstmt->session->parser->host_var_count, batch_data->data.val);
2489 
2490  retval = db_execute_and_keep_statement (session, 1, &db_q_result);
2491  if (retval >= 0)
2492  {
2493  pbrs->rs_info[i].metainfo.affected_row = retval;
2494  pbrs->rs_info[i].err_code = NO_ERROR;
2495  }
2496  else
2497  {
2498  pbrs->rs_info[i].err_code = retval;
2499  pbrs->rs_info[i].err_msg = strdup (api_get_errmsg ());
2500  }
2501 
2502  db_query_end (db_q_result);
2503  batch_data = batch_data->next;
2504  }
2505 
2506  batch_data = pstmt->batch_data;
2507  for (i = 0; i < pstmt->batch_count && batch_data; i++)
2508  {
2509  if (batch_data)
2510  free (batch_data->data.query_string);
2511 
2512  tmp = batch_data;
2513  batch_data = tmp->next;
2514  free (tmp);
2515  }
2516 
2517  pstmt->batch_count = 0;
2518  pstmt->batch_data = NULL;
2519 
2520  return NO_ERROR;
2521 }
2522 
2523 /*
2524  * stmt_exec_batch_query_internal -
2525  * return:
2526  * bh_interface():
2527  * pstmt():
2528  * br():
2529  */
2530 static int
2531 stmt_exec_batch_query_internal (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt, CI_BATCH_RESULT * br)
2532 {
2533  DB_SESSION *session;
2534  int i, retval;
2536  CI_BATCH_DATA *batch_data, *tmp;
2537 
2538  session = pstmt->session;
2539  batch_data = pstmt->batch_data;
2540 
2541  retval = stmt_batch_result_free (bh_interface, pstmt);
2542 
2543  if (retval != NO_ERROR)
2544  return retval;
2545 
2546  retval = stmt_batch_alloc_and_bind_new_result (bh_interface, pstmt, &pbrs, br);
2547 
2548  if (retval != NO_ERROR)
2549  return retval;
2550 
2551  for (i = 0; i < pstmt->batch_count; i++)
2552  {
2553  DB_SESSION *session;
2554  DB_QUERY_RESULT *db_q_result;
2555  int statement_id;
2556  char *query_string;
2557  size_t length;
2558  PT_NODE *pterror;
2559 
2560  session = (DB_SESSION *) malloc (sizeof (DB_SESSION));
2561  memset (session, '\0', sizeof (DB_SESSION));
2562 
2563  if (session == NULL)
2564  {
2566  }
2567 
2568  session->parser = parser_create_parser ();
2569  if (session->parser == NULL)
2570  {
2572  }
2573 
2574  session->include_oid = DB_NO_OIDS;
2575 
2576  query_string = batch_data->data.query_string;
2577  length = batch_data->query_length;
2578 
2579  session->statements = parser_parse_binary (session->parser, query_string, length);
2580  pterror = pt_get_errors (session->parser);
2581 
2582  if (pterror != NULL)
2583  {
2584  int line, col;
2585  const char *msg;
2586 
2587  db_get_next_error (pterror, &line, &col);
2588 
2589  pbrs->rs_info[i].err_code = api_get_errid ();
2590  msg = api_get_errmsg ();
2591 
2592  if (msg)
2593  {
2594  pbrs->rs_info[i].err_msg = strdup (msg);
2595  }
2596 
2597  db_close_session_local (session);
2598  batch_data = batch_data->next;
2599  continue;
2600  }
2601 
2602  if (session->statements)
2603  {
2604  PT_NODE **tmp = session->statements;
2605  if (tmp == NULL)
2606  session->dimension = 0;
2607  else
2608  while (*tmp++)
2609  (session->dimension)++;
2610  }
2611 
2612  statement_id = db_compile_statement_local (session);
2613  if (statement_id < 0)
2614  {
2615  const char *err = api_get_errmsg ();
2616 
2617  pbrs->rs_info[i].err_code = statement_id;
2618  if (err)
2619  pbrs->rs_info[i].err_msg = strdup (err);
2620 
2621  db_close_session_local (session);
2622  batch_data = batch_data->next;
2623  continue;
2624  }
2625 
2626  retval = db_execute_statement_local (session, statement_id, &db_q_result);
2627 
2628  if (retval >= 0)
2629  {
2630  pbrs->rs_info[i].metainfo.affected_row = retval;
2631  pbrs->rs_info[i].err_code = NO_ERROR;
2632  }
2633  else
2634  {
2635  pbrs->rs_info[i].err_code = retval;
2636  pbrs->rs_info[i].err_msg = strdup (api_get_errmsg ());
2637  }
2638 
2639  db_query_end (db_q_result);
2640  db_close_session_local (session);
2641  batch_data = batch_data->next;
2642  }
2643 
2644  /* release batch data */
2645  batch_data = pstmt->batch_data;
2646  for (i = 0; i < pstmt->batch_count && batch_data; i++)
2647  {
2648  if (batch_data)
2649  free (batch_data->data.query_string);
2650 
2651  tmp = batch_data;
2652  batch_data = tmp->next;
2653  free (tmp);
2654  }
2655  pstmt->batch_count = 0;
2656  pstmt->batch_data = NULL;
2657 
2658  return NO_ERROR;
2659 }
2660 
2661 /*
2662  * conn_restart_client -
2663  * return:
2664  * pconn():
2665  * program():
2666  * print_version():
2667  * volume():
2668  * port():
2669  */
2670 static int
2671 conn_restart_client (CI_CONN_STRUCTURE * pconn, const char *program, int print_version, const char *volume, short port)
2672 {
2673  int error = NO_ERROR;
2674  char port_string[8];
2675  BOOT_CLIENT_CREDENTIAL client_credential;
2676 
2677  strncpy (db_Program_name, program, PATH_MAX);
2678  db_Database_name[0] = '\0';
2680 
2681  if (port > 0)
2682  {
2683  sprintf (port_string, "%d", port);
2684  sysprm_set_force ("cubrid_port_id", port_string);
2685  }
2686  client_credential.client_type = DB_CLIENT_TYPE_DEFAULT;
2687  client_credential.client_info = NULL;
2688  client_credential.db_name = (char *) volume;
2689  client_credential.db_user = db_get_user_name ();
2690  client_credential.db_password = NULL;
2691  client_credential.program_name = (char *) program;
2692  client_credential.login_name = NULL;
2693  client_credential.host_name = NULL;
2694  client_credential.process_id = -1;
2695  client_credential.connect_order = DB_CONNECT_ORDER_SEQ;
2696  error = boot_restart_client (&client_credential);
2697 
2698  if (error != NO_ERROR)
2699  {
2701  }
2702  else
2703  {
2705  strcpy (db_Database_name, volume);
2707  esm_load_esm_classes ();
2708 
2709 #if !defined(WINDOWS)
2710 #if defined(SA_MODE) && defined(LINUX)
2711  if (!jsp_jvm_is_loaded ())
2712  {
2714  }
2715 #else /* SA_MODE && (LINUX||X86_SOLARIS) */
2717 #endif /* SA_MODE && (LINUX||X86_SOLARIS) */
2718 #endif /* !WINDOWS */
2719  }
2720 
2721  return (error);
2722 }
2723 
2724 /*
2725  * conn_end_tran -
2726  * return:
2727  * bh_interface():
2728  * pconn():
2729  * commit():
2730  */
2731 static int
2732 conn_end_tran (BH_INTERFACE * bh_interface, CI_CONN_STRUCTURE * pconn, bool commit)
2733 {
2734  int retval, i;
2735  CI_STMT_STRUCTURE *pstmt, *pnextstmt;
2736  bool retain_lock = false;
2737  int query_count = 0;
2738 
2739  assert (pconn);
2740 
2741  if (commit == true)
2742  retval = tran_commit (retain_lock);
2743  else
2744  retval = tran_abort ();
2745 
2746  if (retval == NO_ERROR)
2747  {
2748  retval = bh_interface->bind_get_first_child (bh_interface, (BH_BIND *) pconn, (BH_BIND **) (&pstmt));
2749 
2750  while (pstmt != NULL)
2751  {
2752  retval = stmt_release_children (bh_interface, pstmt, true);
2753  if (pstmt->rs_info)
2754  {
2755  query_count = pstmt->session->dimension;
2756  for (i = 0; i < query_count; i++)
2757  {
2758  pstmt->rs_info[i].rs = NULL;
2759  pstmt->rs_info[i].rsmeta = NULL;
2760  }
2761  }
2762 
2763  retval = bh_interface->bind_get_next_sibling (bh_interface, (BH_BIND *) pstmt, (BH_BIND **) (&pnextstmt));
2764  pstmt = pnextstmt;
2765  }
2766 
2767  if (retval != NO_ERROR)
2768  {
2769  ER_SET_AND_RETURN (retval);
2770  }
2771  }
2772 
2773  return retval;
2774 }
2775 
2776 
2777 /*
2778  * stmt_release_children -
2779  * return:
2780  * bh_interface():
2781  * pstmt():
2782  * result_set_only():
2783  */
2784 static int
2785 stmt_release_children (BH_INTERFACE * bh_interface, CI_STMT_STRUCTURE * pstmt, bool result_set_only)
2786 {
2787  CI_RESULTSET_STRUCTURE *resptr;
2788  BIND_HANDLE rs_handle;
2789  int retval;
2790 
2791  assert (bh_interface && pstmt);
2792 
2793  for (;;)
2794  {
2795  bool continue_work = false;
2796  CI_RESULTSET_STRUCTURE *nextresptr;
2797 
2798  bh_interface->bind_get_first_child (bh_interface, (BH_BIND *) pstmt, (BH_BIND **) (&resptr));
2799  if (resptr == NULL)
2800  break;
2801 
2802  if (result_set_only == false)
2803  {
2804  retval = bh_interface->bind_to_handle (bh_interface, (BH_BIND *) resptr, &rs_handle);
2805  if (retval != NO_ERROR)
2806  {
2807  assert (1);
2808  ER_SET_AND_RETURN (retval);
2809  }
2810 
2811  retval = bh_interface->destroy_handle (bh_interface, rs_handle);
2812  if (retval != NO_ERROR)
2813  {
2814  assert (1);
2815  ER_SET_AND_RETURN (retval);
2816  }
2817 
2818  continue;
2819  }
2820  else
2821  {
2822  do
2823  {
2824  if (resptr->handle_type == HANDLE_TYPE_RESULTSET || resptr->handle_type == HANDLE_TYPE_RMETA)
2825  {
2826  retval = bh_interface->bind_to_handle (bh_interface, (BH_BIND *) resptr, &rs_handle);
2827  if (retval != NO_ERROR)
2828  {
2829  ER_SET_AND_RETURN (retval);
2830  }
2831  retval = bh_interface->destroy_handle (bh_interface, rs_handle);
2832  if (retval != NO_ERROR)
2833  {
2834  ER_SET_AND_RETURN (retval);
2835  }
2836  continue_work = true;
2837  break;
2838  }
2839  else
2840  {
2841  retval =
2842  bh_interface->bind_get_next_sibling (bh_interface, (BH_BIND *) resptr, (BH_BIND **) (&nextresptr));
2843  resptr = nextresptr;
2844  }
2845  }
2846  while (resptr != NULL);
2847 
2848  if (continue_work == false)
2849  break;
2850  }
2851  }
2852 
2853  return NO_ERROR;
2854 }
2855 
2856 
2857 /*
2858  * stmt_bind_pmeta_handle -
2859  * return:
2860  * bh_interface():
2861  * pstmt():
2862  * outmeta():
2863  */
2864 static int
2866 {
2867  int retval, param_count;
2868  CI_PARAM_META_STRUCTURE *ppmeta;
2869  CI_PARAMETER_METADATA hpmeta;
2870 
2871  assert (pstmt && outmeta);
2872 
2873  ppmeta = (CI_PARAM_META_STRUCTURE *) malloc (sizeof (CI_PARAM_META_STRUCTURE));
2874 
2875  if (ppmeta == NULL)
2876  {
2878  }
2879 
2880  init_pmeta_structure (ppmeta);
2881 
2882  ppmeta->marker = db_get_input_markers (pstmt->session, 1);
2883  if (ppmeta->marker == NULL)
2884  {
2885  free (ppmeta);
2886 
2887  assert (er_errid () != NO_ERROR);
2888  return er_errid ();
2889  }
2890 
2891  param_count = pstmt->session->parser->host_var_count;
2892 
2893  if (param_count > 0)
2894  {
2895  ppmeta->is_out_param = (bool *) malloc (sizeof (bool) * param_count);
2896  if (ppmeta->is_out_param == NULL)
2897  {
2899  }
2900  memset (ppmeta->is_out_param, '\0', sizeof (ppmeta->is_out_param));
2901  }
2902 
2903  retval = bh_interface->alloc_handle (bh_interface, (BH_BIND *) ppmeta, (BIND_HANDLE *) (&hpmeta));
2904 
2905  if (retval != NO_ERROR)
2906  {
2907  free (ppmeta);
2908  ER_SET_AND_RETURN (retval);
2909  }
2910 
2911  retval = bh_interface->bind_graft (bh_interface, (BH_BIND *) ppmeta, (BH_BIND *) pstmt);
2912 
2913  ppmeta->param_count = param_count;
2914  ppmeta->bh_interface = bh_interface;
2915 
2916  if (retval != NO_ERROR)
2917  {
2918  free (ppmeta);
2919  ER_SET_AND_RETURN (retval);
2920  }
2921 
2922  *outmeta = ppmeta;
2923 
2924  return NO_ERROR;
2925 }
2926 
2927 /*
2928  * stmt_batch_result_free -
2929  * return:
2930  * bh_interface():
2931  * pstmt():
2932  */
2933 static int
2935 {
2936  int retval;
2937  CI_BATCH_RESULT_STRUCTURE *pbrs, *tmp;
2938  CI_BATCH_RESULT hbrs;
2939 
2940  retval = bh_interface->bind_get_first_child (bh_interface, (BH_BIND *) pstmt, (BH_BIND **) (&pbrs));
2941 
2942  while ((pbrs != NULL) && (retval == NO_ERROR))
2943  {
2944  if (pbrs->handle_type == HANDLE_TYPE_BATCH_RESULT)
2945  {
2946  break;
2947  }
2948 
2949  tmp = pbrs;
2950  pbrs = NULL;
2951  retval = bh_interface->bind_get_next_sibling (bh_interface, (BH_BIND *) tmp, (BH_BIND **) (&pbrs));
2952  }
2953 
2954  if (pbrs != NULL)
2955  {
2956  retval = bh_interface->bind_to_handle (bh_interface, (BH_BIND *) pbrs, (BIND_HANDLE *) (&hbrs));
2957  if (retval != NO_ERROR)
2958  {
2959  ER_SET_AND_RETURN (retval);
2960  }
2961 
2962  retval = bh_interface->destroy_handle (bh_interface, hbrs);
2963  if (retval != NO_ERROR)
2964  {
2965  ER_SET_AND_RETURN (retval);
2966  }
2967  }
2968 
2969  return NO_ERROR;
2970 }
2971 
2972 /*
2973  * stmt_batch_alloc_and_bind_new_result -
2974  * return:
2975  * bh_interface():
2976  * pstmt():
2977  * out_pbrs():
2978  * outhbr():
2979  */
2980 static int
2982  CI_BATCH_RESULT_STRUCTURE ** out_pbrs, CI_BATCH_RESULT * outhbr)
2983 {
2984  int retval;
2986  CI_BATCH_RESULT hbr;
2987 
2988  pbrs = (CI_BATCH_RESULT_STRUCTURE *) malloc (sizeof (CI_BATCH_RESULT_STRUCTURE));
2989 
2990  if (pbrs == NULL)
2991  {
2993  }
2994 
2995  init_batch_rs_structure (pbrs);
2996 
2997  pbrs->rs_count = pstmt->batch_count;
2998 
2999  pbrs->rs_info = (CI_BATCH_RESULT_INFO *) malloc (sizeof (CI_BATCH_RESULT_INFO) * pstmt->batch_count);
3000 
3001  if (pbrs->rs_info == NULL)
3002  {
3003  free (pbrs);
3005  }
3006 
3007  retval = bh_interface->alloc_handle (bh_interface, (BH_BIND *) pbrs, &hbr);
3008 
3009  if (retval != NO_ERROR)
3010  {
3011  ER_SET_AND_RETURN (retval);
3012  }
3013 
3014  retval = bh_interface->bind_graft (bh_interface, (BH_BIND *) pbrs, (BH_BIND *) pstmt);
3015 
3016  if (retval != NO_ERROR)
3017  {
3018  free (pbrs->rs_info);
3019  free (pbrs);
3020  ER_SET_AND_RETURN (retval);
3021  }
3022 
3023  memset (pbrs->rs_info, '\0', sizeof (CI_BATCH_RESULT_INFO) * pstmt->batch_count);
3024 
3025  if (out_pbrs)
3026  *out_pbrs = pbrs;
3027 
3028  if (outhbr)
3029  *outhbr = hbr;
3030 
3031  return NO_ERROR;
3032 }
3033 
3034 /*
3035  * get_connection_opool -
3036  * return:
3037  * pst():
3038  * opool():
3039  */
3040 static int
3042 {
3043  CI_CONN_STRUCTURE *pconn;
3044  pconn = (CI_CONN_STRUCTURE *) pst;
3045 
3046  if (opool)
3047  {
3048  *opool = pconn->opool;
3049  }
3050 
3051  return NO_ERROR;
3052 }
3053 
3054 /* ------------------------------------------------------------------------- */
3055 /* ci_api implementation function */
3056 /* ------------------------------------------------------------------------- */
3057 
3058 /*
3059  * ci_err_set -
3060  * return:
3061  * error_code():
3062  */
3063 int
3064 ci_err_set (int error_code)
3065 {
3066  api_er_set (ER_ERROR_SEVERITY, ARG_FILE_LINE, error_code, 0);
3067  return NO_ERROR;
3068 }
3069 
3070 /*
3071  * ci_create_connection_impl -
3072  * return:
3073  * conn():
3074  */
3075 static int
3076 ci_create_connection_impl (CI_CONNECTION * conn)
3077 {
3078  int rid, retval;
3079  CI_CONN_STRUCTURE *ptr;
3080  BH_INTERFACE *hd_ctx;
3081 
3082  ptr = (CI_CONN_STRUCTURE *) malloc (sizeof (CI_CONN_STRUCTURE));
3083  if (ptr == NULL)
3084  {
3086  }
3087 
3088  init_conn_structure (ptr);
3089 
3091  if (retval != NO_ERROR)
3092  {
3093  ER_SET_AND_RETURN (retval);
3094  }
3095 
3096  retval = bh_root_lock (rid, &hd_ctx);
3097  if (retval != NO_ERROR)
3098  {
3099  ER_SET_AND_RETURN (retval);
3100  }
3101 
3102  retval = hd_ctx->alloc_handle (hd_ctx, (BH_BIND *) ptr, conn);
3103  if (retval != NO_ERROR)
3104  {
3105  ER_SET_AND_RETURN (retval);
3106  }
3107 
3108  /* make object pool */
3109  retval = api_object_resultset_pool_create (hd_ctx, (BIND_HANDLE) * conn, &(ptr->opool));
3110  if (retval != NO_ERROR)
3111  {
3112  ER_SET_AND_RETURN (retval);
3113  }
3114 
3115  ptr->bh_interface = hd_ctx;
3116 
3117  bh_root_unlock (rid);
3118 
3119  return NO_ERROR;
3120 }
3121 
3122 /*
3123  * ci_conn_connect_impl -
3124  * return:
3125  * pst():
3126  * host():
3127  * port():
3128  * databasename():
3129  * user_name():
3130  * password():
3131  */
3132 static int
3133 ci_conn_connect_impl (COMMON_API_STRUCTURE * pst, const char *host, unsigned short port, const char *databasename,
3134  const char *user_name, const char *password)
3135 {
3136  int retval;
3137  CI_CONN_STRUCTURE *pconn;
3138  char dbname_host[1024];
3139 
3140  pconn = (CI_CONN_STRUCTURE *) pst;
3141 
3142  retval = au_login (user_name, password);
3143 
3144  if (retval != NO_ERROR)
3145  {
3146  return retval;
3147  }
3148 
3149  if (host != NULL)
3150  {
3151  memset (dbname_host, '\0', 1024);
3152  sprintf (dbname_host, "%s@%s", databasename, host);
3153  retval = conn_restart_client (pconn, API_PROGRAM_NAME, false, dbname_host, port);
3154  }
3155  else
3156  {
3157  retval = conn_restart_client (pconn, API_PROGRAM_NAME, false, databasename, port);
3158  }
3159 
3160  if (retval != NO_ERROR)
3161  {
3162  return retval;
3163  }
3164 
3166 
3167  return NO_ERROR;
3168 }
3169 
3170 /*
3171  * ci_conn_close_impl -
3172  * return:
3173  * pst():
3174  */
3175 static int
3177 {
3178  CI_CONN_STRUCTURE *pconn;
3179 
3180  pconn = (CI_CONN_STRUCTURE *) pst;
3181 
3182  boot_shutdown_client (true);
3183 #if !defined(WINDOWS)
3184  (void) os_set_signal_handler (SIGFPE, prev_sigfpe_handler);
3185 #endif
3186 
3187  return NO_ERROR;
3188 }
3189 
3190 /*
3191  * ci_conn_create_statement_impl -
3192  * return:
3193  * pst():
3194  * stmt():
3195  */
3196 static int
3198 {
3199  CI_CONN_STRUCTURE *pconn;
3200  CI_STMT_STRUCTURE *pstmt;
3201  BH_INTERFACE *bh_interface;
3202  int retval;
3203 
3204  pconn = (CI_CONN_STRUCTURE *) pst;
3205  bh_interface = pconn->bh_interface;
3206 
3207  pstmt = (CI_STMT_STRUCTURE *) malloc (sizeof (CI_STMT_STRUCTURE));
3208 
3209  if (pstmt == NULL)
3210  {
3212  }
3213 
3214  init_stmt_structure (pstmt);
3215 
3216  retval = bh_interface->alloc_handle (bh_interface, (BH_BIND *) pstmt, stmt);
3217  if (retval != NO_ERROR)
3218  {
3219  ER_SET_AND_RETURN (retval);
3220  }
3221 
3222  retval = bh_interface->bind_graft (bh_interface, (BH_BIND *) pstmt, (BH_BIND *) pconn);
3223 
3224  if (retval != NO_ERROR)
3225  {
3226  ER_SET_AND_RETURN (retval);
3227  }
3228 
3229  pstmt->pconn = pconn;
3230 
3231  return NO_ERROR;
3232 }
3233 
3234 /*
3235  * ci_conn_set_option_impl -
3236  * return:
3237  * pst():
3238  * option():
3239  * arg():
3240  * size():
3241  */
3242 static int
3243 ci_conn_set_option_impl (COMMON_API_STRUCTURE * pst, CI_CONNECTION_OPTION option, void *arg, size_t size)
3244 {
3245  int retval;
3246  int wait_msecs, autocommit, isol_lv;
3247  CI_CONN_STRUCTURE *pconn;
3248 
3249  pconn = (CI_CONN_STRUCTURE *) pst;
3250 
3251  retval = NO_ERROR;
3252 
3253  switch (option)
3254  {
3255  case CI_CONNECTION_OPTION_LOCK_TIMEOUT:
3256  if (size != sizeof (int))
3257  {
3259  }
3260  memcpy (&wait_msecs, arg, sizeof (int));
3261  tran_reset_wait_times (wait_msecs);
3262  break;
3263  case CI_CONNECTION_OPTION_TRAN_ISOLATION_LV:
3264  if (size != sizeof (int))
3265  {
3267  }
3268  memcpy (&isol_lv, arg, sizeof (int));
3269  retval = tran_reset_isolation ((DB_TRAN_ISOLATION) isol_lv, TM_TRAN_ASYNC_WS ());
3270  if (retval == NO_ERROR)
3271  {
3272  pconn->opt.isolation = isol_lv;
3273  }
3274  break;
3275  case CI_CONNECTION_OPTION_AUTOCOMMIT:
3276  if (size != sizeof (int))
3277  {
3279  }
3280  memcpy (&autocommit, arg, sizeof (int));
3281  pconn->opt.autocommit = (autocommit) ? true : false;
3282  break;
3283  case CI_CONNECTION_OPTION_CLIENT_VERSION:
3284  case CI_CONNECTION_OPTION_SERVER_VERSION:
3285  default:
3287  }
3288 
3289  return retval;
3290 }
3291 
3292 /*
3293  * ci_conn_get_option_impl -
3294  * return:
3295  * pst():
3296  * option():
3297  * arg():
3298  * size():
3299  */
3300 static int
3301 ci_conn_get_option_impl (COMMON_API_STRUCTURE * pst, CI_CONNECTION_OPTION option, void *arg, size_t size)
3302 {
3303  int wait_msecs;
3304  int intval;
3305  CI_CONN_STRUCTURE *pconn;
3306  DB_TRAN_ISOLATION isol_lv;
3307  bool dummy;
3308 
3309  pconn = (CI_CONN_STRUCTURE *) pst;
3310 
3311  switch (option)
3312  {
3313  case CI_CONNECTION_OPTION_LOCK_TIMEOUT:
3314  if (size != sizeof (int))
3315  {
3317  }
3318  tran_get_tran_settings (&wait_msecs, &isol_lv, &dummy);
3319  intval = wait_msecs;
3320  memcpy (arg, &intval, sizeof (int));
3321  break;
3322  case CI_CONNECTION_OPTION_TRAN_ISOLATION_LV:
3323  if (size != sizeof (int))
3324  {
3326  }
3327  tran_get_tran_settings (&wait_msecs, &isol_lv, &dummy);
3328  intval = (int) isol_lv;
3329  memcpy (arg, &intval, sizeof (int));
3330  pconn->opt.isolation = isol_lv;
3331  break;
3332  case CI_CONNECTION_OPTION_AUTOCOMMIT:
3333  if (size != sizeof (int))
3334  {
3336  }
3337  intval = (pconn->opt.autocommit) ? (int) 1 : (int) 0;
3338  memcpy (arg, &intval, sizeof (int));
3339  break;
3340  case CI_CONNECTION_OPTION_CLIENT_VERSION:
3341  if (pconn->opt.cli_version[0] == '\0')
3342  {
3343  strncpy (pconn->opt.cli_version, PACKAGE_STRING, VERSION_LENGTH);
3344  }
3345  strncpy ((char *) arg, pconn->opt.cli_version, size - 1);
3346  memset (arg + size - 1, '\0', 1);
3347  break;
3348  case CI_CONNECTION_OPTION_SERVER_VERSION:
3349  if (pconn->opt.srv_version[0] == '\0')
3350  {
3351  strncpy (pconn->opt.srv_version, PACKAGE_STRING, VERSION_LENGTH);
3352  }
3353  strncpy ((char *) arg, pconn->opt.srv_version, size - 1);
3354  memset (arg + size - 1, '\0', 1);
3355  break;
3356  default:
3358  }
3359  return NO_ERROR;
3360 }
3361 
3362 /*
3363  * ci_conn_commit_impl -
3364  * return:
3365  * pst():
3366  */
3367 static int
3369 {
3370  int retval;
3371  CI_CONN_STRUCTURE *pconn;
3372 
3373  pconn = (CI_CONN_STRUCTURE *) pst;
3374 
3375  retval = conn_end_tran (pconn->bh_interface, pconn, true);
3376 
3377  return retval;
3378 }
3379 
3380 /*
3381  * ci_conn_rollback_impl -
3382  * return:
3383  * pst():
3384  */
3385 static int
3387 {
3388  int retval;
3389  CI_CONN_STRUCTURE *pconn;
3390 
3391  pconn = (CI_CONN_STRUCTURE *) pst;
3392 
3393  retval = conn_end_tran (pconn->bh_interface, pconn, false);
3394 
3395  return retval;
3396 }
3397 
3398 /*
3399  * ci_conn_get_error_impl -
3400  * return:
3401  * pst():
3402  * err():
3403  * msg():
3404  * size():
3405  */
3406 static int
3407 ci_conn_get_error_impl (COMMON_API_STRUCTURE * pst, int *err, char *msg, size_t size)
3408 {
3409  assert (msg && err);
3410  *err = api_get_errid ();
3411  strncpy (msg, api_get_errmsg (), size);
3412 
3413  return NO_ERROR;
3414 }
3415 
3416 /*
3417  * ci_stmt_add_batch_query_impl -
3418  * return:
3419  * pst():
3420  * sql():
3421  * len():
3422  */
3423 static int
3424 ci_stmt_add_batch_query_impl (COMMON_API_STRUCTURE * pst, const char *sql, size_t len)
3425 {
3426  int retval;
3427  CI_STMT_STRUCTURE *pstmt;
3428 
3429  pstmt = (CI_STMT_STRUCTURE *) pst;
3430 
3431  if (pstmt->stmt_status & CI_STMT_STATUS_PREPARED)
3432  {
3434  }
3435 
3437  {
3439  }
3440 
3441  retval = stmt_add_batch_string (pstmt, sql, len);
3442 
3443  if (retval == NO_ERROR)
3444  pstmt->batch_count++;
3445 
3447 
3448  return retval;
3449 }
3450 
3451 /*
3452  * stmt_add_batch_string -
3453  * return:
3454  * pstmt():
3455  * sql():
3456  * len():
3457  */
3458 static int
3459 stmt_add_batch_string (CI_STMT_STRUCTURE * pstmt, const char *sql, size_t len)
3460 {
3461  CI_BATCH_DATA *batch_data, *tmp;
3462 
3463  assert (sql);
3464 
3465  batch_data = (CI_BATCH_DATA *) malloc (sizeof (CI_BATCH_DATA));
3466  if (!batch_data)
3467  {
3469  }
3470  memset (batch_data, '\0', sizeof (CI_BATCH_DATA));
3471 
3472  batch_data->data.query_string = (char *) malloc (len);
3473  if (batch_data->data.query_string == NULL)
3474  {
3476  }
3477  memset (batch_data->data.query_string, '\0', len);
3478 
3479  strncpy (batch_data->data.query_string, sql, len);
3480  batch_data->query_length = len;
3481 
3482  tmp = pstmt->batch_data;
3483  if (pstmt->batch_data == NULL)
3484  {
3485  pstmt->batch_data = batch_data;
3486  }
3487  else
3488  {
3489  tmp = pstmt->batch_data;
3490  while (tmp->next != NULL)
3491  {
3492  tmp = tmp->next;
3493  }
3494 
3495  tmp->next = batch_data;
3496  }
3497 
3498  return NO_ERROR;
3499 }
3500 
3501 /*
3502  * ci_stmt_add_batch_impl -
3503  * return:
3504  * pst():
3505  */
3506 static int
3508 {
3509  int retval, i, param_count;
3510  CI_STMT_STRUCTURE *pstmt;
3511 
3512  pstmt = (CI_STMT_STRUCTURE *) pst;
3513 
3514  if (!(pstmt->stmt_status & CI_STMT_STATUS_PREPARED))
3515  {
3517  }
3518 
3520  {
3522  }
3523 
3524  param_count = pstmt->session->parser->host_var_count;
3525 
3526  for (i = 0; i < param_count; i++)
3527  {
3528  if (pstmt->param_value_is_set[i] == false)
3529  {
3531  }
3532  }
3533 
3534  retval = stmt_add_batch_param (pstmt, pstmt->param_val, param_count);
3535 
3536  if (retval == NO_ERROR)
3537  pstmt->batch_count++;
3538 
3539  for (i = 0; i < param_count; i++)
3540  {
3541  pstmt->param_value_is_set[i] = false;
3542  }
3543 
3545 
3546  return retval;
3547 }
3548 
3549 /*
3550  * ci_stmt_clear_batch_impl -
3551  * return:
3552  * pst():
3553  */
3554 static int
3556 {
3557  int param_count;
3558  CI_STMT_STRUCTURE *pstmt;
3559  CI_BATCH_DATA *batch_data, *tmp;
3560  bool is_prepared_batch;
3561 
3562  pstmt = (CI_STMT_STRUCTURE *) pst;
3563 
3565  {
3567  }
3568 
3569  param_count = pstmt->session->parser->host_var_count;
3570 
3571  is_prepared_batch = (pstmt->stmt_status & CI_STMT_STATUS_PREPARED) ? true : false;
3572 
3573  batch_data = pstmt->batch_data;
3574 
3575  while (batch_data)
3576  {
3577  if (is_prepared_batch)
3578  free (batch_data->data.query_string);
3579  else
3580  free (batch_data->data.val);
3581 
3582  tmp = batch_data;
3583  batch_data = tmp->next;
3584  free (tmp);
3585  }
3586 
3587  pstmt->batch_count = 0;
3588  pstmt->batch_data = NULL;
3589 
3590  return NO_ERROR;
3591 }
3592 
3593 /*
3594  * ci_stmt_execute_immediate_impl -
3595  * return:
3596  * pst():
3597  * sql():
3598  * len():
3599  * rs():
3600  * r():
3601  */
3602 static int
3603 ci_stmt_execute_immediate_impl (COMMON_API_STRUCTURE * pst, char *sql, size_t len, CI_RESULTSET * rs, int *r)
3604 {
3605  int retval;
3606  CI_STMT_STRUCTURE *pstmt;
3607  BH_INTERFACE *bh_interface;
3608 
3609  pstmt = (CI_STMT_STRUCTURE *) pst;
3610 
3611  bh_interface = pstmt->pconn->bh_interface;
3612 
3613  if (pstmt->stmt_status & CI_STMT_STATUS_PREPARED)
3614  {
3616  }
3617 
3619  {
3621  }
3622 
3623  if (pstmt->stmt_status & CI_STMT_STATUS_EXECUTED)
3624  {
3625  retval = stmt_release_children (bh_interface, pstmt, false);
3626 
3627  if (retval != NO_ERROR)
3628  {
3629  ER_SET_AND_RETURN (retval);
3630  }
3631  }
3632 
3633  if (pstmt->pconn->opt.autocommit && pstmt->pconn->need_defered_commit)
3634  {
3635  retval = conn_end_tran (bh_interface, pstmt->pconn, true);
3636 
3637  if (retval != NO_ERROR)
3638  {
3639  return retval;
3640  }
3641  pstmt->pconn->need_defered_commit = false;
3642  }
3643 
3644  retval = stmt_exec_immediate_internal (bh_interface, pstmt, sql, len, rs, r);
3645 
3647 
3648  if (retval != NO_ERROR)
3649  {
3650  return retval;
3651  }
3652 
3653  if (pstmt->pconn->opt.autocommit && pstmt->pconn->need_immediate_commit)
3654  {
3655  retval = conn_end_tran (bh_interface, pstmt->pconn, true);
3656 
3657  if (retval != NO_ERROR)
3658  {
3659  return retval;
3660  }
3661  pstmt->pconn->need_immediate_commit = false;
3662  }
3663 
3664  return retval;
3665 }
3666 
3667 /*
3668  * ci_stmt_execute_impl -
3669  * return:
3670  * pst():
3671  * rs():
3672  * r():
3673  */
3674 static int
3675 ci_stmt_execute_impl (COMMON_API_STRUCTURE * pst, CI_RESULTSET * rs, int *r)
3676 {
3677  int retval;
3678  CI_STMT_STRUCTURE *pstmt;
3679  BH_INTERFACE *bh_interface;
3680 
3681  pstmt = (CI_STMT_STRUCTURE *) pst;
3682 
3683  bh_interface = pstmt->pconn->bh_interface;
3684 
3685  if (!(pstmt->stmt_status & CI_STMT_STATUS_PREPARED))
3686  {
3688  }
3689 
3691  {
3693  }
3694 
3695  if (pstmt->stmt_status & CI_STMT_STATUS_EXECUTED)
3696  {
3697  retval = stmt_release_children (bh_interface, pstmt, false);
3698 
3699  if (retval != NO_ERROR)
3700  {
3701  return retval;
3702  }
3703  }
3704 
3705  if (pstmt->pconn->opt.autocommit && pstmt->pconn->need_defered_commit)
3706  {
3707  retval = conn_end_tran (bh_interface, pstmt->pconn, true);
3708 
3709  if (retval != NO_ERROR)
3710  {
3711  return retval;
3712  }
3713  pstmt->pconn->need_defered_commit = false;
3714  }
3715 
3716  retval = stmt_exec_internal (bh_interface, pstmt, rs, r);
3717 
3718  if (retval != NO_ERROR)
3719  {
3720  return retval;
3721  }
3722 
3723  if (pstmt->pconn->opt.autocommit && pstmt->pconn->need_immediate_commit)
3724  {
3725  retval = conn_end_tran (bh_interface, pstmt->pconn, true);
3726 
3727  if (retval != NO_ERROR)
3728  {
3729  return retval;
3730  }
3731  pstmt->pconn->need_immediate_commit = false;
3732  }
3733 
3735 
3736  return retval;
3737 }
3738 
3739 /*
3740  * ci_stmt_execute_batch_impl -
3741  * return:
3742  * pst():
3743  * br():
3744  */
3745 static int
3747 {
3748  int retval;
3749  CI_STMT_STRUCTURE *pstmt;
3750  BH_INTERFACE *bh_interface;
3751 
3752  pstmt = (CI_STMT_STRUCTURE *) pst;
3753 
3754  bh_interface = pstmt->pconn->bh_interface;
3755 
3756  if (!(pstmt->stmt_status & CI_STMT_STATUS_BATCH_ADDED))
3757  {
3759  }
3760 
3761  if (pstmt->stmt_status & CI_STMT_STATUS_PREPARED)
3762  {
3763  retval = stmt_exec_prepared_batch_internal (bh_interface, pstmt, br);
3764  }
3765  else
3766  {
3767  retval = stmt_exec_batch_query_internal (bh_interface, pstmt, br);
3768  }
3769 
3770  if (retval != NO_ERROR)
3771  {
3772  return retval;
3773  }
3774 
3775  if (pstmt->pconn->opt.autocommit)
3776  {
3777  retval = conn_end_tran (bh_interface, pstmt->pconn, true);
3778  if (retval != NO_ERROR)
3779  {
3780  return retval;
3781  }
3782  }
3783 
3784  return NO_ERROR;
3785 }
3786 
3787 /*
3788  * ci_stmt_get_option_impl -
3789  * return:
3790  * pst():
3791  * option():
3792  * arg():
3793  * size():
3794  */
3795 static int
3796 ci_stmt_get_option_impl (COMMON_API_STRUCTURE * pst, CI_STATEMENT_OPTION option, void *arg, size_t size)
3797 {
3798  CI_STMT_STRUCTURE *pstmt;
3799  int *data;
3800 
3801  pstmt = (CI_STMT_STRUCTURE *) pst;
3802 
3803  switch (option)
3804  {
3805  case CI_STATEMENT_OPTION_HOLD_CURSORS_OVER_COMMIT:
3806  data = (int *) arg;
3807  *data = 0; /* not implemeted */
3808  break;
3809  case CI_STATEMENT_OPTION_UPDATABLE_RESULT:
3810  data = (int *) arg;
3811  *data = (pstmt->opt.updatable_result) ? 1 : 0;
3812  break;
3813  case CI_STATEMENT_OPTION_GET_GENERATED_KEYS:
3814  data = (int *) arg;
3815  *data = 0; /* not implemeted */
3816  break;
3817  case CI_STATEMENT_OPTION_EXEC_CONTINUE_ON_ERROR:
3818  data = (int *) arg;
3819  *data = (pstmt->opt.exec_continue_on_error) ? 1 : 0;
3820  break;
3821  case CI_STATEMENT_OPTION_ASYNC_QUERY:
3822  data = (int *) arg;
3823  *data = (pstmt->opt.async_query) ? 1 : 0;
3824  break;
3825  case CI_STATEMENT_OPTION_LAZY_EXEC:
3826  data = (int *) arg;
3827  *data = (pstmt->opt.lazy_exec) ? 1 : 0;
3828  break;
3829  default:
3831  break;
3832  }
3833 
3834  return NO_ERROR;
3835 }
3836 
3837 /*
3838  * ci_stmt_set_option_impl -
3839  * return:
3840  * pst():
3841  * option():
3842  * arg():
3843  * size():
3844  */
3845 static int
3846 ci_stmt_set_option_impl (COMMON_API_STRUCTURE * pst, CI_STATEMENT_OPTION option, void *arg, size_t size)
3847 {
3848  CI_STMT_STRUCTURE *pstmt;
3849  int data;
3850 
3851  pstmt = (CI_STMT_STRUCTURE *) pst;
3852 
3853  switch (option)
3854  {
3855  case CI_STATEMENT_OPTION_HOLD_CURSORS_OVER_COMMIT:
3857  break;
3858 
3859  case CI_STATEMENT_OPTION_UPDATABLE_RESULT:
3860  memcpy (&data, arg, sizeof (int));
3861  pstmt->opt.updatable_result = (data) ? true : false;
3862  break;
3863 
3864  case CI_STATEMENT_OPTION_GET_GENERATED_KEYS:
3866  break;
3867 
3868  case CI_STATEMENT_OPTION_ASYNC_QUERY:
3869  memcpy (&data, arg, sizeof (int));
3870  pstmt->opt.async_query = (data) ? true : false;
3871  break;
3872  case CI_STATEMENT_OPTION_EXEC_CONTINUE_ON_ERROR:
3873  memcpy (&data, arg, sizeof (int));
3874  pstmt->opt.exec_continue_on_error = (data) ? true : false;
3875  break;
3876  case CI_STATEMENT_OPTION_LAZY_EXEC:
3877  memcpy (&data, arg, sizeof (int));
3878  pstmt->opt.lazy_exec = (data) ? true : false;
3879  break;
3880  default:
3882  break;
3883  }
3884 
3885  return NO_ERROR;
3886 }
3887 
3888 /*
3889  * ci_stmt_prepare_impl -
3890  * return:
3891  * pst():
3892  * sql():
3893  * len():
3894  */
3895 static int
3896 ci_stmt_prepare_impl (COMMON_API_STRUCTURE * pst, const char *sql, size_t len)
3897 {
3898  int retval;
3899  CI_STMT_STRUCTURE *pstmt;
3900  BH_INTERFACE *bh_interface;
3901 
3902  pstmt = (CI_STMT_STRUCTURE *) pst;
3903 
3904  bh_interface = pstmt->pconn->bh_interface;
3905 
3907  {
3908  /* executed with exec_immediate before */
3910  }
3911 
3912  if (pstmt->stmt_status & CI_STMT_STATUS_PREPARED)
3913  {
3914  retval = stmt_release_children (bh_interface, pstmt, false);
3915 
3916  if (retval != NO_ERROR)
3917  {
3918  return retval;
3919  }
3920  }
3921 
3922  retval = stmt_prepare_internal (bh_interface, pstmt, sql, len);
3923 
3924  if (retval != NO_ERROR)
3925  {
3926  return retval;
3927  }
3928 
3930  pstmt->stmt_status &= (~CI_STMT_STATUS_EXECUTED);
3931 
3932  return retval;
3933 }
3934 
3935 /*
3936  * ci_stmt_register_out_parameter_impl -
3937  * return:
3938  * pst():
3939  * index():
3940  */
3941 static int
3943 {
3944  int retval;
3945  CI_STMT_STRUCTURE *pstmt;
3946  CI_PARAM_META_STRUCTURE *ppmeta;
3947  BH_INTERFACE *bh_interface;
3948 
3949  pstmt = (CI_STMT_STRUCTURE *) pst;
3950  bh_interface = pstmt->pconn->bh_interface;
3951 
3952  if (!(pstmt->stmt_status & CI_STMT_STATUS_PREPARED))
3953  {
3955  }
3956 
3957  ppmeta = pstmt->ppmeta;
3958 
3959  if (ppmeta == NULL)
3960  {
3961  retval = stmt_bind_pmeta_handle (bh_interface, pstmt, &ppmeta);
3962  if (retval != NO_ERROR)
3963  {
3964  return retval;
3965  }
3966  }
3967 
3968  if (ppmeta->param_count < index)
3969  {
3971  }
3972 
3973  if (pstmt->param_value_is_set[index - 1] == false)
3974  {
3975  retval = stmt_set_parameter_internal (bh_interface, pstmt, index, CI_TYPE_NULL, NULL, 0);
3976  if (retval != NO_ERROR)
3977  {
3978  return retval;
3979  }
3980  }
3981 
3982  ppmeta->is_out_param[index] = CI_PARAM_MODE_OUT;
3983 
3984  return NO_ERROR;
3985 }
3986 
3987 /*
3988  * ci_stmt_get_resultset_metadata_impl -
3989  * return:
3990  * pst():
3991  * r():
3992  */
3993 static int
3995 {
3996  int retval;
3997  CI_STMT_STRUCTURE *pstmt;
3998  BH_INTERFACE *bh_interface;
3999 
4000  pstmt = (CI_STMT_STRUCTURE *) pst;
4001  bh_interface = pstmt->pconn->bh_interface;
4002 
4004  {
4006  }
4007 
4008  retval = stmt_get_resultset_metadata_internal (bh_interface, pstmt, r);
4009 
4010  if (retval != NO_ERROR)
4011  {
4012  return retval;
4013  }
4014 
4015  return NO_ERROR;
4016 }
4017 
4018 /*
4019  * ci_stmt_get_parameter_metadata_impl -
4020  * return:
4021  * pst():
4022  * r():
4023  */
4024 static int
4026 {
4027  int retval;
4028  CI_STMT_STRUCTURE *pstmt;
4029  BH_INTERFACE *bh_interface;
4030 
4031  pstmt = (CI_STMT_STRUCTURE *) pst;
4032  bh_interface = pstmt->pconn->bh_interface;
4033 
4034  if (!(pstmt->stmt_status & CI_STMT_STATUS_PREPARED))
4035  {
4037  }
4038 
4039  if (pstmt->ppmeta == NULL)
4040  {
4041  retval = stmt_bind_pmeta_handle (bh_interface, pstmt, &(pstmt->ppmeta));
4042  if (retval != NO_ERROR)
4043  {
4044  return retval;
4045  }
4046  }
4047 
4048  retval = bh_interface->bind_to_handle (bh_interface, (BH_BIND *) pstmt->ppmeta, (BIND_HANDLE *) r);
4049 
4050  if (retval != NO_ERROR)
4051  {
4052  ER_SET_AND_RETURN (retval);
4053  }
4054 
4055  return NO_ERROR;
4056 }
4057 
4058 /*
4059  * ci_stmt_get_parameter_impl -
4060  * return:
4061  * pst():
4062  * index():
4063  * type():
4064  * addr():
4065  * len():
4066  * outlen():
4067  * isnull():
4068  */
4069 static int
4070 ci_stmt_get_parameter_impl (COMMON_API_STRUCTURE * pst, int index, CI_TYPE type, void *addr, size_t len,
4071  size_t * outlen, bool * isnull)
4072 {
4073  int retval;
4074  CI_STMT_STRUCTURE *pstmt;
4075  BH_INTERFACE *bh_interface;
4076 
4077  pstmt = (CI_STMT_STRUCTURE *) pst;
4078  bh_interface = pstmt->pconn->bh_interface;
4079 
4080  if (!(pstmt->stmt_status & CI_STMT_STATUS_PREPARED))
4081  {
4083  }
4084 
4085  retval = stmt_get_parameter_internal (bh_interface, pstmt, index, type, addr, len, outlen, isnull);
4086 
4087  return retval;
4088 }
4089 
4090 /*
4091  * ci_stmt_set_parameter_impl -
4092  * return:
4093  * pst():
4094  * index():
4095  * type():
4096  * val():
4097  * size():
4098  */
4099 static int
4100 ci_stmt_set_parameter_impl (COMMON_API_STRUCTURE * pst, int index, CI_TYPE type, void *val, size_t size)
4101 {
4102  int retval;
4103  CI_STMT_STRUCTURE *pstmt;
4104  BH_INTERFACE *bh_interface;
4105 
4106  pstmt = (CI_STMT_STRUCTURE *) pst;
4107  bh_interface = pstmt->pconn->bh_interface;
4108 
4109  if (!(pstmt->stmt_status & CI_STMT_STATUS_PREPARED))
4110  {
4112  }
4113 
4114  retval = stmt_set_parameter_internal (bh_interface, pstmt, index, type, val, size);
4115 
4116  return retval;
4117 }
4118 
4119 /*
4120  * ci_stmt_get_resultset_impl -
4121  * return:
4122  * pst():
4123  * res():
4124  */
4125 static int
4127 {
4128  int retval;
4129  CI_STMT_STRUCTURE *pstmt;
4131  BH_INTERFACE *bh_interface;
4132 
4133  pstmt = (CI_STMT_STRUCTURE *) pst;
4134  bh_interface = pstmt->pconn->bh_interface;
4135 
4136  if (!(pstmt->stmt_status & CI_STMT_STATUS_EXECUTED))
4137  {
4139  }
4140 
4141  if (pstmt->rs_info[pstmt->current_rs_idx].metainfo.has_result == false)
4142  {
4144  }
4145 
4146  prs = pstmt->rs_info[pstmt->current_rs_idx].rs;
4147  if (prs == NULL)
4148  {
4150  }
4151 
4152  retval = bh_interface->bind_to_handle (bh_interface, (BH_BIND *) prs, (BIND_HANDLE *) res);
4153 
4154  if (retval != NO_ERROR)
4155  {
4156  ER_SET_AND_RETURN (retval);
4157  }
4158 
4159  return NO_ERROR;
4160 }
4161 
4162 /*
4163  * ci_stmt_affected_rows_impl -
4164  * return:
4165  * pst():
4166  * out():
4167  */
4168 static int
4170 {
4171  CI_STMT_STRUCTURE *pstmt;
4172 
4173  pstmt = (CI_STMT_STRUCTURE *) pst;
4174 
4175  if (!(pstmt->stmt_status & CI_STMT_STATUS_EXECUTED))
4176  {
4178  }
4179 
4180  if (out)
4181  {
4182  *out = pstmt->rs_info[pstmt->current_rs_idx].metainfo.affected_row;
4183  }
4184 
4185  return NO_ERROR;
4186 }
4187 
4188 /*
4189  * ci_stmt_next_result_impl -
4190  * return:
4191  * pst():
4192  * exist_result():
4193  */
4194 static int
4196 {
4197  CI_STMT_STRUCTURE *pstmt;
4198  BH_INTERFACE *bh_interface;
4199  CI_RESULTSET rs;
4200  int affected_row, retval;
4201 
4202  pstmt = (CI_STMT_STRUCTURE *) pst;
4203  bh_interface = pstmt->pconn->bh_interface;
4204 
4205  if (!(pstmt->stmt_status & CI_STMT_STATUS_EXECUTED))
4206  {
4208  }
4209 
4210  if (pstmt->session->dimension <= pstmt->current_rs_idx + 1)
4211  {
4212  if (exist_result)
4213  *exist_result = false;
4214 
4215  return NO_ERROR;
4216  }
4217 
4218  pstmt->current_rs_idx += 1;
4219 
4220  if (exist_result)
4221  {
4222  *exist_result = true;
4223  }
4224 
4225  if (pstmt->opt.lazy_exec == true)
4226  {
4227  if (pstmt->pconn->opt.autocommit == true && pstmt->pconn->need_defered_commit == true)
4228  {
4229  retval = conn_end_tran (bh_interface, pstmt->pconn, true);
4230 
4231  if (retval != NO_ERROR)
4232  {
4233  return retval;
4234  }
4235  pstmt->pconn->need_defered_commit = false;
4236  }
4237 
4238  retval = stmt_exec_one_statement (bh_interface, pstmt->current_rs_idx, pstmt, &rs, &affected_row);
4239  if (retval != NO_ERROR)
4240  {
4241  return retval;
4242  }
4243 
4244  if (pstmt->pconn->opt.autocommit == true && pstmt->pconn->need_immediate_commit == true)
4245  {
4246  retval = conn_end_tran (bh_interface, pstmt->pconn, true);
4247 
4248  if (retval != NO_ERROR)
4249  {
4250  return retval;
4251  }
4252  pstmt->pconn->need_immediate_commit = false;
4253  }
4254  }
4255 
4256  return NO_ERROR;
4257 }
4258 
4259 /*
4260  * ci_batch_res_query_count_impl -
4261  * return:
4262  * pst():
4263  * count():
4264  */
4265 static int
4267 {
4269 
4270  pbrs = (CI_BATCH_RESULT_STRUCTURE *) pst;
4271 
4272  *count = pbrs->rs_count;
4273 
4274  return NO_ERROR;
4275 }
4276 
4277 /*
4278  * ci_batch_res_get_result_impl -
4279  * return:
4280  * pst():
4281  * index():
4282  * ret():
4283  * nr():
4284  */
4285 static int
4287 {
4289 
4290  pbrs = (CI_BATCH_RESULT_STRUCTURE *) pst;
4291 
4292  if (index > pbrs->rs_count)
4293  {
4295  }
4296 
4297  /* convert to zero based index */
4298  *ret = pbrs->rs_info[index - 1].err_code;
4299  *nr = pbrs->rs_info[index - 1].metainfo.affected_row;
4300 
4301  return NO_ERROR;
4302 }
4303 
4304 /*
4305  * ci_batch_res_get_error_impl -
4306  * return:
4307  * pst():
4308  * index():
4309  * err_code():
4310  * err_msg():
4311  * buf_size():
4312  */
4313 static int
4314 ci_batch_res_get_error_impl (COMMON_API_STRUCTURE * pst, int index, int *err_code, char *err_msg, size_t buf_size)
4315 {
4317 
4318  pbrs = (CI_BATCH_RESULT_STRUCTURE *) pst;
4319 
4320  if (index > pbrs->rs_count)
4321  {
4323  }
4324 
4325  *err_code = pbrs->rs_info[index].err_code;
4326 
4327  if (pbrs->rs_info[index].err_msg != NULL)
4328  strncpy (err_msg, pbrs->rs_info[index].err_msg, buf_size);
4329  else
4330  *err_msg = '\0';
4331 
4332  return NO_ERROR;
4333 }
4334 
4335 /*
4336  * ci_pmeta_get_count_impl -
4337  * return:
4338  * pst():
4339  * count():
4340  */
4341 static int
4343 {
4344  CI_PARAM_META_STRUCTURE *ppmeta;
4345 
4346  ppmeta = (CI_PARAM_META_STRUCTURE *) pst;
4347 
4348  *count = ppmeta->param_count;
4349 
4350  return NO_ERROR;
4351 }
4352 
4353 /*
4354  * ci_pmeta_get_info_impl -
4355  * return:
4356  * pst():
4357  * index():
4358  * type():
4359  * arg():
4360  * size():
4361  */
4362 static int
4363 ci_pmeta_get_info_impl (COMMON_API_STRUCTURE * pst, int index, CI_PMETA_INFO_TYPE type, void *arg, size_t size)
4364 {
4365  int retval;
4366  CI_PARAM_META_STRUCTURE *ppmeta;
4367  ppmeta = (CI_PARAM_META_STRUCTURE *) pst;
4368 
4369 
4370 
4371  retval = pmeta_get_info_internal (ppmeta->bh_interface, ppmeta, index, type, arg, size);
4372 
4373  return retval;
4374 }
4375 
4376 /*
4377  * ci_stmt_get_first_error_impl -
4378  * return:
4379  * pst():
4380  * line():
4381  * col():
4382  * errcode():
4383  * err_msg():
4384  * size():
4385  */
4386 static int
4387 ci_stmt_get_first_error_impl (COMMON_API_STRUCTURE * pst, int *line, int *col, int *errcode, char *err_msg, size_t size)
4388 {
4389  CI_STMT_STRUCTURE *pstmt;
4390 
4391  pstmt = (CI_STMT_STRUCTURE *) pst;
4392 
4394  {
4396  }
4397 
4398  if (pstmt->err_info == NULL)
4399  {
4401  }
4402 
4403  *errcode = pstmt->err_info->err_code;
4404  if (pstmt->err_info->line >= 0)
4405  {
4406  *line = pstmt->err_info->line;
4407  }
4408 
4409  if (pstmt->err_info->column >= 0)
4410  {
4411  *col = pstmt->err_info->column;
4412  }
4413 
4414  strncpy (err_msg, pstmt->err_info->err_msg, size);
4415 
4416  pstmt->current_err_idx = 1;
4417 
4418  return NO_ERROR;
4419 }
4420 
4421 /*
4422  * ci_stmt_get_next_error_impl -
4423  * return:
4424  * pst():
4425  * line():
4426  * col():
4427  * errcode():
4428  * err_msg():
4429  * size():
4430  */
4431 static int
4432 ci_stmt_get_next_error_impl (COMMON_API_STRUCTURE * pst, int *line, int *col, int *errcode, char *err_msg, size_t size)
4433 {
4434  int i;
4435  CI_STMT_STRUCTURE *pstmt;
4437 
4438  pstmt = (CI_STMT_STRUCTURE *) pst;
4439 
4441  {
4443  }
4444 
4445  err_info = pstmt->err_info;
4446 
4447  for (i = 0; i < pstmt->current_err_idx && err_info; i++)
4448  {
4449  err_info = err_info->next;
4450  }
4451 
4452  if (err_info == NULL)
4453  {
4455  }
4456 
4457  *errcode = err_info->err_code;
4458 
4459  if (err_info->line >= 0)
4460  {
4461  *line = err_info->line;
4462  }
4463 
4464  if (err_info->column >= 0)
4465  {
4466  *col = err_info->column;
4467  }
4468 
4469  strncpy (err_msg, err_info->err_msg, size);
4470 
4471  pstmt->current_err_idx++;
4472 
4473  return NO_ERROR;
4474 }
4475 
4476 /*
4477  * ci_stmt_get_query_type_impl -
4478  * return:
4479  * pst():
4480  * type(out):
4481  */
4482 static int
4484 {
4485  CI_STMT_STRUCTURE *pstmt;
4486 
4487  pstmt = (CI_STMT_STRUCTURE *) pst;
4488 
4490  {
4492  }
4493 
4495  {
4497  }
4498 
4499  if (type)
4500  {
4501  *type = pstmt->rs_info[pstmt->current_rs_idx].metainfo.sql_type;
4502  }
4503 
4504  return NO_ERROR;
4505 }
4506 
4507 /*
4508  * ci_stmt_get_start_line_impl -
4509  * return:
4510  * pst():
4511  * line(out):
4512  */
4513 static int
4515 {
4516  CI_STMT_STRUCTURE *pstmt;
4517 
4518  pstmt = (CI_STMT_STRUCTURE *) pst;
4519 
4521  {
4523  }
4524 
4526  {
4528  }
4529 
4530  if (line)
4531  {
4532  *line = db_get_start_line (pstmt->session, pstmt->current_rs_idx + 1);
4533  }
4534 
4535  return NO_ERROR;
4536 }
4537 
4538 /*
4539  * ci_collection_new_impl -
4540  * return:
4541  * conn():
4542  * coll():
4543  */
4544 static int
4545 ci_collection_new_impl (CI_CONNECTION conn, CI_COLLECTION * coll)
4546 {
4547  int res;
4548  API_COLLECTION *co;
4549 
4550  res = api_collection_create ((BIND_HANDLE) conn, &co);
4551  if (res == NO_ERROR)
4552  {
4553  *coll = co;
4554  }
4555 
4556  return res;
4557 }
4558 
4561  ci_err_set,
4598 };
#define ER_INTERFACE_NOT_PREPARED
Definition: error_code.h:1180
int bh_root_unlock(int rrid)
Definition: api_handle.c:944
CUBRID_API_FUNCTION_TABLE Cubrid_api_function_table
Definition: db_stub.c:4559
#define ER_INTERFACE_RESULTSET_CLOSED
Definition: error_code.h:1200
static int api_rs_delete_row(API_RESULTSET *res)
Definition: db_stub.c:768
int db_execute_statement_local(DB_SESSION *session, int stmt, DB_QUERY_RESULT **result)
Definition: db_vdb.c:2939
#define ER_INTERFACE_IS_NOT_BATCH_STATEMENT
Definition: error_code.h:1190
CI_BATCH_RESULT_INFO * rs_info
Definition: db_stub.h:157
int(* bind_get_first_child)(BH_INTERFACE *ifs, BH_BIND *bind, BH_BIND **pchild)
Definition: api_handle.h:67
PT_NODE * pt_get_errors(PARSER_CONTEXT *parser)
#define NO_ERROR
Definition: error_code.h:46
static int stmt_batch_alloc_and_bind_new_result(BH_INTERFACE *bh_interface, CI_STMT_STRUCTURE *pstmt, CI_BATCH_RESULT_STRUCTURE **out_pbrs, CI_BATCH_RESULT *outhbr)
Definition: db_stub.c:2981
static int api_rs_get_resultset_metadata(API_RESULTSET *res, API_RESULTSET_META **rimpl)
Definition: db_stub.c:601
static API_RESULTSET_IFS * get_query_rs_ifs(void)
Definition: db_stub.c:1920
SM_DOMAIN * src_domain
Definition: db_query.h:63
RS_META_INFO metainfo
Definition: db_stub.h:149
static int init_rmeta_structure(CI_RESULTSET_META_STRUCTURE *prmeta)
Definition: db_stub.c:548
static int ci_create_connection_impl(CI_CONNECTION *conn)
Definition: db_stub.c:3076
static int pmeta_get_info_internal(BH_INTERFACE *bh_interface, CI_PARAM_META_STRUCTURE *ppmeta, int index, CI_PMETA_INFO_TYPE type, void *arg, size_t size)
Definition: db_stub.c:2309
DB_VALUE * val
Definition: db_stub.h:142
#define HAS_RESULT(stmt_type)
Definition: db_stub.h:44
#define ER_INTERFACE_NOT_EXECUTED
Definition: error_code.h:1182
TP_DOMAIN * expected_domain
Definition: parse_tree.h:3452
DB_GET_RESULT g
Definition: db_query.h:127
CURSOR_ID cursor_id
Definition: db_query.h:74
void(* destroy)(VALUE_BIND_TABLE *tbl)
Definition: api_common.h:250
int sysprm_set_force(const char *pname, const char *pvalue)
int(* bind_graft)(BH_INTERFACE *ifs, BH_BIND *bind, BH_BIND *on_bind)
Definition: api_handle.h:66
int db_query_seek_tuple(DB_QUERY_RESULT *result, int offset, int seek_mode)
Definition: db_query.c:2455
void tran_get_tran_settings(int *lock_wait_in_msecs, TRAN_ISOLATION *tran_isolation, bool *async_ws)
static int ci_stmt_execute_immediate_impl(COMMON_API_STRUCTURE *pst, char *sql, size_t len, CI_RESULTSET *rs, int *r)
Definition: db_stub.c:3603
int obj_delete(MOP op)
int current_err_idx
Definition: db_stub.h:171
PT_NODE * pt_node_next(const PT_NODE *node)
int db_Connect_status
Definition: db_macro.c:88
static int api_rs_fetch(API_RESULTSET *res, int offset, CI_FETCH_POSITION pos)
Definition: db_stub.c:665
bool * param_value_is_set
Definition: db_stub.h:174
int bh_root_lock(int rrid, BH_INTERFACE **bhifs)
Definition: api_handle.c:908
CI_RESULTSET_STRUCTURE * rs
Definition: db_stub.h:132
DB_TYPE
Definition: dbtype_def.h:670
#define ER_INTERFACE_NOT_SUPPORTED_OPERATION
Definition: error_code.h:1177
DB_TYPE db_type
Definition: db_query.h:60
static void api_rs_destroy(API_RESULTSET *res)
Definition: db_stub.c:970
static int stmt_bind_resultset_meta_handle(BH_INTERFACE *bh_interface, CI_STMT_STRUCTURE *pstmt, int stmt_idx, CI_RESULTSET_META_STRUCTURE **outmeta)
Definition: db_stub.c:1934
static int init_stmt_structure(CI_STMT_STRUCTURE *pstmt)
Definition: db_stub.c:510
static int ci_stmt_clear_batch_impl(COMMON_API_STRUCTURE *pst)
Definition: db_stub.c:3555
bool autocommit
Definition: db_stub.h:79
char * original_name
Definition: db_query.h:59
int(* get_value_by_name)(VALUE_BIND_TABLE *tbl, const char *name, CI_TYPE type, void *addr, size_t len, size_t *outlen, bool *isnull)
Definition: api_common.h:245
int do_check_partitioned_class(DB_OBJECT *classop, int check_map, char *keyattr)
static void rs_meta_destroyf(BH_BIND *ptr)
Definition: db_stub.c:413
int db_query_end(DB_QUERY_RESULT *result)
Definition: db_query.c:3362
static int ci_stmt_set_option_impl(COMMON_API_STRUCTURE *pst, CI_STATEMENT_OPTION option, void *arg, size_t size)
Definition: db_stub.c:3846
CI_RESULTSET_META_STRUCTURE * rsmeta
Definition: db_stub.h:133
static int stmt_exec_one_statement(BH_INTERFACE *bh_interface, int stmt_idx, CI_STMT_STRUCTURE *pstmt, CI_RESULTSET *rs, int *r)
Definition: db_stub.c:1220
#define ER_INTERFACE_RESULTSET_NOT_UPDATABLE
Definition: error_code.h:1187
#define api_get_errmsg()
Definition: db_stub.h:41
#define ER_INTERFACE_IS_BATCH_STATEMENT
Definition: error_code.h:1195
#define ER_IT_EMPTY_STATEMENT
Definition: error_code.h:502
PT_NODE ** statements
Definition: api_compat.h:38
PARSER_CONTEXT * parser_create_parser(void)
Definition: parse_tree.c:1169
void(* prev_sigfpe_handler)(int)
Definition: db_admin.c:70
DB_VALUE * param_val
Definition: db_stub.h:167
CUBRID_STMT_TYPE sql_type
Definition: db_stub.h:123
static int ci_stmt_execute_impl(COMMON_API_STRUCTURE *pst, CI_RESULTSET *rs, int *r)
Definition: db_stub.c:3675
int db_get_start_line(DB_SESSION *session, int stmt)
Definition: db_vdb.c:1444
static int stmt_set_parameter_internal(BH_INTERFACE *bh_interface, CI_STMT_STRUCTURE *pstmt, int index, CI_TYPE type, void *val, size_t size)
Definition: db_stub.c:1582
static int ci_stmt_get_query_type_impl(COMMON_API_STRUCTURE *pst, CUBRID_STMT_TYPE *type)
Definition: db_stub.c:4483
char db_Database_name[]
Definition: db_admin.c:100
SM_ATTRIBUTE * classobj_find_attribute(SM_CLASS *class_, const char *name, int class_attribute)
int bh_root_acquire(int *rrid, BH_ROOT_TYPE rt)
Definition: api_handle.c:817
static API_RESULTSET_META_IFS * get_query_rmeta_ifs(void)
Definition: db_stub.c:1910
int jsp_jvm_is_loaded(void)
Definition: jsp_sr.c:774
int er_errid(void)
STMT_RESULT_INFO * rs_info
Definition: db_stub.h:169
int(* reset)(VALUE_BIND_TABLE *tbl)
Definition: api_common.h:249
int tran_abort(void)
static int ci_stmt_get_resultset_impl(COMMON_API_STRUCTURE *pst, CI_RESULTSET *res)
Definition: db_stub.c:4126
#define ER_INTERFACE_NOT_ENOUGH_DATA_SIZE
Definition: error_code.h:1184
#define ER_INTERFACE_NO_MORE_ERROR
Definition: error_code.h:1196
int(* bind_get_next_sibling)(BH_INTERFACE *ifs, BH_BIND *bind, BH_BIND **psibling)
Definition: api_handle.h:68
bool need_immediate_commit
Definition: db_stub.h:118
static int ci_stmt_get_first_error_impl(COMMON_API_STRUCTURE *pst, int *line, int *col, int *errcode, char *err_msg, size_t size)
Definition: db_stub.c:4387
CI_CONN_STATUS conn_status
Definition: db_stub.h:108
static void conn_destroyf(BH_BIND *ptr)
Definition: db_stub.c:225
static int stmt_add_batch_param(CI_STMT_STRUCTURE *pstmt, DB_VALUE *val, int num_val)
Definition: db_stub.c:2406
#define ER_INTERFACE_IS_NOT_PREPARED_STATEMENT
Definition: error_code.h:1194
CI_RESULTSET_META_STRUCTURE * prsmeta
Definition: db_stub.h:188
DB_VALUE * host_variables
Definition: parse_tree.h:3560
API_OBJECT_RESULTSET_POOL * opool
Definition: db_stub.h:114
#define ER_UCI_TOO_FEW_HOST_VARS
Definition: error_code.h:541
#define ER_INTERFACE_HAS_NO_RESULT_SET
Definition: error_code.h:1181
bool lazy_exec
Definition: db_stub.h:91
bool async_query
Definition: db_stub.h:89
static int conn_end_tran(BH_INTERFACE *bh_interface, CI_CONN_STRUCTURE *pconn, bool commit)
Definition: db_stub.c:2732
DB_DOMAIN_INFO domain
Definition: dbtype_def.h:1082
#define ER_INTERFACE_ROW_IS_DELETED
Definition: error_code.h:1188
static int ci_stmt_add_batch_query_impl(COMMON_API_STRUCTURE *pst, const char *sql, size_t len)
Definition: db_stub.c:3424
bool current_row_isdeleted
Definition: db_stub.h:191
DB_SESSION_ERROR * db_get_next_error(DB_SESSION_ERROR *errors, int *line, int *col)
Definition: db_vdb.c:953
BH_INTERFACE * bh_interface
Definition: db_stub.h:197
char db_Program_name[]
Definition: db_admin.c:101
static int get_col_count(DB_QUERY_TYPE *query_type)
Definition: db_stub.c:2058
int batch_count
Definition: db_stub.h:177
int dimension
Definition: api_compat.h:30
static int rs_get_index_by_name(void *impl, const char *name, int *ri)
Definition: db_stub.c:2083
bool exec_continue_on_error
Definition: db_stub.h:90
PT_TYPE_ENUM type_enum
Definition: parse_tree.h:3457
bool has_result
Definition: db_stub.h:124
static void batch_res_destroyf(BH_BIND *ptr)
Definition: db_stub.c:457
DB_TYPE pt_type_enum_to_db(const PT_TYPE_ENUM t)
Definition: parse_dbi.c:2314
static int api_rs_get_value_by_name(API_RESULTSET *res, const char *name, CI_TYPE type, void *addr, size_t len, size_t *outlen, bool *isnull)
Definition: db_stub.c:851
char cli_version[VERSION_LENGTH]
Definition: db_stub.h:75
int boot_restart_client(BOOT_CLIENT_CREDENTIAL *client_credential)
Definition: boot_cl.c:738
#define DB_CONNECTION_STATUS_CONNECTED
Definition: db.h:47
DB_DATA data
Definition: dbtype_def.h:1083
int tran_reset_wait_times(int wait_in_msecs)
#define DB_CONNECT_ORDER_SEQ
Definition: connection_cl.h:33
static int ci_stmt_get_parameter_impl(COMMON_API_STRUCTURE *pst, int index, CI_TYPE type, void *addr, size_t len, size_t *outlen, bool *isnull)
Definition: db_stub.c:4070
db_client_type client_type
#define api_er_set(a, b, c, d)
Definition: db_stub.h:40
DB_SELECT_RESULT s
Definition: db_query.h:124
static int conn_restart_client(CI_CONN_STRUCTURE *pconn, const char *program, int print_version, const char *volume, short port)
Definition: db_stub.c:2671
#define ER_INTERFACE_CANNOT_BATCH_EXECUTE
Definition: error_code.h:1192
static int ci_conn_commit_impl(COMMON_API_STRUCTURE *pst)
Definition: db_stub.c:3368
#define assert(x)
int cursor_get_current_oid(CURSOR_ID *cursor_id_p, DB_VALUE *value_p)
Definition: cursor.c:1449
static int api_rs_clear_updates(API_RESULTSET *res)
Definition: db_stub.c:724
#define ER_INTERFACE_GENERIC
Definition: error_code.h:1179
static int ci_stmt_get_option_impl(COMMON_API_STRUCTURE *pst, CI_STATEMENT_OPTION option, void *arg, size_t size)
Definition: db_stub.c:3796
DB_QUERY_TYPE * query_type
Definition: db_query.h:119
int db_type_to_type(DB_TYPE dt, CI_TYPE *xt)
int au_fetch_class(MOP op, SM_CLASS **class_ptr, AU_FETCHMODE fetchmode, DB_AUTH type)
static int ci_stmt_affected_rows_impl(COMMON_API_STRUCTURE *pst, int *out)
Definition: db_stub.c:4169
CI_PARAM_META_STRUCTURE * ppmeta
Definition: db_stub.h:173
int(* bind_to_handle)(BH_INTERFACE *ifs, BH_BIND *bind, BIND_HANDLE *bh)
Definition: api_handle.h:63
STMT_ERROR_INFO * next
Definition: db_stub.h:96
char * name
Definition: db_query.h:56
static int rs_init_domain(void *impl, int index, DB_VALUE *val)
Definition: db_stub.c:2229
static int ci_batch_res_get_error_impl(COMMON_API_STRUCTURE *pst, int index, int *err_code, char *err_msg, size_t buf_size)
Definition: db_stub.c:4314
int db_execute_and_keep_statement(DB_SESSION *session, int stmt_ndx, DB_QUERY_RESULT **result)
Definition: db_vdb.c:2906
static int api_rmeta_get_count(API_RESULTSET_META *impl, int *count)
Definition: db_stub.c:982
static int stmt_exec_batch_query_internal(BH_INTERFACE *bh_interface, CI_STMT_STRUCTURE *pstmt, CI_BATCH_RESULT *br)
Definition: db_stub.c:2531
std::string client_info
static int ci_stmt_get_start_line_impl(COMMON_API_STRUCTURE *pst, int *line)
Definition: db_stub.c:4514
int tran_commit(bool retain_lock)
DB_MARKER * db_get_input_markers(DB_SESSION *session, int stmt)
Definition: db_vdb.c:1179
static int res_fetch_internal(BH_INTERFACE *bh_interface, CI_RESULTSET_STRUCTURE *prs, int offset, CI_FETCH_POSITION pos)
Definition: db_stub.c:1992
static API_RESULTSET_META_IFS RMETA_IFS_
Definition: db_stub.c:176
int api_object_resultset_pool_create(BH_INTERFACE *ifs, BIND_HANDLE conn, API_OBJECT_RESULTSET_POOL **rpool)
Definition: db_object.c:1159
CI_CONN_STRUCTURE * pconn
Definition: db_stub.h:168
SM_DOMAIN * domain
Definition: db_query.h:62
DB_TRAN_ISOLATION
Definition: dbtran_def.h:26
static int ci_collection_new_impl(CI_CONNECTION conn, CI_COLLECTION *coll)
Definition: db_stub.c:4545
std::string db_user
char * attr_name
Definition: db_query.h:57
static int rs_set_db_value(void *impl, int index, DB_VALUE *val)
Definition: db_stub.c:2149
static int ci_stmt_get_next_error_impl(COMMON_API_STRUCTURE *pst, int *line, int *col, int *errcode, char *err_msg, size_t size)
Definition: db_stub.c:4432
const char * sm_get_ch_name(MOP op)
T_ERROR_INFO err_info
Definition: cas.c:186
DB_SESSION * session
Definition: db_stub.h:166
static int api_rs_apply_row(API_RESULTSET *res)
Definition: db_stub.c:927
static int ci_stmt_add_batch_impl(COMMON_API_STRUCTURE *pst)
Definition: db_stub.c:3507
static int stmt_make_error_info(CI_STMT_STRUCTURE *pstmt, int statement_id)
Definition: db_stub.c:124
struct db_query_type * next
Definition: db_query.h:54
RS_META_INFO metainfo
Definition: db_stub.h:131
static int ci_pmeta_get_count_impl(COMMON_API_STRUCTURE *pst, int *count)
Definition: db_stub.c:4342
#define NULL
Definition: freelistheap.h:34
#define API_PROGRAM_NAME
Definition: db_stub.c:41
DB_MARKER * marker
Definition: db_stub.h:209
BH_INTERFACE * bh_interface
Definition: db_stub.h:208
void db_close_session_local(DB_SESSION *session)
Definition: db_vdb.c:3244
#define ER_INTERFACE_IS_PREPARED_STATEMENT
Definition: error_code.h:1193
DB_OBJECT * db_get_class(MOP obj)
Definition: db_info.c:589
CI_BATCH_DATA * batch_data
Definition: db_stub.h:178
static int ci_conn_get_option_impl(COMMON_API_STRUCTURE *pst, CI_CONNECTION_OPTION option, void *arg, size_t size)
Definition: db_stub.c:3301
#define VERSION_LENGTH
Definition: db_stub.h:54
STMT_ERROR_INFO * err_info
Definition: db_stub.h:170
static void rs_destroyf(BH_BIND *ptr)
Definition: db_stub.c:332
static int stmt_reset_session_and_parse(CI_STMT_STRUCTURE *pstmt, const char *sql, size_t len)
Definition: db_stub.c:1615
static int create_resultset_value_table(int num_col, BIND_HANDLE conn, CI_RESULTSET_STRUCTURE *prs, VALUE_BIND_TABLE **value_table)
Definition: db_stub.c:2291
#define err(fd,...)
Definition: porting.h:431
bool * is_out_param
Definition: db_stub.h:210
std::string program_name
DB_OBJECT * op
Definition: dbtype_def.h:1055
static int ci_stmt_execute_batch_impl(COMMON_API_STRUCTURE *pst, CI_BATCH_RESULT *br)
Definition: db_stub.c:3746
char * db_get_user_name(void)
Definition: db_admin.c:1911
CI_STMT_STATUS stmt_status
Definition: db_stub.h:165
int count(int &result, const cub_regex_object &reg, const std::string &src, const int position, const INTL_CODESET codeset)
int(* bind_get_parent)(BH_INTERFACE *ifs, BH_BIND *bind, BH_BIND **pbind)
Definition: api_handle.h:64
int pr_clear_value(DB_VALUE *value)
static int stmt_exec_prepared_batch_internal(BH_INTERFACE *bh_interface, CI_STMT_STRUCTURE *pstmt, CI_BATCH_RESULT *br)
Definition: db_stub.c:2459
#define DB_DEFAULT_SCALE
Definition: dbtype_def.h:561
int tuple_no
Definition: cursor.h:64
char include_oid
Definition: api_compat.h:29
struct db_domain_info::general_info general_info
#define ER_INTERFACE_END_OF_CURSOR
Definition: error_code.h:1197
int tran_reset_isolation(TRAN_ISOLATION isolation, bool async_ws)
static int ci_conn_close_impl(COMMON_API_STRUCTURE *pst)
Definition: db_stub.c:3176
static int stmt_bind_pmeta_handle(BH_INTERFACE *bh_interface, CI_STMT_STRUCTURE *pstmt, CI_PARAM_META_STRUCTURE **outmeta)
Definition: db_stub.c:2865
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
unsigned int flags
Definition: class_object.h:459
#define DB_DEFAULT_PRECISION
Definition: dbtype_def.h:558
static int api_rs_update_value(API_RESULTSET *res, int index, CI_TYPE type, void *addr, size_t len)
Definition: db_stub.c:881
static int stmt_release_children(BH_INTERFACE *bh_interface, CI_STMT_STRUCTURE *pstmt, bool resultset_only)
Definition: db_stub.c:2785
static int ci_stmt_prepare_impl(COMMON_API_STRUCTURE *pst, const char *sql, size_t len)
Definition: db_stub.c:3896
VALUE_BIND_TABLE_IFS * ifs
Definition: api_common.h:233
static int init_conn_structure(CI_CONN_STRUCTURE *pconn)
Definition: db_stub.c:492
#define AU_SELECT
Definition: authenticate.h:69
#define ARG_FILE_LINE
Definition: error_manager.h:44
static int stmt_get_resultset_metadata_internal(BH_INTERFACE *bh_interface, CI_STMT_STRUCTURE *pstmt, CI_RESULTSET_METADATA *r)
Definition: db_stub.c:1864
static void stmt_destroyf(BH_BIND *ptr)
Definition: db_stub.c:252
int pr_clone_value(const DB_VALUE *src, DB_VALUE *dest)
Definition: dbi.h:57
int obj_set(MOP op, const char *name, DB_VALUE *value)
void au_link_static_methods(void)
int ci_err_set(int error_code)
Definition: db_stub.c:3064
static int api_rmeta_get_info(API_RESULTSET_META *impl, int index, CI_RMETA_INFO_TYPE type, void *arg, size_t size)
Definition: db_stub.c:1005
CUBRID_STMT_TYPE
Definition: cas_dbms_util.h:40
static int ci_conn_connect_impl(COMMON_API_STRUCTURE *pst, const char *host, unsigned short port, const char *databasename, const char *user_name, const char *password)
Definition: db_stub.c:3133
int boot_shutdown_client(bool is_er_final)
Definition: boot_cl.c:1396
int api_collection_create(BIND_HANDLE conn, API_COLLECTION **rc)
#define strlen(s1)
Definition: intl_support.c:43
static int ci_conn_create_statement_impl(COMMON_API_STRUCTURE *pst, CI_STATEMENT *stmt)
Definition: db_stub.c:3197
static int ci_stmt_set_parameter_impl(COMMON_API_STRUCTURE *pst, int index, CI_TYPE type, void *val, size_t size)
Definition: db_stub.c:4100
bool current_row_isupdated
Definition: db_stub.h:190
int affected_row
Definition: db_stub.h:125
PARSER_CONTEXT * parser
Definition: api_compat.h:35
static void pmeta_destroyf(BH_BIND *ptr)
Definition: db_stub.c:435
CI_CONN_OPT_STRUCTURE opt
Definition: db_stub.h:107
CI_STMT_OPT_STRUCTURE opt
Definition: db_stub.h:164
int db_push_values(DB_SESSION *session, int count, DB_VALUE *in_values)
Definition: db_vdb.c:1527
int current_rs_idx
Definition: db_stub.h:172
#define TM_TRAN_ASYNC_WS()
static int stmt_add_batch_string(CI_STMT_STRUCTURE *pstmt, const char *sql, size_t len)
Definition: db_stub.c:3459
#define DB_CURSOR_SUCCESS
Definition: dbtype_def.h:166
DB_QUERY_RESULT * result
Definition: db_stub.h:186
static int ci_stmt_register_out_parameter_impl(COMMON_API_STRUCTURE *pst, int index)
Definition: db_stub.c:3942
int create_db_value_bind_table(int nvalue, void *impl, int auto_apply, BIND_HANDLE conn_handle, int(*get_index_by_name)(void *, const char *, int *ri), int(*get_db_value)(void *, int, DB_VALUE *), int(*set_db_value)(void *, int, DB_VALUE *), int(*init_domain)(void *, int, DB_VALUE *), VALUE_BIND_TABLE **rtable)
int coerce_db_value_to_value(const DB_VALUE *dbval, BIND_HANDLE conn, CI_TYPE type, void *addr, size_t len, size_t *outlen, bool *isnull)
static int ci_stmt_get_resultset_metadata_impl(COMMON_API_STRUCTURE *pst, CI_RESULTSET_METADATA *r)
Definition: db_stub.c:3994
int(* get_value)(VALUE_BIND_TABLE *tbl, int index, CI_TYPE type, void *addr, size_t len, size_t *outlen, bool *isnull)
Definition: api_common.h:242
int(* set_value)(VALUE_BIND_TABLE *tbl, int index, CI_TYPE type, void *addr, size_t len)
Definition: api_common.h:244
DB_QUERY_TYPE * db_get_query_type_list(DB_SESSION *session, int stmt_ndx)
Definition: db_vdb.c:1341
static int ci_batch_res_get_result_impl(COMMON_API_STRUCTURE *pst, int index, int *ret, int *nr)
Definition: db_stub.c:4286
DB_RESULT_TYPE type
Definition: db_query.h:115
#define ER_QPROC_INVALID_COLNAME
Definition: error_code.h:524
static int res_delete_row_internal(BH_INTERFACE *bh_interface, CI_RESULTSET_STRUCTURE *prs)
Definition: db_stub.c:2024
char srv_version[VERSION_LENGTH]
Definition: db_stub.h:76
int au_login(const char *name, const char *password, bool ignore_dba_privilege)
void(* destroy)(API_OBJECT_RESULTSET_POOL *pool)
Definition: api_common.h:173
int(* apply_updates)(VALUE_BIND_TABLE *tbl)
Definition: api_common.h:248
#define ER_INTERFACE_PARAM_IS_NOT_SET
Definition: error_code.h:1189
int i
Definition: dynamic_load.c:954
union ci_batch_data::_data data
static int init_pmeta_structure(CI_PARAM_META_STRUCTURE *ppmeta)
Definition: db_stub.c:566
static int init_batch_rs_structure(CI_BATCH_RESULT_STRUCTURE *pbrs)
Definition: db_stub.c:583
std::string host_name
static int init_resultset_structure(CI_RESULTSET_STRUCTURE *prs)
Definition: db_stub.c:530
static int stmt_prepare_internal(BH_INTERFACE *bh_interface, CI_STMT_STRUCTURE *pstmt, const char *sql, size_t len)
Definition: db_stub.c:1437
static int get_connection_opool(COMMON_API_STRUCTURE *pst, API_OBJECT_RESULTSET_POOL **opool)
Definition: db_stub.c:3041
static int stmt_exec_internal(BH_INTERFACE *bh_interface, CI_STMT_STRUCTURE *pstmt, CI_RESULTSET *rs, int *r)
Definition: db_stub.c:1723
#define ER_SET_AND_RETURN(X)
Definition: db_stub.c:43
char * strdup(const char *str)
Definition: porting.c:901
int(* destroy_handle)(BH_INTERFACE *ifs, BIND_HANDLE bh)
Definition: api_handle.h:61
int(* alloc_handle)(BH_INTERFACE *ifs, BH_BIND *bind, BIND_HANDLE *bh)
Definition: api_handle.h:60
static int stmt_batch_result_free(BH_INTERFACE *bh_interface, CI_STMT_STRUCTURE *pstmt)
Definition: db_stub.c:2934
static API_RESULTSET_IFS RS_IFS_
Definition: db_stub.c:181
static int ci_pmeta_get_info_impl(COMMON_API_STRUCTURE *pst, int index, CI_PMETA_INFO_TYPE type, void *arg, size_t size)
Definition: db_stub.c:4363
UINT64 BIND_HANDLE
Definition: api_handle.h:28
void sigfpe_handler(int sig)
Definition: db_admin.c:822
static int api_rs_fetch_tell(API_RESULTSET *res, int *offset)
Definition: db_stub.c:691
#define ER_INTERFACE_NO_AVAILABLE_INFORMATION
Definition: error_code.h:1185
static int ci_conn_set_option_impl(COMMON_API_STRUCTURE *pst, CI_CONNECTION_OPTION option, void *arg, size_t size)
Definition: db_stub.c:3243
static int stmt_remove_error_info(CI_STMT_STRUCTURE *pstmt)
Definition: db_stub.c:200
int db_query_get_tuple_value(DB_QUERY_RESULT *result, int index, DB_VALUE *value)
Definition: db_query.c:2873
VALUE_BIND_TABLE * value_table
Definition: db_stub.h:189
int coerce_value_to_db_value(CI_TYPE type, void *addr, size_t len, DB_VALUE *dbval, bool domain_initialized)
struct db_object * class_mop
Definition: object_domain.h:81
BH_INTERFACE * bh_interface
Definition: db_stub.h:109
static int api_rs_get_value(API_RESULTSET *res, int index, CI_TYPE type, void *addr, size_t len, size_t *outlen, bool *is_null)
Definition: db_stub.c:817
#define api_get_errid
Definition: db_stub.h:42
BH_INTERFACE * bh_interface
Definition: db_stub.h:185
DB_TRAN_ISOLATION isolation
Definition: db_stub.h:78
#define CHECK_PARTITION_NONE
static int stmt_get_parameter_internal(BH_INTERFACE *bh_interface, CI_STMT_STRUCTURE *pstmt, int index, CI_TYPE type, void *addr, size_t len, size_t *outlen, bool *isnull)
Definition: db_stub.c:1533
static char * host
int db_compile_statement_local(DB_SESSION *session)
Definition: db_vdb.c:510
static int ci_conn_get_error_impl(COMMON_API_STRUCTURE *pst, int *err, char *msg, size_t size)
Definition: db_stub.c:3407
#define ER_INTERFACE_INVALID_ARGUMENT
Definition: error_code.h:1174
std::string login_name
#define DB_CURSOR_END
Definition: dbtype_def.h:167
static int stmt_exec_immediate_internal(BH_INTERFACE *bh_interface, CI_STMT_STRUCTURE *pstmt, char *sql, size_t len, CI_RESULTSET *rs, int *r)
Definition: db_stub.c:1355
static int ci_batch_res_query_count_impl(COMMON_API_STRUCTURE *pst, int *count)
Definition: db_stub.c:4266
static int ci_conn_rollback_impl(COMMON_API_STRUCTURE *pst)
Definition: db_stub.c:3386
#define ER_INTERFACE_INVALID_HANDLE
Definition: error_code.h:1176
bool updatable_result
Definition: db_stub.h:87
static int ci_stmt_next_result_impl(COMMON_API_STRUCTURE *pst, bool *exist_result)
Definition: db_stub.c:4195
static int rs_get_db_value(void *impl, int index, DB_VALUE *val)
Definition: db_stub.c:2127
DB_QUERY_TYPE * query_type
Definition: db_stub.h:198
DB_SESSION_ERROR * db_get_errors(DB_SESSION *session)
Definition: db_vdb.c:926
#define ER_INTERFACE_CANNOT_CLEAR_BATCH
Definition: error_code.h:1191
size_t query_length
Definition: db_stub.h:144
SIGNAL_HANDLER_FUNCTION os_set_signal_handler(const int sig_no, SIGNAL_HANDLER_FUNCTION sig_handler)
Definition: porting.c:1333
#define DB_CONNECTION_STATUS_NOT_CONNECTED
Definition: db.h:46
static int ci_stmt_get_parameter_metadata_impl(COMMON_API_STRUCTURE *pst, CI_PARAMETER_METADATA *r)
Definition: db_stub.c:4025
struct ci_batch_data * next
Definition: db_stub.h:138
bool need_defered_commit
Definition: db_stub.h:117
int db_value_domain_init(DB_VALUE *value, const DB_TYPE type, const int precision, const int scale)
Definition: db_macro.c:153
#define ER_INTERFACE_NO_MORE_MEMORY
Definition: error_code.h:1198
union db_query_result::@47 res