mysql5/mysql-5.7.27/sql/sql_servers.h

262 lines
6.8 KiB
C++

#ifndef SQL_SERVERS_INCLUDED
#define SQL_SERVERS_INCLUDED
/* Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
#include "my_global.h" /* uint */
#include "sql_cmd.h"
#include "sql_string.h"
#include "sql_alloc.h"
class THD;
struct TABLE;
typedef struct st_mem_root MEM_ROOT;
class FOREIGN_SERVER : public Sql_alloc
{
public:
char *server_name;
long port;
size_t server_name_length;
char *db, *scheme, *username, *password, *socket, *owner, *host, *sport;
FOREIGN_SERVER()
: server_name(NULL), port(-1), server_name_length(0), db(NULL),
scheme(NULL), username(NULL), password(NULL), socket(NULL),
owner(NULL), host(NULL), sport(NULL)
{ }
};
/* cache handlers */
bool servers_init(bool dont_read_server_table);
bool servers_reload(THD *thd);
void servers_free(bool end=0);
/* lookup functions */
FOREIGN_SERVER *get_server_by_name(MEM_ROOT *mem, const char *server_name,
FOREIGN_SERVER *server_buffer);
/**
This class represent server options as set by the parser.
*/
class Server_options
{
public:
static const long PORT_NOT_SET= -1;
LEX_STRING m_server_name;
private:
long m_port;
LEX_STRING m_host;
LEX_STRING m_db;
LEX_STRING m_username;
LEX_STRING m_password;
LEX_STRING m_scheme;
LEX_STRING m_socket;
LEX_STRING m_owner;
public:
void set_port(long port) { m_port= port; }
void set_host(LEX_STRING host) { m_host= host; }
void set_db(LEX_STRING db) { m_db= db; }
void set_username(LEX_STRING username) { m_username= username; }
void set_password(LEX_STRING password) { m_password= password; }
void set_scheme(LEX_STRING scheme) { m_scheme= scheme; }
void set_socket(LEX_STRING socket) { m_socket= socket; }
void set_owner(LEX_STRING owner) { m_owner= owner; }
long get_port() const { return m_port; }
const char *get_host() const { return m_host.str; }
const char *get_db() const { return m_db.str; }
const char *get_username() const { return m_username.str; }
const char *get_password() const { return m_password.str; }
const char *get_scheme() const { return m_scheme.str; }
const char *get_socket() const { return m_socket.str; }
const char *get_owner() const { return m_owner.str; }
/**
Reset all strings to NULL and port to PORT_NOT_SET.
This prepares the structure for being used by a new statement.
*/
void reset();
/**
Create a cache entry and insert it into the cache.
@returns false if entry was created and inserted, true otherwise.
*/
bool insert_into_cache() const;
/**
Update a cache entry.
@param existing Cache entry to update
@returns false if the entry was updated, true otherwise.
*/
bool update_cache(FOREIGN_SERVER *existing) const;
/**
Create a record representing these server options,
ready to be inserted into the mysql.servers table.
@param table Table to be inserted into.
*/
void store_new_server(TABLE *table) const;
/**
Create a record for updating a row in the mysql.servers table.
@param table Table to be updated.
@param existing Cache entry represeting the existing values.
*/
void store_altered_server(TABLE *table, FOREIGN_SERVER *existing) const;
};
/**
This class has common code for CREATE/ALTER/DROP SERVER statements.
*/
class Sql_cmd_common_server : public Sql_cmd
{
protected:
TABLE *table;
Sql_cmd_common_server()
: table(NULL)
{ }
virtual ~Sql_cmd_common_server()
{ }
/**
Check permissions and open the mysql.servers table.
@param thd Thread context
@returns false if success, true otherwise
*/
bool check_and_open_table(THD *thd);
};
/**
This class implements the CREATE SERVER statement.
*/
class Sql_cmd_create_server : public Sql_cmd_common_server
{
/**
Server_options::m_server_name contains the name of the
server to create. The remaining Server_options fields
contain options as set by the parser.
Unset options are NULL (or PORT_NOT_SET for port).
*/
const Server_options *m_server_options;
public:
Sql_cmd_create_server(Server_options *server_options)
: Sql_cmd_common_server(), m_server_options(server_options)
{ }
enum_sql_command sql_command_code() const
{ return SQLCOM_CREATE_SERVER; }
/**
Create a new server by inserting a row into the
mysql.server table and creating a cache entry.
@param thd Thread context
@returns false if success, true otherwise
*/
bool execute(THD *thd);
};
/**
This class implements the ALTER SERVER statement.
*/
class Sql_cmd_alter_server : public Sql_cmd_common_server
{
/**
Server_options::m_server_name contains the name of the
server to change. The remaining Server_options fields
contain changed options as set by the parser.
Unchanged options are NULL (or PORT_NOT_SET for port).
*/
const Server_options *m_server_options;
public:
Sql_cmd_alter_server(Server_options *server_options)
: Sql_cmd_common_server(), m_server_options(server_options)
{ }
enum_sql_command sql_command_code() const
{ return SQLCOM_ALTER_SERVER; }
/**
Alter an existing server by updating the matching row in the
mysql.servers table and updating the cache entry.
@param thd Thread context
@returns false if success, true otherwise
*/
bool execute(THD *thd);
};
/**
This class implements the DROP SERVER statement.
*/
class Sql_cmd_drop_server : public Sql_cmd_common_server
{
/// Name of server to drop
LEX_STRING m_server_name;
/// Is this DROP IF EXISTS?
bool m_if_exists;
public:
Sql_cmd_drop_server(LEX_STRING server_name,
bool if_exists)
: Sql_cmd_common_server(),
m_server_name(server_name), m_if_exists(if_exists)
{ }
enum_sql_command sql_command_code() const
{ return SQLCOM_DROP_SERVER; }
/**
Drop an existing server by deleting the matching row from the
mysql.servers table and removing the cache entry.
@param thd Thread context
@returns false if success, true otherwise
*/
bool execute(THD *thd);
};
#endif /* SQL_SERVERS_INCLUDED */