CUBRID Engine  latest
cas_net_buf.c
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 
20 /*
21  * cas_net_buf.c -
22  */
23 
24 #ident "$Id$"
25 
26 #include <stdio.h>
27 #include <string.h>
28 #include <stdlib.h>
29 #include <assert.h>
30 
31 #if defined(WINDOWS)
32 #include <winsock2.h>
33 #include <windows.h>
34 #else /* WINDOWS */
35 #include <arpa/inet.h>
36 #endif /* WINDOWS */
37 
38 #include "cas.h"
39 #include "cas_common.h"
40 #include "cas_net_buf.h"
41 #include "cas_util.h"
42 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
43 #include "dbi.h"
44 #else
45 #include "cas_dbms_util.h"
46 #endif
47 #include "error_code.h"
48 #include "dbtype.h"
49 #include "byte_order.h"
50 
51 static int net_buf_realloc (T_NET_BUF * net_buf, int size);
52 
53 void
54 net_buf_init (T_NET_BUF * net_buf, T_BROKER_VERSION client_version)
55 {
56  net_buf->data = NULL;
57  net_buf->alloc_size = 0;
58  net_buf->data_size = 0;
59  net_buf->err_code = 0;
60  net_buf->post_file_size = 0;
61  net_buf->post_send_file = NULL;
62  net_buf->client_version = client_version;
63 }
64 
65 void
67 {
68  net_buf->data_size = 0;
69  net_buf->err_code = 0;
70  net_buf->post_file_size = 0;
71  FREE_MEM (net_buf->post_send_file);
72 }
73 
74 void
76 {
77  FREE_MEM (net_buf->data);
78  net_buf->alloc_size = 0;
79  net_buf_clear (net_buf);
80 }
81 
82 int
83 net_buf_cp_post_send_file (T_NET_BUF * net_buf, int size, char *filename)
84 {
85  FREE_MEM (net_buf->post_send_file);
86  ALLOC_COPY (net_buf->post_send_file, filename);
87  if (net_buf->post_send_file == NULL)
88  {
90  return CAS_ER_NO_MORE_MEMORY;
91  }
92  net_buf->post_file_size = size;
93  return 0;
94 }
95 
96 int
97 net_buf_cp_byte (T_NET_BUF * net_buf, char ch)
98 {
99  if (NET_BUF_FREE_SIZE (net_buf) < NET_SIZE_BYTE && net_buf_realloc (net_buf, NET_SIZE_BYTE) < 0)
100  {
101  return CAS_ER_NO_MORE_MEMORY;
102  }
103 
104  *(NET_BUF_CURR_PTR (net_buf)) = ch; /* do not call memcpy(); simply assign */
105  net_buf->data_size += NET_SIZE_BYTE;
106  return 0;
107 }
108 
109 int
110 net_buf_cp_str (T_NET_BUF * net_buf, const char *buf, int size)
111 {
112  if (size <= 0)
113  return 0;
114 
115  if (NET_BUF_FREE_SIZE (net_buf) < size && net_buf_realloc (net_buf, size) < 0)
116  {
117  return CAS_ER_NO_MORE_MEMORY;
118  }
119 
120  memcpy (NET_BUF_CURR_PTR (net_buf), buf, size);
121  net_buf->data_size += size;
122  return 0;
123 }
124 
125 int
126 net_buf_cp_int (T_NET_BUF * net_buf, int value, int *begin_offset)
127 {
128  if (NET_BUF_FREE_SIZE (net_buf) < NET_SIZE_INT && net_buf_realloc (net_buf, NET_SIZE_INT) < 0)
129  {
130  if (begin_offset)
131  {
132  *begin_offset = -1;
133  }
134  return CAS_ER_NO_MORE_MEMORY;
135  }
136 
137  value = htonl (value);
138  memcpy (NET_BUF_CURR_PTR (net_buf), &value, NET_SIZE_INT);
139 
140  if (begin_offset)
141  {
142  *begin_offset = net_buf->data_size;
143  }
144 
145  net_buf->data_size += NET_SIZE_INT;
146  return 0;
147 }
148 
149 void
150 net_buf_overwrite_int (T_NET_BUF * net_buf, int offset, int value)
151 {
152  if (net_buf->data == NULL || offset < 0)
153  {
154  return;
155  }
156  value = htonl (value);
157  memcpy (net_buf->data + NET_BUF_HEADER_SIZE + offset, &value, NET_SIZE_INT);
158 }
159 
160 int
161 net_buf_cp_bigint (T_NET_BUF * net_buf, DB_BIGINT value, int *begin_offset)
162 {
163  if (NET_BUF_FREE_SIZE (net_buf) < NET_SIZE_BIGINT && net_buf_realloc (net_buf, NET_SIZE_BIGINT) < 0)
164  {
165  if (begin_offset)
166  {
167  *begin_offset = -1;
168  }
169  return CAS_ER_NO_MORE_MEMORY;
170  }
171 
172  value = net_htoni64 (value);
173  memcpy (NET_BUF_CURR_PTR (net_buf), &value, NET_SIZE_BIGINT);
174 
175  if (begin_offset)
176  {
177  *begin_offset = net_buf->data_size;
178  }
179 
180  net_buf->data_size += NET_SIZE_BIGINT;
181  return 0;
182 }
183 
184 #if defined (ENABLE_UNUSED_FUNCTION)
185 void
186 net_buf_overwrite_bigint (T_NET_BUF * net_buf, int offset, DB_BIGINT value)
187 {
188  if (net_buf->data == NULL || offset < 0)
189  {
190  return;
191  }
192 
193  value = net_htoni64 (value);
194  memcpy (net_buf->data + NET_BUF_HEADER_SIZE + offset, &value, NET_SIZE_BIGINT);
195 }
196 #endif /* ENABLE_UNUSED_FUNCTION */
197 
198 int
199 net_buf_cp_float (T_NET_BUF * net_buf, float value)
200 {
201  if (NET_BUF_FREE_SIZE (net_buf) < NET_SIZE_FLOAT && net_buf_realloc (net_buf, NET_SIZE_FLOAT) < 0)
202  {
203  return CAS_ER_NO_MORE_MEMORY;
204  }
205  value = net_htonf (value);
206  memcpy (NET_BUF_CURR_PTR (net_buf), &value, NET_SIZE_FLOAT);
207  net_buf->data_size += NET_SIZE_FLOAT;
208 
209  return 0;
210 }
211 
212 int
213 net_buf_cp_double (T_NET_BUF * net_buf, double value)
214 {
215  if (NET_BUF_FREE_SIZE (net_buf) < NET_SIZE_DOUBLE && net_buf_realloc (net_buf, NET_SIZE_DOUBLE) < 0)
216  {
217  return CAS_ER_NO_MORE_MEMORY;
218  }
219  value = net_htond (value);
220  memcpy (NET_BUF_CURR_PTR (net_buf), &value, NET_SIZE_DOUBLE);
221  net_buf->data_size += NET_SIZE_DOUBLE;
222 
223  return 0;
224 }
225 
226 int
227 net_buf_cp_short (T_NET_BUF * net_buf, short value)
228 {
229  if (NET_BUF_FREE_SIZE (net_buf) < NET_SIZE_SHORT && net_buf_realloc (net_buf, NET_SIZE_SHORT) < 0)
230  {
231  return CAS_ER_NO_MORE_MEMORY;
232  }
233  value = htons (value);
234  memcpy (NET_BUF_CURR_PTR (net_buf), &value, NET_SIZE_SHORT);
235  net_buf->data_size += NET_SIZE_SHORT;
236 
237  return 0;
238 }
239 
240 int
242 {
243  if (NET_BUF_FREE_SIZE (net_buf) < NET_SIZE_OBJECT && net_buf_realloc (net_buf, NET_SIZE_OBJECT) < 0)
244  {
245  return CAS_ER_NO_MORE_MEMORY;
246  }
247  net_buf_cp_int (net_buf, oid->pageid, NULL);
248  net_buf_cp_short (net_buf, oid->slotid);
249  net_buf_cp_short (net_buf, oid->volid);
250 
251  return 0;
252 }
253 
254 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
255 int
257 {
258  int lob_handle_size = NET_SIZE_INT + NET_SIZE_INT64 + NET_SIZE_INT + lob->locator_size;
259  /* db_type + lob_size + locator_size + locator including null character */
260  if (NET_BUF_FREE_SIZE (net_buf) < lob_handle_size && net_buf_realloc (net_buf, lob_handle_size))
261  {
262  return CAS_ER_NO_MORE_MEMORY;
263  }
264  net_buf_cp_int (net_buf, lob->db_type, NULL);
265  net_buf_cp_bigint (net_buf, lob->lob_size, NULL);
266  net_buf_cp_int (net_buf, lob->locator_size, NULL);
267  net_buf_cp_str (net_buf, lob->locator, lob->locator_size);
268  /* including null character */
269 
270  return 0;
271 }
272 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
273 
274 
275 /* shard_proxy dose not use this function */
276 void
277 net_buf_error_msg_set (T_NET_BUF * net_buf, int err_indicator, int err_code, char *err_str, const char *file, int line)
278 {
279 #ifdef CAS_DEBUG
280  char msg_buf[1024];
281 #endif
282 #ifndef LIBCAS_FOR_JSP
283 #if defined(CAS_CUBRID) || defined(CAS_FOR_MYSQL) || defined(CAS_FOR_ORACLE)
284  T_BROKER_VERSION ver;
285 #endif /* CAS_CUBRID || CAS_FOR_MYSQL || CAS_FOR_ORACLE */
286 #endif /* !LIBCAS_FOR_JSP */
287  size_t err_msg_len = 0;
288  char err_msg[ERR_MSG_LENGTH];
289 
290  assert (err_code != NO_ERROR);
291 
292  net_buf_clear (net_buf);
293 #ifndef LIBCAS_FOR_JSP
294 #if defined(CAS_CUBRID) || defined(CAS_FOR_MYSQL) || defined(CAS_FOR_ORACLE)
295  ver = as_info->clt_version;
296  if (ver >= CAS_MAKE_VER (8, 3, 0))
297  {
298  net_buf_cp_int (net_buf, err_indicator, NULL);
299  }
300 
302  && err_code != NO_ERROR)
303  {
304  if (err_indicator == CAS_ERROR_INDICATOR || err_code == CAS_ER_NOT_AUTHORIZED_CLIENT)
305  {
306  err_code = CAS_CONV_ERROR_TO_OLD (err_code);
307  }
308  }
309 #else /* CAS_CUBRID || CAS_FOR_MYSQL || CAS_FOR_ORACLE */
310  /* shard_proxy do not use net_buf_error_msg_set. it is dummy code. */
311  net_buf_cp_int (net_buf, err_indicator, NULL);
312 #endif /* FOR SHARD_PROXY */
313 #else /* !LIBCAS_FOR_JSP */
314  net_buf_cp_int (net_buf, err_indicator, NULL);
315 #endif /* !LIBCAS_FOR_JSP */
316  net_buf_cp_int (net_buf, err_code, NULL);
317 
318 #ifdef CAS_DEBUG
319  sprintf (msg_buf, "%s:%d ", file, line);
320  net_buf_cp_str (net_buf, msg_buf, strlen (msg_buf));
321 #endif
322 
323  err_msg_len = net_error_append_shard_info (err_msg, err_str, ERR_MSG_LENGTH);
324  if (err_msg_len == 0)
325  {
326  net_buf_cp_byte (net_buf, '\0');
327  }
328  else
329  {
330  net_buf_cp_str (net_buf, err_msg, (int) err_msg_len + 1);
331  }
332 }
333 
334 #ifndef BYTE_ORDER_BIG_ENDIAN
335 INT64
336 net_htoni64 (INT64 from)
337 {
338  INT64 to;
339  char *p, *q;
340 
341  p = (char *) &from;
342  q = (char *) &to;
343 
344  q[0] = p[7];
345  q[1] = p[6];
346  q[2] = p[5];
347  q[3] = p[4];
348  q[4] = p[3];
349  q[5] = p[2];
350  q[6] = p[1];
351  q[7] = p[0];
352 
353  return to;
354 }
355 
356 float
357 net_htonf (float from)
358 {
359  float to;
360  char *p, *q;
361 
362  p = (char *) &from;
363  q = (char *) &to;
364 
365  q[0] = p[3];
366  q[1] = p[2];
367  q[2] = p[1];
368  q[3] = p[0];
369 
370  return to;
371 }
372 
373 double
374 net_htond (double from)
375 {
376  double to;
377  char *p, *q;
378 
379  p = (char *) &from;
380  q = (char *) &to;
381 
382  q[0] = p[7];
383  q[1] = p[6];
384  q[2] = p[5];
385  q[3] = p[4];
386  q[4] = p[3];
387  q[5] = p[2];
388  q[6] = p[1];
389  q[7] = p[0];
390 
391  return to;
392 }
393 #endif /* !BYTE_ORDER_BIG_ENDIAN */
394 
395 void
396 net_buf_column_info_set (T_NET_BUF * net_buf, char ut, short scale, int prec, char charset, const char *name)
397 {
398  net_buf_cp_cas_type_and_charset (net_buf, ut, charset);
399  net_buf_cp_short (net_buf, scale);
400  net_buf_cp_int (net_buf, prec, NULL);
401  if (name == NULL)
402  {
403  net_buf_cp_int (net_buf, 1, NULL);
404  net_buf_cp_byte (net_buf, '\0');
405  }
406  else
407  {
408  char *tmp_str;
409 
410  ALLOC_COPY (tmp_str, name);
411  if (tmp_str == NULL)
412  {
413  net_buf_cp_int (net_buf, 1, NULL);
414  net_buf_cp_byte (net_buf, '\0');
415  }
416  else
417  {
418  ut_trim (tmp_str);
419  net_buf_cp_int (net_buf, (int) strlen (tmp_str) + 1, NULL);
420  net_buf_cp_str (net_buf, tmp_str, (int) strlen (tmp_str) + 1);
421  FREE_MEM (tmp_str);
422  }
423  }
424 }
425 
426 static int
427 net_buf_realloc (T_NET_BUF * net_buf, int size)
428 {
429  if (NET_BUF_FREE_SIZE (net_buf) < size)
430  {
431  int extra, new_alloc_size;
432 
433  /* realloc unit is 64 Kbyte */
434  extra = (size + NET_BUF_EXTRA_SIZE - 1) / NET_BUF_EXTRA_SIZE;
435  new_alloc_size = net_buf->alloc_size + extra * NET_BUF_EXTRA_SIZE;
436  net_buf->data = (char *) REALLOC (net_buf->data, new_alloc_size);
437  if (net_buf->data == NULL)
438  {
439  net_buf->alloc_size = 0;
440  net_buf->err_code = CAS_ER_NO_MORE_MEMORY;
441  return -1;
442  }
443 
444  net_buf->alloc_size = new_alloc_size;
445  }
446 
447  return 0;
448 }
449 
450 void
451 net_arg_get_size (int *size, void *arg)
452 {
453  int tmp_i;
454 
455  memcpy (&tmp_i, arg, NET_SIZE_INT);
456  *size = ntohl (tmp_i);
457 }
458 
459 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
460 void
461 net_arg_get_bigint (int64_t * value, void *arg)
462 {
463  int64_t tmp_i;
464  char *cur_p = (char *) arg + NET_SIZE_INT;
465 
466  memcpy (&tmp_i, cur_p, NET_SIZE_BIGINT);
467  *value = ntohi64 (tmp_i);
468  cur_p += NET_SIZE_BIGINT;
469 }
470 #else /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
471 void
472 net_arg_get_bigint (DB_BIGINT * value, void *arg)
473 {
474  DB_BIGINT tmp_i;
475  char *cur_p = (char *) arg + NET_SIZE_INT;
476 
477  memcpy (&tmp_i, cur_p, NET_SIZE_BIGINT);
478  *value = ntohi64 (tmp_i);
479  cur_p += NET_SIZE_BIGINT;
480 }
481 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
482 
483 void
484 net_arg_get_int (int *value, void *arg)
485 {
486  int tmp_i;
487  char *cur_p = (char *) arg + NET_SIZE_INT;
488 
489  memcpy (&tmp_i, cur_p, NET_SIZE_INT);
490  *value = ntohl (tmp_i);
491  cur_p += NET_SIZE_INT;
492 }
493 
494 void
495 net_arg_get_short (short *value, void *arg)
496 {
497  short tmp_s;
498  char *cur_p = (char *) arg + NET_SIZE_INT;
499 
500  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
501  *value = ntohs (tmp_s);
502  cur_p += NET_SIZE_SHORT;
503 }
504 
505 void
506 net_arg_get_float (float *value, void *arg)
507 {
508  float tmp_f;
509  char *cur_p = (char *) arg + NET_SIZE_INT;
510 
511  memcpy (&tmp_f, cur_p, NET_SIZE_FLOAT);
512  *value = net_ntohf (tmp_f);
513  cur_p += NET_SIZE_FLOAT;
514 }
515 
516 void
517 net_arg_get_double (double *value, void *arg)
518 {
519  double tmp_d;
520  char *cur_p = (char *) arg + NET_SIZE_INT;
521 
522  memcpy (&tmp_d, cur_p, NET_SIZE_DOUBLE);
523  *value = net_ntohd (tmp_d);
524  cur_p += NET_SIZE_DOUBLE;
525 }
526 
527 void
528 net_arg_get_str (char **value, int *size, void *arg)
529 {
530  int tmp_i;
531  char *cur_p = (char *) arg;
532 
533  memcpy (&tmp_i, cur_p, NET_SIZE_INT);
534  *size = ntohl (tmp_i);
535  cur_p += NET_SIZE_INT;
536  if (*size <= 0)
537  {
538  *value = NULL;
539  *size = 0;
540  }
541  else
542  {
543  *value = cur_p;
544  }
545 }
546 
547 void
548 net_arg_get_date (short *year, short *mon, short *day, void *arg)
549 {
550  short tmp_s;
551  char *cur_p = (char *) arg + NET_SIZE_INT;
552 
553  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
554  *year = ntohs (tmp_s);
555  cur_p += NET_SIZE_SHORT;
556  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
557  *mon = ntohs (tmp_s);
558  cur_p += NET_SIZE_SHORT;
559  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
560  *day = ntohs (tmp_s);
561  cur_p += NET_SIZE_SHORT;
562 }
563 
564 void
565 net_arg_get_time (short *hh, short *mm, short *ss, void *arg)
566 {
567  short tmp_s;
568  char *cur_p = (char *) arg + NET_SIZE_INT + NET_SIZE_SHORT * 3;
569 
570  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
571  *hh = ntohs (tmp_s);
572  cur_p += NET_SIZE_SHORT;
573  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
574  *mm = ntohs (tmp_s);
575  cur_p += NET_SIZE_SHORT;
576  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
577  *ss = ntohs (tmp_s);
578  cur_p += NET_SIZE_SHORT;
579 }
580 
581 void
582 net_arg_get_timestamp (short *yr, short *mon, short *day, short *hh, short *mm, short *ss, void *arg)
583 {
584  short tmp_s;
585  char *cur_p = (char *) arg + NET_SIZE_INT;
586 
587  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
588  *yr = ntohs (tmp_s);
589  cur_p += NET_SIZE_SHORT;
590  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
591  *mon = ntohs (tmp_s);
592  cur_p += NET_SIZE_SHORT;
593  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
594  *day = ntohs (tmp_s);
595  cur_p += NET_SIZE_SHORT;
596  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
597  *hh = ntohs (tmp_s);
598  cur_p += NET_SIZE_SHORT;
599  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
600  *mm = ntohs (tmp_s);
601  cur_p += NET_SIZE_SHORT;
602  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
603  *ss = ntohs (tmp_s);
604  cur_p += NET_SIZE_SHORT;
605 }
606 
607 void
608 net_arg_get_timestamptz (short *yr, short *mon, short *day, short *hh, short *mm, short *ss, char **tz, int *tz_size,
609  void *arg)
610 {
611  int tmp_i;
612  char *cur_p = (char *) arg;
613 
614  net_arg_get_timestamp (yr, mon, day, hh, mm, ss, arg);
615 
616  memcpy (&tmp_i, cur_p, NET_SIZE_INT);
617  /* skip dummy milisecond values */
618  *tz_size = ntohl (tmp_i) - NET_SIZE_TIMESTAMP - NET_SIZE_SHORT;
620 
621  *tz = cur_p;
622 }
623 
624 void
625 net_arg_get_datetime (short *yr, short *mon, short *day, short *hh, short *mm, short *ss, short *ms, void *arg)
626 {
627  short tmp_s;
628  char *cur_p = (char *) arg + NET_SIZE_INT;
629 
630  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
631  *yr = ntohs (tmp_s);
632  cur_p += NET_SIZE_SHORT;
633  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
634  *mon = ntohs (tmp_s);
635  cur_p += NET_SIZE_SHORT;
636  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
637  *day = ntohs (tmp_s);
638  cur_p += NET_SIZE_SHORT;
639  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
640  *hh = ntohs (tmp_s);
641  cur_p += NET_SIZE_SHORT;
642  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
643  *mm = ntohs (tmp_s);
644  cur_p += NET_SIZE_SHORT;
645  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
646  *ss = ntohs (tmp_s);
647  cur_p += NET_SIZE_SHORT;
648  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
649  *ms = ntohs (tmp_s);
650  cur_p += NET_SIZE_SHORT;
651 }
652 
653 void
654 net_arg_get_datetimetz (short *yr, short *mon, short *day, short *hh, short *mm, short *ss, short *ms, char **tz,
655  int *tz_size, void *arg)
656 {
657  int tmp_i;
658  char *cur_p = (char *) arg;
659 
660  net_arg_get_datetime (yr, mon, day, hh, mm, ss, ms, arg);
661 
662  memcpy (&tmp_i, cur_p, NET_SIZE_INT);
663  *tz_size = ntohl (tmp_i) - NET_SIZE_DATETIME;
664  cur_p += NET_SIZE_INT + NET_SIZE_DATETIME;
665 
666  *tz = cur_p;
667 }
668 
669 void
670 net_arg_get_object (T_OBJECT * obj, void *arg)
671 {
672  int tmp_i;
673  short tmp_s;
674  char *cur_p = (char *) arg + NET_SIZE_INT;
675 
676  memcpy (&tmp_i, cur_p, NET_SIZE_INT);
677  obj->pageid = ntohl (tmp_i);
678  cur_p += NET_SIZE_INT;
679  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
680  obj->slotid = ntohs (tmp_s);
681  cur_p += NET_SIZE_SHORT;
682  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
683  obj->volid = ntohs (tmp_s);
684  cur_p += NET_SIZE_SHORT;
685 }
686 
687 void
688 net_arg_get_cache_time (void *ct, void *arg)
689 {
690  int tmp_i;
691  char *cur_p = (char *) arg + NET_SIZE_INT;
692  CACHE_TIME *cache_time = (CACHE_TIME *) ct;
693 
694  memcpy (&tmp_i, cur_p, NET_SIZE_INT);
695  cache_time->sec = ntohl (tmp_i);
696  cur_p += NET_SIZE_INT;
697  memcpy (&tmp_i, cur_p, NET_SIZE_INT);
698  cache_time->usec = ntohl (tmp_i);
699  cur_p += NET_SIZE_INT;
700 }
701 
702 #if !defined(CAS_FOR_ORACLE) && !defined(CAS_FOR_MYSQL)
703 void
704 net_arg_get_dbobject (DB_OBJECT ** obj, void *arg)
705 {
706  T_OBJECT cas_obj;
707  DB_IDENTIFIER oid;
708 
709  net_arg_get_object (&cas_obj, arg);
710  oid.pageid = cas_obj.pageid;
711  oid.volid = cas_obj.volid;
712  oid.slotid = cas_obj.slotid;
713  *obj = db_object (&oid);
714 }
715 
716 void
717 net_arg_get_cci_object (int *pageid, short *slotid, short *volid, void *arg)
718 {
719  int tmp_i;
720  short tmp_s;
721  char *cur_p = (char *) arg + NET_SIZE_INT;
722 
723  memcpy (&tmp_i, cur_p, NET_SIZE_INT);
724  *pageid = ntohl (tmp_i);
725  cur_p += NET_SIZE_INT;
726  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
727  *slotid = ntohs (tmp_s);
728  cur_p += NET_SIZE_SHORT;
729  memcpy (&tmp_s, cur_p, NET_SIZE_SHORT);
730  *volid = ntohs (tmp_s);
731  cur_p += NET_SIZE_SHORT;
732 }
733 
734 void
736 {
737  int tmp_i;
738  INT64 tmp_i64;
739  char *cur_p = (char *) arg + NET_SIZE_INT;
740 
741  memcpy (&tmp_i, cur_p, NET_SIZE_INT);
742  lob->db_type = ntohl (tmp_i);
743  cur_p += NET_SIZE_INT;
744  memcpy (&tmp_i64, cur_p, NET_SIZE_INT64);
745  lob->lob_size = ntohi64 (tmp_i64);
746  cur_p += NET_SIZE_INT64;
747  memcpy (&tmp_i, cur_p, NET_SIZE_INT);
748  lob->locator_size = ntohl (tmp_i);
749  cur_p += NET_SIZE_INT;
750  if (lob->locator_size <= 0)
751  {
752  lob->locator = NULL;
753  lob->locator_size = 0;
754  }
755  else
756  {
757  lob->locator = cur_p; /* null terminated */
758  }
759 }
760 
761 void
762 net_arg_get_lob_value (DB_VALUE * db_lob, void *arg)
763 {
764  T_LOB_HANDLE lob_handle;
765  DB_ELO elo;
766 
767  net_arg_get_lob_handle (&lob_handle, arg);
768  elo_init_structure (&elo);
769  elo.size = lob_handle.lob_size;
770  elo.type = ELO_FBO;
771  elo.locator = db_private_strdup (NULL, lob_handle.locator);
772  db_make_elo (db_lob, (DB_TYPE) lob_handle.db_type, &elo);
773  db_lob->need_clear = true;
774 }
775 #endif /* !CAS_FOR_ORACLE && !CAS_FOR_MYSQL */
776 
777 void
778 net_arg_put_int (void *arg, int *value)
779 {
780  int len;
781  int put_value;
782  char *cur_p;
783 
784  cur_p = (char *) (arg);
785  len = htonl (NET_SIZE_INT);
786  memcpy (cur_p, &len, NET_SIZE_INT);
787 
788  cur_p += NET_SIZE_INT;
789  put_value = htonl (*value);
790  memcpy (cur_p, &put_value, NET_SIZE_INT);
791 }
792 
793 
794 size_t
795 net_error_append_shard_info (char *err_buf, const char *err_msg, int buf_size)
796 {
797  assert (err_buf);
798 
799 #if !defined(LIBCAS_FOR_JSP) && !defined(CUB_PROXY)
800  if (cas_shard_flag == ON)
801  {
802  if (err_msg == NULL)
803  {
804  snprintf (err_buf, buf_size, "[SHARD/CAS ID-%d,%d]", shm_shard_id, shm_shard_cas_id + 1);
805  }
806  else if ((int) strlen (err_msg) + MAX_SHARD_INFO_LENGTH >= buf_size)
807  {
808  snprintf (err_buf, buf_size, "%s", err_msg);
809  }
810  else
811  {
812  snprintf (err_buf, buf_size, "%s [SHARD/CAS ID-%d,%d]", err_msg, shm_shard_id, shm_shard_cas_id + 1);
813  }
814  }
815  else
816 #endif /* !LIBCAS_FOR_JSP && !CUB_PROXY */
817  {
818  if (err_msg == NULL)
819  {
820  err_buf[0] = '\0';
821  return 0;
822  }
823  else
824  {
825  strncpy (err_buf, err_msg, buf_size - 1);
826  }
827  }
828 
829  err_buf[buf_size - 1] = '\0';
830 
831  return strlen (err_buf);
832 }
833 
834 /* net_buf_cp_cas_type_and_charset -
835  * sends the type information into a network buffer
836  * The cas_type is expected to be encoded by function
837  * 'set_extended_cas_type'. The network buffer bytes will
838  * be encoded as:
839  * MSB byte : 1CCR RHHH : C = collection code bits
840  * R = reserved bits
841  * H = charset
842  * (please note the bit 7 is 1)
843  * LSB byte : TTTT TTTT : T = type bits
844  */
845 int
846 net_buf_cp_cas_type_and_charset (T_NET_BUF * net_buf, unsigned char cas_type, unsigned char charset)
847 {
849  {
850  unsigned char cas_net_first_byte, cas_net_second_byte;
851 
852  if (NET_BUF_FREE_SIZE (net_buf) < NET_SIZE_SHORT && net_buf_realloc (net_buf, NET_SIZE_SHORT) < 0)
853  {
854  return CAS_ER_NO_MORE_MEMORY;
855  }
856 
857  cas_net_first_byte = cas_type & CCI_CODE_COLLECTION;
858  cas_net_first_byte |= CAS_TYPE_FIRST_BYTE_PROTOCOL_MASK;
859  cas_net_first_byte |= charset & 0x07;
860 
861  net_buf_cp_byte (net_buf, cas_net_first_byte);
862 
863  cas_net_second_byte = CCI_GET_COLLECTION_DOMAIN (cas_type);
864 
865  net_buf_cp_byte (net_buf, cas_net_second_byte);
866  }
867  else
868  {
869  if (NET_BUF_FREE_SIZE (net_buf) < NET_SIZE_BYTE && net_buf_realloc (net_buf, NET_SIZE_BYTE) < 0)
870  {
871  return CAS_ER_NO_MORE_MEMORY;
872  }
873 
874  assert (cas_type < 0x80);
875  net_buf_cp_byte (net_buf, cas_type);
876  }
877 
878  return 0;
879 }
static int net_buf_realloc(T_NET_BUF *net_buf, int size)
Definition: cas_net_buf.c:427
#define NET_SIZE_BYTE
Definition: cas_network.h:41
void net_arg_get_datetime(short *yr, short *mon, short *day, short *hh, short *mm, short *ss, short *ms, void *arg)
Definition: cas_net_buf.c:625
T_BROKER_VERSION client_version
Definition: cas_net_buf.h:100
#define ERR_MSG_LENGTH
Definition: cas.h:42
#define NO_ERROR
Definition: error_code.h:46
#define NET_SIZE_FLOAT
Definition: cas_network.h:44
void net_buf_error_msg_set(T_NET_BUF *net_buf, int err_indicator, int err_code, char *err_str, const char *file, int line)
Definition: cas_net_buf.c:277
void net_arg_get_datetimetz(short *yr, short *mon, short *day, short *hh, short *mm, short *ss, short *ms, char **tz, int *tz_size, void *arg)
Definition: cas_net_buf.c:654
int net_buf_cp_str(T_NET_BUF *net_buf, const char *buf, int size)
Definition: cas_net_buf.c:110
DB_OBJECT * db_object(DB_IDENTIFIER *oid)
Definition: db_admin.c:2641
#define CAS_CONV_ERROR_TO_OLD(V)
Definition: cas_protocol.h:301
unsigned int htonl(unsigned int from)
DB_TYPE
Definition: dbtype_def.h:670
#define net_ntohd(X)
Definition: cas_net_buf.h:64
T_BROKER_VERSION clt_version
Definition: broker_shm.h:303
#define NET_SIZE_DATETIME
Definition: cas_network.h:52
INT64 net_htoni64(INT64 from)
Definition: cas_net_buf.c:336
DB_ELO_TYPE type
Definition: dbtype_def.h:950
void net_arg_get_lob_handle(T_LOB_HANDLE *lob, void *arg)
Definition: cas_net_buf.c:735
#define MAX_SHARD_INFO_LENGTH
Definition: cas.h:44
#define CAS_TYPE_FIRST_BYTE_PROTOCOL_MASK
Definition: cas_protocol.h:314
void net_arg_get_cci_object(int *pageid, short *slotid, short *volid, void *arg)
Definition: cas_net_buf.c:717
#define CAS_MAKE_VER(MAJOR, MINOR, PATCH)
Definition: cas_protocol.h:304
int post_file_size
Definition: cas_net_buf.h:98
void net_buf_clear(T_NET_BUF *net_buf)
Definition: cas_net_buf.c:66
int net_buf_cp_float(T_NET_BUF *net_buf, float value)
Definition: cas_net_buf.c:199
int db_make_elo(DB_VALUE *value, DB_TYPE type, const DB_ELO *elo)
void net_arg_get_int(int *value, void *arg)
Definition: cas_net_buf.c:484
char * post_send_file
Definition: cas_net_buf.h:99
double net_htond(double from)
Definition: cas_net_buf.c:374
int net_buf_cp_cas_type_and_charset(T_NET_BUF *net_buf, unsigned char cas_type, unsigned char charset)
Definition: cas_net_buf.c:846
void net_buf_init(T_NET_BUF *net_buf, T_BROKER_VERSION client_version)
Definition: cas_net_buf.c:54
int net_buf_cp_int(T_NET_BUF *net_buf, int value, int *begin_offset)
Definition: cas_net_buf.c:126
void net_arg_get_timestamp(short *yr, short *mon, short *day, short *hh, short *mm, short *ss, void *arg)
Definition: cas_net_buf.c:582
int cas_shard_flag
Definition: cas.c:143
#define NET_SIZE_INT64
Definition: cas_network.h:46
#define DOES_CLIENT_MATCH_THE_PROTOCOL(CLIENT, MATCH)
Definition: cas_protocol.h:289
#define assert(x)
char driver_info[SRV_CON_CLIENT_INFO_SIZE]
Definition: broker_shm.h:304
void net_buf_overwrite_int(T_NET_BUF *net_buf, int offset, int value)
Definition: cas_net_buf.c:150
short volid
Definition: cas.h:53
char * db_private_strdup(THREAD_ENTRY *thrd, const char *s)
Definition: memory_alloc.c:675
int net_buf_cp_short(T_NET_BUF *net_buf, short value)
Definition: cas_net_buf.c:227
void net_arg_get_short(short *value, void *arg)
Definition: cas_net_buf.c:495
#define net_ntohf(X)
Definition: cas_net_buf.h:63
short slotid
Definition: cas.h:52
#define NET_BUF_FREE_SIZE(n)
Definition: cas_net_buf.h:81
void net_arg_get_time(short *hh, short *mm, short *ss, void *arg)
Definition: cas_net_buf.c:565
void net_arg_get_str(char **value, int *size, void *arg)
Definition: cas_net_buf.c:528
#define CAS_ERROR_INDICATOR
Definition: cas.h:39
char * data
Definition: cas_net_buf.h:96
#define NET_SIZE_BIGINT
Definition: cas_network.h:47
float net_htonf(float from)
Definition: cas_net_buf.c:357
#define NULL
Definition: freelistheap.h:34
Definition: cas.h:49
#define NET_SIZE_DOUBLE
Definition: cas_network.h:45
void net_buf_destroy(T_NET_BUF *net_buf)
Definition: cas_net_buf.c:75
unsigned short htons(unsigned short from)
void net_arg_get_lob_value(DB_VALUE *db_lob, void *arg)
Definition: cas_net_buf.c:762
void net_arg_get_bigint(DB_BIGINT *value, void *arg)
Definition: cas_net_buf.c:472
#define FREE_MEM(PTR)
Definition: cas_common.h:58
int db_type
Definition: cas.h:59
int data_size
Definition: cas_net_buf.h:95
void net_arg_get_size(int *size, void *arg)
Definition: cas_net_buf.c:451
need_clear_type need_clear
Definition: dbtype_def.h:1084
UINT64 ntohi64(UINT64 from)
void net_arg_get_cache_time(void *ct, void *arg)
Definition: cas_net_buf.c:688
int64_t DB_BIGINT
Definition: dbtype_def.h:751
int net_buf_cp_double(T_NET_BUF *net_buf, double value)
Definition: cas_net_buf.c:213
void net_arg_put_int(void *arg, int *value)
Definition: cas_net_buf.c:778
#define NET_BUF_HEADER_SIZE
Definition: cas_net_buf.h:78
int shm_shard_id
Definition: cas.c:144
int pageid
Definition: cas.h:51
unsigned short ntohs(unsigned short from)
#define NET_SIZE_TIMESTAMP
Definition: cas_network.h:51
char * locator
Definition: dbtype_def.h:948
#define strlen(s1)
Definition: intl_support.c:43
int alloc_size
Definition: cas_net_buf.h:94
int T_BROKER_VERSION
Definition: cas_protocol.h:342
int64_t size
Definition: dbtype_def.h:947
T_APPL_SERVER_INFO * as_info
Definition: cas.c:153
#define NET_SIZE_OBJECT
Definition: cas_network.h:50
#define DOES_CLIENT_UNDERSTAND_THE_PROTOCOL(CLIENT, REQUIRE)
Definition: cas_protocol.h:290
void elo_init_structure(DB_ELO *elo)
Definition: elo.c:127
#define ALLOC_COPY(PTR, STR)
Definition: cas_common.h:66
void net_arg_get_timestamptz(short *yr, short *mon, short *day, short *hh, short *mm, short *ss, char **tz, int *tz_size, void *arg)
Definition: cas_net_buf.c:608
#define NET_BUF_CURR_PTR(n)
Definition: cas_net_buf.h:83
bool cas_di_understand_renewed_error_code(const char *driver_info)
Definition: cas_meta.c:203
int locator_size
Definition: cas.h:61
#define NET_SIZE_SHORT
Definition: cas_network.h:42
char * locator
Definition: cas.h:62
#define NET_SIZE_INT
Definition: cas_network.h:43
void net_arg_get_object(T_OBJECT *obj, void *arg)
Definition: cas_net_buf.c:670
unsigned int ntohl(unsigned int from)
int net_buf_cp_lob_handle(T_NET_BUF *net_buf, T_LOB_HANDLE *lob)
Definition: cas_net_buf.c:256
void net_arg_get_dbobject(DB_OBJECT **obj, void *arg)
Definition: cas_net_buf.c:704
void net_arg_get_double(double *value, void *arg)
Definition: cas_net_buf.c:517
int net_buf_cp_bigint(T_NET_BUF *net_buf, DB_BIGINT value, int *begin_offset)
Definition: cas_net_buf.c:161
#define NET_BUF_EXTRA_SIZE
Definition: cas_net_buf.h:73
void net_arg_get_date(short *year, short *mon, short *day, void *arg)
Definition: cas_net_buf.c:548
int net_buf_cp_object(T_NET_BUF *net_buf, T_OBJECT *oid)
Definition: cas_net_buf.c:241
void net_arg_get_float(float *value, void *arg)
Definition: cas_net_buf.c:506
char * ut_trim(char *str)
int net_buf_cp_byte(T_NET_BUF *net_buf, char ch)
Definition: cas_net_buf.c:97
int err_code
Definition: cas_net_buf.h:97
const char ** p
Definition: dynamic_load.c:945
int net_buf_cp_post_send_file(T_NET_BUF *net_buf, int size, char *filename)
Definition: cas_net_buf.c:83
int shm_shard_cas_id
Definition: cas.c:155
size_t net_error_append_shard_info(char *err_buf, const char *err_msg, int buf_size)
Definition: cas_net_buf.c:795
#define REALLOC(PTR, SIZE)
Definition: cas_common.h:54
void net_buf_column_info_set(T_NET_BUF *net_buf, char ut, short scale, int prec, char charset, const char *name)
Definition: cas_net_buf.c:396
INT64 lob_size
Definition: cas.h:60