| 1 | /* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. |
| 2 | |
| 3 | This program is free software; you can redistribute it and/or modify |
| 4 | it under the terms of the GNU General Public License as published by |
| 5 | the Free Software Foundation; version 2 of the License. |
| 6 | |
| 7 | This program is distributed in the hope that it will be useful, |
| 8 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 9 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 10 | GNU General Public License for more details. |
| 11 | |
| 12 | You should have received a copy of the GNU General Public License |
| 13 | along with this program; if not, write to the Free Software |
| 14 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ |
| 15 | |
| 16 | #ifndef RPL_FILTER_H |
| 17 | #define RPL_FILTER_H |
| 18 | |
| 19 | #include "mysql.h" |
| 20 | #include "mysqld.h" |
| 21 | #include "sql_list.h" /* I_List */ |
| 22 | #include "hash.h" /* HASH */ |
| 23 | |
| 24 | class String; |
| 25 | struct TABLE_LIST; |
| 26 | typedef struct st_dynamic_array DYNAMIC_ARRAY; |
| 27 | |
| 28 | typedef struct st_table_rule_ent |
| 29 | { |
| 30 | char* db; |
| 31 | char* tbl_name; |
| 32 | uint key_len; |
| 33 | } TABLE_RULE_ENT; |
| 34 | |
| 35 | /* |
| 36 | Rpl_filter |
| 37 | |
| 38 | Inclusion and exclusion rules of tables and databases. |
| 39 | Also handles rewrites of db. |
| 40 | Used for replication and binlogging. |
| 41 | */ |
| 42 | class Rpl_filter |
| 43 | { |
| 44 | public: |
| 45 | Rpl_filter(); |
| 46 | ~Rpl_filter(); |
| 47 | Rpl_filter(Rpl_filter const&); |
| 48 | Rpl_filter& operator=(Rpl_filter const&); |
| 49 | |
| 50 | /* Checks - returns true if ok to replicate/log */ |
| 51 | |
| 52 | #ifndef MYSQL_CLIENT |
| 53 | bool tables_ok(const char* db, TABLE_LIST *tables); |
| 54 | #endif |
| 55 | bool db_ok(const char* db); |
| 56 | bool db_ok_with_wild_table(const char *db); |
| 57 | |
| 58 | bool is_on(); |
| 59 | |
| 60 | /* Setters - add filtering rules */ |
| 61 | |
| 62 | int add_do_table(const char* table_spec); |
| 63 | int add_ignore_table(const char* table_spec); |
| 64 | |
| 65 | int set_do_table(const char* table_spec); |
| 66 | int set_ignore_table(const char* table_spec); |
| 67 | |
| 68 | int add_wild_do_table(const char* table_spec); |
| 69 | int add_wild_ignore_table(const char* table_spec); |
| 70 | |
| 71 | int set_wild_do_table(const char* table_spec); |
| 72 | int set_wild_ignore_table(const char* table_spec); |
| 73 | |
| 74 | int add_do_db(const char* db_spec); |
| 75 | int add_ignore_db(const char* db_spec); |
| 76 | |
| 77 | int set_do_db(const char* db_spec); |
| 78 | int set_ignore_db(const char* db_spec); |
| 79 | |
| 80 | void set_parallel_mode(enum_slave_parallel_mode mode) |
| 81 | { |
| 82 | parallel_mode= mode; |
| 83 | } |
| 84 | /* Return given parallel mode or if one is not given, the default mode */ |
| 85 | enum_slave_parallel_mode get_parallel_mode() |
| 86 | { |
| 87 | return parallel_mode; |
| 88 | } |
| 89 | |
| 90 | void add_db_rewrite(const char* from_db, const char* to_db); |
| 91 | |
| 92 | /* Getters - to get information about current rules */ |
| 93 | |
| 94 | void get_do_table(String* str); |
| 95 | void get_ignore_table(String* str); |
| 96 | |
| 97 | void get_wild_do_table(String* str); |
| 98 | void get_wild_ignore_table(String* str); |
| 99 | |
| 100 | bool rewrite_db_is_empty(); |
| 101 | const char* get_rewrite_db(const char* db, size_t *new_len); |
| 102 | void copy_rewrite_db(Rpl_filter *from); |
| 103 | |
| 104 | I_List<i_string>* get_do_db(); |
| 105 | I_List<i_string>* get_ignore_db(); |
| 106 | |
| 107 | void get_do_db(String* str); |
| 108 | void get_ignore_db(String* str); |
| 109 | |
| 110 | private: |
| 111 | |
| 112 | void init_table_rule_hash(HASH* h, bool* h_inited); |
| 113 | void init_table_rule_array(DYNAMIC_ARRAY* a, bool* a_inited); |
| 114 | |
| 115 | int add_table_rule(HASH* h, const char* table_spec); |
| 116 | int add_wild_table_rule(DYNAMIC_ARRAY* a, const char* table_spec); |
| 117 | |
| 118 | typedef int (Rpl_filter::*Add_filter)(char const*); |
| 119 | |
| 120 | int parse_filter_rule(const char* spec, Add_filter func); |
| 121 | |
| 122 | void free_string_array(DYNAMIC_ARRAY *a); |
| 123 | void free_string_list(I_List<i_string> *l); |
| 124 | |
| 125 | void table_rule_ent_hash_to_str(String* s, HASH* h, bool inited); |
| 126 | void table_rule_ent_dynamic_array_to_str(String* s, DYNAMIC_ARRAY* a, |
| 127 | bool inited); |
| 128 | void db_rule_ent_list_to_str(String* s, I_List<i_string>* l); |
| 129 | TABLE_RULE_ENT* find_wild(DYNAMIC_ARRAY *a, const char* key, int len); |
| 130 | |
| 131 | int add_string_list(I_List<i_string> *list, const char* spec); |
| 132 | |
| 133 | /* |
| 134 | Those 4 structures below are uninitialized memory unless the |
| 135 | corresponding *_inited variables are "true". |
| 136 | */ |
| 137 | HASH do_table; |
| 138 | HASH ignore_table; |
| 139 | DYNAMIC_ARRAY wild_do_table; |
| 140 | DYNAMIC_ARRAY wild_ignore_table; |
| 141 | enum_slave_parallel_mode parallel_mode; |
| 142 | |
| 143 | bool table_rules_on; |
| 144 | bool do_table_inited; |
| 145 | bool ignore_table_inited; |
| 146 | bool wild_do_table_inited; |
| 147 | bool wild_ignore_table_inited; |
| 148 | |
| 149 | I_List<i_string> do_db; |
| 150 | I_List<i_string> ignore_db; |
| 151 | |
| 152 | I_List<i_string_pair> rewrite_db; |
| 153 | }; |
| 154 | |
| 155 | extern Rpl_filter *global_rpl_filter; |
| 156 | extern Rpl_filter *binlog_filter; |
| 157 | |
| 158 | #endif // RPL_FILTER_H |
| 159 | |