123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442 |
- #ifndef MYSQL_SERVICE_COMMAND_INCLUDED
- #define MYSQL_SERVICE_COMMAND_INCLUDED
- /* Copyright (c) 2015, 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, version 2.0,
- as published by the Free Software Foundation.
- This program is also distributed with certain software (including
- but not limited to OpenSSL) that is licensed under separate terms,
- as designated in a particular file or component or in included license
- documentation. The authors of MySQL hereby grant you an additional
- permission to link the program and your derivative works with the
- separately licensed software that they have included with MySQL.
- 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, version 2.0, 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 */
- /**
- @file
- Header file for the Command service. This service is to provide means
- of executing different commands, like COM_QUERY, COM_STMT_PREPARE,
- in the server.
- */
- #include "mysql/service_srv_session.h"
- #include "mysql/com_data.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- #include "mysql_time.h"
- #include "decimal.h"
- #ifndef MYSQL_ABI_CHECK
- #include "m_ctype.h"
- #include <stdint.h> /* uint32_t */
- #endif
- /* POD structure for the field metadata from the server */
- struct st_send_field
- {
- const char *db_name;
- const char *table_name;
- const char *org_table_name;
- const char *col_name;
- const char *org_col_name;
- unsigned long length;
- unsigned int charsetnr;
- unsigned int flags;
- unsigned int decimals;
- enum_field_types type;
- };
- struct st_command_service_cbs
- {
- /*
- For a statement that returns a result, the flow of called callbacks will be:
- start_result_metadata()
- field_metadata()
- ....
- end_result_metadata() (in the classic protocol this generates an EOF packet)
- start_row()
- get_xxx()
- ...
- end_row()
- start_row()
- get_xxx()
- ...
- end_row()
- handle_ok() (with data for an EOF packet)
- For a statement that does NOT return a result, but only status, like
- INSERT, UPDATE, DELETE, REPLACE, TRUNCATE, CREATE, DROP, ALTER, etc. only
- handle_ok() will be invoked, in case of success.
- All statements that result in an error will invoke handle_error().
- For statements that return a result set, handle_error() might be invoked
- even after metadata was sent. This will indicate an error during the
- execution of the statement.
- */
- /*** Getting metadata ***/
- /**
- Indicates beginning of metadata for the result set
- @param ctx Plugin's context
- @param num_cols Number of fields being sent
- @param flags Flags to alter the metadata sending
- @param resultcs Charset of the result set
- @note resultcs is the charset in which the data should be encoded before
- sent to the client. This is the value of the session variable
- character_set_results. The implementor most probably will need to save
- this value in the context and use it as "to" charset in get_string().
- In case of CS_BINARY_REPRESENTATION, get_string() receives as a parameter
- the charset of the string, as it is stored on disk.
- In case of CS_TEXT_REPRESENTATION, the string value might be already a
- stringified value or non-string data, which is in character_set_results.
- @returns
- 1 an error occured, server will abort the command
- 0 ok
- */
- int (*start_result_metadata)(void *ctx, uint num_cols, uint flags,
- const CHARSET_INFO *resultcs);
- /**
- Field metadata is provided via this callback
- @param ctx Plugin's context
- @param field Field's metadata (see field.h)
- @param charset Field's charset
- @returns
- 1 an error occured, server will abort the command
- 0 ok
- */
- int (*field_metadata)(void *ctx, struct st_send_field *field,
- const CHARSET_INFO *charset);
- /**
- Indicates end of metadata for the result set
- @param ctx Plugin's context
- @param server_status Status of server (see mysql_com.h, SERVER_STATUS_*)
- @param warn_count Number of warnings generated during execution to the
- moment when the metadata is sent.
- @returns
- 1 an error occured, server will abort the command
- 0 ok
- */
- int (*end_result_metadata)(void *ctx, uint server_status,
- uint warn_count);
- /**
- Indicates the beginning of a new row in the result set/metadata
- @param ctx Plugin's context
- @returns
- 1 an error occured, server will abort the command
- 0 ok
- */
- int (*start_row)(void *ctx);
- /**
- Indicates the end of the current row in the result set/metadata
- @param ctx Plugin's context
- @returns
- 1 an error occured, server will abort the command
- 0 ok
- */
- int (*end_row)(void *ctx);
- /**
- An error occured during execution
- @details This callback indicates that an error occured during command
- execution and the partial row should be dropped. Server will raise error
- and return.
- @param ctx Plugin's context
- @returns
- true an error occured, server will abort the command
- false ok
- */
- void (*abort_row)(void *ctx);
- /**
- Return client's capabilities (see mysql_com.h, CLIENT_*)
- @param ctx Plugin's context
- @return Bitmap of client's capabilities
- */
- ulong (*get_client_capabilities)(void *ctx);
- /****** Getting data ******/
- /**
- Receive NULL value from server
- @param ctx Plugin's context
- @returns
- 1 an error occured, server will abort the command
- 0 ok
- */
- int (*get_null)(void * ctx);
- /**
- Receive TINY/SHORT/LONG value from server
- @param ctx Plugin's context
- @param value Value received
- @note In order to know which type exactly was received, the plugin must
- track the metadata that was sent just prior to the result set.
- @returns
- 1 an error occured, server will abort the command
- 0 ok
- */
- int (*get_integer)(void * ctx, longlong value);
- /**
- Get LONGLONG value from server
- @param ctx Plugin's context
- @param value Value received
- @param is_unsigned TRUE <=> value is unsigned
- @returns
- 1 an error occured, server will abort the command
- 0 ok
- */
- int (*get_longlong)(void * ctx, longlong value, uint is_unsigned);
- /**
- Receive DECIMAL value from server
- @param ctx Plugin's context
- @param value Value received
- @returns
- 1 an error occured, server will abort the command
- 0 ok
- */
- int (*get_decimal)(void * ctx, const decimal_t * value);
- /**
- Receive FLOAT/DOUBLE from server
- @param ctx Plugin's context
- @param value Value received
- @param decimals Number of decimals
- @note In order to know which type exactly was received, the plugin must
- track the metadata that was sent just prior to the result set.
- @returns
- 1 an error occured, server will abort the command
- 0 ok
- */
- int (*get_double)(void * ctx, double value, uint32_t decimals);
- /**
- Get DATE value from server
- @param ctx Plugin's context
- @param value Value received
- @returns
- 1 an error occured during storing, server will abort the command
- 0 ok
- */
- int (*get_date)(void * ctx, const MYSQL_TIME * value);
- /**
- Receive TIME value from server
- @param ctx Plugin's context
- @param value Value received
- @param decimals Number of decimals
- @returns
- 1 an error occured during storing, server will abort the command
- 0 ok
- */
- int (*get_time)(void * ctx, const MYSQL_TIME * value, uint decimals);
- /**
- Receive DATETIME value from server
- @param ctx Plugin's context
- @param value Value received
- @param decimals Number of decimals
- @returns
- 1 an error occured during storing, server will abort the command
- 0 ok
- */
- int (*get_datetime)(void * ctx, const MYSQL_TIME * value, uint decimals);
- /**
- Get STRING value from server
- @param ctx Plugin's context
- @param value Data
- @param length Data length
- @param valuecs Data charset
- @note In case of CS_BINARY_REPRESENTATION, get_string() receives as
- a parameter the charset of the string, as it is stored on disk.
- In case of CS_TEXT_REPRESENTATION, the string value might be already a
- stringified value or non-string data, which is in character_set_results.
- @see start_result_metadata()
- @returns
- 1 an error occured, server will abort the command
- 0 ok
- */
- int (*get_string)(void * ctx, const char * value, size_t length,
- const CHARSET_INFO * valuecs);
- /****** Getting execution status ******/
- /**
- Command ended with success
- @param ctx Plugin's context
- @param server_status Status of server (see mysql_com.h,
- SERVER_STATUS_*)
- @param statement_warn_count Number of warnings thrown during execution
- @param affected_rows Number of rows affected by the command
- @param last_insert_id Last insert id being assigned during execution
- @param message A message from server
- */
- void (*handle_ok)(void * ctx,
- uint server_status, uint statement_warn_count,
- ulonglong affected_rows, ulonglong last_insert_id,
- const char * message);
- /**
- Command ended with ERROR
- @param ctx Plugin's context
- @param sql_errno Error code
- @param err_msg Error message
- @param sqlstate SQL state correspongin to the error code
- */
- void (*handle_error)(void * ctx, uint sql_errno, const char * err_msg,
- const char * sqlstate);
- /**
- Callback for shutdown notification from the server.
- @param ctx Plugin's context
- @param server_shutdown Whether this is a normal connection shutdown (0) or
- server shutdown (1).
- */
- void (*shutdown)(void *ctx, int server_shutdown);
- };
- enum cs_text_or_binary
- {
- CS_TEXT_REPRESENTATION= 1, /* Let the server convert everything to string */
- CS_BINARY_REPRESENTATION= 2, /* Let the server use native types */
- };
- extern struct command_service_st {
- int (*run_command)(MYSQL_SESSION session,
- enum enum_server_command command,
- const union COM_DATA * data,
- const CHARSET_INFO * client_cs,
- const struct st_command_service_cbs * callbacks,
- enum cs_text_or_binary text_or_binary,
- void * service_callbacks_ctx);
- } *command_service;
- #ifdef MYSQL_DYNAMIC_PLUGIN
- #define command_service_run_command(t, command, data, cset, cbs, t_or_b, ctx) \
- command_service->run_command((t), (command), (data), (cset), \
- (cbs), (t_or_b), (ctx))
- #else
- /**
- Executes a server command in a session.
- There are two cases. Execution in a physical thread :
- 1. initialized by the srv_session service
- 2. NOT initialized by the srv_session service
- In case of 1, if there is currently attached session, and it is
- different from the passed one, the former will be automatically
- detached. The session to be used for the execution will then be
- attached. After the command is executed, the attached session will
- not be detached. It will be detached by a next call to run_command()
- with another session as parameter. In other words, for all sessions
- used in a physical thread, there will be at most one in attached
- state.
- In case of 2, the current state (current_thd) will be
- preserved. Then the given session will move to attached state and
- the command will be executed. After the execution the state of the
- session will be changed to detached and the preserved state
- (current_thd) will be restored.
- The client charset is used for commands like COM_QUERY and
- COM_STMT_PREPARE to know how to threat the char* fields. This
- charset will be used until the next call of run_command when it may
- be changed again.
- @param session The session
- @param command The command to be executed.
- @param data The data needed for the command to be executed
- @param client_cs The charset for the string data input(COM_QUERY for example)
- @param callbacks Callbacks to be used by the server to encode data and
- to communicate with the client (plugin) side.
- @param text_or_binary Select which representation the server will use for the
- data passed to the callbacks. For more information
- @see cs_text_or_binary enum
- @param service_callbacks_ctx Context passed to the command service callbacks
- @return
- 0 success
- 1 failure
- */
- int command_service_run_command(MYSQL_SESSION session,
- enum enum_server_command command,
- const union COM_DATA * data,
- const CHARSET_INFO * client_cs,
- const struct st_command_service_cbs * callbacks,
- enum cs_text_or_binary text_or_binary,
- void * service_callbacks_ctx);
- #endif /* MYSQL_DYNAMIC_PLUGIN */
- #ifdef __cplusplus
- }
- #endif
- #endif
|