CUBRID Engine  latest
jsp_cl.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  * jsp_cl.c - Java Stored Procedure Client Module Source
21  */
22 
23 #ident "$Id$"
24 
25 #include "config.h"
26 
27 #include <assert.h>
28 #if !defined(WINDOWS)
29 #include <sys/socket.h>
30 #else /* not WINDOWS */
31 #include <winsock2.h>
32 #endif /* not WINDOWS */
33 
34 #include "authenticate.h"
35 #include "error_manager.h"
36 #include "memory_alloc.h"
37 #include "dbtype.h"
38 #include "parser.h"
39 #include "object_domain.h"
40 #include "object_primitive.h"
41 #include "object_representation.h"
42 #include "db.h"
43 #include "object_accessor.h"
44 #include "set_object.h"
45 #include "locator_cl.h"
46 #include "transaction_cl.h"
47 #include "schema_manager.h"
48 #include "numeric_opfunc.h"
49 #include "jsp_cl.h"
50 #include "system_parameter.h"
51 #include "network_interface_cl.h"
52 #include "unicode_support.h"
53 #include "dbtype.h"
54 #include "jsp_comm.h"
55 
56 #if defined (SUPPRESS_STRLEN_WARNING)
57 #define strlen(s1) ((int) strlen(s1))
58 #endif /* defined (SUPPRESS_STRLEN_WARNING) */
59 
60 #if !defined(INADDR_NONE)
61 #define INADDR_NONE 0xffffffff
62 #endif /* !INADDR_NONE */
63 
64 #define PT_NODE_SP_NAME(node) \
65  ((node)->info.sp.name->info.name.original)
66 
67 #define PT_NODE_SP_TYPE(node) \
68  ((node)->info.sp.type)
69 
70 #define PT_NODE_SP_RETURN_TYPE(node) \
71  ((node)->info.sp.ret_type->info.name.original)
72 
73 #define PT_NODE_SP_JAVA_METHOD(node) \
74  ((node)->info.sp.java_method->info.value.data_value.str->bytes)
75 
76 #define PT_NODE_SP_COMMENT(node) \
77  (((node)->info.sp.comment == NULL) ? NULL : \
78  (node)->info.sp.comment->info.value.data_value.str->bytes)
79 
80 #define PT_NODE_SP_ARG_COMMENT(node) \
81  (((node)->info.sp_param.comment == NULL) ? NULL : \
82  (node)->info.sp_param.comment->info.value.data_value.str->bytes)
83 
84 #define MAX_ARG_COUNT 64
85 #define MAX_CALL_COUNT 16
86 #define SAVEPOINT_ADD_STORED_PROC "ADDSTOREDPROC"
87 #define SAVEPOINT_CREATE_STORED_PROC "CREATESTOREDPROC"
88 
89 typedef struct db_arg_list
90 {
91  struct db_arg_list *next;
93  const char *label;
94 } DB_ARG_LIST;
95 
96 typedef struct
97 {
98  const char *name;
102  int arg_mode[MAX_ARG_COUNT];
103  int arg_type[MAX_ARG_COUNT];
105 } SP_ARGS;
106 
108 
109 static int server_port = -1;
110 static int call_cnt = 0;
112 
113 #if defined(WINDOWS)
114 static FARPROC jsp_old_hook = NULL;
115 #endif /* WINDOWS */
116 
118 static int jsp_map_pt_misc_to_sp_mode (PT_MISC_TYPE pt_enum);
119 static int jsp_get_argument_count (const SP_ARGS * sp_args);
120 static int jsp_add_stored_procedure_argument (MOP * mop_p, const char *sp_name, const char *arg_name, int index,
121  PT_TYPE_ENUM data_type, PT_MISC_TYPE mode, const char *arg_comment);
122 static char *jsp_check_stored_procedure_name (const char *str);
123 static int jsp_add_stored_procedure (const char *name, const PT_MISC_TYPE type, const PT_TYPE_ENUM ret_type,
124  PT_NODE * param_list, const char *java_method, const char *comment);
125 static int drop_stored_procedure (const char *name, PT_MISC_TYPE expected_type);
126 static int jsp_get_value_size (DB_VALUE * value);
127 static int jsp_get_argument_size (DB_ARG_LIST * args);
128 
129 static char *jsp_pack_argument (char *buffer, DB_VALUE * value);
130 static char *jsp_pack_int_argument (char *buffer, DB_VALUE * value);
131 static char *jsp_pack_bigint_argument (char *buffer, DB_VALUE * value);
132 static char *jsp_pack_short_argument (char *buffer, DB_VALUE * value);
133 static char *jsp_pack_float_argument (char *buffer, DB_VALUE * value);
134 static char *jsp_pack_double_argument (char *buffer, DB_VALUE * value);
135 static char *jsp_pack_numeric_argument (char *buffer, DB_VALUE * value);
136 static char *jsp_pack_string_argument (char *buffer, DB_VALUE * value);
137 static char *jsp_pack_date_argument (char *buffer, DB_VALUE * value);
138 static char *jsp_pack_time_argument (char *buffer, DB_VALUE * value);
139 static char *jsp_pack_timestamp_argument (char *buffer, DB_VALUE * value);
140 static char *jsp_pack_datetime_argument (char *buffer, DB_VALUE * value);
141 static char *jsp_pack_set_argument (char *buffer, DB_VALUE * value);
142 static char *jsp_pack_object_argument (char *buffer, DB_VALUE * value);
143 static char *jsp_pack_monetary_argument (char *buffer, DB_VALUE * value);
144 static char *jsp_pack_null_argument (char *buffer);
145 
146 static char *jsp_unpack_value (char *buffer, DB_VALUE * retval);
147 static char *jsp_unpack_int_value (char *buffer, DB_VALUE * retval);
148 static char *jsp_unpack_bigint_value (char *buffer, DB_VALUE * retval);
149 static char *jsp_unpack_short_value (char *buffer, DB_VALUE * retval);
150 static char *jsp_unpack_float_value (char *buffer, DB_VALUE * retval);
151 static char *jsp_unpack_double_value (char *buffer, DB_VALUE * retval);
152 static char *jsp_unpack_numeric_value (char *buffer, DB_VALUE * retval);
153 static char *jsp_unpack_string_value (char *buffer, DB_VALUE * retval);
154 static char *jsp_unpack_date_value (char *buffer, DB_VALUE * retval);
155 static char *jsp_unpack_time_value (char *buffer, DB_VALUE * retval);
156 static char *jsp_unpack_timestamp_value (char *buffer, DB_VALUE * retval);
157 static char *jsp_unpack_set_value (char *buffer, int type, DB_VALUE * retval);
158 static char *jsp_unpack_object_value (char *buffer, DB_VALUE * retval);
159 static char *jsp_unpack_monetary_value (char *buffer, DB_VALUE * retval);
160 static char *jsp_unpack_resultset (char *buffer, DB_VALUE * retval);
161 
162 extern int libcas_main (SOCKET fd);
163 extern void *libcas_get_db_result_set (int h_id);
164 extern void libcas_srv_handle_free (int h_id);
165 
166 static int jsp_send_call_request (const SOCKET sockfd, const SP_ARGS * sp_args);
167 static int jsp_alloc_response (const SOCKET sockfd, char *&buffer);
168 static int jsp_receive_response (const SOCKET sockfd, const SP_ARGS * sp_args);
169 static int jsp_receive_result (char *&buffer, char *&ptr, const SP_ARGS * sp_args);
170 static int jsp_receive_error (char *&buffer, char *&ptr, const SP_ARGS * sp_args);
171 
172 static int jsp_execute_stored_procedure (const SP_ARGS * args);
173 static int jsp_do_call_stored_procedure (DB_VALUE * returnval, DB_ARG_LIST * args, const char *name);
174 
175 extern bool ssl_client;
176 
177 /*
178  * jsp_init - Initialize Java Stored Procedure
179  * return: none
180  *
181  * Note:
182  */
183 
184 void
185 jsp_init (void)
186 {
187  int i;
188  call_cnt = 0;
189 
190  for (i = 0; i < MAX_CALL_COUNT; i++)
191  {
193  is_prepare_call[i] = false;
194  }
195 
196 #if defined(WINDOWS)
197  windows_socket_startup (jsp_old_hook);
198 #endif /* WINDOWS */
199 }
200 
201 /*
202  * jsp_close_connection - Java Stored Procedure Close Connection
203  * return: none
204  *
205  * Note:
206  */
207 
208 void
210 {
211  if (!IS_INVALID_SOCKET (sock_fds[0]))
212  {
215  }
216 }
217 
218 /*
219  * jsp_find_stored_procedure
220  * return: MOP
221  * name(in): find java stored procedure name
222  *
223  * Note:
224  */
225 
226 MOP
227 jsp_find_stored_procedure (const char *name)
228 {
229  MOP mop = NULL;
230  DB_VALUE value;
231  int save;
232  char *checked_name;
233 
234  if (!name)
235  {
236  return NULL;
237  }
238 
239  AU_DISABLE (save);
240 
241  checked_name = jsp_check_stored_procedure_name (name);
242  db_make_string (&value, checked_name);
244 
246  {
247  er_clear ();
249  }
250 
251  free_and_init (checked_name);
252  AU_ENABLE (save);
253 
254  return mop;
255 }
256 
257 /*
258  * jsp_is_exist_stored_procedure
259  * return: name is exist then return true
260  * else return false
261  * name(in): find java stored procedure name
262  *
263  * Note:
264  */
265 
266 int
268 {
269  MOP mop = NULL;
270 
271  mop = jsp_find_stored_procedure (name);
272  er_clear ();
273 
274  return mop != NULL;
275 }
276 
277 /*
278  * jsp_get_return_type - Return Java Stored Procedure Type
279  * return: if fail return error code
280  * else return Java Stored Procedure Type
281  * name(in): java stored procedure name
282  *
283  * Note:
284  */
285 
286 int
287 jsp_get_return_type (const char *name)
288 {
289  DB_OBJECT *mop_p;
290  DB_VALUE return_type;
291  int err;
292  int save;
293 
294  AU_DISABLE (save);
295 
296  mop_p = jsp_find_stored_procedure (name);
297  if (mop_p == NULL)
298  {
299  AU_ENABLE (save);
300 
301  assert (er_errid () != NO_ERROR);
302  return er_errid ();
303  }
304 
305  err = db_get (mop_p, SP_ATTR_RETURN_TYPE, &return_type);
306  if (err != NO_ERROR)
307  {
308  AU_ENABLE (save);
309  return err;
310  }
311 
312  AU_ENABLE (save);
313  return db_get_int (&return_type);
314 }
315 
316 /*
317  * jsp_call_stored_procedure - call java stored procedure
318  * return: call jsp failed return error code
319  * parser(in/out): parser environment
320  * statement(in): a statement node
321  *
322  * Note:
323  */
324 
325 int
327 {
328  const char *into_label, *proc;
329  int error = NO_ERROR;
330  DB_VALUE *ins_value, ret_value;
331  DB_ARG_LIST *value_list = 0, *vl, **next_value_list;
332  PT_NODE *vc, *into, *method;
333 
334  if (!statement || !(method = statement->info.method_call.method_name) || method->node_type != PT_NAME
335  || !(proc = method->info.name.original))
336  {
338  return er_errid ();
339  }
340 
341  db_make_null (&ret_value);
342 
343  /* Build an argument list. */
344  next_value_list = &value_list;
345  vc = statement->info.method_call.arg_list;
346  while (vc)
347  {
349  bool to_break = false;
350 
351  *next_value_list = (DB_ARG_LIST *) calloc (1, sizeof (DB_ARG_LIST));
352  if (*next_value_list == NULL)
353  {
355  return er_errid ();
356  }
357 
358  (*next_value_list)->next = (DB_ARG_LIST *) 0;
359 
360  /*
361  * Don't clone host vars; they may actually be acting as output variables (e.g., a character array that is
362  * intended to receive bytes from the method), and cloning will ensure that the results never make it to the
363  * expected area. Since pt_evaluate_tree() always clones its db_values we must not use pt_evaluate_tree() to
364  * extract the db_value from a host variable; instead extract it ourselves. */
365  if (PT_IS_CONST (vc))
366  {
367  db_value = pt_value_to_db (parser, vc);
368  }
369  else
370  {
371  db_value = (DB_VALUE *) calloc (1, sizeof (DB_VALUE));
372  if (db_value == NULL)
373  {
375  return er_errid ();
376  }
377 
378  /* must call pt_evaluate_tree */
379  pt_evaluate_tree (parser, vc, db_value, 1);
380  if (pt_has_error (parser))
381  {
382  /* to maintain the list to free all the allocated */
383  to_break = true;
384  }
385  }
386 
387  (*next_value_list)->val = db_value;
388 
389  next_value_list = &(*next_value_list)->next;
390  vc = vc->next;
391 
392  if (to_break)
393  {
394  break;
395  }
396  }
397 
398  if (pt_has_error (parser))
399  {
401  error = er_errid ();
402  }
403  else
404  {
405  /* call sp */
406  error = jsp_do_call_stored_procedure (&ret_value, value_list, proc);
407  }
408 
409  vc = statement->info.method_call.arg_list;
410  while (value_list && vc)
411  {
412  vl = value_list->next;
413  if (!PT_IS_CONST (vc))
414  {
415  db_value_clear (value_list->val);
416  free_and_init (value_list->val);
417  }
418  free_and_init (value_list);
419  value_list = vl;
420  vc = vc->next;
421  }
422 
423  if (error == NO_ERROR)
424  {
425  /* Save the method result. */
426  statement->etc = (void *) db_value_copy (&ret_value);
427  into = statement->info.method_call.to_return_var;
428 
429  if (into != NULL && into->node_type == PT_NAME && (into_label = into->info.name.original) != NULL)
430  {
431  /* create another DB_VALUE of the new instance for the label_table */
432  ins_value = db_value_copy (&ret_value);
433  error = pt_associate_label_with_value_check_reference (into_label, ins_value);
434  }
435  }
436 
437  db_value_clear (&ret_value);
438  return error;
439 }
440 
441 /*
442  * jsp_drop_stored_procedure - drop java stored procedure
443  * return: Error code
444  * parser(in/out): parser environment
445  * statement(in): a statement node
446  *
447  * Note:
448  */
449 
450 int
452 {
453  const char *name;
454  PT_MISC_TYPE type;
455  PT_NODE *name_list, *p;
456  int i;
457  int err = NO_ERROR;
458 
460 
462  {
464  return ER_BLOCK_DDL_STMT;
465  }
466 
467  name_list = statement->info.sp.name;
468  type = PT_NODE_SP_TYPE (statement);
469 
470  for (p = name_list, i = 0; p != NULL; p = p->next)
471  {
472  name = (char *) p->info.name.original;
473  if (name == NULL || name[0] == '\0')
474  {
476  return er_errid ();
477  }
478 
479  err = drop_stored_procedure (name, type);
480  if (err != NO_ERROR)
481  {
482  break;
483  }
484  }
485 
486  return err;
487 }
488 
489 /*
490  * jsp_create_stored_procedure
491  * return: if failed return error code else execute jsp_add_stored_procedure
492  * function
493  * parser(in/out): parser environment
494  * statement(in): a statement node
495  *
496  * Note:
497  */
498 
499 int
501 {
502  const char *name, *java_method, *comment = NULL;
503 
504  PT_MISC_TYPE type;
505  PT_NODE *param_list, *p;
506  PT_TYPE_ENUM ret_type = PT_TYPE_NONE;
507  int param_count;
508  int err = NO_ERROR;
509  bool has_savepoint = false;
510 
512 
514  {
516  return ER_BLOCK_DDL_STMT;
517  }
518 
519  name = (char *) PT_NODE_SP_NAME (statement);
520  if (name == NULL || name[0] == '\0')
521  {
523  return er_errid ();
524  }
525 
526  type = PT_NODE_SP_TYPE (statement);
527  if (type == PT_SP_FUNCTION)
528  {
529  ret_type = statement->info.sp.ret_type;
530  }
531 
532  java_method = (char *) PT_NODE_SP_JAVA_METHOD (statement);
533  param_list = statement->info.sp.param_list;
534 
536  {
537  if (statement->info.sp.or_replace)
538  {
539  /* drop existing stored procedure */
541  if (err != NO_ERROR)
542  {
543  return err;
544  }
545  has_savepoint = true;
546 
547  err = drop_stored_procedure (name, type);
548  if (err != NO_ERROR)
549  {
550  goto error_exit;
551  }
552  }
553  else
554  {
556  return er_errid ();
557  }
558  }
559 
560  for (p = param_list, param_count = 0; p != NULL; p = p->next, param_count++)
561  {
562  ;
563  }
564 
565  if (param_count > MAX_ARG_COUNT)
566  {
568  goto error_exit;
569  }
570 
571  comment = (char *) PT_NODE_SP_COMMENT (statement);
572 
573  err = jsp_add_stored_procedure (name, type, ret_type, param_list, java_method, comment);
574  if (err != NO_ERROR)
575  {
576  goto error_exit;
577  }
578  return NO_ERROR;
579 
580 error_exit:
581  if (has_savepoint)
582  {
584  }
585  return (er_errid () != NO_ERROR) ? er_errid () : ER_FAILED;
586 }
587 
588 /*
589  * jsp_alter_stored_procedure
590  * return: if failed return error code else NO_ERROR
591  * parser(in/out): parser environment
592  * statement(in): a statement node
593  *
594  * Note:
595  */
596 
597 int
599 {
600  int err = NO_ERROR;
601  PT_NODE *sp_name = NULL, *sp_owner = NULL, *sp_comment = NULL;
602  const char *name_str = NULL, *owner_str = NULL, *comment_str = NULL;
603  PT_MISC_TYPE type;
604  SP_TYPE_ENUM real_type;
605  MOP sp_mop = NULL, new_owner = NULL;
606  DB_VALUE user_val, sp_type_val;
607  int save;
608 
609  assert (statement != NULL);
610 
612 
614  {
616  return ER_BLOCK_DDL_STMT;
617  }
618 
619  db_make_null (&user_val);
620 
621  type = PT_NODE_SP_TYPE (statement);
622  sp_name = statement->info.sp.name;
623  assert (sp_name != NULL);
624 
625  sp_owner = statement->info.sp.owner;
626  sp_comment = statement->info.sp.comment;
627  assert (sp_owner != NULL || sp_comment != NULL);
628 
629  name_str = sp_name->info.name.original;
630  assert (name_str != NULL);
631 
632  if (sp_owner != NULL)
633  {
634  owner_str = sp_owner->info.name.original;
635  assert (owner_str != NULL);
636  }
637 
638  comment_str = (char *) PT_NODE_SP_COMMENT (statement);
639 
640  AU_DISABLE (save);
641 
642  /* authentication */
644  {
645  err = ER_AU_DBA_ONLY;
646  er_set (ER_ERROR_SEVERITY, ARG_FILE_LINE, err, 1, "change stored procedure owner");
647  goto error;
648  }
649 
650  /* existence of sp */
651  sp_mop = jsp_find_stored_procedure (name_str);
652  if (sp_mop == NULL)
653  {
654  assert (er_errid () != NO_ERROR);
655  err = er_errid ();
656  goto error;
657  }
658 
659  /* existence of new owner */
660  if (sp_owner != NULL)
661  {
662  new_owner = db_find_user (owner_str);
663  if (new_owner == NULL)
664  {
666  er_set (ER_ERROR_SEVERITY, ARG_FILE_LINE, err, 1, owner_str);
667  goto error;
668  }
669  }
670 
671  /* check type */
672  err = db_get (sp_mop, SP_ATTR_SP_TYPE, &sp_type_val);
673  if (err != NO_ERROR)
674  {
675  goto error;
676  }
677 
678  real_type = (SP_TYPE_ENUM) db_get_int (&sp_type_val);
679  if (real_type != jsp_map_pt_misc_to_sp_type (type))
680  {
681  err = ER_SP_INVALID_TYPE;
682  er_set (ER_ERROR_SEVERITY, ARG_FILE_LINE, err, 2, name_str,
683  real_type == SP_TYPE_FUNCTION ? "FUNCTION" : "PROCEDURE");
684  goto error;
685  }
686 
687  /* change the owner */
688  if (sp_owner != NULL)
689  {
690  db_make_object (&user_val, new_owner);
691  err = obj_set (sp_mop, SP_ATTR_OWNER, &user_val);
692  if (err < 0)
693  {
694  goto error;
695  }
696  pr_clear_value (&user_val);
697  }
698 
699  /* change the comment */
700  if (sp_comment != NULL)
701  {
702  db_make_string (&user_val, comment_str);
703  err = obj_set (sp_mop, SP_ATTR_COMMENT, &user_val);
704  if (err < 0)
705  {
706  goto error;
707  }
708  pr_clear_value (&user_val);
709  }
710 
711 error:
712 
713  pr_clear_value (&user_val);
714  AU_ENABLE (save);
715 
716  return err;
717 }
718 
719 /*
720  * jsp_map_pt_misc_to_sp_type
721  * return : stored procedure type ( Procedure or Function )
722  * pt_enum(in): Misc Types
723  *
724  * Note:
725  */
726 
727 static SP_TYPE_ENUM
729 {
730  if (pt_enum == PT_SP_PROCEDURE)
731  {
732  return SP_TYPE_PROCEDURE;
733  }
734  else
735  {
736  return SP_TYPE_FUNCTION;
737  }
738 }
739 
740 /*
741  * jsp_map_pt_misc_to_sp_mode
742  * return : stored procedure mode ( input or output or inout )
743  * pt_enum(in) : Misc Types
744  *
745  * Note:
746  */
747 
748 static int
750 {
751  if (pt_enum == PT_INPUT || pt_enum == PT_NOPUT)
752  {
753  return SP_MODE_IN;
754  }
755  else if (pt_enum == PT_OUTPUT)
756  {
757  return SP_MODE_OUT;
758  }
759  else
760  {
761  return SP_MODE_INOUT;
762  }
763 }
764 
765 /*
766  * jsp_get_argument_count
767  * return: count element from argument list
768  * sp_args(in) : argument list
769  *
770  * Note:
771  */
772 
773 static int
775 {
776  int count = 0;
777  DB_ARG_LIST *p;
778 
779  for (p = sp_args->args; p != NULL; p = p->next)
780  {
781  count++;
782  }
783 
784  return count;
785 }
786 
787 /*
788  * jsp_add_stored_procedure_argument
789  * return: Error Code
790  * mop_p(in/out) :
791  * sp_name(in) :
792  * arg_name(in) :
793  * index(in) :
794  * data_type(in) :
795  * mode(in) :
796  * arg_comment(in):
797  *
798  * Note:
799  */
800 
801 static int
802 jsp_add_stored_procedure_argument (MOP * mop_p, const char *sp_name, const char *arg_name, int index,
803  PT_TYPE_ENUM data_type, PT_MISC_TYPE mode, const char *arg_comment)
804 {
805  DB_OBJECT *classobj_p, *object_p;
806  DB_OTMPL *obt_p = NULL;
807  DB_VALUE value;
808  int save;
809  int err;
810 
811  AU_DISABLE (save);
812 
813  classobj_p = db_find_class (SP_ARG_CLASS_NAME);
814  if (classobj_p == NULL)
815  {
816  assert (er_errid () != NO_ERROR);
817  err = er_errid ();
818  goto error;
819  }
820 
821  obt_p = dbt_create_object_internal (classobj_p);
822  if (obt_p == NULL)
823  {
824  assert (er_errid () != NO_ERROR);
825  err = er_errid ();
826  goto error;
827  }
828 
829  db_make_string (&value, sp_name);
830  err = dbt_put_internal (obt_p, SP_ATTR_NAME, &value);
831  pr_clear_value (&value);
832  if (err != NO_ERROR)
833  {
834  goto error;
835  }
836 
837  db_make_string (&value, arg_name);
838  err = dbt_put_internal (obt_p, SP_ATTR_ARG_NAME, &value);
839  pr_clear_value (&value);
840  if (err != NO_ERROR)
841  {
842  goto error;
843  }
844 
845  db_make_int (&value, index);
846  err = dbt_put_internal (obt_p, SP_ATTR_INDEX_OF_NAME, &value);
847  if (err != NO_ERROR)
848  {
849  goto error;
850  }
851 
852  db_make_int (&value, pt_type_enum_to_db (data_type));
853  err = dbt_put_internal (obt_p, SP_ATTR_DATA_TYPE, &value);
854  if (err != NO_ERROR)
855  {
856  goto error;
857  }
858 
859  db_make_int (&value, jsp_map_pt_misc_to_sp_mode (mode));
860  err = dbt_put_internal (obt_p, SP_ATTR_MODE, &value);
861  if (err != NO_ERROR)
862  {
863  goto error;
864  }
865 
866  db_make_string (&value, arg_comment);
867  err = dbt_put_internal (obt_p, SP_ATTR_ARG_COMMENT, &value);
868  pr_clear_value (&value);
869  if (err != NO_ERROR)
870  {
871  goto error;
872  }
873 
874  object_p = dbt_finish_object (obt_p);
875  if (!object_p)
876  {
877  assert (er_errid () != NO_ERROR);
878  err = er_errid ();
879  goto error;
880  }
881  obt_p = NULL;
882 
883  err = locator_flush_instance (object_p);
884  if (err != NO_ERROR)
885  {
886  assert (er_errid () != NO_ERROR);
887  err = er_errid ();
888  obj_delete (object_p);
889  goto error;
890  }
891 
892  *mop_p = object_p;
893 
894  AU_ENABLE (save);
895  return NO_ERROR;
896 
897 error:
898  if (obt_p)
899  {
900  dbt_abort_object (obt_p);
901  }
902 
903  AU_ENABLE (save);
904  return err;
905 }
906 
907 /*
908  * jsp_check_stored_procedure_name -
909  * return: java stored procedure name
910  * str(in) :
911  *
912  * Note: convert lowercase
913  */
914 
915 static char *
917 {
918  char buffer[SM_MAX_IDENTIFIER_LENGTH + 2];
919  char *name = NULL;
920 
922  name = strdup (buffer);
923 
924  return name;
925 }
926 
927 /*
928  * jsp_add_stored_procedure -
929  * return: Error ID
930  * name(in): jsp name
931  * type(in): type
932  * ret_type(in): return type
933  * param_list(in): parameter list
934  * java_method(in):
935  * comment(in):
936  *
937  * Note:
938  */
939 
940 static int
941 jsp_add_stored_procedure (const char *name, const PT_MISC_TYPE type, const PT_TYPE_ENUM return_type,
942  PT_NODE * param_list, const char *java_method, const char *comment)
943 {
944  DB_OBJECT *classobj_p, *object_p;
945  DB_OTMPL *obt_p = NULL;
946  DB_VALUE value, v;
947  DB_SET *param = NULL;
948  int i, save;
949  int err;
950  PT_NODE *node_p;
951  PT_NAME_INFO name_info;
952  bool has_savepoint = false;
953  char *checked_name;
954  const char *arg_comment;
955 
956  if (java_method == NULL)
957  {
959  return er_errid ();
960  }
961 
962  AU_DISABLE (save);
963 
964  checked_name = jsp_check_stored_procedure_name (name);
965 
966  classobj_p = db_find_class (SP_CLASS_NAME);
967 
968  if (classobj_p == NULL)
969  {
970  assert (er_errid () != NO_ERROR);
971  err = er_errid ();
972  goto error;
973  }
974 
976  if (err != NO_ERROR)
977  {
978  goto error;
979  }
980  has_savepoint = true;
981 
982  obt_p = dbt_create_object_internal (classobj_p);
983  if (!obt_p)
984  {
985  assert (er_errid () != NO_ERROR);
986  err = er_errid ();
987  goto error;
988  }
989 
990  db_make_string (&value, checked_name);
991  err = dbt_put_internal (obt_p, SP_ATTR_NAME, &value);
992  pr_clear_value (&value);
993 
994  if (err != NO_ERROR)
995  {
996  goto error;
997  }
998 
999  db_make_int (&value, jsp_map_pt_misc_to_sp_type (type));
1000  err = dbt_put_internal (obt_p, SP_ATTR_SP_TYPE, &value);
1001  if (err != NO_ERROR)
1002  {
1003  goto error;
1004  }
1005 
1006  db_make_int (&value, pt_type_enum_to_db (return_type));
1007  err = dbt_put_internal (obt_p, SP_ATTR_RETURN_TYPE, &value);
1008  if (err != NO_ERROR)
1009  {
1010  goto error;
1011  }
1012 
1013  param = set_create_sequence (0);
1014  if (param == NULL)
1015  {
1016  assert (er_errid () != NO_ERROR);
1017  err = er_errid ();
1018  goto error;
1019  }
1020 
1021  for (node_p = param_list, i = 0; node_p != NULL; node_p = node_p->next)
1022  {
1023  MOP mop = NULL;
1024 
1025  if (node_p->type_enum == PT_TYPE_RESULTSET && node_p->info.sp_param.mode != PT_OUTPUT)
1026  {
1028  err = er_errid ();
1029  goto error;
1030  }
1031  name_info = node_p->info.sp_param.name->info.name;
1032 
1033  arg_comment = (char *) PT_NODE_SP_ARG_COMMENT (node_p);
1034 
1035  err =
1036  jsp_add_stored_procedure_argument (&mop, checked_name, name_info.original, i, node_p->type_enum,
1037  node_p->info.sp_param.mode, arg_comment);
1038  if (err != NO_ERROR)
1039  {
1040  goto error;
1041  }
1042 
1043  db_make_object (&v, mop);
1044  err = set_put_element (param, i++, &v);
1045  pr_clear_value (&v);
1046 
1047  if (err != NO_ERROR)
1048  {
1049  goto error;
1050  }
1051  }
1052 
1053  db_make_sequence (&value, param);
1054  err = dbt_put_internal (obt_p, SP_ATTR_ARGS, &value);
1055  pr_clear_value (&value);
1056  param = NULL;
1057  if (err != NO_ERROR)
1058  {
1059  goto error;
1060  }
1061 
1062  db_make_int (&value, i);
1063  err = dbt_put_internal (obt_p, SP_ATTR_ARG_COUNT, &value);
1064  if (err != NO_ERROR)
1065  {
1066  goto error;
1067  }
1068 
1069  db_make_int (&value, SP_LANG_JAVA);
1070  err = dbt_put_internal (obt_p, SP_ATTR_LANG, &value);
1071  if (err != NO_ERROR)
1072  {
1073  goto error;
1074  }
1075 
1076  db_make_string (&value, java_method);
1077  err = dbt_put_internal (obt_p, SP_ATTR_TARGET, &value);
1078  pr_clear_value (&value);
1079  if (err != NO_ERROR)
1080  {
1081  goto error;
1082  }
1083 
1084  db_make_object (&value, Au_user);
1085  err = dbt_put_internal (obt_p, SP_ATTR_OWNER, &value);
1086  pr_clear_value (&value);
1087  if (err != NO_ERROR)
1088  {
1089  goto error;
1090  }
1091 
1092  db_make_string (&value, comment);
1093  err = dbt_put_internal (obt_p, SP_ATTR_COMMENT, &value);
1094  pr_clear_value (&value);
1095  if (err != NO_ERROR)
1096  {
1097  goto error;
1098  }
1099 
1100  object_p = dbt_finish_object (obt_p);
1101  if (!object_p)
1102  {
1103  assert (er_errid () != NO_ERROR);
1104  err = er_errid ();
1105  goto error;
1106  }
1107  obt_p = NULL;
1108 
1109  err = locator_flush_instance (object_p);
1110  if (err != NO_ERROR)
1111  {
1112  assert (er_errid () != NO_ERROR);
1113  err = er_errid ();
1114  obj_delete (object_p);
1115  goto error;
1116  }
1117 
1118  free_and_init (checked_name);
1119  AU_ENABLE (save);
1120  return NO_ERROR;
1121 
1122 error:
1123  if (param)
1124  set_free (param);
1125 
1126  if (obt_p)
1127  {
1128  dbt_abort_object (obt_p);
1129  }
1130 
1131  if (has_savepoint)
1132  {
1134  }
1135 
1136  free_and_init (checked_name);
1137  AU_ENABLE (save);
1138 
1139  return err;
1140 }
1141 
1142 /*
1143  * drop_stored_procedure -
1144  * return: Error code
1145  * name(in): jsp name
1146  * expected_type(in):
1147  *
1148  * Note:
1149  */
1150 
1151 static int
1152 drop_stored_procedure (const char *name, PT_MISC_TYPE expected_type)
1153 {
1154  MOP sp_mop, arg_mop, owner;
1155  DB_VALUE sp_type_val, arg_cnt_val, args_val, owner_val, temp;
1156  SP_TYPE_ENUM real_type;
1157  DB_SET *arg_set_p;
1158  int save, i, arg_cnt;
1159  int err;
1160 
1161  AU_DISABLE (save);
1162 
1163  db_make_null (&args_val);
1164  db_make_null (&owner_val);
1165 
1166  sp_mop = jsp_find_stored_procedure (name);
1167  if (sp_mop == NULL)
1168  {
1169  assert (er_errid () != NO_ERROR);
1170  err = er_errid ();
1171  goto error;
1172  }
1173 
1174  err = db_get (sp_mop, SP_ATTR_OWNER, &owner_val);
1175  if (err != NO_ERROR)
1176  {
1177  goto error;
1178  }
1179  owner = db_get_object (&owner_val);
1180 
1182  {
1184  err = er_errid ();
1185  goto error;
1186  }
1187 
1188  err = db_get (sp_mop, SP_ATTR_SP_TYPE, &sp_type_val);
1189  if (err != NO_ERROR)
1190  {
1191  goto error;
1192  }
1193 
1194  real_type = (SP_TYPE_ENUM) db_get_int (&sp_type_val);
1195  if (real_type != jsp_map_pt_misc_to_sp_type (expected_type))
1196  {
1198  real_type == SP_TYPE_FUNCTION ? "FUNCTION" : "PROCEDURE");
1199 
1200  err = er_errid ();
1201  goto error;
1202  }
1203 
1204  err = db_get (sp_mop, SP_ATTR_ARG_COUNT, &arg_cnt_val);
1205  if (err != NO_ERROR)
1206  {
1207  goto error;
1208  }
1209 
1210  arg_cnt = db_get_int (&arg_cnt_val);
1211 
1212  err = db_get (sp_mop, SP_ATTR_ARGS, &args_val);
1213  if (err != NO_ERROR)
1214  {
1215  goto error;
1216  }
1217 
1218  arg_set_p = db_get_set (&args_val);
1219 
1220  for (i = 0; i < arg_cnt; i++)
1221  {
1222  set_get_element (arg_set_p, i, &temp);
1223  arg_mop = db_get_object (&temp);
1224  err = obj_delete (arg_mop);
1225  pr_clear_value (&temp);
1226  if (err != NO_ERROR)
1227  {
1228  goto error;
1229  }
1230  }
1231 
1232  err = obj_delete (sp_mop);
1233 
1234 error:
1235  AU_ENABLE (save);
1236 
1237  pr_clear_value (&args_val);
1238  pr_clear_value (&owner_val);
1239 
1240  return err;
1241 }
1242 
1243 /*
1244  * jsp_get_value_size -
1245  * return: return value size
1246  * value(in): input value
1247  *
1248  * Note:
1249  */
1250 
1251 static int
1253 {
1254  char str_buf[NUMERIC_MAX_STRING_SIZE];
1255  int type, size = 0;
1256 
1257  type = DB_VALUE_TYPE (value);
1258  switch (type)
1259  {
1260  case DB_TYPE_INTEGER:
1261  case DB_TYPE_SHORT:
1262  size = sizeof (int);
1263  break;
1264 
1265  case DB_TYPE_BIGINT:
1266  size = sizeof (DB_BIGINT);
1267  break;
1268 
1269  case DB_TYPE_FLOAT:
1270  size = sizeof (float); /* need machine independent code */
1271  break;
1272 
1273  case DB_TYPE_DOUBLE:
1274  case DB_TYPE_MONETARY:
1275  size = sizeof (double); /* need machine independent code */
1276  break;
1277 
1278  case DB_TYPE_NUMERIC:
1279  size = or_packed_string_length (numeric_db_value_print (value, str_buf), NULL);
1280  break;
1281 
1282  case DB_TYPE_CHAR:
1283  case DB_TYPE_NCHAR:
1284  case DB_TYPE_VARNCHAR:
1285  case DB_TYPE_STRING:
1286  size = or_packed_string_length (db_get_string (value), NULL);
1287  break;
1288 
1289  case DB_TYPE_BIT:
1290  case DB_TYPE_VARBIT:
1291  break;
1292 
1293  case DB_TYPE_OBJECT:
1294  case DB_TYPE_DATE:
1295  case DB_TYPE_TIME:
1296  size = sizeof (int) * 3;
1297  break;
1298 
1299  case DB_TYPE_TIMESTAMP:
1300  size = sizeof (int) * 6;
1301  break;
1302 
1303  case DB_TYPE_DATETIME:
1304  size = sizeof (int) * 7;
1305  break;
1306 
1307  case DB_TYPE_SET:
1308  case DB_TYPE_MULTISET:
1309  case DB_TYPE_SEQUENCE:
1310  {
1311  DB_SET *set;
1312  int ncol, i;
1313  DB_VALUE v;
1314 
1315  set = db_get_set (value);
1316  ncol = set_size (set);
1317  size += 4; /* set size */
1318 
1319  for (i = 0; i < ncol; i++)
1320  {
1321  if (set_get_element (set, i, &v) != NO_ERROR)
1322  {
1323  return 0;
1324  }
1325 
1326  size += jsp_get_value_size (&v);
1327  pr_clear_value (&v);
1328  }
1329  }
1330  break;
1331 
1332  case DB_TYPE_NULL:
1333  default:
1334  break;
1335  }
1336 
1337  size += 16; /* type + value's size + mode + arg_data_type */
1338  return size;
1339 }
1340 
1341 /*
1342  * jsp_get_arg_sizes -
1343  * return: return do a sum value size of argument list
1344  * args(in/out): argument list of jsp
1345  *
1346  * Note:
1347  */
1348 
1349 static int
1351 {
1352  DB_ARG_LIST *p;
1353  int size = 0;
1354 
1355  for (p = args; p != NULL; p = p->next)
1356  {
1357  size += jsp_get_value_size (p->val);
1358  }
1359 
1360  return size;
1361 }
1362 
1363 /*
1364  * jsp_pack_int_argument -
1365  * return: return packing value
1366  * buffer(in/out): buffer
1367  * value(in): value of integer type
1368  *
1369  * Note:
1370  */
1371 
1372 static char *
1373 jsp_pack_int_argument (char *buffer, DB_VALUE * value)
1374 {
1375  int v;
1376  char *ptr;
1377 
1378  ptr = buffer;
1379  ptr = or_pack_int (ptr, sizeof (int));
1380  v = db_get_int (value);
1381  ptr = or_pack_int (ptr, v);
1382 
1383  return ptr;
1384 }
1385 
1386 /*
1387  * jsp_pack_bigint_argument -
1388  * return: return packing value
1389  * buffer(in/out): buffer
1390  * value(in): value of bigint type
1391  *
1392  * Note:
1393  */
1394 static char *
1395 jsp_pack_bigint_argument (char *buffer, DB_VALUE * value)
1396 {
1397  DB_BIGINT tmp_value;
1398  char *ptr;
1399 
1400  ptr = or_pack_int (buffer, sizeof (DB_BIGINT));
1401  tmp_value = db_get_bigint (value);
1402  OR_PUT_BIGINT (ptr, &tmp_value);
1403 
1404  return ptr + OR_BIGINT_SIZE;
1405 }
1406 
1407 /*
1408  * jsp_pack_short_argument -
1409  * return: return packing value
1410  * buffer(in): buffer
1411  * value(in): value of short type
1412  *
1413  * Note:
1414  */
1415 
1416 static char *
1417 jsp_pack_short_argument (char *buffer, DB_VALUE * value)
1418 {
1419  short v;
1420  char *ptr;
1421 
1422  ptr = buffer;
1423  ptr = or_pack_int (ptr, sizeof (int));
1424  v = db_get_short (value);
1425  ptr = or_pack_short (ptr, v);
1426 
1427  return ptr;
1428 }
1429 
1430 /*
1431  * jsp_pack_float_argument -
1432  * return: return packing value
1433  * buffer(in): buffer
1434  * value(in): value of float type
1435  *
1436  * Note:
1437  */
1438 
1439 static char *
1440 jsp_pack_float_argument (char *buffer, DB_VALUE * value)
1441 {
1442  float v;
1443  char *ptr;
1444 
1445  ptr = buffer;
1446  ptr = or_pack_int (ptr, sizeof (float));
1447  v = db_get_float (value);
1448  ptr = or_pack_float (ptr, v);
1449 
1450  return ptr;
1451 }
1452 
1453 /*
1454  * jsp_pack_double_argument -
1455  * return: return packing value
1456  * buffer(in): buffer
1457  * value(in): value of double type
1458  *
1459  * Note:
1460  */
1461 
1462 static char *
1463 jsp_pack_double_argument (char *buffer, DB_VALUE * value)
1464 {
1465  double v;
1466  char *ptr;
1467  char pack_value[OR_DOUBLE_SIZE];
1468 
1469  ptr = or_pack_int (buffer, sizeof (double));
1470  v = db_get_double (value);
1471  OR_PUT_DOUBLE (pack_value, v);
1472  memcpy (ptr, pack_value, OR_DOUBLE_SIZE);
1473 
1474  return ptr + OR_DOUBLE_SIZE;
1475 }
1476 
1477 /*
1478  * jsp_pack_numeric_argument -
1479  * return: return packing value
1480  * buffer(in): buffer
1481  * value(in): value of numeric type
1482  *
1483  * Note:
1484  */
1485 
1486 static char *
1487 jsp_pack_numeric_argument (char *buffer, DB_VALUE * value)
1488 {
1489  char str_buf[NUMERIC_MAX_STRING_SIZE];
1490  char *ptr;
1491 
1492  ptr = buffer;
1493  numeric_db_value_print (value, str_buf);
1494  ptr = or_pack_string (ptr, str_buf);
1495 
1496  return ptr;
1497 }
1498 
1499 /*
1500  * jsp_pack_string_argument -
1501  * return: return packing value
1502  * buffer(in): buffer
1503  * value(in): value of string type
1504  *
1505  * Note:
1506  */
1507 
1508 static char *
1509 jsp_pack_string_argument (char *buffer, DB_VALUE * value)
1510 {
1511  const char *v;
1512  char *ptr, *decomposed = NULL;
1513  int v_size;
1514  int decomp_size;
1515  bool was_decomposed = false;
1516 
1517 
1518  ptr = buffer;
1519  v = db_get_string (value);
1520  v_size = (v != NULL) ? strlen (v) : 0;
1521 
1522  if (v_size > 0 && db_get_string_codeset (value) == INTL_CODESET_UTF8
1523  && unicode_string_need_decompose (v, v_size, &decomp_size, lang_get_generic_unicode_norm ()))
1524  {
1525  int alloc_size = decomp_size + 1;
1526 
1527  decomposed = (char *) db_private_alloc (NULL, alloc_size);
1528  if (decomposed != NULL)
1529  {
1530  unicode_decompose_string (v, v_size, decomposed, &decomp_size, lang_get_generic_unicode_norm ());
1531  /* or_pack_string requires null-terminated string */
1532  decomposed[decomp_size] = '\0';
1533  assert (decomp_size < alloc_size);
1534 
1535  v = decomposed;
1536  v_size = decomp_size;
1537  was_decomposed = true;
1538  }
1539  else
1540  {
1541  v = NULL;
1542  }
1543  }
1544 
1545  ptr = or_pack_string (ptr, v);
1546 
1547  if (was_decomposed)
1548  {
1549  db_private_free (NULL, decomposed);
1550  }
1551 
1552  return ptr;
1553 }
1554 
1555 /*
1556  * jsp_pack_date_argument -
1557  * return: return packing value
1558  * buffer(in): buffer
1559  * value(in): value of date type
1560  *
1561  * Note:
1562  */
1563 
1564 static char *
1565 jsp_pack_date_argument (char *buffer, DB_VALUE * value)
1566 {
1567  int year, month, day;
1568  DB_DATE *date;
1569  char *ptr;
1570 
1571  ptr = buffer;
1572  date = db_get_date (value);
1573  db_date_decode (date, &month, &day, &year);
1574 
1575  ptr = or_pack_int (ptr, sizeof (int) * 3);
1576  ptr = or_pack_int (ptr, year);
1577  ptr = or_pack_int (ptr, month - 1);
1578  ptr = or_pack_int (ptr, day);
1579 
1580  return ptr;
1581 }
1582 
1583 /*
1584  * jsp_pack_time_argument -
1585  * return: return packing value
1586  * buffer(in): buffer
1587  * value(in): value of time type
1588  *
1589  * Note:
1590  */
1591 
1592 static char *
1593 jsp_pack_time_argument (char *buffer, DB_VALUE * value)
1594 {
1595  int hour, min, sec;
1596  DB_TIME *time;
1597  char *ptr;
1598 
1599  ptr = buffer;
1600  time = db_get_time (value);
1601  db_time_decode (time, &hour, &min, &sec);
1602 
1603  ptr = or_pack_int (ptr, sizeof (int) * 3);
1604  ptr = or_pack_int (ptr, hour);
1605  ptr = or_pack_int (ptr, min);
1606  ptr = or_pack_int (ptr, sec);
1607 
1608  return ptr;
1609 }
1610 
1611 /*
1612  * jsp_pack_timestamp_argument -
1613  * return: return packing value
1614  * buffer(in): buffer
1615  * value(in): value of timestamp type
1616  *
1617  * Note:
1618  */
1619 
1620 static char *
1621 jsp_pack_timestamp_argument (char *buffer, DB_VALUE * value)
1622 {
1623  DB_TIMESTAMP *timestamp;
1624  DB_DATE date;
1625  DB_TIME time;
1626  int year, mon, day, hour, min, sec;
1627  char *ptr;
1628 
1629  ptr = buffer;
1630  timestamp = db_get_timestamp (value);
1631  (void) db_timestamp_decode_ses (timestamp, &date, &time);
1632  db_date_decode (&date, &mon, &day, &year);
1633  db_time_decode (&time, &hour, &min, &sec);
1634 
1635  ptr = or_pack_int (ptr, sizeof (int) * 6);
1636  ptr = or_pack_int (ptr, year);
1637  ptr = or_pack_int (ptr, mon - 1);
1638  ptr = or_pack_int (ptr, day);
1639  ptr = or_pack_int (ptr, hour);
1640  ptr = or_pack_int (ptr, min);
1641  ptr = or_pack_int (ptr, sec);
1642 
1643  return ptr;
1644 }
1645 
1646 /*
1647  * jsp_pack_datetime_argument -
1648  * return: return packing value
1649  * buffer(in): buffer
1650  * value(in): value of datetime type
1651  *
1652  * Note:
1653  */
1654 
1655 static char *
1656 jsp_pack_datetime_argument (char *buffer, DB_VALUE * value)
1657 {
1658  DB_DATETIME *datetime;
1659  int year, mon, day, hour, min, sec, msec;
1660  char *ptr;
1661 
1662  ptr = buffer;
1663  datetime = db_get_datetime (value);
1664  db_datetime_decode (datetime, &mon, &day, &year, &hour, &min, &sec, &msec);
1665 
1666  ptr = or_pack_int (ptr, sizeof (int) * 7);
1667  ptr = or_pack_int (ptr, year);
1668  ptr = or_pack_int (ptr, mon - 1);
1669  ptr = or_pack_int (ptr, day);
1670  ptr = or_pack_int (ptr, hour);
1671  ptr = or_pack_int (ptr, min);
1672  ptr = or_pack_int (ptr, sec);
1673  ptr = or_pack_int (ptr, msec);
1674 
1675  return ptr;
1676 }
1677 
1678 /*
1679  * jsp_pack_set_argument -
1680  * return: return packing value
1681  * buffer(in): buffer
1682  * value(in): value of set type
1683  *
1684  * Note:
1685  */
1686 
1687 static char *
1688 jsp_pack_set_argument (char *buffer, DB_VALUE * value)
1689 {
1690  DB_SET *set;
1691  int ncol, i;
1692  DB_VALUE v;
1693  char *ptr;
1694 
1695  ptr = buffer;
1696  set = db_get_set (value);
1697  ncol = set_size (set);
1698 
1699  ptr = or_pack_int (ptr, sizeof (int));
1700  ptr = or_pack_int (ptr, ncol);
1701 
1702  for (i = 0; i < ncol; i++)
1703  {
1704  if (set_get_element (set, i, &v) != NO_ERROR)
1705  {
1706  break;
1707  }
1708 
1709  ptr = jsp_pack_argument (ptr, &v);
1710  pr_clear_value (&v);
1711  }
1712 
1713  return ptr;
1714 }
1715 
1716 /*
1717  * jsp_pack_object_argument -
1718  * return: return packing value
1719  * buffer(in/out): buffer
1720  * value(in): value of object type
1721  *
1722  * Note:
1723  */
1724 
1725 static char *
1726 jsp_pack_object_argument (char *buffer, DB_VALUE * value)
1727 {
1728  char *ptr;
1729  OID *oid;
1730  MOP mop;
1731 
1732  ptr = buffer;
1733  mop = db_get_object (value);
1734  if (mop != NULL)
1735  {
1736  oid = WS_OID (mop);
1737  }
1738  else
1739  {
1740  oid = (OID *) (&oid_Null_oid);
1741  }
1742 
1743  ptr = or_pack_int (ptr, sizeof (int) * 3);
1744  ptr = or_pack_int (ptr, oid->pageid);
1745  ptr = or_pack_short (ptr, oid->slotid);
1746  ptr = or_pack_short (ptr, oid->volid);
1747 
1748  return ptr;
1749 }
1750 
1751 /*
1752  * jsp_pack_monetary_argument -
1753  * return: return packing value
1754  * buffer(in/out): buffer
1755  * value(in): value of monetary type
1756  *
1757  * Note:
1758  */
1759 
1760 static char *
1761 jsp_pack_monetary_argument (char *buffer, DB_VALUE * value)
1762 {
1763  DB_MONETARY *v;
1764  char pack_value[OR_DOUBLE_SIZE];
1765  char *ptr;
1766 
1767  ptr = or_pack_int (buffer, sizeof (double));
1768  v = db_get_monetary (value);
1769  OR_PUT_DOUBLE (pack_value, v->amount);
1770  memcpy (ptr, pack_value, OR_DOUBLE_SIZE);
1771 
1772  return ptr + OR_DOUBLE_SIZE;
1773 }
1774 
1775 /*
1776  * jsp_pack_null_argument -
1777  * return: return null packing value
1778  * buffer(in/out): buffer
1779  *
1780  * Note:
1781  */
1782 
1783 static char *
1785 {
1786  char *ptr;
1787 
1788  ptr = buffer;
1789  ptr = or_pack_int (ptr, 0);
1790 
1791  return ptr;
1792 }
1793 
1794 /*
1795  * jsp_pack_argument
1796  * return: packing value for send to jsp server
1797  * buffer(in/out): contain packng value
1798  * value(in): value for packing
1799  *
1800  * Note:
1801  */
1802 
1803 static char *
1804 jsp_pack_argument (char *buffer, DB_VALUE * value)
1805 {
1806  int param_type;
1807  char *ptr;
1808 
1809  ptr = buffer;
1810  param_type = DB_VALUE_TYPE (value);
1811  ptr = or_pack_int (ptr, param_type);
1812 
1813  switch (param_type)
1814  {
1815  case DB_TYPE_INTEGER:
1816  ptr = jsp_pack_int_argument (ptr, value);
1817  break;
1818 
1819  case DB_TYPE_BIGINT:
1820  ptr = jsp_pack_bigint_argument (ptr, value);
1821  break;
1822 
1823  case DB_TYPE_SHORT:
1824  ptr = jsp_pack_short_argument (ptr, value);
1825  break;
1826 
1827  case DB_TYPE_FLOAT:
1828  ptr = jsp_pack_float_argument (ptr, value);
1829  break;
1830 
1831  case DB_TYPE_DOUBLE:
1832  ptr = jsp_pack_double_argument (ptr, value);
1833  break;
1834 
1835  case DB_TYPE_NUMERIC:
1836  ptr = jsp_pack_numeric_argument (ptr, value);
1837  break;
1838 
1839  case DB_TYPE_CHAR:
1840  case DB_TYPE_NCHAR:
1841  case DB_TYPE_VARNCHAR:
1842  case DB_TYPE_STRING:
1843  ptr = jsp_pack_string_argument (ptr, value);
1844  break;
1845 
1846  case DB_TYPE_BIT:
1847  case DB_TYPE_VARBIT:
1848  break;
1849 
1850  case DB_TYPE_DATE:
1851  ptr = jsp_pack_date_argument (ptr, value);
1852  break;
1853  /* describe_data(); */
1854 
1855  case DB_TYPE_TIME:
1856  ptr = jsp_pack_time_argument (ptr, value);
1857  break;
1858 
1859  case DB_TYPE_TIMESTAMP:
1860  ptr = jsp_pack_timestamp_argument (ptr, value);
1861  break;
1862 
1863  case DB_TYPE_DATETIME:
1864  ptr = jsp_pack_datetime_argument (ptr, value);
1865  break;
1866 
1867  case DB_TYPE_SET:
1868  case DB_TYPE_MULTISET:
1869  case DB_TYPE_SEQUENCE:
1870  ptr = jsp_pack_set_argument (ptr, value);
1871  break;
1872 
1873  case DB_TYPE_MONETARY:
1874  ptr = jsp_pack_monetary_argument (ptr, value);
1875  break;
1876 
1877  case DB_TYPE_OBJECT:
1878  ptr = jsp_pack_object_argument (ptr, value);
1879  break;
1880 
1881  case DB_TYPE_NULL:
1882  ptr = jsp_pack_null_argument (ptr);
1883  break;
1884  default:
1885  break;
1886  }
1887 
1888  return ptr;
1889 }
1890 
1891 /*
1892  * jsp_send_call_request -
1893  * return: error code
1894  * sockfd(in): socket description
1895  * sp_args(in): jsp argument list
1896  *
1897  * Note:
1898  */
1899 
1900 static int
1901 jsp_send_call_request (const SOCKET sockfd, const SP_ARGS * sp_args)
1902 {
1903  int error_code = NO_ERROR;
1904  int req_code, arg_count, i, strlen;
1905  int req_size, nbytes;
1906  DB_ARG_LIST *p;
1907  char *buffer = NULL, *ptr = NULL;
1908 
1909  req_size =
1910  (int) sizeof (int) * 4 + or_packed_string_length (sp_args->name, &strlen) + jsp_get_argument_size (sp_args->args);
1911 
1912  buffer = (char *) malloc (req_size);
1913  if (buffer == NULL)
1914  {
1916  error_code = er_errid ();
1917  goto exit;
1918  }
1919 
1920  req_code = SP_CODE_INVOKE;
1921  ptr = or_pack_int (buffer, req_code);
1922 
1923  ptr = or_pack_string_with_length (ptr, sp_args->name, strlen);
1924 
1925  arg_count = jsp_get_argument_count (sp_args);
1926  ptr = or_pack_int (ptr, arg_count);
1927 
1928  for (p = sp_args->args, i = 0; p != NULL; p = p->next, i++)
1929  {
1930  ptr = or_pack_int (ptr, sp_args->arg_mode[i]);
1931  ptr = or_pack_int (ptr, sp_args->arg_type[i]);
1932  ptr = jsp_pack_argument (ptr, p->val);
1933  }
1934 
1935  ptr = or_pack_int (ptr, sp_args->return_type);
1936  ptr = or_pack_int (ptr, req_code);
1937 
1938  nbytes = jsp_writen (sockfd, buffer, req_size);
1939  if (nbytes != req_size)
1940  {
1942  error_code = er_errid ();
1943  goto exit;
1944  }
1945 
1946 exit:
1947  if (buffer)
1948  {
1949  free_and_init (buffer);
1950  }
1951  return error_code;
1952 }
1953 
1954 /*
1955  * jsp_send_destroy_request_all -
1956  * return: error code
1957  * sockfd(in): socket description
1958  *
1959  * Note:
1960  */
1961 
1962 extern int
1964 {
1965  for (int i = 0; i < MAX_CALL_COUNT; i++)
1966  {
1967  int idx = (MAX_CALL_COUNT - 1) - i;
1968  if (!IS_INVALID_SOCKET (sock_fds[idx]))
1969  {
1972  sock_fds[idx] = INVALID_SOCKET;
1973  }
1974  }
1975  return NO_ERROR;
1976 }
1977 
1978 extern int
1980 {
1981  OR_ALIGNED_BUF (OR_INT_SIZE) a_request;
1982  char *request = OR_ALIGNED_BUF_START (a_request);
1983 
1984  or_pack_int (request, (int) SP_CODE_DESTROY);
1985  int nbytes = jsp_writen (sockfd, request, (int) sizeof (int));
1986  if (nbytes != (int) sizeof (int))
1987  {
1989  return er_errid ();
1990  }
1991 
1992  /* read request code */
1993  int code;
1994  nbytes = jsp_readn (sockfd, (char *) &code, (int) sizeof (int));
1995  if (nbytes != (int) sizeof (int))
1996  {
1998  return er_errid ();
1999  }
2000  code = ntohl (code);
2001 
2002  if (code == SP_CODE_DESTROY)
2003  {
2004  bool mode = ssl_client;
2005  ssl_client = false;
2007  libcas_main (sockfd); /* jdbc call */
2009  ssl_client = mode;
2010  }
2011  else
2012  {
2013  /* end */
2014  }
2015 
2016  return NO_ERROR;
2017 }
2018 
2019 /*
2020  * jsp_unpack_int_value -
2021  * return: return unpacking value
2022  * buffer(in/out): buffer
2023  * retval(in): value of int type
2024  *
2025  * Note:
2026  */
2027 
2028 static char *
2029 jsp_unpack_int_value (char *buffer, DB_VALUE * retval)
2030 {
2031  int val;
2032  char *ptr;
2033 
2034  ptr = buffer;
2035  ptr = or_unpack_int (ptr, &val);
2036  db_make_int (retval, val);
2037 
2038  return ptr;
2039 }
2040 
2041 /*
2042  * jsp_unpack_bigint_value -
2043  * return: return unpacking value
2044  * buffer(in/out): buffer
2045  * retval(in): value of bigint type
2046  *
2047  * Note:
2048  */
2049 
2050 static char *
2051 jsp_unpack_bigint_value (char *buffer, DB_VALUE * retval)
2052 {
2053  DB_BIGINT val;
2054 
2055  memcpy ((char *) (&val), buffer, OR_BIGINT_SIZE);
2056  OR_GET_BIGINT (&val, &val);
2057  db_make_bigint (retval, val);
2058 
2059  return buffer + OR_BIGINT_SIZE;
2060 }
2061 
2062 /*
2063  * jsp_unpack_short_value -
2064  * return: return unpacking value
2065  * buffer(in/out): buffer
2066  * retval(in): value of short type
2067  *
2068  * Note:
2069  */
2070 
2071 static char *
2072 jsp_unpack_short_value (char *buffer, DB_VALUE * retval)
2073 {
2074  short val;
2075  char *ptr;
2076 
2077  ptr = buffer;
2078  ptr = or_unpack_short (ptr, &val);
2079  db_make_short (retval, val);
2080 
2081  return ptr;
2082 }
2083 
2084 /*
2085  * jsp_unpack_float_value -
2086  * return: return unpacking value
2087  * buffer(in/out): buffer
2088  * retval(in): value of float type
2089  *
2090  * Note:
2091  */
2092 
2093 static char *
2094 jsp_unpack_float_value (char *buffer, DB_VALUE * retval)
2095 {
2096  float val;
2097  char *ptr;
2098 
2099  ptr = buffer;
2100  ptr = or_unpack_float (ptr, &val);
2101  db_make_float (retval, val);
2102 
2103  return ptr;
2104 }
2105 
2106 /*
2107  * jsp_unpack_double_value -
2108  * return: return unpacking value
2109  * buffer(in/out): buffer
2110  * retval(in): value of double type
2111  *
2112  * Note:
2113  */
2114 
2115 static char *
2116 jsp_unpack_double_value (char *buffer, DB_VALUE * retval)
2117 {
2118  UINT64 val;
2119  double result;
2120 
2121  memcpy ((char *) (&val), buffer, OR_DOUBLE_SIZE);
2122  OR_GET_DOUBLE (&val, &result);
2123  db_make_double (retval, result);
2124 
2125  return buffer + OR_DOUBLE_SIZE;
2126 }
2127 
2128 /*
2129  * jsp_unpack_numeric_value -
2130  * return: return unpacking value
2131  * buffer(in/out): buffer
2132  * retval(in): value of numeric type
2133  *
2134  * Note:
2135  */
2136 
2137 static char *
2138 jsp_unpack_numeric_value (char *buffer, DB_VALUE * retval)
2139 {
2140  char *val;
2141  char *ptr;
2142 
2143  ptr = or_unpack_string_nocopy (buffer, &val);
2144  if (val == NULL || numeric_coerce_string_to_num (val, strlen (val), lang_get_client_charset (), retval) != NO_ERROR)
2145  {
2146  ptr = NULL;
2147  }
2148 
2149  return ptr;
2150 }
2151 
2152 /*
2153  * jsp_unpack_string_value -
2154  * return: return unpacking value
2155  * buffer(in/out): buffer
2156  * retval(in): value of string type
2157  *
2158  * Note:
2159  */
2160 
2161 static char *
2162 jsp_unpack_string_value (char *buffer, DB_VALUE * retval)
2163 {
2164  char *val;
2165  char *ptr;
2166  char *invalid_pos = NULL;
2167  int size_in;
2168  int composed_size;
2169 
2170  ptr = buffer;
2171  ptr = or_unpack_string (ptr, &val);
2172 
2173  size_in = strlen (val);
2174 
2175  if (intl_check_string (val, size_in, &invalid_pos, lang_get_client_charset ()) != INTL_UTF8_VALID)
2176  {
2177  er_set (ER_ERROR_SEVERITY, ARG_FILE_LINE, ER_INVALID_CHAR, 1, invalid_pos - val);
2178  return NULL;
2179  }
2180 
2182  && unicode_string_need_compose (val, size_in, &composed_size, lang_get_generic_unicode_norm ()))
2183  {
2184  char *composed;
2185  bool is_composed = false;
2186 
2187  composed = (char *) db_private_alloc (NULL, composed_size + 1);
2188  if (composed == NULL)
2189  {
2190  return NULL;
2191  }
2192 
2193  unicode_compose_string (val, size_in, composed, &composed_size, &is_composed, lang_get_generic_unicode_norm ());
2194  composed[composed_size] = '\0';
2195 
2196  assert (composed_size <= size_in);
2197 
2198  if (is_composed)
2199  {
2200  db_private_free (NULL, val);
2201  val = composed;
2202  }
2203  else
2204  {
2205  db_private_free (NULL, composed);
2206  }
2207  }
2208 
2209  db_make_string (retval, val);
2211  retval->need_clear = true;
2212 
2213  return ptr;
2214 }
2215 
2216 /*
2217  * jsp_unpack_date_value -
2218  * return: return unpacking value
2219  * buffer(in/out): buffer
2220  * retval(in): value of date type
2221  *
2222  * Note:
2223  */
2224 
2225 static char *
2226 jsp_unpack_date_value (char *buffer, DB_VALUE * retval)
2227 {
2228  DB_DATE date;
2229  char *val;
2230  char *ptr;
2231 
2232  ptr = buffer;
2233  ptr = or_unpack_string_nocopy (ptr, &val);
2234 
2235  if (val == NULL || db_string_to_date (val, &date) != NO_ERROR)
2236  {
2237  ptr = NULL;
2238  }
2239  else
2240  {
2241  db_value_put_encoded_date (retval, &date);
2242  }
2243 
2244  return ptr;
2245 }
2246 
2247 /*
2248  * jsp_unpack_time_value -
2249  * return: return unpacking value
2250  * buffer(in/out): buffer
2251  * retval(in): value of time type
2252  *
2253  * Note:
2254  */
2255 
2256 static char *
2257 jsp_unpack_time_value (char *buffer, DB_VALUE * retval)
2258 {
2259  DB_TIME time;
2260  char *val;
2261  char *ptr;
2262 
2263  ptr = buffer;
2264  ptr = or_unpack_string_nocopy (ptr, &val);
2265 
2266  if (val == NULL || db_string_to_time (val, &time) != NO_ERROR)
2267  {
2268  ptr = NULL;
2269  }
2270  else
2271  {
2272  db_value_put_encoded_time (retval, &time);
2273  }
2274 
2275  return ptr;
2276 }
2277 
2278 /*
2279  * jsp_unpack_timestamp_value -
2280  * return: return unpacking value
2281  * buffer(in/out): buffer
2282  * retval(in): value of timestamp type
2283  *
2284  * Note:
2285  */
2286 
2287 static char *
2288 jsp_unpack_timestamp_value (char *buffer, DB_VALUE * retval)
2289 {
2290  DB_TIMESTAMP timestamp;
2291  char *val;
2292  char *ptr;
2293 
2294  ptr = buffer;
2295  ptr = or_unpack_string_nocopy (ptr, &val);
2296 
2297  if (val == NULL || db_string_to_timestamp (val, &timestamp) != NO_ERROR)
2298  {
2299  ptr = NULL;
2300  }
2301  else
2302  {
2303  db_make_timestamp (retval, timestamp);
2304  }
2305 
2306  return ptr;
2307 }
2308 
2309 /*
2310  * jsp_unpack_datetime_value -
2311  * return: return unpacking value
2312  * buffer(in/out): buffer
2313  * retval(in): value of datetime type
2314  *
2315  * Note:
2316  */
2317 
2318 static char *
2319 jsp_unpack_datetime_value (char *buffer, DB_VALUE * retval)
2320 {
2321  DB_DATETIME datetime;
2322  char *val;
2323  char *ptr;
2324 
2325  ptr = buffer;
2326  ptr = or_unpack_string_nocopy (ptr, &val);
2327 
2328  if (val == NULL || db_string_to_datetime (val, &datetime) != NO_ERROR)
2329  {
2330  ptr = NULL;
2331  }
2332  else
2333  {
2334  db_make_datetime (retval, &datetime);
2335  }
2336 
2337  return ptr;
2338 }
2339 
2340 /*
2341  * jsp_unpack_set_value -
2342  * return: return unpacking value
2343  * buffer(in/out): buffer
2344  * retval(in): value of set type
2345  *
2346  * Note:
2347  */
2348 
2349 static char *
2350 jsp_unpack_set_value (char *buffer, int type, DB_VALUE * retval)
2351 {
2352  DB_SET *set;
2353  int ncol, i;
2354  char *ptr;
2355  DB_VALUE v;
2356 
2357  ptr = buffer;
2358  ptr = or_unpack_int (ptr, &ncol);
2359  set = set_create ((DB_TYPE) type, ncol);
2360 
2361  for (i = 0; i < ncol; i++)
2362  {
2363  ptr = jsp_unpack_value (ptr, &v);
2364  if (ptr == NULL || set_add_element (set, &v) != NO_ERROR)
2365  {
2366  set_free (set);
2367  break;
2368  }
2369  pr_clear_value (&v);
2370  }
2371 
2372  if (type == DB_TYPE_SET)
2373  {
2374  db_make_set (retval, set);
2375  }
2376  else if (type == DB_TYPE_MULTISET)
2377  {
2378  db_make_multiset (retval, set);
2379  }
2380  else if (type == DB_TYPE_SEQUENCE)
2381  {
2382  db_make_sequence (retval, set);
2383  }
2384 
2385  return ptr;
2386 
2387 }
2388 
2389 /*
2390  * jsp_unpack_object_value -
2391  * return: return unpacking value
2392  * buffer(in/out): buffer
2393  * retval(in): value of object type
2394  *
2395  * Note:
2396  */
2397 
2398 static char *
2399 jsp_unpack_object_value (char *buffer, DB_VALUE * retval)
2400 {
2401  OID oid;
2402  MOP obj;
2403  char *ptr;
2404 
2405  ptr = buffer;
2406  ptr = or_unpack_int (ptr, &(oid.pageid));
2407  ptr = or_unpack_short (ptr, &(oid.slotid));
2408  ptr = or_unpack_short (ptr, &(oid.volid));
2409 
2410  obj = ws_mop (&oid, NULL);
2411  db_make_object (retval, obj);
2412 
2413  return ptr;
2414 }
2415 
2416 /*
2417  * jsp_unpack_monetary_value -
2418  * return: return unpacking value
2419  * buffer(in/out): buffer
2420  * retval(in): value of monetary type
2421  *
2422  * Note:
2423  */
2424 
2425 static char *
2426 jsp_unpack_monetary_value (char *buffer, DB_VALUE * retval)
2427 {
2428  UINT64 val;
2429  double result;
2430  char *ptr;
2431 
2432  ptr = buffer;
2433  memcpy ((char *) (&val), buffer, OR_DOUBLE_SIZE);
2434  OR_GET_DOUBLE (&val, &result);
2435 
2436  if (db_make_monetary (retval, DB_CURRENCY_DEFAULT, result) != NO_ERROR)
2437  {
2438  ptr = NULL;
2439  }
2440  else
2441  {
2442  ptr += OR_DOUBLE_SIZE;
2443  }
2444 
2445  return ptr;
2446 }
2447 
2448 /*
2449  * jsp_unpack_resultset -
2450  * return: return unpacking value
2451  * buffer(in/out): buffer
2452  * retval(in): value of resultset type
2453  *
2454  * Note:
2455  */
2456 
2457 static char *
2458 jsp_unpack_resultset (char *buffer, DB_VALUE * retval)
2459 {
2460  int val;
2461  char *ptr;
2462 
2463  ptr = buffer;
2464  ptr = or_unpack_int (ptr, &val);
2465  db_make_resultset (retval, val);
2466 
2467  return ptr;
2468 }
2469 
2470 /*
2471  * jsp_unpack_value -
2472  * return: return unpacking value
2473  * buffer(in/out): buffer
2474  * retval(in): db value for unpacking
2475  *
2476  * Note:
2477  */
2478 
2479 static char *
2480 jsp_unpack_value (char *buffer, DB_VALUE * retval)
2481 {
2482  char *ptr;
2483  int type;
2484 
2485  ptr = buffer;
2486  ptr = or_unpack_int (buffer, &type);
2487 
2488  switch (type)
2489  {
2490  case DB_TYPE_INTEGER:
2491  ptr = jsp_unpack_int_value (ptr, retval);
2492  break;
2493 
2494  case DB_TYPE_BIGINT:
2495  ptr = jsp_unpack_bigint_value (ptr, retval);
2496  break;
2497 
2498  case DB_TYPE_SHORT:
2499  ptr = jsp_unpack_short_value (ptr, retval);
2500  break;
2501 
2502  case DB_TYPE_FLOAT:
2503  ptr = jsp_unpack_float_value (ptr, retval);
2504  break;
2505 
2506  case DB_TYPE_DOUBLE:
2507  ptr = jsp_unpack_double_value (ptr, retval);
2508  break;
2509 
2510  case DB_TYPE_NUMERIC:
2511  ptr = jsp_unpack_numeric_value (ptr, retval);
2512  break;
2513 
2514  case DB_TYPE_CHAR:
2515  case DB_TYPE_NCHAR:
2516  case DB_TYPE_VARNCHAR:
2517  case DB_TYPE_STRING:
2518  ptr = jsp_unpack_string_value (ptr, retval);
2519  break;
2520 
2521  case DB_TYPE_BIT:
2522  case DB_TYPE_VARBIT:
2523  break;
2524 
2525  case DB_TYPE_DATE:
2526  ptr = jsp_unpack_date_value (ptr, retval);
2527  break;
2528  /* describe_data(); */
2529 
2530  case DB_TYPE_TIME:
2531  ptr = jsp_unpack_time_value (ptr, retval);
2532  break;
2533 
2534  case DB_TYPE_TIMESTAMP:
2535  ptr = jsp_unpack_timestamp_value (ptr, retval);
2536  break;
2537 
2538  case DB_TYPE_DATETIME:
2539  ptr = jsp_unpack_datetime_value (ptr, retval);
2540  break;
2541 
2542  case DB_TYPE_SET:
2543  case DB_TYPE_MULTISET:
2544  case DB_TYPE_SEQUENCE:
2545  ptr = jsp_unpack_set_value (ptr, type, retval);
2546  break;
2547 
2548  case DB_TYPE_OBJECT:
2549  ptr = jsp_unpack_object_value (ptr, retval);
2550  break;
2551 
2552  case DB_TYPE_MONETARY:
2553  ptr = jsp_unpack_monetary_value (ptr, retval);
2554  break;
2555 
2556  case DB_TYPE_RESULTSET:
2557  ptr = jsp_unpack_resultset (ptr, retval);
2558  break;
2559 
2560  case DB_TYPE_NULL:
2561  default:
2562  db_make_null (retval);
2563  break;
2564  }
2565 
2566  return ptr;
2567 }
2568 
2569 /*
2570  * jsp_receive_response -
2571  * return: error code
2572  * sockfd(in) : socket description
2573  * sp_args(in) : stored procedure argument list
2574  *
2575  * Note:
2576  */
2577 
2578 static int
2579 jsp_receive_response (const SOCKET sockfd, const SP_ARGS * sp_args)
2580 {
2581  int nbytes;
2582  int start_code = -1, end_code = -1;
2583  char *buffer = NULL, *ptr = NULL;
2584  int error_code = NO_ERROR;
2585 
2586 redo:
2587  /* read request code */
2588  nbytes = jsp_readn (sockfd, (char *) &start_code, (int) sizeof (int));
2589  if (nbytes != (int) sizeof (int))
2590  {
2592  return ER_SP_NETWORK_ERROR;
2593  }
2594  start_code = ntohl (start_code);
2595 
2596  if (start_code == SP_CODE_INTERNAL_JDBC)
2597  {
2599  error_code = libcas_main (sockfd); /* jdbc call */
2601  if (error_code != NO_ERROR)
2602  {
2603  goto exit;
2604  }
2605  goto redo;
2606  }
2607  else if (start_code == SP_CODE_RESULT || start_code == SP_CODE_ERROR)
2608  {
2609  /* read size of buffer to allocate and data */
2610  error_code = jsp_alloc_response (sockfd, buffer);
2611  if (error_code != NO_ERROR)
2612  {
2613  goto exit;
2614  }
2615 
2616  switch (start_code)
2617  {
2618  case SP_CODE_RESULT:
2619  error_code = jsp_receive_result (buffer, ptr, sp_args);
2620  break;
2621  case SP_CODE_ERROR:
2622  error_code = jsp_receive_error (buffer, ptr, sp_args);
2623  break;
2624  }
2625  if (error_code != NO_ERROR)
2626  {
2627  goto exit;
2628  }
2629  /* check request code at the end */
2630  if (ptr)
2631  {
2632  ptr = or_unpack_int (ptr, &end_code);
2633  if (start_code != end_code)
2634  {
2636  error_code = ER_SP_NETWORK_ERROR;
2637  goto exit;
2638  }
2639  }
2640  }
2641  else
2642  {
2644  error_code = ER_SP_NETWORK_ERROR;
2645  goto exit;
2646  }
2647 
2648 exit:
2649  if (buffer)
2650  {
2651  free_and_init (buffer);
2652  }
2653  return error_code;
2654 }
2655 
2656 static int
2657 jsp_alloc_response (const SOCKET sockfd, char *&buffer)
2658 {
2659  int nbytes, res_size;
2660  nbytes = jsp_readn (sockfd, (char *) &res_size, (int) sizeof (int));
2661  if (nbytes != (int) sizeof (int))
2662  {
2664  return ER_SP_NETWORK_ERROR;
2665  }
2666  res_size = ntohl (res_size);
2667 
2668  buffer = (char *) malloc (res_size);
2669  if (!buffer)
2670  {
2672  return ER_OUT_OF_VIRTUAL_MEMORY;
2673  }
2674 
2675  nbytes = jsp_readn (sockfd, buffer, res_size);
2676  if (nbytes != res_size)
2677  {
2679  return ER_SP_NETWORK_ERROR;
2680  }
2681  return NO_ERROR;
2682 }
2683 
2684 static int
2685 jsp_receive_result (char *&buffer, char *&ptr, const SP_ARGS * sp_args)
2686 {
2687  int error_code = NO_ERROR;
2688  int i;
2689  DB_VALUE temp;
2690  DB_ARG_LIST *arg_list_p;
2691 
2692  ptr = jsp_unpack_value (buffer, sp_args->returnval);
2693  if (ptr == NULL)
2694  {
2695  assert (er_errid () != NO_ERROR);
2696  error_code = er_errid ();
2697  return error_code;
2698  }
2699 
2700  for (arg_list_p = sp_args->args, i = 0; arg_list_p != NULL; arg_list_p = arg_list_p->next, i++)
2701  {
2702  if (sp_args->arg_mode[i] < SP_MODE_OUT)
2703  {
2704  continue;
2705  }
2706 
2707  ptr = jsp_unpack_value (ptr, &temp);
2708  if (ptr == NULL)
2709  {
2710  db_value_clear (&temp);
2711  assert (er_errid () != NO_ERROR);
2712  error_code = er_errid ();
2713  return error_code;
2714  }
2715 
2716  db_value_clear (arg_list_p->val);
2717  db_value_clone (&temp, arg_list_p->val);
2718  db_value_clear (&temp);
2719  }
2720 
2721  return error_code;
2722 }
2723 
2724 static int
2725 jsp_receive_error (char *&buffer, char *&ptr, const SP_ARGS * sp_args)
2726 {
2727  int error_code = NO_ERROR;
2728  DB_VALUE error_value, error_msg;
2729 
2730  db_make_null (sp_args->returnval);
2731  ptr = jsp_unpack_value (buffer, &error_value);
2732  if (ptr == NULL)
2733  {
2734  assert (er_errid () != NO_ERROR);
2735  error_code = er_errid ();
2736  return error_code;
2737  }
2738 
2739  ptr = jsp_unpack_value (ptr, &error_msg);
2740  if (ptr == NULL)
2741  {
2742  assert (er_errid () != NO_ERROR);
2743  error_code = er_errid ();
2744  return error_code;
2745  }
2746 
2748  error_code = er_errid ();
2749  db_value_clear (&error_msg);
2750  return error_code;
2751 }
2752 
2753 /*
2754  * jsp_execute_stored_procedure - Execute Java Stored Procedure
2755  * return: Error code
2756  * args(in):
2757  *
2758  * Note:
2759  */
2760 
2761 static int
2763 {
2764  int error = NO_ERROR;
2765  SOCKET sock_fd;
2766  int retry_count = 0;
2767  bool mode = ssl_client;
2768 
2769 retry:
2771  {
2772  if (server_port == -1) /* try to connect at the first time */
2773  {
2775  }
2776 
2777  if (server_port != -1)
2778  {
2780 
2781  /* ask port number of javasp server from cub_server and try connection again */
2782  if (IS_INVALID_SOCKET (sock_fds[call_cnt]))
2783  {
2786  }
2787 
2788  /* Java SP Server may have a problem */
2789  if (IS_INVALID_SOCKET (sock_fds[call_cnt]))
2790  {
2791  if (server_port == -1)
2792  {
2793  er_clear (); /* ER_SP_CANNOT_CONNECT_JVM in jsp_connect_server() */
2795  }
2796  return er_errid ();
2797  }
2798  }
2799  else
2800  {
2801  /* Java SP Server is not running */
2803  return er_errid ();
2804  }
2805  }
2806 
2807  sock_fd = sock_fds[call_cnt];
2808  call_cnt++;
2809 
2810  if (call_cnt >= MAX_CALL_COUNT)
2811  {
2813  error = er_errid ();
2814  goto end;
2815  }
2816 
2817  error = jsp_send_call_request (sock_fd, args);
2818 
2819  if (error != NO_ERROR)
2820  {
2821  if (retry_count == 0 && call_cnt == 1 && error == ER_SP_NETWORK_ERROR)
2822  {
2823  call_cnt--;
2824  retry_count++;
2826  goto retry;
2827  }
2828  else
2829  {
2830  goto end;
2831  }
2832  }
2833 
2834  ssl_client = false;
2835  error = jsp_receive_response (sock_fd, args);
2836  ssl_client = mode;
2837 
2838 end:
2839  call_cnt--;
2840  if (error != NO_ERROR || is_prepare_call[call_cnt])
2841  {
2842  jsp_send_destroy_request (sock_fd);
2843  jsp_disconnect_server (sock_fd);
2845  }
2846 
2847  return error;
2848 }
2849 
2850 /*
2851  * jsp_do_call_stored_procedure -
2852  * return: Error Code
2853  * returnval(in/out):
2854  * args(in/out):
2855  * name(in):
2856  *
2857  * Note:
2858  */
2859 
2860 static int
2861 jsp_do_call_stored_procedure (DB_VALUE * returnval, DB_ARG_LIST * args, const char *name)
2862 {
2863  DB_OBJECT *mop_p, *arg_mop_p;
2864  SP_ARGS sp_args;
2865  DB_VALUE method, param, param_cnt_val, return_type, temp, mode, arg_type;
2866  int arg_cnt, param_cnt, i;
2867  DB_SET *param_set;
2868  int save;
2869  int err = NO_ERROR;
2870 
2871  AU_DISABLE (save);
2872 
2873  db_make_null (&method);
2874  db_make_null (&param);
2875  memset (&sp_args, 0, sizeof (SP_ARGS));
2876 
2877  mop_p = jsp_find_stored_procedure (name);
2878  if (!mop_p)
2879  {
2880  assert (er_errid () != NO_ERROR);
2881  err = er_errid ();
2882  goto error;
2883  }
2884 
2885  err = db_get (mop_p, SP_ATTR_TARGET, &method);
2886  if (err != NO_ERROR)
2887  {
2888  goto error;
2889  }
2890 
2891  sp_args.name = db_get_string (&method);
2892  if (!sp_args.name)
2893  {
2895  err = er_errid ();
2896  goto error;
2897  }
2898  sp_args.returnval = returnval;
2899  sp_args.args = args;
2900 
2901  err = db_get (mop_p, SP_ATTR_ARG_COUNT, &param_cnt_val);
2902  if (err != NO_ERROR)
2903  {
2904  goto error;
2905  }
2906 
2907  param_cnt = db_get_int (&param_cnt_val);
2908  arg_cnt = jsp_get_argument_count (&sp_args);
2909  if (param_cnt != arg_cnt)
2910  {
2912  err = er_errid ();
2913  goto error;
2914  }
2915  sp_args.arg_count = arg_cnt;
2916 
2917  err = db_get (mop_p, SP_ATTR_ARGS, &param);
2918  if (err != NO_ERROR)
2919  {
2920  goto error;
2921  }
2922 
2923  param_set = db_get_set (&param);
2924 
2925  for (i = 0; i < arg_cnt; i++)
2926  {
2927  set_get_element (param_set, i, &temp);
2928  arg_mop_p = db_get_object (&temp);
2929 
2930  err = db_get (arg_mop_p, SP_ATTR_MODE, &mode);
2931  if (err != NO_ERROR)
2932  {
2933  pr_clear_value (&temp);
2934  goto error;
2935  }
2936 
2937  sp_args.arg_mode[i] = db_get_int (&mode);
2938 
2939  err = db_get (arg_mop_p, SP_ATTR_DATA_TYPE, &arg_type);
2940  if (err != NO_ERROR)
2941  {
2942  pr_clear_value (&temp);
2943  goto error;
2944  }
2945 
2946  sp_args.arg_type[i] = db_get_int (&arg_type);
2947  pr_clear_value (&temp);
2948 
2949  if (sp_args.arg_type[i] == DB_TYPE_RESULTSET && !is_prepare_call[call_cnt])
2950  {
2952  err = er_errid ();
2953  goto error;
2954  }
2955  }
2956 
2957  err = db_get (mop_p, SP_ATTR_RETURN_TYPE, &return_type);
2958  if (err != NO_ERROR)
2959  {
2960  goto error;
2961  }
2962 
2963  sp_args.return_type = db_get_int (&return_type);
2964 
2966  {
2968  err = er_errid ();
2969  }
2970 
2971 error:
2972  AU_ENABLE (save);
2973 
2974  if (err == NO_ERROR)
2975  {
2976  AU_SAVE_AND_ENABLE (save);
2977  err = jsp_execute_stored_procedure (&sp_args);
2978  AU_RESTORE (save);
2979  }
2980 
2981  pr_clear_value (&method);
2982  pr_clear_value (&param);
2983 
2984  return err;
2985 }
2986 
2987 /*
2988  * jsp_call_from_server -
2989  * return: Error Code
2990  * returnval(in/out) : jsp call result
2991  * argarray(in/out):
2992  * name(in): call jsp
2993  * arg_cnt(in):
2994  *
2995  * Note:
2996  */
2997 
2998 int
2999 jsp_call_from_server (DB_VALUE * returnval, DB_VALUE ** argarray, const char *name, const int arg_cnt)
3000 {
3001  DB_ARG_LIST *val_list = 0, *vl, **next_val_list;
3002  int i;
3003  int error = NO_ERROR;
3004 
3005  next_val_list = &val_list;
3006  for (i = 0; i < arg_cnt; i++)
3007  {
3008  DB_VALUE *db_val;
3009  *next_val_list = (DB_ARG_LIST *) calloc (1, sizeof (DB_ARG_LIST));
3010  if (*next_val_list == NULL)
3011  {
3013  return ER_OUT_OF_VIRTUAL_MEMORY;
3014  }
3015  (*next_val_list)->next = (DB_ARG_LIST *) 0;
3016 
3017  if (argarray[i] == NULL)
3018  {
3019  return -1; /* error, clean */
3020  }
3021  db_val = argarray[i];
3022  (*next_val_list)->label = ""; /* check out mode in select statement */
3023  (*next_val_list)->val = db_val;
3024 
3025  next_val_list = &(*next_val_list)->next;
3026  }
3027 
3028  error = jsp_do_call_stored_procedure (returnval, val_list, name);
3029 
3030  while (val_list)
3031  {
3032  vl = val_list->next;
3033  free_and_init (val_list);
3034  val_list = vl;
3035  }
3036 
3037  return error;
3038 }
3039 
3040 /*
3041  * jsp_set_prepare_call -
3042  * return: none
3043  *
3044  * Note:
3045  */
3046 
3047 void
3049 {
3050  is_prepare_call[call_cnt] = true;
3051 }
3052 
3053 /*
3054  * jsp_unset_prepare_call -
3055  * return: none
3056  *
3057  * Note:
3058  */
3059 
3060 void
3062 {
3063  is_prepare_call[call_cnt] = false;
3064 }
3065 
3066 /*
3067  * jsp_get_db_result_set -
3068  * return: none
3069  * h_id(in):
3070  *
3071  * Note: require cubrid cas library
3072  */
3073 
3074 void *
3076 {
3077  return libcas_get_db_result_set (h_id);
3078 }
3079 
3080 /*
3081  * jsp_srv_handle_free -
3082  * return: none
3083  * h_id(in):
3084  *
3085  * Note:
3086  */
3087 
3088 void
3090 {
3091  libcas_srv_handle_free (h_id);
3092 }
#define SP_ATTR_RETURN_TYPE
Definition: jsp_cl.h:42
DB_OBJECT * db_find_class(const char *name)
Definition: db_info.c:133
static int jsp_send_call_request(const SOCKET sockfd, const SP_ARGS *sp_args)
Definition: jsp_cl.c:1901
DB_C_FLOAT db_get_float(const DB_VALUE *value)
#define ER_SP_ALREADY_EXIST
Definition: error_code.h:1105
PT_NODE * next
Definition: parse_tree.h:3447
PT_NAME_INFO name
Definition: parse_tree.h:3318
DB_COLLECTION * set_create(DB_TYPE type, int initial_size)
Definition: set_object.c:2373
int tran_system_savepoint(const char *savept_name)
int db_make_datetime(DB_VALUE *value, const DB_DATETIME *datetime)
#define CHECK_MODIFICATION_ERROR()
Definition: db.h:121
#define NO_ERROR
Definition: error_code.h:46
#define AU_DISABLE(save)
Definition: authenticate.h:106
int jsp_call_from_server(DB_VALUE *returnval, DB_VALUE **argarray, const char *name, const int arg_cnt)
Definition: jsp_cl.c:2999
Definition: jsp_cl.c:96
static int jsp_execute_stored_procedure(const SP_ARGS *args)
Definition: jsp_cl.c:2762
#define ER_SP_CANNOT_RETURN_RESULTSET
Definition: error_code.h:1139
DB_COLLECTION * db_get_set(const DB_VALUE *value)
PT_METHOD_CALL_INFO method_call
Definition: parse_tree.h:3316
const char * label
Definition: jsp_cl.c:93
bool unicode_string_need_compose(const char *str_in, const int size_in, int *size_out, const UNICODE_NORMALIZATION *norm)
#define SP_ATTR_ARG_COUNT
Definition: jsp_cl.h:44
PT_NODE * param_list
Definition: parse_tree.h:3143
int db_string_to_timestamp(const char *str, DB_TIMESTAMP *utime)
Definition: db_date.c:3802
PT_STATEMENT_INFO info
Definition: parse_tree.h:3487
char * or_unpack_string(char *ptr, char **string)
int SOCKET
Definition: porting.h:482
void tran_end_libcas_function(void)
#define AU_SAVE_AND_ENABLE(save)
Definition: authenticate.h:119
MOP ws_mop(const OID *oid, MOP class_mop)
Definition: work_space.c:614
int obj_delete(MOP op)
void set_free(DB_COLLECTION *set)
Definition: set_object.c:2560
DB_ARG_LIST * args
Definition: jsp_cl.c:100
void jsp_set_prepare_call(void)
Definition: jsp_cl.c:3048
PT_MISC_TYPE
Definition: parse_tree.h:983
int arg_count
Definition: jsp_cl.c:101
int db_make_bigint(DB_VALUE *value, const DB_BIGINT num)
int db_get_int(const DB_VALUE *value)
void * jsp_get_db_result_set(int h_id)
Definition: jsp_cl.c:3075
DB_TYPE
Definition: dbtype_def.h:670
DB_C_DOUBLE db_get_double(const DB_VALUE *value)
#define ER_FAILED
Definition: error_code.h:47
static int jsp_get_value_size(DB_VALUE *value)
Definition: jsp_cl.c:1252
int db_datetime_decode(const DB_DATETIME *datetime, int *month, int *day, int *year, int *hour, int *minute, int *second, int *millisecond)
Definition: db_date.c:4574
static char * jsp_unpack_timestamp_value(char *buffer, DB_VALUE *retval)
Definition: jsp_cl.c:2288
static char * jsp_pack_bigint_argument(char *buffer, DB_VALUE *value)
Definition: jsp_cl.c:1395
static char * jsp_unpack_numeric_value(char *buffer, DB_VALUE *retval)
Definition: jsp_cl.c:2138
int libcas_main(SOCKET fd)
static int jsp_add_stored_procedure_argument(MOP *mop_p, const char *sp_name, const char *arg_name, int index, PT_TYPE_ENUM data_type, PT_MISC_TYPE mode, const char *arg_comment)
Definition: jsp_cl.c:802
void jsp_unset_prepare_call(void)
Definition: jsp_cl.c:3061
int db_value_clone(DB_VALUE *src, DB_VALUE *dest)
Definition: db_macro.c:1564
static char * jsp_pack_datetime_argument(char *buffer, DB_VALUE *value)
Definition: jsp_cl.c:1656
char * or_pack_string(char *ptr, const char *string)
static char * jsp_pack_set_argument(char *buffer, DB_VALUE *value)
Definition: jsp_cl.c:1688
#define PT_NODE_SP_NAME(node)
Definition: jsp_cl.c:64
enum pt_type_enum PT_TYPE_ENUM
Definition: parse_tree.h:962
int db_string_to_datetime(const char *str, DB_DATETIME *datetime)
Definition: db_date.c:4441
struct db_arg_list * next
Definition: jsp_cl.c:91
void OR_PUT_DOUBLE(char *ptr, double val)
int db_make_object(DB_VALUE *value, DB_C_OBJECT *obj)
#define SM_MAX_IDENTIFIER_LENGTH
static SP_TYPE_ENUM jsp_map_pt_misc_to_sp_type(PT_MISC_TYPE pt_enum)
Definition: jsp_cl.c:728
DB_COLLECTION * set_create_sequence(int size)
Definition: set_object.c:2432
#define SP_ATTR_COMMENT
Definition: jsp_cl.h:48
PT_STORED_PROC_PARAM_INFO sp_param
Definition: parse_tree.h:3345
bool ssl_client
Definition: cas_ssl.c:81
static int jsp_add_stored_procedure(const char *name, const PT_MISC_TYPE type, const PT_TYPE_ENUM ret_type, PT_NODE *param_list, const char *java_method, const char *comment)
Definition: jsp_cl.c:941
#define ER_SP_INVALID_PARAM_COUNT
Definition: error_code.h:1106
bool au_is_dba_group_member(MOP user)
static int jsp_alloc_response(const SOCKET sockfd, char *&buffer)
Definition: jsp_cl.c:2657
static char * jsp_pack_numeric_argument(char *buffer, DB_VALUE *value)
Definition: jsp_cl.c:1487
#define OR_ALIGNED_BUF(size)
DB_OBJECT * db_find_user(const char *name)
Definition: db_admin.c:1606
DB_VALUE * returnval
Definition: jsp_cl.c:99
void unicode_compose_string(const char *str_in, const int size_in, char *str_out, int *size_out, bool *is_composed, const UNICODE_NORMALIZATION *norm)
void sm_downcase_name(const char *name, char *buf, int maxlen)
int db_make_sequence(DB_VALUE *value, DB_C_SET *set)
#define SP_ATTR_TARGET
Definition: jsp_cl.h:46
#define OR_DOUBLE_SIZE
DB_OBJECT * dbt_finish_object(DB_OTMPL *def)
Definition: db_obj.c:560
#define AU_RESTORE(save)
Definition: authenticate.h:133
#define ER_SP_EXECUTE_ERROR
Definition: error_code.h:1107
static char * jsp_unpack_short_value(char *buffer, DB_VALUE *retval)
Definition: jsp_cl.c:2072
char * or_unpack_string_nocopy(char *ptr, char **string)
#define SP_ARG_CLASS_NAME
Definition: jsp_cl.h:38
DB_VALUE * val
Definition: jsp_cl.c:92
int er_errid(void)
void dbt_abort_object(DB_OTMPL *def)
Definition: db_obj.c:616
#define ER_SP_INVALID_NAME
Definition: error_code.h:1129
int set_size(DB_COLLECTION *set)
Definition: set_object.c:3036
static char * jsp_pack_timestamp_argument(char *buffer, DB_VALUE *value)
Definition: jsp_cl.c:1621
static char * jsp_unpack_object_value(char *buffer, DB_VALUE *retval)
Definition: jsp_cl.c:2399
static int jsp_map_pt_misc_to_sp_mode(PT_MISC_TYPE pt_enum)
Definition: jsp_cl.c:749
static char * jsp_check_stored_procedure_name(const char *str)
Definition: jsp_cl.c:916
#define ER_SP_INVAILD_JAVA_METHOD
Definition: error_code.h:1131
#define INVALID_SOCKET
Definition: porting.h:483
bool ws_is_same_object(MOP mop1, MOP mop2)
Definition: work_space.c:5065
#define SP_ATTR_LANG
Definition: jsp_cl.h:45
void jsp_init(void)
Definition: jsp_cl.c:185
static int jsp_get_argument_count(const SP_ARGS *sp_args)
Definition: jsp_cl.c:774
char * or_pack_short(char *ptr, short number)
int pt_associate_label_with_value_check_reference(const char *label, DB_VALUE *val)
#define ER_SP_INVALID_TYPE
Definition: error_code.h:1116
static char * jsp_unpack_set_value(char *buffer, int type, DB_VALUE *retval)
Definition: jsp_cl.c:2350
#define ER_SP_NETWORK_ERROR
Definition: error_code.h:1130
int dbt_put_internal(DB_OTMPL *def, const char *name, DB_VALUE *value)
Definition: db_obj.c:670
int jsp_is_exist_stored_procedure(const char *name)
Definition: jsp_cl.c:267
int db_make_short(DB_VALUE *value, const DB_C_SHORT num)
static char * jsp_unpack_time_value(char *buffer, DB_VALUE *retval)
Definition: jsp_cl.c:2257
#define OR_ALIGNED_BUF_START(abuf)
PT_TYPE_ENUM type_enum
Definition: parse_tree.h:3457
static char * jsp_unpack_datetime_value(char *buffer, DB_VALUE *retval)
Definition: jsp_cl.c:2319
void pt_report_to_ersys(const PARSER_CONTEXT *parser, const PT_ERROR_TYPE error_type)
Definition: query_result.c:287
DB_TYPE pt_type_enum_to_db(const PT_TYPE_ENUM t)
Definition: parse_dbi.c:2314
int db_make_string(DB_VALUE *value, DB_CONST_C_CHAR str)
static char * jsp_unpack_string_value(char *buffer, DB_VALUE *retval)
Definition: jsp_cl.c:2162
DB_MONETARY * db_get_monetary(const DB_VALUE *value)
int db_string_to_time(const char *str, DB_TIME *time)
Definition: db_date.c:3739
#define PT_NODE_SP_ARG_COMMENT(node)
Definition: jsp_cl.c:80
#define SP_ATTR_DATA_TYPE
Definition: jsp_cl.h:52
unsigned int DB_TIMESTAMP
Definition: dbtype_def.h:759
char * or_pack_float(char *ptr, float number)
static int jsp_receive_response(const SOCKET sockfd, const SP_ARGS *sp_args)
Definition: jsp_cl.c:2579
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
Definition: db_set.h:35
void unicode_decompose_string(const char *str_in, const int size_in, char *str_out, int *size_out, const UNICODE_NORMALIZATION *norm)
int db_value_put_encoded_time(DB_VALUE *value, const DB_TIME *time)
Definition: db_macro.c:1357
static char * jsp_pack_string_argument(char *buffer, DB_VALUE *value)
Definition: jsp_cl.c:1509
int tran_abort_upto_system_savepoint(const char *savepoint_name)
#define assert(x)
int db_make_monetary(DB_VALUE *value, const DB_CURRENCY type, const double amount)
int set_add_element(DB_COLLECTION *set, DB_VALUE *value)
Definition: set_object.c:2641
MOP jsp_find_stored_procedure(const char *name)
Definition: jsp_cl.c:227
int or_packed_string_length(const char *string, int *strlen)
static char * jsp_pack_date_argument(char *buffer, DB_VALUE *value)
Definition: jsp_cl.c:1565
#define ER_SP_CANNOT_INPUT_RESULTSET
Definition: error_code.h:1140
void tran_begin_libcas_function(void)
static int drop_stored_procedure(const char *name, PT_MISC_TYPE expected_type)
Definition: jsp_cl.c:1152
int db_make_set(DB_VALUE *value, DB_C_SET *set)
void pt_evaluate_tree(PARSER_CONTEXT *parser, PT_NODE *tree, DB_VALUE *db_values, int values_count)
static bool is_prepare_call[MAX_CALL_COUNT]
Definition: jsp_cl.c:111
int db_make_multiset(DB_VALUE *value, DB_C_SET *set)
static char * jsp_pack_short_argument(char *buffer, DB_VALUE *value)
Definition: jsp_cl.c:1417
#define PT_NODE_SP_COMMENT(node)
Definition: jsp_cl.c:76
static char * jsp_pack_int_argument(char *buffer, DB_VALUE *value)
Definition: jsp_cl.c:1373
static char * jsp_unpack_float_value(char *buffer, DB_VALUE *retval)
Definition: jsp_cl.c:2094
#define ER_OUT_OF_VIRTUAL_MEMORY
Definition: error_code.h:50
static int server_port
Definition: jsp_cl.c:109
int jsp_call_stored_procedure(PARSER_CONTEXT *parser, PT_NODE *statement)
Definition: jsp_cl.c:326
static int jsp_get_argument_size(DB_ARG_LIST *args)
Definition: jsp_cl.c:1350
PT_NODE * method_name
Definition: parse_tree.h:2363
const char * original
Definition: parse_tree.h:2544
void jsp_close_connection(void)
Definition: jsp_cl.c:209
void libcas_srv_handle_free(int h_id)
#define PT_NODE_SP_JAVA_METHOD(node)
Definition: jsp_cl.c:73
#define IS_INVALID_SOCKET(socket)
Definition: porting.h:484
#define MAX_CALL_COUNT
Definition: jsp_cl.c:85
const char * name
Definition: jsp_cl.c:98
PT_NODE_TYPE node_type
Definition: parse_tree.h:3439
static enum scanner_mode mode
#define ER_BLOCK_DDL_STMT
Definition: error_code.h:1384
#define min(a, b)
DB_OBJECT * db_get_object(const DB_VALUE *value)
static char * jsp_unpack_value(char *buffer, DB_VALUE *retval)
Definition: jsp_cl.c:2480
#define PT_IS_CONST(n)
Definition: parse_tree.h:364
int db_string_put_cs_and_collation(DB_VALUE *value, const int codeset, const int collation_id)
Definition: db_macro.c:4164
DB_VALUE * db_value_copy(DB_VALUE *value)
Definition: db_macro.c:1537
#define SP_ATTR_OWNER
Definition: jsp_cl.h:47
#define SP_ATTR_NAME
Definition: jsp_cl.h:40
SP_PARSER_CTX * parser
UNICODE_NORMALIZATION * lang_get_generic_unicode_norm(void)
#define NULL
Definition: freelistheap.h:34
static char * jsp_pack_argument(char *buffer, DB_VALUE *value)
Definition: jsp_cl.c:1804
static char * jsp_pack_null_argument(char *buffer)
Definition: jsp_cl.c:1784
#define NUMERIC_MAX_STRING_SIZE
char * or_unpack_float(char *ptr, float *number)
#define ER_OBJ_OBJECT_NOT_FOUND
Definition: error_code.h:873
if(extra_options)
Definition: dynamic_load.c:958
#define OR_BIGINT_SIZE
static SOCKET sock_fds[MAX_CALL_COUNT]
Definition: jsp_cl.c:107
#define SP_ATTR_ARGS
Definition: jsp_cl.h:43
#define OR_GET_BIGINT(ptr, val)
#define err(fd,...)
Definition: porting.h:431
int db_value_put_encoded_date(DB_VALUE *value, const DB_DATE *date)
Definition: db_macro.c:1383
struct db_arg_list DB_ARG_LIST
void jsp_disconnect_server(const SOCKET sockfd)
Definition: jsp_comm.c:135
char * or_unpack_int(char *ptr, int *number)
#define db_private_free(thrd, ptr)
Definition: memory_alloc.h:229
#define ER_SP_NOT_EXIST
Definition: error_code.h:1115
#define db_private_alloc(thrd, size)
Definition: memory_alloc.h:227
#define PT_NODE_SP_TYPE(node)
Definition: jsp_cl.c:67
int set_get_element(DB_COLLECTION *set, int index, DB_VALUE *value)
Definition: set_object.c:2575
const OID oid_Null_oid
Definition: oid.c:68
need_clear_type need_clear
Definition: dbtype_def.h:1084
static char * jsp_pack_object_argument(char *buffer, DB_VALUE *value)
Definition: jsp_cl.c:1726
int count(int &result, const cub_regex_object &reg, const std::string &src, const int position, const INTL_CODESET codeset)
int pr_clear_value(DB_VALUE *value)
int db_timestamp_decode_ses(const DB_TIMESTAMP *utime, DB_DATE *date, DB_TIME *timeval)
Definition: db_date.c:764
DB_BIGINT db_get_bigint(const DB_VALUE *value)
int64_t DB_BIGINT
Definition: dbtype_def.h:751
int jsp_create_stored_procedure(PARSER_CONTEXT *parser, PT_NODE *statement)
Definition: jsp_cl.c:500
int locator_flush_instance(MOP mop)
Definition: locator_cl.c:5236
MOP Au_user
Definition: authenticate.c:343
int arg_type[MAX_ARG_COUNT]
Definition: jsp_cl.c:103
int jsp_writen(SOCKET fd, const void *vptr, int n)
Definition: jsp_comm.c:160
int set_put_element(DB_COLLECTION *set, int index, DB_VALUE *value)
Definition: set_object.c:2719
static void error(const char *msg)
Definition: gencat.c:331
int return_type
Definition: jsp_cl.c:104
int db_make_float(DB_VALUE *value, const DB_C_FLOAT num)
char * or_pack_int(char *ptr, int number)
#define ER_SP_TOO_MANY_NESTED_CALL
Definition: error_code.h:1141
char * numeric_db_value_print(const DB_VALUE *val, char *buf)
DB_OTMPL * dbt_create_object_internal(DB_OBJECT *classobj)
#define SP_ATTR_MODE
Definition: jsp_cl.h:53
#define ARG_FILE_LINE
Definition: error_manager.h:44
#define ER_AU_DBA_ONLY
Definition: error_code.h:204
#define WS_OID(mop)
Definition: work_space.h:293
unsigned int DB_TIME
Definition: dbtype_def.h:754
int obj_set(MOP op, const char *name, DB_VALUE *value)
#define AU_ENABLE(save)
Definition: authenticate.h:113
static char * jsp_pack_monetary_argument(char *buffer, DB_VALUE *value)
Definition: jsp_cl.c:1761
static int jsp_receive_error(char *&buffer, char *&ptr, const SP_ARGS *sp_args)
Definition: jsp_cl.c:2725
#define SP_ATTR_ARG_COMMENT
Definition: jsp_cl.h:54
unsigned int DB_DATE
Definition: dbtype_def.h:771
void * libcas_get_db_result_set(int h_id)
PT_NODE * to_return_var
Definition: parse_tree.h:2366
#define SAVEPOINT_CREATE_STORED_PROC
Definition: jsp_cl.c:87
static char * jsp_pack_time_argument(char *buffer, DB_VALUE *value)
Definition: jsp_cl.c:1593
#define free_and_init(ptr)
Definition: memory_alloc.h:147
#define strlen(s1)
Definition: intl_support.c:43
static char * jsp_pack_float_argument(char *buffer, DB_VALUE *value)
Definition: jsp_cl.c:1440
DB_DATE * db_get_date(const DB_VALUE *value)
static char * jsp_unpack_resultset(char *buffer, DB_VALUE *retval)
Definition: jsp_cl.c:2458
char * or_pack_string_with_length(char *ptr, const char *string, int length)
#define ER_OBJ_INVALID_ARGUMENTS
Definition: error_code.h:275
#define SP_ATTR_INDEX_OF_NAME
Definition: jsp_cl.h:51
int jsp_send_destroy_request_all()
Definition: jsp_cl.c:1963
#define SP_ATTR_ARG_NAME
Definition: jsp_cl.h:50
int db_get(DB_OBJECT *object, const char *attpath, DB_VALUE *value)
Definition: db_obj.c:233
bool prm_get_bool_value(PARAM_ID prm_id)
int jsp_get_return_type(const char *name)
Definition: jsp_cl.c:287
SOCKET jsp_connect_server(int server_port)
Definition: jsp_comm.c:58
DB_TIMESTAMP * db_get_timestamp(const DB_VALUE *value)
DB_C_SHORT db_get_short(const DB_VALUE *value)
#define SAVEPOINT_ADD_STORED_PROC
Definition: jsp_cl.c:86
#define OR_GET_DOUBLE(ptr, value)
void er_clear(void)
bool unicode_string_need_decompose(const char *str_in, const int size_in, int *decomp_size, const UNICODE_NORMALIZATION *norm)
#define MAX_ARG_COUNT
Definition: jsp_cl.c:84
static SOCKET sock_fd
Definition: broker.c:300
void * etc
Definition: parse_tree.h:3450
#define DB_VALUE_TYPE(value)
Definition: dbtype.h:72
PT_TYPE_ENUM ret_type
Definition: parse_tree.h:3149
#define DB_CURRENCY_DEFAULT
Definition: dbtype.h:46
static char * jsp_unpack_date_value(char *buffer, DB_VALUE *retval)
Definition: jsp_cl.c:2226
int i
Definition: dynamic_load.c:954
int db_make_resultset(DB_VALUE *value, const DB_RESULTSET handle)
int db_make_null(DB_VALUE *value)
int arg_mode[MAX_ARG_COUNT]
Definition: jsp_cl.c:102
int jsp_readn(SOCKET fd, void *vptr, int n)
Definition: jsp_comm.c:212
static int jsp_receive_result(char *&buffer, char *&ptr, const SP_ARGS *sp_args)
Definition: jsp_cl.c:2685
int db_make_double(DB_VALUE *value, const DB_C_DOUBLE num)
INTL_CODESET lang_get_client_charset(void)
#define SP_ATTR_SP_TYPE
Definition: jsp_cl.h:41
char * strdup(const char *str)
Definition: porting.c:901
#define ER_SP_DROP_NOT_ALLOWED
Definition: error_code.h:1132
void db_date_decode(const DB_DATE *date, int *monthp, int *dayp, int *yearp)
Definition: db_date.c:338
DB_DATETIME * db_get_datetime(const DB_VALUE *value)
int db_value_clear(DB_VALUE *value)
Definition: db_macro.c:1588
int db_make_timestamp(DB_VALUE *value, const DB_C_TIMESTAMP timeval)
int db_make_int(DB_VALUE *value, const int num)
unsigned int ntohl(unsigned int from)
int jsp_alter_stored_procedure(PARSER_CONTEXT *parser, PT_NODE *statement)
Definition: jsp_cl.c:598
#define pt_has_error(parser)
Definition: parser.h:507
static char * jsp_pack_double_argument(char *buffer, DB_VALUE *value)
Definition: jsp_cl.c:1463
#define OR_PUT_BIGINT(ptr, val)
DB_OBJECT * db_find_unique(MOP classmop, const char *attname, DB_VALUE *value)
Definition: db_obj.c:1092
static char * jsp_unpack_bigint_value(char *buffer, DB_VALUE *retval)
Definition: jsp_cl.c:2051
char * or_unpack_short(char *ptr, short *number)
DB_TIME * db_get_time(const DB_VALUE *value)
INTL_UTF8_VALIDITY intl_check_string(const char *buf, int size, char **pos, const INTL_CODESET codeset)
int numeric_coerce_string_to_num(const char *astring, int astring_length, INTL_CODESET codeset, DB_VALUE *result)
SP_TYPE_ENUM
Definition: jsp_cl.h:56
static char * jsp_unpack_double_value(char *buffer, DB_VALUE *retval)
Definition: jsp_cl.c:2116
void db_time_decode(DB_TIME *timeval, int *hourp, int *minutep, int *secondp)
Definition: db_date.c:432
int jsp_send_destroy_request(const SOCKET sockfd)
Definition: jsp_cl.c:1979
static char * jsp_unpack_monetary_value(char *buffer, DB_VALUE *retval)
Definition: jsp_cl.c:2426
#define ER_INVALID_CHAR
Definition: error_code.h:1350
DB_VALUE * pt_value_to_db(PARSER_CONTEXT *parser, PT_NODE *value)
Definition: parse_dbi.c:1088
double amount
Definition: dbtype_def.h:831
static int jsp_do_call_stored_procedure(DB_VALUE *returnval, DB_ARG_LIST *args, const char *name)
Definition: jsp_cl.c:2861
void jsp_srv_handle_free(int h_id)
Definition: jsp_cl.c:3089
#define ER_SP_NOT_RUNNING_JVM
Definition: error_code.h:1127
int db_get_string_codeset(const DB_VALUE *value)
int db_string_to_date(const char *str, DB_DATE *date)
Definition: db_date.c:3693
static int call_cnt
Definition: jsp_cl.c:110
const char ** p
Definition: dynamic_load.c:945
DB_CONST_C_CHAR db_get_string(const DB_VALUE *value)
#define SP_CLASS_NAME
Definition: jsp_cl.h:37
int lang_get_client_collation(void)
int jsp_get_server_port(void)
static char * jsp_unpack_int_value(char *buffer, DB_VALUE *retval)
Definition: jsp_cl.c:2029
PT_STORED_PROC_INFO sp
Definition: parse_tree.h:3344
int jsp_drop_stored_procedure(PARSER_CONTEXT *parser, PT_NODE *statement)
Definition: jsp_cl.c:451
#define ER_SP_TOO_MANY_ARG_COUNT
Definition: error_code.h:1133