Skip to content

File cas_network.h

File List > broker > cas_network.h

Go to the documentation of this file

/*
 * Copyright 2008 Search Solution Corporation
 * Copyright 2016 CUBRID Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */


/*
 * cas_network.h -
 */

#ifndef _CAS_NETWORK_H_
#define _CAS_NETWORK_H_

#ident "$Id$"

#include <string.h>
#include "cas_net_buf.h"

#define NET_MIN_TIMEOUT     2
#define NET_DEFAULT_TIMEOUT 60
#define MYSQL_CONNECT_TIMEOUT   (5*60*60)   /* 5 hour. MySQL timeout = 8 hour */

#ifndef MIN
#define MIN(X, Y)   ((X) < (Y) ? (X) : (Y))
#endif

#define NET_ARG_GET_SIZE(SIZE, ARG)                     \
    do {                                            \
      int   tmp_i;                                  \
      memcpy(&tmp_i, (char*) (ARG), NET_SIZE_INT);      \
      SIZE = ntohl(tmp_i);                          \
    } while (0)

#define NET_ARG_GET_BIGINT(VALUE, ARG)                                     \
        do {                                                               \
          DB_BIGINT   tmp_i;                                               \
          memcpy(&tmp_i, (char*) (ARG) + NET_SIZE_INT, NET_SIZE_BIGINT);           \
          VALUE = ntohi64(tmp_i);                                          \
        } while (0)

#define NET_ARG_GET_INT(VALUE, ARG)                                        \
    do {                                                               \
      int   tmp_i;                                                     \
      memcpy(&tmp_i, (char*) (ARG) + NET_SIZE_INT, NET_SIZE_INT);              \
      VALUE = ntohl(tmp_i);                                            \
    } while (0)

#define NET_ARG_GET_SHORT(VALUE, ARG)                                      \
    do {                                                               \
      short tmp_s;                                         \
      memcpy(&tmp_s, (char*) (ARG) + NET_SIZE_INT, NET_SIZE_SHORT);            \
      VALUE = ntohs(tmp_s);                                            \
    } while (0)

#define NET_ARG_GET_FLOAT(VALUE, ARG)                                      \
    do {                                                               \
      float tmp_f;                                                     \
      memcpy(&tmp_f, (char*) (ARG) + NET_SIZE_INT, NET_SIZE_FLOAT);            \
      VALUE = net_ntohf(tmp_f);                                        \
    } while (0)

#define NET_ARG_GET_DOUBLE(VALUE, ARG)                                     \
    do {                                                               \
      double    tmp_d;                                             \
      memcpy(&tmp_d, (char*) (ARG) + NET_SIZE_INT, NET_SIZE_DOUBLE);           \
      VALUE = net_ntohd(tmp_d);                                        \
    } while (0)

#define NET_ARG_GET_CHAR(VALUE, ARG)                                       \
    do {                                                               \
      VALUE = (*((char*) (ARG) + NET_SIZE_INT));                           \
    } while (0)

#define NET_ARG_GET_STR(VALUE, SIZE, ARG)               \
    do {                                            \
      int   _size;                                  \
      char  *cur_p = (char*) ARG;                   \
      memcpy(&_size, cur_p, NET_SIZE_INT);              \
      _size = ntohl(_size);                         \
      cur_p += NET_SIZE_INT;                            \
      if (_size <= 0) {                             \
        VALUE = NULL;                               \
        SIZE = 0;                                   \
      } else {                                      \
        VALUE = ((char*) cur_p);                    \
        SIZE = _size;                               \
      }                                             \
    } while (0)

#define NET_ARG_GET_DATE(YEAR, MON, DAY, ARG)           \
    do {                                                \
      char      *cur_p = (char*) ARG;                   \
      short     tmp_s;                          \
      int           pos = NET_SIZE_INT;                         \
      memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);      \
      YEAR = ntohs(tmp_s);                              \
      pos += NET_SIZE_SHORT;                                    \
      memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);      \
      MON = ntohs(tmp_s);                               \
          pos += NET_SIZE_SHORT;                                    \
      memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);      \
      DAY = ntohs(tmp_s);                               \
    } while (0)

#define NET_ARG_GET_TIME(HH, MM, SS, ARG)                            \
    do {                                                         \
      char      *cur_p = (char*) ARG;                        \
      short     tmp_s;                               \
          int           pos = NET_SIZE_INT + NET_SIZE_SHORT * 3;             \
      memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);                   \
      HH = ntohs(tmp_s);                                         \
          pos += NET_SIZE_SHORT;                                         \
      memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);                   \
      MM = ntohs(tmp_s);                                         \
          pos += NET_SIZE_SHORT;                                         \
      memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);                   \
      SS = ntohs(tmp_s);                                         \
    } while (0)

#define NET_ARG_GET_TIMESTAMP(YR, MON, DAY, HH, MM, SS, ARG)         \
        do {                                                         \
          char          *cur_p = (char*) ARG;                        \
          short         tmp_s;                                       \
          int           pos = NET_SIZE_INT;                              \
          memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);                   \
          YR = ntohs(tmp_s);                                         \
          pos += NET_SIZE_SHORT;                                         \
          memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);                   \
          MON = ntohs(tmp_s);                                        \
          pos += NET_SIZE_SHORT;                                         \
          memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);                   \
          DAY = ntohs(tmp_s);                                        \
          pos += NET_SIZE_SHORT;                                         \
          memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);                   \
          HH = ntohs(tmp_s);                                         \
          pos += NET_SIZE_SHORT;                                         \
          memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);                   \
          MM = ntohs(tmp_s);                                         \
          pos += NET_SIZE_SHORT;                                         \
          memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);                   \
          SS = ntohs(tmp_s);                                         \
        } while (0)

#define NET_ARG_GET_DATETIME(YR, MON, DAY, HH, MM, SS, MS, ARG)      \
        do {                                                         \
          char          *cur_p = (char*) ARG;                        \
          short         tmp_s;                                       \
          int           pos = NET_SIZE_INT;                              \
          memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);                   \
          YR = ntohs(tmp_s);                                         \
          pos += NET_SIZE_SHORT;                                         \
          memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);                   \
          MON = ntohs(tmp_s);                                        \
          pos += NET_SIZE_SHORT;                                         \
          memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);                   \
          DAY = ntohs(tmp_s);                                        \
          pos += NET_SIZE_SHORT;                                         \
          memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);                   \
          HH = ntohs(tmp_s);                                         \
          pos += NET_SIZE_SHORT;                                         \
          memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);                   \
          MM = ntohs(tmp_s);                                         \
          pos += NET_SIZE_SHORT;                                         \
          memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);                   \
          SS = ntohs(tmp_s);                                         \
          pos += NET_SIZE_SHORT;                                         \
          memcpy(&tmp_s, cur_p + pos, NET_SIZE_SHORT);                   \
          MS = ntohs(tmp_s);                                         \
        } while (0)

#define NET_ARG_GET_OBJECT(VALUE, ARG)      \
    do {                    \
      char      *cur_p = (char*) ARG;   \
      int       pageid;         \
      short     slotid, volid;      \
      DB_IDENTIFIER tmp_oid;        \
      DB_OBJECT *tmp_obj;       \
      int           pos = NET_SIZE_INT;         \
      memcpy(&pageid, cur_p + pos, NET_SIZE_INT);\
      pageid = ntohl(pageid);       \
      pos += NET_SIZE_INT;                      \
      memcpy(&slotid, cur_p + pos, NET_SIZE_SHORT);\
      slotid = ntohs(slotid);       \
      pos += NET_SIZE_SHORT;                    \
          memcpy(&volid, cur_p + pos, NET_SIZE_SHORT);\
      volid = ntohs(volid);             \
      pos += NET_SIZE_SHORT;                    \
          tmp_oid.pageid = pageid;      \
      tmp_oid.slotid = slotid;      \
      tmp_oid.volid = volid;        \
      tmp_obj = db_object(&tmp_oid);    \
      VALUE = tmp_obj;          \
    } while (0)

#define NET_ARG_GET_CCI_OBJECT(PAGEID, SLOTID, VOLID, ARG)  \
    do {                            \
      char  *_macro_tmp_p = (char*) ARG;            \
      int   _tmp_pageid;                    \
      short _tmp_slotid, _tmp_volid;            \
      int           pos = NET_SIZE_INT;                         \
          memcpy(&_tmp_pageid, _macro_tmp_p + pos, NET_SIZE_INT);   \
      PAGEID = ntohl(_tmp_pageid);              \
      pos += NET_SIZE_INT;                                      \
      memcpy(&_tmp_slotid, _macro_tmp_p + pos, NET_SIZE_SHORT); \
      SLOTID = ntohs(_tmp_slotid);              \
      pos += NET_SIZE_SHORT;                                    \
          memcpy(&_tmp_volid, _macro_tmp_p + pos, NET_SIZE_SHORT);  \
      VOLID = ntohs(_tmp_volid);                \
    } while (0)

#define NET_ARG_GET_CACHE_TIME(CT, ARG)             \
        do {                                        \
          char *cur_p = (char*) ARG;                \
          int sec, usec;                            \
          int pos = NET_SIZE_INT;                       \
          memcpy(&sec, cur_p + pos, NET_SIZE_INT);      \
          pos += NET_SIZE_INT;                          \
          memcpy(&usec, cur_p + pos, NET_SIZE_INT);     \
          (CT)->sec = ntohl(sec);                   \
          (CT)->usec = ntohl(usec);                 \
        } while (0)


extern SOCKET
#if defined(WINDOWS)
  net_init_env (int *new_port);
#else
  net_init_env (char *port_name);
#endif

typedef struct
{
  int *msg_body_size_ptr;
  char *info_ptr;
  char buf[MSG_HEADER_SIZE];
} MSG_HEADER;

#if defined(WINDOWS)
extern SOCKET net_connect_proxy (int proxy_id);
#else /* WINDOWS */
extern SOCKET net_connect_proxy (void);
#endif /* !WINDOWS */
extern SOCKET net_connect_client (SOCKET srv_sock_fd);

extern int net_read_stream (SOCKET sock_fd, char *buf, int size);
extern int net_write_stream (SOCKET sock_fd, const char *buf, int size);
extern int net_write_int (SOCKET sock_fd, int value);
extern int net_read_int (SOCKET sock_fd, int *value);
extern int net_decode_str (char *msg, int msg_size, char *func_code, void ***ret_argv);

extern int net_read_to_file (SOCKET sock_fd, int file_size, char *filename);
extern int net_write_from_file (SOCKET sock_fd, int file_size, char *filename);

extern void net_timeout_set (int timeout_sec);
extern void init_msg_header (MSG_HEADER * header);
extern int net_read_header (SOCKET sock_fd, MSG_HEADER * header);
extern int net_write_header (SOCKET sock_fd, MSG_HEADER * header);
extern bool is_net_timed_out (void);

extern void net_write_error (SOCKET sock, int version, char *driver_info, char *cas_info, int cas_info_size,
                 int indicator, int code, const char *msg);
#endif /* _CAS_NETWORK_H_ */