1 #ifndef SQL_SERVERS_INCLUDED
2 #define SQL_SERVERS_INCLUDED
3 
4 /* Copyright (c) 2006, 2019, Oracle and/or its affiliates. All rights reserved.
5 
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License, version 2.0,
8    as published by the Free Software Foundation.
9 
10    This program is also distributed with certain software (including
11    but not limited to OpenSSL) that is licensed under separate terms,
12    as designated in a particular file or component or in included license
13    documentation.  The authors of MySQL hereby grant you an additional
14    permission to link the program and your derivative works with the
15    separately licensed software that they have included with MySQL.
16 
17    This program is distributed in the hope that it will be useful,
18    but WITHOUT ANY WARRANTY; without even the implied warranty of
19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20    GNU General Public License, version 2.0, for more details.
21 
22    You should have received a copy of the GNU General Public License
23    along with this program; if not, write to the Free Software
24    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA */
25 
26 #include <stddef.h>
27 
28 #include "lex_string.h"
29 #include "my_sqlcommand.h"
30 #include "sql/sql_cmd.h"  // Sql_cmd
31 
32 class THD;
33 struct MEM_ROOT;
34 struct TABLE;
35 
36 class FOREIGN_SERVER {
37  public:
38   char *server_name;
39   long port;
40   size_t server_name_length;
41   char *db, *scheme, *username, *password, *socket, *owner, *host, *sport;
42 
FOREIGN_SERVER()43   FOREIGN_SERVER()
44       : server_name(nullptr),
45         port(-1),
46         server_name_length(0),
47         db(nullptr),
48         scheme(nullptr),
49         username(nullptr),
50         password(nullptr),
51         socket(nullptr),
52         owner(nullptr),
53         host(nullptr),
54         sport(nullptr) {}
55 };
56 
57 /* cache handlers */
58 bool servers_init(bool dont_read_server_table);
59 bool servers_reload(THD *thd);
60 void servers_free(bool end = false);
61 
62 /* lookup functions */
63 FOREIGN_SERVER *get_server_by_name(MEM_ROOT *mem, const char *server_name,
64                                    FOREIGN_SERVER *server_buffer);
65 
66 /**
67    This class represent server options as set by the parser.
68  */
69 
70 class Server_options {
71  public:
72   static const long PORT_NOT_SET = -1;
73   LEX_STRING m_server_name;
74 
75  private:
76   long m_port;
77   LEX_STRING m_host;
78   LEX_STRING m_db;
79   LEX_STRING m_username;
80   LEX_STRING m_password;
81   LEX_STRING m_scheme;
82   LEX_STRING m_socket;
83   LEX_STRING m_owner;
84 
85  public:
set_port(long port)86   void set_port(long port) { m_port = port; }
set_host(LEX_STRING host)87   void set_host(LEX_STRING host) { m_host = host; }
set_db(LEX_STRING db)88   void set_db(LEX_STRING db) { m_db = db; }
set_username(LEX_STRING username)89   void set_username(LEX_STRING username) { m_username = username; }
set_password(LEX_STRING password)90   void set_password(LEX_STRING password) { m_password = password; }
set_scheme(LEX_STRING scheme)91   void set_scheme(LEX_STRING scheme) { m_scheme = scheme; }
set_socket(LEX_STRING socket)92   void set_socket(LEX_STRING socket) { m_socket = socket; }
set_owner(LEX_STRING owner)93   void set_owner(LEX_STRING owner) { m_owner = owner; }
94 
get_port()95   long get_port() const { return m_port; }
get_host()96   const char *get_host() const { return m_host.str; }
get_db()97   const char *get_db() const { return m_db.str; }
get_username()98   const char *get_username() const { return m_username.str; }
get_password()99   const char *get_password() const { return m_password.str; }
get_scheme()100   const char *get_scheme() const { return m_scheme.str; }
get_socket()101   const char *get_socket() const { return m_socket.str; }
get_owner()102   const char *get_owner() const { return m_owner.str; }
103 
104   /**
105      Reset all strings to NULL and port to PORT_NOT_SET.
106      This prepares the structure for being used by a new statement.
107   */
108   void reset();
109 
110   /**
111      Create a cache entry and insert it into the cache.
112 
113      @returns false if entry was created and inserted, true otherwise.
114   */
115   bool insert_into_cache() const;
116 
117   /**
118      Update a cache entry.
119 
120      @param existing  Cache entry to update
121 
122      @returns false if the entry was updated, true otherwise.
123   */
124   bool update_cache(FOREIGN_SERVER *existing) const;
125 
126   /**
127      Create a record representing these server options,
128      ready to be inserted into the mysql.servers table.
129 
130      @param table  Table to be inserted into.
131   */
132   void store_new_server(TABLE *table) const;
133 
134   /**
135      Create a record for updating a row in the mysql.servers table.
136 
137      @param table     Table to be updated.
138      @param existing  Cache entry represeting the existing values.
139   */
140   void store_altered_server(TABLE *table, FOREIGN_SERVER *existing) const;
141 };
142 
143 /**
144    This class has common code for CREATE/ALTER/DROP SERVER statements.
145 */
146 
147 class Sql_cmd_common_server : public Sql_cmd {
148  protected:
149   TABLE *table;
150 
Sql_cmd_common_server()151   Sql_cmd_common_server() : table(nullptr) {}
152 
~Sql_cmd_common_server()153   virtual ~Sql_cmd_common_server() {}
154 
155   /**
156      Check permissions and open the mysql.servers table.
157 
158      @param thd  Thread context
159 
160      @returns false if success, true otherwise
161   */
162   bool check_and_open_table(THD *thd);
163 };
164 
165 /**
166    This class implements the CREATE SERVER statement.
167 */
168 
169 class Sql_cmd_create_server : public Sql_cmd_common_server {
170   /**
171      Server_options::m_server_name contains the name of the
172      server to create. The remaining Server_options fields
173      contain options as set by the parser.
174      Unset options are NULL (or PORT_NOT_SET for port).
175   */
176   const Server_options *m_server_options;
177 
178  public:
Sql_cmd_create_server(Server_options * server_options)179   Sql_cmd_create_server(Server_options *server_options)
180       : Sql_cmd_common_server(), m_server_options(server_options) {}
181 
sql_command_code()182   enum_sql_command sql_command_code() const { return SQLCOM_CREATE_SERVER; }
183 
184   /**
185      Create a new server by inserting a row into the
186      mysql.server table and creating a cache entry.
187 
188      @param thd  Thread context
189 
190      @returns false if success, true otherwise
191   */
192   bool execute(THD *thd);
193 };
194 
195 /**
196    This class implements the ALTER SERVER statement.
197 */
198 
199 class Sql_cmd_alter_server : public Sql_cmd_common_server {
200   /**
201      Server_options::m_server_name contains the name of the
202      server to change. The remaining Server_options fields
203      contain changed options as set by the parser.
204      Unchanged options are NULL (or PORT_NOT_SET for port).
205   */
206   const Server_options *m_server_options;
207 
208  public:
Sql_cmd_alter_server(Server_options * server_options)209   Sql_cmd_alter_server(Server_options *server_options)
210       : Sql_cmd_common_server(), m_server_options(server_options) {}
211 
sql_command_code()212   enum_sql_command sql_command_code() const { return SQLCOM_ALTER_SERVER; }
213 
214   /**
215      Alter an existing server by updating the matching row in the
216      mysql.servers table and updating the cache entry.
217 
218      @param thd  Thread context
219 
220      @returns false if success, true otherwise
221   */
222   bool execute(THD *thd);
223 };
224 
225 /**
226    This class implements the DROP SERVER statement.
227 */
228 
229 class Sql_cmd_drop_server : public Sql_cmd_common_server {
230   /// Name of server to drop
231   LEX_STRING m_server_name;
232 
233   /// Is this DROP IF EXISTS?
234   bool m_if_exists;
235 
236  public:
Sql_cmd_drop_server(LEX_STRING server_name,bool if_exists)237   Sql_cmd_drop_server(LEX_STRING server_name, bool if_exists)
238       : Sql_cmd_common_server(),
239         m_server_name(server_name),
240         m_if_exists(if_exists) {}
241 
sql_command_code()242   enum_sql_command sql_command_code() const { return SQLCOM_DROP_SERVER; }
243 
244   /**
245      Drop an existing server by deleting the matching row from the
246      mysql.servers table and removing the cache entry.
247 
248      @param thd  Thread context
249 
250      @returns false if success, true otherwise
251   */
252   bool execute(THD *thd);
253 };
254 
255 #endif /* SQL_SERVERS_INCLUDED */
256