Skip to content

File shard_statement.h

File List > broker > shard_statement.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.
 *
 */


/*
 * shard_statement.h -
 *
 */

#ifndef _SHARD_STATEMENT_H_
#define _SHARD_STATEMENT_H_

#ident "$Id$"

#include "shard_parser.h"
#include "broker_config.h"
#include "shard_proxy_queue.h"
#include "cas_protocol.h"

#define SHARD_STMT_INVALID_HANDLE_ID    (-1)
#define SHARD_STMT_MAX_NUM_ALLOC    (8192)

enum
{
  SHARD_STMT_STATUS_UNUSED = 0,
  SHARD_STMT_STATUS_IN_PROGRESS = 1,
  SHARD_STMT_STATUS_COMPLETE = 2,
  SHARD_STMT_STATUS_INVALID = 3
};

enum
{
  SHARD_STMT_TYPE_PREPARED = 0,
  SHARD_STMT_TYPE_SCHEMA_INFO = 1,
  SHARD_STMT_TYPE_EXCLUSIVE = 2
};

typedef struct t_shard_stmt T_SHARD_STMT;
struct t_shard_stmt
{
  unsigned int index;
  unsigned int num_alloc;

  int stmt_h_id;        /* stmt handle id for client */
  int status;
  int stmt_type;

  T_BROKER_VERSION client_version;  /* client version */

  int ctx_cid;          /* owner context cid */
  unsigned int ctx_uid;     /* owner context uid */
  char database_user[SRV_CON_DBUSER_SIZE];

  int num_pinned;       /* pinned count */
  T_SHARD_STMT *lru_next;
  T_SHARD_STMT *lru_prev;
  T_SHARD_STMT *hash_next;
  T_SHARD_STMT *hash_prev;

  SP_PARSER_CTX *parser;    /* parser context */

  int request_buffer_length;
  void *request_buffer;     /* prepare request */
  int reply_buffer_length;
  void *reply_buffer;       /* prepare reply */

  T_SHARD_QUEUE waitq;

  int *srv_h_id_ent;
};

typedef struct t_shard_stmt_global T_SHARD_STMT_GLOBAL;
struct t_shard_stmt_global
{
  int max_num_stmt;

  int max_num_shard;
  int num_cas_per_shard;

  T_SHARD_STMT *lru;        /* head */
  T_SHARD_STMT *mru;        /* tail */

  T_SHARD_STMT *stmt_ent;

  MHT_TABLE *stmt_map;
};

extern T_SHARD_STMT *shard_stmt_find_by_sql (char *sql_stmt, const char *db_user, T_BROKER_VERSION client_version);
extern T_SHARD_STMT *shard_stmt_find_by_stmt_h_id (int stmt_h_id);
extern int shard_stmt_pin (T_SHARD_STMT * stmt_p);
extern int shard_stmt_unpin (T_SHARD_STMT * stmt_p);

extern void shard_stmt_check_waiter_and_wakeup (T_SHARD_STMT * stmt_p);

extern T_SHARD_STMT *shard_stmt_new_prepared_stmt (char *sql_stmt, int ctx_cid, unsigned int ctx_uid,
                           T_BROKER_VERSION client_version);
extern T_SHARD_STMT *shard_stmt_new_schema_info (int ctx_cid, unsigned int ctx_uid);
extern T_SHARD_STMT *shard_stmt_new_exclusive (char *sql_stmt, int ctx_cid, unsigned int ctx_uid,
                           T_BROKER_VERSION client_version);
extern void shard_stmt_free (T_SHARD_STMT * stmt_p);
extern void shard_stmt_destroy (void);
extern int shard_stmt_find_srv_h_id_for_shard_cas (int stmt_h_id, int shard_id, int cas_id);
extern int shard_stmt_add_srv_h_id_for_shard_cas (int stmt_h_id, int shard_id, int cas_id, int srv_h_id);
extern void shard_stmt_del_srv_h_id_for_shard_cas (int stmt_h_id, int shard_id, int cas_id);
extern void shard_stmt_del_all_srv_h_id_for_shard_cas (int shard_id, int cas_id);
extern int shard_stmt_set_hint_list (T_SHARD_STMT * stmt_p);
extern int shard_stmt_get_hint_type (T_SHARD_STMT * stmt_p);
extern int shard_stmt_save_prepare_request (T_SHARD_STMT * stmt_p, bool has_shard_val_hint, char **prepare_req,
                        int *prepare_req_len, char *argv_sql_stmt, char *argv_remainder,
                        char *orgzd_sql);
#if defined (PROXY_VERBOSE_DEBUG)
extern void shard_stmt_dump_title (FILE * fp);
extern void shard_stmt_dump (FILE * fp, T_SHARD_STMT * stmt_p);
extern void shard_stmt_dump_all (FILE * fp);
#endif /* PROXY_VERBOSE_DEBUG */
extern char *shard_str_stmt (T_SHARD_STMT * stmt_p);
extern int shard_stmt_initialize (int initial_size);
extern char *shard_stmt_rewrite_sql (bool * has_shard_val_hint, char *sql_stmt, char appl_server);

extern void shard_statement_wait_timer (void);
extern void shard_stmt_set_status_invalid (int stmt_h_id);
extern void shard_stmt_set_status_complete (int stmt_h_id);
#endif /* _SHARD_STATEMENT_H_ */