/* * Copyright (c) 2016 MariaDB Corporation Ab * * Use of this software is governed by the Business Source License included * in the LICENSE.TXT file and at www.mariadb.com/bsl. * * Change Date: 2019-07-01 * * On the date above, in accordance with the Business Source License, use * of this software will be governed by version 2 or later of the General * Public License. */ /* * File: rwsplit_internal.h * Author: mbrampton * * Created on 08 August 2016, 11:54 */ #ifndef RWSPLIT_INTERNAL_H #define RWSPLIT_INTERNAL_H #ifdef __cplusplus extern "C" { #endif #include /* This needs to be removed along with dependency on it - see the * rwsplit_tmp_table_multi functions */ #include /* * The following are implemented in rwsplit_mysql.c */ bool route_single_stmt(ROUTER_INSTANCE *inst, ROUTER_CLIENT_SES *rses, GWBUF *querybuf); void closed_session_reply(GWBUF *querybuf); void live_session_reply(GWBUF **querybuf, ROUTER_CLIENT_SES *rses); void print_error_packet(ROUTER_CLIENT_SES *rses, GWBUF *buf, DCB *dcb); void check_session_command_reply(GWBUF *writebuf, sescmd_cursor_t *scur, backend_ref_t *bref); bool execute_sescmd_in_backend(backend_ref_t *backend_ref); bool handle_target_is_all(route_target_t route_target, ROUTER_INSTANCE *inst, ROUTER_CLIENT_SES *rses, GWBUF *querybuf, int packet_type, qc_query_type_t qtype); int determine_packet_type(GWBUF *querybuf, bool *non_empty_packet); void log_transaction_status(ROUTER_CLIENT_SES *rses, GWBUF *querybuf, qc_query_type_t qtype); void session_lock_failure_handling(GWBUF *querybuf, int packet_type, qc_query_type_t qtype); bool is_packet_a_one_way_message(int packet_type); sescmd_cursor_t *backend_ref_get_sescmd_cursor(backend_ref_t *bref); bool is_packet_a_query(int packet_type); bool send_readonly_error(DCB *dcb); /* * The following are implemented in readwritesplit.c */ bool rses_begin_locked_router_action(ROUTER_CLIENT_SES *rses); void rses_end_locked_router_action(ROUTER_CLIENT_SES *rses); void bref_clear_state(backend_ref_t *bref, bref_state_t state); void bref_set_state(backend_ref_t *bref, bref_state_t state); int router_handle_state_switch(DCB *dcb, DCB_REASON reason, void *data); backend_ref_t *get_bref_from_dcb(ROUTER_CLIENT_SES *rses, DCB *dcb); void rses_property_done(rses_property_t *prop); int rses_get_max_slavecount(ROUTER_CLIENT_SES *rses, int router_nservers); int rses_get_max_replication_lag(ROUTER_CLIENT_SES *rses); /* * The following are implemented in rwsplit_route_stmt.c */ bool route_single_stmt(ROUTER_INSTANCE *inst, ROUTER_CLIENT_SES *rses, GWBUF *querybuf); int rwsplit_hashkeyfun(const void *key); int rwsplit_hashcmpfun(const void *v1, const void *v2); void *rwsplit_hstrdup(const void *fval); void rwsplit_hfree(void *fval); bool rwsplit_get_dcb(DCB **p_dcb, ROUTER_CLIENT_SES *rses, backend_type_t btype, char *name, int max_rlag); route_target_t get_route_target(ROUTER_CLIENT_SES *rses, qc_query_type_t qtype, HINT *hint); rses_property_t *rses_property_init(rses_property_type_t prop_type); int rses_property_add(ROUTER_CLIENT_SES *rses, rses_property_t *prop); void handle_multi_temp_and_load(ROUTER_CLIENT_SES *rses, GWBUF *querybuf, int packet_type, int *qtype); bool handle_hinted_target(ROUTER_CLIENT_SES *rses, GWBUF *querybuf, route_target_t route_target, DCB **target_dcb); bool handle_slave_is_target(ROUTER_INSTANCE *inst, ROUTER_CLIENT_SES *rses, DCB **target_dcb); bool handle_master_is_target(ROUTER_INSTANCE *inst, ROUTER_CLIENT_SES *rses, DCB **target_dcb); bool handle_got_target(ROUTER_INSTANCE *inst, ROUTER_CLIENT_SES *rses, GWBUF *querybuf, DCB *target_dcb); bool route_session_write(ROUTER_CLIENT_SES *router_cli_ses, GWBUF *querybuf, ROUTER_INSTANCE *inst, int packet_type, qc_query_type_t qtype); /* * The following are implemented in rwsplit_session_cmd.c */ mysql_sescmd_t *rses_property_get_sescmd(rses_property_t *prop); mysql_sescmd_t *mysql_sescmd_init(rses_property_t *rses_prop, GWBUF *sescmd_buf, unsigned char packet_type, ROUTER_CLIENT_SES *rses); void mysql_sescmd_done(mysql_sescmd_t *sescmd); mysql_sescmd_t *sescmd_cursor_get_command(sescmd_cursor_t *scur); bool sescmd_cursor_is_active(sescmd_cursor_t *sescmd_cursor); void sescmd_cursor_set_active(sescmd_cursor_t *sescmd_cursor, bool value); bool execute_sescmd_history(backend_ref_t *bref); GWBUF *sescmd_cursor_clone_querybuf(sescmd_cursor_t *scur); GWBUF *sescmd_cursor_process_replies(GWBUF *replybuf, backend_ref_t *bref, bool *reconnect); /* * The following are implemented in rwsplit_select_backends.c */ bool select_connect_backend_servers(backend_ref_t **p_master_ref, backend_ref_t *backend_ref, int router_nservers, int max_nslaves, int max_rlag, select_criteria_t select_criteria, SESSION *session, ROUTER_INSTANCE *router); /* * The following are implemented in rwsplit_tmp_table_multi.c */ void check_drop_tmp_table(ROUTER_CLIENT_SES *router_cli_ses, GWBUF *querybuf, mysql_server_cmd_t packet_type); qc_query_type_t is_read_tmp_table(ROUTER_CLIENT_SES *router_cli_ses, GWBUF *querybuf, qc_query_type_t type); void check_create_tmp_table(ROUTER_CLIENT_SES *router_cli_ses, GWBUF *querybuf, qc_query_type_t type); bool check_for_multi_stmt(GWBUF *buf, void *protocol, mysql_server_cmd_t packet_type); qc_query_type_t determine_query_type(GWBUF *querybuf, int packet_type, bool non_empty_packet); #ifdef __cplusplus } #endif #endif /* RWSPLIT_INTERNAL_H */