38 #if defined (SUPPRESS_STRLEN_WARNING) 39 #define strlen(s1) ((int) strlen(s1)) 91 shard_Stmt.
lru = stmt_p;
94 shard_Stmt.
mru = stmt_p;
106 PROXY_DEBUG_LOG (
"Invalid statement lru list. " "(stmt_p:%p, lru:%p, mru:%p). " "statement(%s).", stmt_p,
143 return shard_Stmt.
lru;
154 PROXY_DEBUG_LOG (
"Invalid statement shard/CAS id. " "(shard_id:%d, cas_id:%d, max_num_shard:%d, " 155 "num_cas_per_shard:%d). statement(%s).", shard_id, cas_id, shard_Stmt.
max_num_shard,
174 if (srv_h_id_p ==
NULL)
179 return (*srv_h_id_p);
188 if (srv_h_id_p ==
NULL)
193 *srv_h_id_p = srv_h_id;
279 stmt_p = &(shard_Stmt.
stmt_ent[hash_res]);
397 "Failed to wakeup context by statement. " 398 "(error:%d, context id:%d, context uid:%d). statement(%s).", error, waiter_p->
ctx_cid,
504 for (i = 0; i < num_cas; i++)
669 for (i = 0; i < num_cas; i++)
702 "Unable to find saved statement handle id. " "(shard_id:%d, cas_id:%d). stmt(%s).", shard_id, cas_id,
740 "Unable to save statement handle id. " "(shard_id:%d, cas_id:%d, srv_h_id:%d). stmt(%s).", shard_id,
745 PROXY_DEBUG_LOG (
"save statement handle id. " "(shard_id:%d, cas_id:%d, srv_h_id:%d). statement(%s).", shard_id,
829 while (hint_p !=
NULL)
889 int *prepare_req_len,
char *argv_sql_stmt,
char *argv_remainder,
char *orgzd_sql)
892 int orgzd_sql_size, n_orgzd_sql_size;
897 char *prepare_req_header;
898 char *tmp_prepare_req;
902 prepare_req_header = *(prepare_req);
906 if (has_shard_val_hint ==
true)
909 orgzd_sql_size =
strlen (orgzd_sql) + 1;
911 if (sql_size >= orgzd_sql_size)
917 expand_size = orgzd_sql_size - sql_size;
921 if (expand_size == 0)
924 memcpy ((argv_sql_stmt +
NET_SIZE_INT), orgzd_sql, orgzd_sql_size);
928 stmt_p->
request_buffer = (
char *) malloc (req_msg_size + expand_size);
937 offset = argv_sql_stmt - prepare_req_header;
943 n_orgzd_sql_size =
htonl (orgzd_sql_size);
948 memcpy (cur_p, orgzd_sql, orgzd_sql_size);
951 cur_p += orgzd_sql_size;
952 remainder_size = (req_msg_size) - (argv_remainder - prepare_req_header);
953 memcpy (cur_p, argv_remainder, remainder_size);
960 if (tmp_prepare_req ==
NULL)
967 *prepare_req = tmp_prepare_req;
987 #if defined (PROXY_VERBOSE_DEBUG) 989 shard_stmt_dump_title (FILE * fp)
991 fprintf (fp,
"[%-10s][%-5s] %-10s %-2s %-10s %-10s %-10s\n",
"INDEX",
"NUSED",
"STMT_H_ID",
"ST",
"NUM_PINNED",
992 "LRU_NEXT",
"LRU_PREV");
1000 fprintf (fp,
"[%-10u][%-5u] %-10d %-2d %-10d %-10p %-10p\n", stmt_p->
index, stmt_p->
num_alloc, stmt_p->
stmt_h_id,
1007 shard_stmt_dump_all (FILE * fp)
1013 fprintf (fp,
"* %-20s : %d\n",
"MAX_NUM_STMT", shard_Stmt.
max_num_stmt);
1014 fprintf (fp,
"* %-20s : %d\n",
"MAX_NUM_SHARD", shard_Stmt.
max_num_shard);
1015 fprintf (fp,
"* %-20s : %d\n",
"NUM_CAS_PER_SHARD", shard_Stmt.
num_cas_per_shard);
1018 shard_stmt_dump_title (fp);
1022 shard_stmt_dump (fp, stmt_p);
1032 static char buffer[BUFSIZ];
1036 return (
char *)
"-";
1039 snprintf (buffer,
sizeof (buffer),
1040 "index:%u, num_alloc:%u, " "stmt_h_id:%d, status:%d, " "stmt_type:%d, " "context id:%d, context uid:%d, " 1041 "num pinned:%d, " "lru_next:%p, lru_prev:%p, " "hash_next:%p, hash_prev:%p, " "db_user:%s, sql_stmt:[%s]",
1047 return (
char *) buffer;
1059 static bool is_init =
false;
1074 "Not enough virtual memory. " "Failed to alloc statement entries. " "(errno:%d, size:%d).", errno,
1079 memset (shard_Stmt.
stmt_ent, 0, mem_size);
1113 stmt_p->
srv_h_id_ent = (
int *) malloc (num_cas *
sizeof (
int));
1117 "Not enough virtual memory. " "Failed to alloc statement handle id entries. " 1118 "(errno:%d, size:%d).", errno, mem_size);
1123 for (j = 0; j < num_cas; j++)
1136 const char *
p =
NULL;
1137 const char *next_p =
NULL;
1139 char *organized_sql_stmt =
NULL;
1144 int whitespace_count = 0;
1147 while (*sql_stmt && isspace (*sql_stmt))
1158 organized_sql_stmt = (
char *) malloc (
sizeof (
char) * (
strlen (sql_stmt) + 2));
1159 if (organized_sql_stmt ==
NULL)
1165 q = organized_sql_stmt;
1168 prev_token = curr_token =
TT_NONE;
1191 whitespace_count = 0;
1200 if (whitespace_count++ < 1)
1222 free (organized_sql_stmt);
1223 organized_sql_stmt =
NULL;
1240 free (organized_sql_stmt);
1241 organized_sql_stmt =
NULL;
1256 whitespace_count = 0;
1263 prev_token = curr_token;
1276 if (*(p) ==
'/' && *(p + 1) ==
'*' && *(p + 2) ==
'+')
1287 free (organized_sql_stmt);
1288 organized_sql_stmt =
NULL;
1293 *(has_shard_val_hint) =
true;
1310 return organized_sql_stmt;
1320 const char *key_column;
1321 int shard_key_id = -1;
1322 char shard_key_id_string[14];
1349 if (shard_key_id < 0)
1356 if (range_p ==
NULL)
1366 sprintf (shard_key_id_string,
"shard_id(%d)*/", range_p->
shard_id);
1384 for (; i < length; i++)
1389 *(sql_stmt++) = toupper (*(buf++));
1393 *(sql_stmt++) = *(buf++);
1396 *(sql_stmt++) = *(buf++);
1443 if (hash_stmt_p ==
NULL)
1467 const char *key =
NULL;
1475 if (hash_stmt_p ==
NULL)
1480 while (hash_stmt_p !=
NULL && stmt_p != hash_stmt_p)
1485 if (hash_stmt_p ==
NULL || stmt_p != hash_stmt_p)
static int shard_stmt_lru_insert(T_SHARD_STMT *stmt_p)
enum sp_hint_type SP_HINT_TYPE
void set_data_length(char *buffer, int length)
unsigned int mht_1strhash(const void *key, const unsigned int ht_size)
T_SHARD_INFO * shard_shm_find_shard_info(T_PROXY_INFO *proxy_info_p, int shard_id)
void sp_free_parser_hint(SP_PARSER_HINT *hint_p)
T_PROXY_CONTEXT * proxy_context_find(int cid, unsigned int uid)
void sp_destroy_parser(SP_PARSER_CTX *parser_p)
#define PROXY_DEBUG_LOG(fmt, args...)
#define CAS_PROTO_MAKE_VER(VER)
unsigned int htonl(unsigned int from)
char database_user[SRV_CON_DBUSER_SIZE]
int shard_stmt_unpin(T_SHARD_STMT *stmt_p)
static int shard_stmt_set_srv_h_id(T_SHARD_STMT *stmt_p, int shard_id, int cas_id, int srv_h_id)
T_SHARD_STMT_GLOBAL shard_Stmt
#define PROXY_INVALID_CONTEXT
int mht_rem(MHT_TABLE *ht, const void *key, int(*rem_func)(const void *key, void *data, void *args), void *func_args)
static int shard_stmt_find_srv_h_id(T_SHARD_STMT *stmt_p, int shard_id, int cas_id)
char database_user[SRV_CON_DBUSER_SIZE]
int get_msg_length(char *buffer)
void shard_stmt_destroy(void)
const void * mht_put(MHT_TABLE *ht, const void *key, void *data)
int shard_stmt_add_srv_h_id_for_shard_cas(int stmt_h_id, int shard_id, int cas_id, int srv_h_id)
static T_BROKER_VERSION shard_stmt_make_protocol_version(T_BROKER_VERSION client_version)
static T_SHARD_STMT * shard_stmt_get_lru(void)
static T_SHARD_STMT * shard_stmt_find_unused(void)
#define CAS_MAKE_VER(MAJOR, MINOR, PATCH)
T_PROXY_INFO * proxy_info_p
static char * shard_stmt_write_buf_to_sql(char *sql_stmt, const char *buf, int length, bool is_to_upper, char appl_server)
int request_buffer_length
T_SHARD_STMT * shard_stmt_new_schema_info(int ctx_cid, unsigned int ctx_uid)
char * shard_str_sqls(char *sql)
SP_PARSER_HINT * sp_get_first_hint(SP_PARSER_CTX *parser_p)
SP_PARSER_CTX * sp_create_parser(const char *sql_stmt)
const char * sp_check_end_of_hint(const char *sql, int *error)
static int shard_stmt_lru_delete(T_SHARD_STMT *stmt_p)
#define APPL_SERVER_CAS_MYSQL
void mht_destroy(MHT_TABLE *ht)
#define CAS_PROTO_CURRENT_VER
T_BROKER_VERSION client_version
T_SHARD_STMT * shard_stmt_new_prepared_stmt(char *sql_stmt, int ctx_cid, unsigned int ctx_uid, T_BROKER_VERSION client_version)
void shard_statement_wait_timer(void)
struct t_shard_stmt T_SHARD_STMT
const char * sp_get_token_type(const char *sql, SP_TOKEN *token)
int shard_Stmt_max_num_alloc
int shard_stmt_get_hint_type(T_SHARD_STMT *stmt_p)
bool sp_is_pair_token(SP_TOKEN start_token, SP_TOKEN end_token)
void net_arg_get_str(char **value, int *size, void *arg)
T_SHARD_STMT * shard_stmt_new_exclusive(char *sql_stmt, int ctx_cid, unsigned int ctx_uid, T_BROKER_VERSION client_version)
static int shard_stmt_change_shard_val_to_id(char **sql_stmt, const char **buf, char appl_server)
int shard_stmt_set_hint_list(T_SHARD_STMT *stmt_p)
void shard_stmt_set_status_invalid(int stmt_h_id)
void * mht_get(MHT_TABLE *ht, const void *key)
#define strncpy_bufsize(buf, str)
char * shard_str_stmt(T_SHARD_STMT *stmt_p)
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)
MHT_TABLE * mht_create(const char *name, int est_size, unsigned int(*hash_func)(const void *key, unsigned int ht_size), int(*cmp_func)(const void *key1, const void *key2))
char * proxy_dup_msg(char *msg)
int proxy_find_shard_id_by_hint_value(SP_VALUE *value_p, const char *key_column)
const char * sp_get_hint_arg(const char *sql, SP_PARSER_HINT *hint_p, int *error)
SP_PARSER_HINT * sp_create_parser_hint(void)
T_SHARD_STMT * shard_stmt_find_by_sql(char *sql_stmt, const char *db_user, T_BROKER_VERSION client_version)
char * shard_stmt_rewrite_sql(bool *has_shard_val_hint, char *sql_stmt, char appl_server)
static void error(const char *msg)
int shard_stmt_pin(T_SHARD_STMT *stmt_p)
static T_SHARD_STMT * shard_stmt_new_internal(int stmt_type, char *sql_stmt, int ctx_cid, unsigned int ctx_uid, T_BROKER_VERSION client_version)
void proxy_waiter_timeout(T_SHARD_QUEUE *waitq, INT64 *counter, int now)
T_SHARD_KEY shard_key[MAX_SHARD_KEY]
void shard_stmt_check_waiter_and_wakeup(T_SHARD_STMT *stmt_p)
void shard_queue_destroy(T_SHARD_QUEUE *q)
static int * shard_stmt_pos_srv_h_id(T_SHARD_STMT *stmt_p, int shard_id, int cas_id)
void shard_stmt_set_status_complete(int stmt_h_id)
void shard_stmt_del_all_srv_h_id_for_shard_cas(int shard_id, int cas_id)
#define PROXY_LOG(level, fmt, args...)
char key_column[SHARD_KEY_COLUMN_LEN]
static void shard_stmt_put_statement_to_map(const char *sql_stmt, T_SHARD_STMT *stmt_p)
#define SHARD_STMT_MAX_NUM_ALLOC
const char * sp_get_hint_type(const char *sql, SP_HINT_TYPE *hint_type)
void shard_stmt_free(T_SHARD_STMT *stmt_p)
static void shard_stmt_set_status(int stmt_h_id, int status)
void * shard_queue_dequeue(T_SHARD_QUEUE *q)
int shard_stmt_initialize(int initial_size)
bool sp_is_exist_pair_token(SP_TOKEN token)
int shard_queue_initialize(T_SHARD_QUEUE *q)
int shard_stmt_find_srv_h_id_for_shard_cas(int stmt_h_id, int shard_id, int cas_id)
T_SHARD_STMT * shard_stmt_find_by_stmt_h_id(int stmt_h_id)
int sp_parse_sql(SP_PARSER_CTX *parser_p)
const char * sp_get_sql_stmt(SP_PARSER_CTX *parser_p)
SP_PARSER_HINT * sp_get_next_hint(SP_PARSER_HINT *hint_p)
static void shard_stmt_del_statement_from_map(T_SHARD_STMT *stmt_p)
int mht_compare_strings_are_equal(const void *key1, const void *key2)
T_SHM_SHARD_KEY * shm_key_p
int proxy_wakeup_context_by_statement(T_WAIT_CONTEXT *waiter_p)
void shard_stmt_del_srv_h_id_for_shard_cas(int stmt_h_id, int shard_id, int cas_id)
#define SHARD_STMT_INVALID_HANDLE_ID