CUBRID Engine  latest
method_scan.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  * method_scan.c - Routines to implement scanning an array of values
21  * received by the comm interface
22  */
23 
24 #ident "$Id$"
25 
26 #include "config.h"
27 
28 #include <string.h>
29 
30 #include "method_scan.h"
31 
32 #include "network_interface_sr.h" /* TODO: should not be here */
33 #ifndef SERVER_MODE
34 #include "object_accessor.h"
35 #include "dbi.h"
36 #include "authenticate.h"
37 #endif
38 #include "xasl.h"
39 
40 #if defined (SA_MODE)
41 #include "jsp_cl.h"
42 #endif /* defined (SA_MODE) */
43 
44 #include "dbtype.h"
45 #include "object_primitive.h"
46 #include "object_representation.h"
47 #include "query_list.h"
48 #include "regu_var.hpp"
49 
50 #if !defined(SERVER_MODE)
51 extern unsigned int db_on_server;
52 #endif
53 
55 
56 #define ENTER_SERVER_IN_METHOD_CALL(save_pri_heap_id_) \
57  do { \
58  db_on_server = 1; \
59  private_heap_id = save_pri_heap_id_; \
60  } while (0)
61 
62 #define EXIT_SERVER_IN_METHOD_CALL(save_pri_heap_id_) \
63  do { \
64  save_pri_heap_id_ = private_heap_id; \
65  private_heap_id = 0; \
66  db_on_server = 0; \
67  } while (0)
68 
69 static int method_open_value_array_scan (METHOD_SCAN_BUFFER * scan_buf);
72 static int method_invoke (THREAD_ENTRY * thread_p, METHOD_SCAN_BUFFER * scan_buf);
73 static SCAN_CODE method_receive_results (THREAD_ENTRY * thread_p, METHOD_SCAN_BUFFER * scan_buf);
74 
75 #ifndef SERVER_MODE
76 static void method_clear_scan_buffer (METHOD_SCAN_BUFFER * scan_buf);
77 #else
79 static void method_free_vacomm_buffer (VACOMM_BUFFER * vacomm_buffer);
80 static SCAN_CODE method_receive_value (THREAD_ENTRY * thread_p, DB_VALUE * dbval, VACOMM_BUFFER * vacomm_buffer);
81 #endif /* SERVER_MODE */
82 
83 /*
84  * xs_open_va_scan () -
85  * return: int
86  * scan_buf(in) : Value array buffer
87  * scanbuf_type(in) : Method signature list
88  */
89 static int
91 {
92  int num_methods;
93 
94  num_methods = scan_buffer_p->s.method_ctl.method_sig_list->num_methods;
95  if (num_methods <= 0)
96  {
97  num_methods = MAX_XS_SCANBUF_DBVALS; /* for safe-guard */
98  }
99 
100  scan_buffer_p->dbval_list = (QPROC_DB_VALUE_LIST) malloc (sizeof (scan_buffer_p->dbval_list[0]) * num_methods);
101 
102  if (scan_buffer_p->dbval_list == NULL)
103  {
104  return ER_FAILED;
105  }
106 
107 #ifdef SERVER_MODE
108  scan_buffer_p->vacomm_buffer = method_initialize_vacomm_buffer ();
109  if (scan_buffer_p->vacomm_buffer == NULL)
110  {
111  return ER_FAILED;
112  }
113 #endif /* SERVER_MODE */
114 
115  return NO_ERROR;
116 }
117 
118 /*
119  * method_close_value_array_scan () -
120  * return: int
121  * scan_buf(in) : Value array buffer
122  */
123 static int
125 {
126 #ifdef SERVER_MODE
127  method_free_vacomm_buffer (scan_buffer_p->vacomm_buffer);
128  scan_buffer_p->vacomm_buffer = NULL;
129 #endif /* SERVER_MODE */
130 
131  free_and_init (scan_buffer_p->dbval_list);
132  return NO_ERROR;
133 }
134 
135 /*
136  * method_scan_next_value_array () -
137  * return: int
138  * scan_buf(in) : Value array buffer
139  * val_list(in) :
140  */
141 static SCAN_CODE
143 {
144  SCAN_CODE scan_result = S_SUCCESS;
145  QPROC_DB_VALUE_LIST dbval_list;
146  int n;
147 
148  dbval_list = scan_buffer_p->dbval_list;
149  for (n = 0; n < value_list_p->val_cnt; n++)
150  {
151  dbval_list->next = dbval_list + 1;
152  dbval_list++;
153  }
154 
155  scan_buffer_p->dbval_list[value_list_p->val_cnt - 1].next = NULL;
156  value_list_p->valp = scan_buffer_p->dbval_list;
157 
158  return scan_result;
159 }
160 
161 /*
162  * method_open_scan () -
163  * return: int
164  * scan_buf(in) : Value array buffer
165  * list_id(in) :
166  * method_sig_list(in): Method signature list
167  */
168 int
169 method_open_scan (THREAD_ENTRY * thread_p, METHOD_SCAN_BUFFER * scan_buffer_p, qfile_list_id * list_id_p,
170  method_sig_list * method_sig_list_p)
171 {
172  int error;
173  METHOD_INFO *method_ctl_p;
174 
175  method_ctl_p = &scan_buffer_p->s.method_ctl;
176 
177  method_ctl_p->list_id = list_id_p;
178  method_ctl_p->method_sig_list = method_sig_list_p;
179 
180  error = method_open_value_array_scan (scan_buffer_p);
181  if (error != NO_ERROR)
182  {
183  return error;
184  }
185 
186  error = method_invoke (thread_p, scan_buffer_p);
187  if (error != NO_ERROR)
188  {
189  (void) method_close_value_array_scan (scan_buffer_p);
190  return error;
191  }
192 
193  return NO_ERROR;
194 }
195 
196 /*
197  * method_close_scan () -
198  * return: int
199  * scan_buf(in) : Value array buffer
200  */
201 int
202 method_close_scan (THREAD_ENTRY * thread_p, METHOD_SCAN_BUFFER * scan_buffer_p)
203 {
204 #ifdef SERVER_MODE
205  VACOMM_BUFFER *vacomm_buffer_p;
206 
207  /*
208  * If the method scan is being closed before the client is done, the status could be zero (1st buffer not received)
209  * or METHOD_SUCCESS (last buffer not received). */
210 
211  vacomm_buffer_p = scan_buffer_p->vacomm_buffer;
212 
213  if ((vacomm_buffer_p) && ((vacomm_buffer_p->status == 0) || (vacomm_buffer_p->status == METHOD_SUCCESS)))
214  {
215  vacomm_buffer_p->action = VACOMM_BUFFER_ABORT;
216 
217  do
218  {
219  (void) method_receive_results (thread_p, scan_buffer_p);
220  }
221  while (vacomm_buffer_p->status == METHOD_SUCCESS);
222  }
223 #else /* SERVER_MODE */
224  method_clear_scan_buffer (scan_buffer_p);
225 #endif /* SERVER_MODE */
226 
227  return method_close_value_array_scan (scan_buffer_p);
228 }
229 
230 /*
231  * method_scan_next () -
232  * return: int
233  * scan_buf(in) : Value array buffer
234  * val_list(in) :
235  */
236 SCAN_CODE
237 method_scan_next (THREAD_ENTRY * thread_p, METHOD_SCAN_BUFFER * scan_buffer_p, val_list_node * value_list_p)
238 {
239  SCAN_CODE scan_result;
240 
241  scan_result = method_receive_results (thread_p, scan_buffer_p);
242 
243  if (scan_result == S_SUCCESS)
244  {
245  value_list_p->val_cnt = scan_buffer_p->s.method_ctl.method_sig_list->num_methods;
246  scan_result = method_scan_next_value_array (scan_buffer_p, value_list_p);
247  }
248 
249  return scan_result;
250 }
251 
252 #ifdef SERVER_MODE
253 static int
254 method_invoke_from_server (THREAD_ENTRY * thread_p, METHOD_SCAN_BUFFER * scan_buffer_p)
255 {
256  METHOD_INFO *method_ctl_p;
257 
258  method_ctl_p = &scan_buffer_p->s.method_ctl;
259  return xs_send_method_call_info_to_client (thread_p, method_ctl_p->list_id, method_ctl_p->method_sig_list);
260 }
261 #else
262 static int
264 {
265  int meth_num;
266  int val_cnt;
267  int i;
268  METHOD_INFO *method_ctl_p;
270  METHOD_SIG *meth_sig;
271 
272  method_ctl_p = &scan_buffer_p->s.method_ctl;
273  method_sig_list = method_ctl_p->method_sig_list;
274  scan_buffer_p->crs_id.buffer = NULL;
275 
276  val_cnt = 0;
277  meth_sig = method_sig_list->method_sig;
278 
279  for (meth_num = 0; meth_num < method_sig_list->num_methods; meth_num++)
280  {
281  val_cnt += meth_sig->num_method_args + 1;
282  meth_sig = meth_sig->next;
283  }
284 
285  if (method_ctl_p->list_id->type_list.type_cnt > val_cnt)
286  {
287  val_cnt = method_ctl_p->list_id->type_list.type_cnt;
288  }
289 
290  scan_buffer_p->val_cnt = val_cnt;
291  scan_buffer_p->vallist = (DB_VALUE *) malloc (sizeof (DB_VALUE) * val_cnt);
292 
293  if ((val_cnt > 0) && (scan_buffer_p->vallist == NULL))
294  {
295  return ER_FAILED;
296  }
297  /*
298  * Make sure that these containers get initialized with meaningful
299  * bits. It's possible to wind up in method_clear_scan_buffer() without ever
300  * having actually received any method results, and if that happens
301  * we'll be trying to db_value_clear() junk unless we initialize things
302  * here.
303  */
304  for (i = 0; i < val_cnt; i++)
305  {
306  db_make_null (&scan_buffer_p->vallist[i]);
307  }
308 
309  scan_buffer_p->valptrs = (DB_VALUE **) malloc (sizeof (DB_VALUE *) * (val_cnt + 1));
310 
311  if (scan_buffer_p->valptrs == NULL)
312  {
313  method_clear_scan_buffer (scan_buffer_p);
314  return ER_FAILED;
315  }
316 
317  scan_buffer_p->oid_cols = (int *) malloc (sizeof (int) * method_sig_list->num_methods);
318 
319  if (scan_buffer_p->oid_cols == NULL)
320  {
321  method_clear_scan_buffer (scan_buffer_p);
322  return ER_FAILED;
323  }
324 
325  meth_sig = method_sig_list->method_sig;
326  for (meth_num = 0; meth_num < method_sig_list->num_methods; meth_num++)
327  {
328  scan_buffer_p->oid_cols[meth_num] = meth_sig->method_arg_pos[0];
329  meth_sig = meth_sig->next;
330  }
331 
332  if (!cursor_open (&scan_buffer_p->crs_id, method_ctl_p->list_id, false, false))
333  {
334  method_clear_scan_buffer (scan_buffer_p);
335  return ER_FAILED;
336  }
337 
338  /* tfile_vfid pointer as query id for method scan */
339  scan_buffer_p->crs_id.query_id = (QUERY_ID) method_ctl_p->list_id->tfile_vfid;
340 
341  cursor_set_oid_columns (&scan_buffer_p->crs_id, scan_buffer_p->oid_cols, method_sig_list->num_methods);
342 
343  return NO_ERROR;
344 }
345 #endif
346 
347 /*
348  * method_invoke () -
349  * return: int
350  * scan_buf(in) : Value array buffer
351  */
352 static int
353 method_invoke (THREAD_ENTRY * thread_p, METHOD_SCAN_BUFFER * scan_buffer_p)
354 {
355 #if defined(SERVER_MODE)
356  return method_invoke_from_server (thread_p, scan_buffer_p);
357 #else /* SERVER_MODE */
358  return method_invoke_from_stand_alone (scan_buffer_p);
359 #endif /* SERVER_MODE */
360 }
361 
362 #ifdef SERVER_MODE
363 static SCAN_CODE
364 method_receive_results_for_server (THREAD_ENTRY * thread_p, METHOD_SCAN_BUFFER * scan_buffer_p)
365 {
366  QPROC_DB_VALUE_LIST dbval_list;
367  int meth_num, i;
368  METHOD_SIG *meth_sig_p;
369  SCAN_CODE result;
370  DB_VALUE *dbval_p;
371  METHOD_SIG_LIST *method_sig_list_p;
372 
373  method_sig_list_p = scan_buffer_p->s.method_ctl.method_sig_list;
374  meth_sig_p = method_sig_list_p->method_sig;
375  dbval_list = scan_buffer_p->dbval_list;
376 
377  for (meth_num = 0; meth_num < method_sig_list_p->num_methods; ++meth_num)
378  {
379  dbval_p = (DB_VALUE *) malloc (sizeof (DB_VALUE));
380  dbval_list->val = dbval_p;
381 
382  if (dbval_p == NULL)
383  {
384  result = S_ERROR;
385  }
386  else
387  {
388  db_make_null (dbval_p);
389  result = method_receive_value (thread_p, dbval_p, scan_buffer_p->vacomm_buffer);
390  }
391 
392  if (result != S_SUCCESS)
393  {
394  for (i = 0; i <= meth_num; i++)
395  {
396  if (scan_buffer_p->dbval_list[i].val)
397  {
398  db_value_clear (scan_buffer_p->dbval_list[i].val);
399  free_and_init (scan_buffer_p->dbval_list[i].val);
400  }
401  }
402 
403  if (result == S_ERROR)
404  {
405  scan_buffer_p->vacomm_buffer->status = METHOD_ERROR;
406  }
407 
408  return result;
409  }
410 
411  dbval_list++;
412  meth_sig_p = meth_sig_p->next;
413  }
414 
415  return S_SUCCESS;
416 }
417 
418 #else /* SERVER_MODE */
419 
420 static SCAN_CODE
422 {
423  QPROC_DB_VALUE_LIST dbval_list;
424  int meth_num;
425  METHOD_SIG *meth_sig;
426  int crs_result;
427  int num_args;
428  int pos;
429  int arg;
430  int turn_on_auth = 1;
431  DB_VALUE val;
432  int error = NO_ERROR;
433  HL_HEAPID save_pri_heap_id;
435 
436  method_sig_list = scan_buffer_p->s.method_ctl.method_sig_list;
437 
438  EXIT_SERVER_IN_METHOD_CALL (save_pri_heap_id);
439 
440  crs_result = cursor_next_tuple (&scan_buffer_p->crs_id);
441  if (crs_result == DB_CURSOR_SUCCESS)
442  {
443  DB_VALUE *ptr;
444  int i;
445 
446  /* Since we may be calling this in a loop, we need to clear out the vallist to avoid leaking old pointers. */
447  for (i = 0, ptr = scan_buffer_p->vallist; ptr && i < scan_buffer_p->val_cnt; i++, ptr++)
448  {
449  pr_clear_value (ptr);
450  }
451 
452  if (cursor_get_tuple_value_list (&scan_buffer_p->crs_id,
453  scan_buffer_p->s.method_ctl.list_id->type_list.type_cnt,
454  scan_buffer_p->vallist) != NO_ERROR)
455  {
456  method_clear_scan_buffer (scan_buffer_p);
457  ENTER_SERVER_IN_METHOD_CALL (save_pri_heap_id);
458  return S_ERROR;
459  }
460 
461  meth_sig = method_sig_list->method_sig;
462  dbval_list = scan_buffer_p->dbval_list;
463 
464  for (meth_num = 0; meth_num < method_sig_list->num_methods; meth_num++)
465  {
466  /* The first position # is for the object ID */
467  num_args = meth_sig->num_method_args + 1;
468  for (arg = 0; arg < num_args; ++arg)
469  {
470  pos = meth_sig->method_arg_pos[arg];
471  scan_buffer_p->valptrs[arg] = &scan_buffer_p->vallist[pos];
472  }
473 
474  scan_buffer_p->valptrs[num_args] = NULL;
475  db_make_null (&val);
476 
477  if (meth_sig->class_name != NULL)
478  {
479  /* Don't call the method if the object is NULL or it has been deleted. A method call on a NULL object is
480  * NULL. */
481  if (!DB_IS_NULL (scan_buffer_p->valptrs[0]))
482  {
483  error = db_is_any_class (db_get_object (scan_buffer_p->valptrs[0]));
484  if (error == 0)
485  {
486  error = db_is_instance (db_get_object (scan_buffer_p->valptrs[0]));
487  }
488  }
489  if (error == ER_HEAP_UNKNOWN_OBJECT)
490  {
491  error = NO_ERROR;
492  }
493  else if (error > 0)
494  {
495  /* methods must run with authorization turned on and database modifications turned off. */
496  turn_on_auth = 0;
497  AU_ENABLE (turn_on_auth);
500  error = obj_send_array (db_get_object (scan_buffer_p->valptrs[0]), meth_sig->method_name, &val,
501  &scan_buffer_p->valptrs[1]);
504  AU_DISABLE (turn_on_auth);
505  }
506  }
507  else
508  {
509  /* java stored procedure call */
510  turn_on_auth = 0;
511  AU_ENABLE (turn_on_auth);
514  error = jsp_call_from_server (&val, scan_buffer_p->valptrs, meth_sig->method_name,
515  meth_sig->num_method_args);
518  AU_DISABLE (turn_on_auth);
519  }
520 
521  if (error != NO_ERROR)
522  {
523  method_clear_scan_buffer (scan_buffer_p);
524  ENTER_SERVER_IN_METHOD_CALL (save_pri_heap_id);
525  return S_ERROR;
526  }
527 
528  if (DB_VALUE_TYPE (&val) == DB_TYPE_ERROR)
529  {
530  if (er_errid () == NO_ERROR)
531  {
533  }
534  method_clear_scan_buffer (scan_buffer_p);
535  ENTER_SERVER_IN_METHOD_CALL (save_pri_heap_id);
536  return S_ERROR;
537  }
538 
539  dbval_list->val = (DB_VALUE *) malloc (sizeof (DB_VALUE));
540  if (dbval_list->val == NULL)
541  {
542  pr_clear_value (&val);
543  ENTER_SERVER_IN_METHOD_CALL (save_pri_heap_id);
544  return S_ERROR;
545  }
547 
548  /* Don't forget to translate any OBJECTS to OIDs. */
549  if (DB_VALUE_DOMAIN_TYPE (&val) == DB_TYPE_OBJECT)
550  {
551  db_make_oid (dbval_list->val, ws_oid (db_get_object (&val)));
552  }
553  else if (db_value_clone (&val, dbval_list->val) != NO_ERROR)
554  {
555  pr_clear_value (&val);
556  ENTER_SERVER_IN_METHOD_CALL (save_pri_heap_id);
557  return S_ERROR;
558  }
559  pr_clear_value (&val);
560 
561  dbval_list++;
562  meth_sig = meth_sig->next;
563  }
564 
565  /* enter server after all jsp functions are finished */
566  ENTER_SERVER_IN_METHOD_CALL (save_pri_heap_id);
567  return S_SUCCESS;
568  }
569  else if (crs_result == DB_CURSOR_END)
570  {
571  method_clear_scan_buffer (scan_buffer_p);
572  ENTER_SERVER_IN_METHOD_CALL (save_pri_heap_id);
573  return S_END;
574  }
575  else
576  {
577  method_clear_scan_buffer (scan_buffer_p);
578  ENTER_SERVER_IN_METHOD_CALL (save_pri_heap_id);
579  return (SCAN_CODE) crs_result;
580  }
581 }
582 #endif /* !SERVER_MODE */
583 
584 /*
585  * method_receive_results () -
586  * return: int
587  * scan_buf(in) : Value array buffer
588  */
589 static SCAN_CODE
591 {
592 #if defined(SERVER_MODE)
593  return method_receive_results_for_server (thread_p, scan_buffer_p);
594 #else /* SERVER_MODE */
595  return method_receive_results_for_stand_alone (scan_buffer_p);
596 #endif /* SERVER_MODE */
597 }
598 
599 #if !defined(SERVER_MODE)
600 /*
601  * method_clear_scan_buffer () -
602  * return:
603  * scan_buffer_p(in) : Value array buffer
604  */
605 static void
607 {
608  int i;
609  DB_VALUE *ptr;
610 
611  if (scan_buffer_p->crs_id.buffer)
612  {
613  cursor_close (&scan_buffer_p->crs_id);
614  scan_buffer_p->crs_id.buffer = NULL;
615  }
616 
617  ptr = scan_buffer_p->vallist;
618  for (i = 0; ptr && i < scan_buffer_p->val_cnt; i++)
619  {
620  db_value_clear (ptr);
621  ptr++;
622  }
623 
624  free_and_init (scan_buffer_p->valptrs);
625  free_and_init (scan_buffer_p->vallist);
626  free_and_init (scan_buffer_p->oid_cols);
627 
628  return;
629 }
630 #else /* !SERVER_MODE */
631 /*
632  * method_free_vacomm_buffer () - Frees the comm buffer
633  * return:
634  * vacomm_buffer(in) : Transmission buffer
635  */
636 static void
637 method_free_vacomm_buffer (VACOMM_BUFFER * vacomm_buffer_p)
638 {
639  if (vacomm_buffer_p)
640  {
641  free_and_init (vacomm_buffer_p->area);
642  free_and_init (vacomm_buffer_p);
643  }
644 }
645 
646 /*
647  * method_initialize_vacomm_buffer () - Initializes the method comm buffer
648  * return:
649  */
650 static VACOMM_BUFFER *
652 {
654 
655  vacomm_buffer = (VACOMM_BUFFER *) malloc (sizeof (VACOMM_BUFFER));
656  if (vacomm_buffer == NULL)
657  {
659  return NULL;
660  }
661 
662  vacomm_buffer->length = 0;
663  vacomm_buffer->status = 0;
664  vacomm_buffer->action = VACOMM_BUFFER_SEND;
665  vacomm_buffer->error = 0;
666  vacomm_buffer->num_vals = 0;
667  vacomm_buffer->area = NULL;
668  vacomm_buffer->buffer = NULL;
669  vacomm_buffer->cur_pos = 0;
670  vacomm_buffer->size = 0;
671 
672  return vacomm_buffer;
673 }
674 
675 /*
676  * method_receive_value () -
677  * return: int (number of values received)
678  * dbval(in) : value
679  * vacomm_buffer(in) : Transmission buffer
680  *
681  * Note: If there is a db_value in the transmission buffer,
682  * unpack it & return 1. Otherwise, if EOF is indicated return 0,
683  * else receive the buffer from the client and then unpack
684  * the value and return 1. If an error is indicated, return -1
685  * because the error has been set by the comm interface.
686  */
687 static SCAN_CODE
688 method_receive_value (THREAD_ENTRY * thread_p, DB_VALUE * dbval_p, VACOMM_BUFFER * vacomm_buffer_p)
689 {
690  int error;
691  char *p;
692 
693  if (vacomm_buffer_p->cur_pos == 0)
694  {
695  if (vacomm_buffer_p->status == METHOD_EOF)
696  {
697  return S_END;
698  }
699 
700  vacomm_buffer_p->status = METHOD_ERROR;
701 
702  error = xs_receive_data_from_client (thread_p, &vacomm_buffer_p->area, &vacomm_buffer_p->size);
703  if (error == NO_ERROR)
704  {
705  vacomm_buffer_p->buffer = vacomm_buffer_p->area + VACOMM_BUFFER_HEADER_SIZE;
706  p = or_unpack_int (vacomm_buffer_p->area + VACOMM_BUFFER_HEADER_LENGTH_OFFSET, &vacomm_buffer_p->length);
707  p = or_unpack_int (vacomm_buffer_p->area + VACOMM_BUFFER_HEADER_STATUS_OFFSET, &vacomm_buffer_p->status);
708 
709  if (vacomm_buffer_p->status == METHOD_ERROR)
710  {
711  p = or_unpack_int (vacomm_buffer_p->area + VACOMM_BUFFER_HEADER_ERROR_OFFSET, &vacomm_buffer_p->error);
712  }
713  else
714  {
715  p =
716  or_unpack_int (vacomm_buffer_p->area + VACOMM_BUFFER_HEADER_NO_VALS_OFFSET, &vacomm_buffer_p->num_vals);
717  }
718 
719  if (vacomm_buffer_p->status == METHOD_SUCCESS)
720  {
721  error = xs_send_action_to_client (thread_p, (VACOMM_BUFFER_CLIENT_ACTION) vacomm_buffer_p->action);
722  if (error != NO_ERROR)
723  {
724  return S_ERROR;
725  }
726  }
727  }
728  else
729  {
730  xs_send_action_to_client (thread_p, (VACOMM_BUFFER_CLIENT_ACTION) vacomm_buffer_p->action);
731  return S_ERROR;
732  }
733  }
734 
735  if (vacomm_buffer_p->status == METHOD_ERROR)
736  {
737  return S_ERROR;
738  }
739 
740  if (vacomm_buffer_p->num_vals > 0)
741  {
742  p = or_unpack_db_value (vacomm_buffer_p->buffer + vacomm_buffer_p->cur_pos, dbval_p);
743  vacomm_buffer_p->cur_pos += OR_VALUE_ALIGNED_SIZE (dbval_p);
744  vacomm_buffer_p->num_vals--;
745  }
746  else
747  {
748  return S_END;
749  }
750 
751  if (vacomm_buffer_p->num_vals == 0)
752  {
753  vacomm_buffer_p->cur_pos = 0;
754  }
755 
756  return S_SUCCESS;
757 }
758 #endif /* !SERVER_MODE */
#define NO_ERROR
Definition: error_code.h:46
static SCAN_CODE method_scan_next_value_array(METHOD_SCAN_BUFFER *scan_buf, VAL_LIST *val_list)
Definition: method_scan.c:142
#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
SCAN_CODE method_scan_next(THREAD_ENTRY *thread_p, METHOD_SCAN_BUFFER *scan_buffer_p, val_list_node *value_list_p)
Definition: method_scan.c:237
int xs_send_method_call_info_to_client(THREAD_ENTRY *thread_p, qfile_list_id *list_id, method_sig_list *methsg_list)
struct qmgr_temp_file * tfile_vfid
Definition: query_list.h:440
SCAN_CODE
QFILE_TUPLE_VALUE_TYPE_LIST type_list
Definition: query_list.h:428
METHOD_SIG * method_sig
Definition: method_def.hpp:69
int val_cnt
Definition: xasl.h:208
char * method_name
Definition: method_def.hpp:57
#define ER_FAILED
Definition: error_code.h:47
static int method_close_value_array_scan(METHOD_SCAN_BUFFER *scan_buf)
Definition: method_scan.c:124
int cursor_next_tuple(CURSOR_ID *cursor_id_p)
Definition: cursor.c:1482
int db_value_clone(DB_VALUE *src, DB_VALUE *dest)
Definition: db_macro.c:1564
int db_is_instance(MOP obj)
Definition: db_info.c:394
static int method_initialize_vacomm_buffer(VACOMM_BUFFER *vacomm_buffer, unsigned int rc, char *host, char *server_name)
Definition: query_method.c:73
int method_Num_method_jsp_calls
Definition: method_scan.c:54
CURSOR_ID crs_id
Definition: method_scan.h:92
int db_is_any_class(MOP obj)
Definition: db_info.c:356
static void method_clear_scan_buffer(METHOD_SCAN_BUFFER *scan_buf)
Definition: method_scan.c:606
OID * ws_oid(MOP mop)
Definition: work_space.c:2884
int er_errid(void)
#define EXIT_SERVER_IN_METHOD_CALL(save_pri_heap_id_)
Definition: method_scan.c:62
#define VACOMM_BUFFER_HEADER_LENGTH_OFFSET
Definition: method_def.hpp:40
union method_scan_buffer::@146 s
#define VACOMM_BUFFER_HEADER_ERROR_OFFSET
Definition: method_def.hpp:43
struct qproc_db_value_list * QPROC_DB_VALUE_LIST
Definition: xasl.h:192
METHOD_SIG * next
Definition: method_def.hpp:56
#define MAX_XS_SCANBUF_DBVALS
Definition: method_scan.h:67
void THREAD_ENTRY
DB_VALUE * val
Definition: xasl.h:196
VACOMM_BUFFER_CLIENT_ACTION
Definition: method_def.hpp:33
static int method_invoke(THREAD_ENTRY *thread_p, METHOD_SCAN_BUFFER *scan_buf)
Definition: method_scan.c:353
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
static int method_invoke_from_stand_alone(METHOD_SCAN_BUFFER *scan_buffer_p)
Definition: method_scan.c:263
#define ER_GENERIC_ERROR
Definition: error_code.h:49
#define ER_OUT_OF_VIRTUAL_MEMORY
Definition: error_code.h:50
#define OR_VALUE_ALIGNED_SIZE(value)
#define DB_VALUE_DOMAIN_TYPE(value)
Definition: dbtype.h:70
method_sig_list()=default
DB_VALUE * vallist
Definition: method_scan.h:89
int obj_send_array(MOP obj, const char *name, DB_VALUE *returnval, DB_VALUE **argarray)
int * method_arg_pos
Definition: method_def.hpp:61
int cursor_set_oid_columns(CURSOR_ID *cursor_id_p, int *oid_col_no_p, int oid_col_no_cnt)
Definition: cursor.c:1322
DB_OBJECT * db_get_object(const DB_VALUE *value)
QUERY_ID query_id
Definition: cursor.h:54
METHOD_SIG_LIST * method_sig_list
Definition: method_scan.h:73
int xs_send_action_to_client(THREAD_ENTRY *thread_p, VACOMM_BUFFER_CLIENT_ACTION action)
#define NULL
Definition: freelistheap.h:34
METHOD_INFO method_ctl
Definition: method_scan.h:82
int db_enable_modification(void)
Definition: db_admin.c:1015
static SCAN_CODE method_receive_results(THREAD_ENTRY *thread_p, METHOD_SCAN_BUFFER *scan_buf)
Definition: method_scan.c:590
char * or_unpack_int(char *ptr, int *number)
int pr_clear_value(DB_VALUE *value)
#define DB_DEFAULT_SCALE
Definition: dbtype_def.h:561
int xs_receive_data_from_client(THREAD_ENTRY *thread_p, char **area, int *datasize)
static void error(const char *msg)
Definition: gencat.c:331
#define DB_DEFAULT_PRECISION
Definition: dbtype_def.h:558
unsigned int db_on_server
#define ARG_FILE_LINE
Definition: error_manager.h:44
char * buffer
Definition: cursor.h:66
#define AU_ENABLE(save)
Definition: authenticate.h:113
int db_disable_modification(void)
Definition: db_admin.c:1001
#define free_and_init(ptr)
Definition: memory_alloc.h:147
#define VACOMM_BUFFER_HEADER_NO_VALS_OFFSET
Definition: method_def.hpp:42
qfile_list_id * list_id
Definition: method_scan.h:72
#define ER_HEAP_UNKNOWN_OBJECT
Definition: error_code.h:102
QPROC_DB_VALUE_LIST valp
Definition: xasl.h:207
#define DB_CURSOR_SUCCESS
Definition: dbtype_def.h:166
static int method_open_value_array_scan(METHOD_SCAN_BUFFER *scan_buf)
Definition: method_scan.c:90
void cursor_close(CURSOR_ID *cursor_id_p)
Definition: cursor.c:1381
#define DB_VALUE_TYPE(value)
Definition: dbtype.h:72
int i
Definition: dynamic_load.c:954
int db_make_null(DB_VALUE *value)
#define DB_IS_NULL(value)
Definition: dbtype.h:63
QPROC_DB_VALUE_LIST next
Definition: xasl.h:195
#define VACOMM_BUFFER_HEADER_SIZE
Definition: method_def.hpp:39
int db_value_clear(DB_VALUE *value)
Definition: db_macro.c:1588
#define VACOMM_BUFFER_HEADER_STATUS_OFFSET
Definition: method_def.hpp:41
int method_close_scan(THREAD_ENTRY *thread_p, METHOD_SCAN_BUFFER *scan_buffer_p)
Definition: method_scan.c:202
int db_make_oid(DB_VALUE *value, const OID *oid)
qproc_db_value_list * dbval_list
Definition: method_scan.h:79
#define DB_CURSOR_END
Definition: dbtype_def.h:167
static SCAN_CODE method_receive_results_for_stand_alone(METHOD_SCAN_BUFFER *scan_buffer_p)
Definition: method_scan.c:421
bool cursor_open(CURSOR_ID *cursor_id_p, QFILE_LIST_ID *list_id_p, bool updatable, bool is_oid_included)
Definition: cursor.c:1194
#define ENTER_SERVER_IN_METHOD_CALL(save_pri_heap_id_)
Definition: method_scan.c:56
DB_VALUE ** valptrs
Definition: method_scan.h:90
const char ** p
Definition: dynamic_load.c:945
char * or_unpack_db_value(char *buffer, DB_VALUE *val)
int method_open_scan(THREAD_ENTRY *thread_p, METHOD_SCAN_BUFFER *scan_buffer_p, qfile_list_id *list_id_p, method_sig_list *method_sig_list_p)
Definition: method_scan.c:169
int cursor_get_tuple_value_list(CURSOR_ID *cursor_id_p, int size, DB_VALUE *value_list_p)
Definition: cursor.c:1778
int db_value_domain_init(DB_VALUE *value, const DB_TYPE type, const int precision, const int scale)
Definition: db_macro.c:153