Skip to content

File connection_sr.h

File List > connection > connection_sr.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.
 *
 */


/*
 * connection_sr.h - Client/Server Connection List Management
 */

#ifndef _CONNECTION_SR_H_
#define _CONNECTION_SR_H_

#ident "$Id$"

#include "connection_support.hpp"
#include "connection_list_sr.h"
#include "connection_defs.h"
#include "critical_section.h"
#include "error_manager.h"
#include "porting.h"
#include "thread_compat.hpp"

#include <assert.h>
#if !defined(WINDOWS)
#include <pthread.h>
#endif /* not WINDOWS */

#define IP_BYTE_COUNT 5

typedef struct ip_info IP_INFO;
struct ip_info
{
  unsigned char *address_list;
  int num_list;
};

extern CSS_CONN_ENTRY *css_Conn_array;
extern CSS_CONN_ENTRY *css_Active_conn_anchor;

extern SYNC_RWLOCK css_Rwlock_active_conn_anchor;

#define CSS_RWLOCK_ACTIVE_CONN_ANCHOR (&css_Rwlock_active_conn_anchor)
#define CSS_RWLOCK_ACTIVE_CONN_ANCHOR_NAME "CSS_RWLOCK_ACTIVE_CONN_ANCHOR"

#define START_EXCLUSIVE_ACCESS_ACTIVE_CONN_ANCHOR(r) \
  do \
    { \
      (r) = rwlock_write_lock (CSS_RWLOCK_ACTIVE_CONN_ANCHOR); \
      assert ((r) == NO_ERROR); \
    } \
  while (0)

#define END_EXCLUSIVE_ACCESS_ACTIVE_CONN_ANCHOR(r) \
  do \
    { \
      (r) = rwlock_write_unlock (CSS_RWLOCK_ACTIVE_CONN_ANCHOR); \
      assert ((r) == NO_ERROR); \
    } \
  while (0)

#define START_SHARED_ACCESS_ACTIVE_CONN_ANCHOR(r) \
  do \
    { \
      (r) = rwlock_read_lock (CSS_RWLOCK_ACTIVE_CONN_ANCHOR); \
      assert ((r) == NO_ERROR); \
    } \
  while (0)

#define END_SHARED_ACCESS_ACTIVE_CONN_ANCHOR(r) \
  do \
    { \
      (r) = rwlock_read_unlock (CSS_RWLOCK_ACTIVE_CONN_ANCHOR); \
      assert ((r) == NO_ERROR); \
    } \
  while (0)

extern SYNC_RWLOCK css_Rwlock_free_conn_anchor;

#define CSS_RWLOCK_FREE_CONN_ANCHOR (&css_Rwlock_free_conn_anchor)
#define CSS_RWLOCK_FREE_CONN_ANCHOR_NAME "CSS_RWLOCK_FREE_CONN_ANCHOR"

#define START_EXCLUSIVE_ACCESS_FREE_CONN_ANCHOR(r) \
  do \
    { \
      (r) = rwlock_write_lock (CSS_RWLOCK_FREE_CONN_ANCHOR); \
      assert ((r) == NO_ERROR); \
    } \
  while (0)

#define END_EXCLUSIVE_ACCESS_FREE_CONN_ANCHOR(r) \
  do \
    { \
      (r) = rwlock_write_unlock (CSS_RWLOCK_FREE_CONN_ANCHOR); \
      assert ((r) == NO_ERROR); \
    } \
  while (0)

#define START_SHARED_ACCESS_FREE_CONN_ANCHOR(r) \
  do \
    { \
      (r) = rwlock_read_lock (CSS_RWLOCK_FREE_CONN_ANCHOR); \
      assert ((r) == NO_ERROR); \
    } \
  while (0)

#define END_SHARED_ACCESS_FREE_CONN_ANCHOR(r) \
  do \
    { \
      (r) = rwlock_read_unlock (CSS_RWLOCK_FREE_CONN_ANCHOR); \
      assert ((r) == NO_ERROR); \
    } \
  while (0)

extern int css_Num_access_user;

#define CSS_LOG(msg_arg, ...) \
  if (prm_get_bool_value (PRM_ID_CONNECTION_LOGGING)) _er_log_debug (ARG_FILE_LINE, msg_arg "\n", __VA_ARGS__)
#define CSS_LOG_STACK(msg_arg, ...) \
  if (prm_get_bool_value (PRM_ID_CONNECTION_LOGGING)) er_print_callstack (ARG_FILE_LINE, msg_arg "\n", __VA_ARGS__)

extern int css_initialize_conn (CSS_CONN_ENTRY * conn, SOCKET fd);
extern void css_prepare_shutdown_conn (CSS_CONN_ENTRY * conn);
extern void css_shutdown_conn (CSS_CONN_ENTRY * conn);
extern int css_init_conn_list (void);
extern void css_final_conn_list (void);

extern CSS_CONN_ENTRY *css_make_conn (SOCKET fd);
extern void css_insert_into_active_conn_list (CSS_CONN_ENTRY * conn);

extern int css_get_num_free_conn (void);

extern int css_increment_num_conn (BOOT_CLIENT_TYPE client_type);
extern void css_decrement_num_conn (BOOT_CLIENT_TYPE client_type);

extern void css_free_conn (CSS_CONN_ENTRY * conn);
extern void css_print_conn_entry_info (CSS_CONN_ENTRY * p);
extern void css_print_conn_list (void);
extern void css_print_free_conn_list (void);
extern CSS_CONN_ENTRY *css_connect_to_master_server (int master_port_id, const char *server_name, int name_length);

extern CSS_CONN_ENTRY *css_find_conn_by_tran_index (int tran_index);
extern CSS_CONN_ENTRY *css_find_conn_from_fd (SOCKET fd);
extern int css_get_session_ids_for_active_connections (SESSION_ID ** ids, int *count);
extern int css_shutdown_conn_by_tran_index (int tran_index, int wait_time);

extern int css_read_header (CSS_CONN_ENTRY * conn, const NET_HEADER * local_header);
extern int css_receive_request (CSS_CONN_ENTRY * conn, unsigned short *rid, int *request, int *buffer_size);
extern int css_receive_data (CSS_CONN_ENTRY * conn, unsigned short req_id, char **buffer, int *buffer_size,
                 int timeout);

extern unsigned int css_return_eid_from_conn (CSS_CONN_ENTRY * conn, unsigned short rid);

extern int css_return_queued_data (CSS_CONN_ENTRY * conn, unsigned short rid, char **buffer, int *bufsize, int *rc);

extern int css_return_queued_error (CSS_CONN_ENTRY * conn, unsigned short request_id, char **buffer, int *buffer_size,
                    int *rc);
extern int css_return_queued_request (CSS_CONN_ENTRY * conn, unsigned short *rid, int *request, int *buffer_size);

extern void css_remove_unexpected_packets (CSS_CONN_ENTRY * conn, unsigned short request_id);
extern void css_remove_all_unexpected_packets (CSS_CONN_ENTRY * conn);
extern int css_queue_user_data_buffer (CSS_CONN_ENTRY * conn, unsigned short request_id, int size, char *buffer);
extern unsigned short css_get_request_id (CSS_CONN_ENTRY * conn);
extern int css_set_accessible_ip_info (void);
extern int css_free_accessible_ip_info (void);
extern int css_free_ip_info (IP_INFO * ip_info);
extern int css_read_ip_info (IP_INFO ** out_ip_info, char *filename);
extern int css_check_ip (IP_INFO * ip_info, unsigned char *address);

extern void css_set_user_access_status (const char *db_user, const char *host, const char *program_name);
extern void css_get_user_access_status (int num_user, LAST_ACCESS_STATUS ** access_status_array);
extern void css_free_user_access_status (void);

extern void css_set_exec_path (char *exec_path);
extern void css_set_argv (char **argv);

extern void css_process_abort_packet (CSS_CONN_ENTRY * conn, unsigned short request_id);
extern bool css_is_request_aborted (CSS_CONN_ENTRY * conn, unsigned short request_id);

extern css_error_code css_add_queue_entry (CSS_CONN_ENTRY * conn, CSS_LIST * list, unsigned short request_id,
                       char *buffer, int buffer_size, int rc, int transid, int invalidate_snapshot,
                       int db_error);
extern CSS_WAIT_QUEUE_ENTRY *css_find_and_remove_wait_queue_entry (CSS_LIST * list, unsigned int key);
extern void css_free_wait_queue_entry (CSS_CONN_ENTRY * conn, CSS_WAIT_QUEUE_ENTRY * entry);

extern char *css_get_exec_path (void);
extern char **css_get_argv (void);
extern void css_request_shutdown_conn (css_conn_entry * conn, uint8_t ignore, bool retry, int wait_time);
extern void css_request_release_packet (css_conn_entry * conn, void *buffer);
extern void css_wakeup_handler (css_conn_entry * conn);

#endif /* _CONNECTION_SR_H_ */