eaiovnaovbqoebvqoeavibavo PKp #endif struct _db_code_state_; typedef uint32 my_thread_id; C_MODE_START #ifdef _WIN32 typedef DWORD thread_local_key_t; #else typedef pthread_key_t thread_local_key_t; #endif static inline int my_create_thread_local_key(thread_local_key_t *key, void (*destructor)(void *)) { #ifdef _WIN32 *key= TlsAlloc(); return (*key == TLS_OUT_OF_INDEXES); #else return pthread_key_create(key, destructor); #endif } static inline int my_delete_thread_local_key(thread_local_key_t key) { #ifdef _WIN32 return !TlsFree(key); #else return pthread_key_delete(key); #endif } static inline void* my_get_thread_local(thread_local_key_t key) { #ifdef _WIN32 return TlsGetValue(key); #else return pthread_getspecific(key); #endif } static inline int my_set_thread_local(thread_local_key_t key, void *value) { #ifdef _WIN32 return !TlsSetValue(key, value); #else return pthread_setspecific(key, value); #endif } /** Retrieve the MySQL thread-local storage variant of errno. */ int my_errno(); /** Set the MySQL thread-local storage variant of errno. */ void set_my_errno(int my_errno); #ifdef _WIN32 /* thr_winerr is used for returning the original OS error-code in Windows, my_osmaperr() returns EINVAL for all unknown Windows errors, hence we preserve the original Windows Error code in thr_winerr. */ int thr_winerr(); void set_thr_winerr(int winerr); #endif #ifndef DBUG_OFF /* Return pointer to DBUG for holding current state */ struct _db_code_state_ **my_thread_var_dbug(); my_thread_id my_thread_var_id(); void set_my_thread_var_id(my_thread_id id); #endif C_MODE_END #endif // MY_THREAD_LOCAL_INCLUDED PKpquot. The fractional part is multiplied to 10^9 and stored to to->rem. @param from Decimal value @param to lldiv_t value @retval 0 on success @retval !0 in error */ int decimal2lldiv_t(const decimal_t *from, lldiv_t *to); /** Convert doube to lldiv_t. The integer part is stored in to->quot. The fractional part is multiplied to 10^9 and stored to to->rem. @param from Decimal value @param to lldiv_t value @retval 0 on success @retval !0 in error */ int double2lldiv_t(double from, lldiv_t *to); int decimal_size(int precision, int scale); int decimal_bin_size(int precision, int scale); int decimal_result_size(decimal_t *from1, decimal_t *from2, char op, int param); int decimal_intg(const decimal_t *from); int decimal_add(const decimal_t *from1, const decimal_t *from2, decimal_t *to); int decimal_sub(const decimal_t *from1, const decimal_t *from2, decimal_t *to); int decimal_cmp(const decimal_t *from1, const decimal_t *from2); int decimal_mul(const decimal_t *from1, const decimal_t *from2, decimal_t *to); int decimal_div(const decimal_t *from1, const decimal_t *from2, decimal_t *to, int scale_incr); int decimal_mod(const decimal_t *from1, const decimal_t *from2, decimal_t *to); int decimal_round(const decimal_t *from, decimal_t *to, int new_scale, decimal_round_mode mode); int decimal_is_zero(const decimal_t *from); void max_decimal(int precision, int frac, decimal_t *to); #define string2decimal(A,B,C) internal_str2dec((A), (B), (C), 0) #define string2decimal_fixed(A,B,C) internal_str2dec((A), (B), (C), 1) /* set a decimal_t to zero */ #define decimal_make_zero(dec) do { \ (dec)->buf[0]=0; \ (dec)->intg=1; \ (dec)->frac=0; \ (dec)->sign=0; \ } while(0) /* returns the length of the buffer to hold string representation of the decimal (including decimal dot, possible sign and \0) */ #define decimal_string_size(dec) (((dec)->intg ? (dec)->intg : 1) + \ (dec)->frac + ((dec)->frac > 0) + 2) /* conventions: decimal_smth() == 0 -- everything's ok decimal_smth() <= 1 -- result is usable, but precision loss is possible decimal_smth() <= 2 -- result can be unusable, most significant digits could've been lost decimal_smth() > 2 -- no result was generated */ #define E_DEC_OK 0 #define E_DEC_TRUNCATED 1 #define E_DEC_OVERFLOW 2 #define E_DEC_DIV_ZERO 4 #define E_DEC_BAD_NUM 8 #define E_DEC_OOM 16 #define E_DEC_ERROR 31 #define E_DEC_FATAL_ERROR 30 #endif // !MYSQL_ABI_CHECK #endif PKpmysql_key_iterator_init(&iterator_ptr); if (iterator_ptr == NULL) report error; while (!(plugin_handle->mysql_key_iterator_get_key(iterator_ptr, key_id, user_id))) { Fetch the keys. Perform operations on the fetched keys. .. } plugin_handle->mysql_key_iterator_deinit(iterator_ptr); init() method accepts a void pointer which is the made to point to Keys_iterator instance. Keys_iterator instance internal pointer points to Key_metadata list. This list holds information about all keys stored in the backed end data store of keyring plugin. After call to init() please check iterator_ptr. get_key() method accepts the above iterator_ptr as IN param and then fills the passes in key_id and user_id with valid values. This can be used to fetch actual key information. Every call to this method will change internal pointers to advance to next position, so that the next call will fetch the next key. deinit() method frees all internal pointers along with iterator_ptr. */ /** Initialize an iterator. @param[out] key_iterator Iterator used to fetch individual keys from key_container. @return VOID */ void (*mysql_key_iterator_init)(void** key_iterator); /** Deinitialize an iterator. @param[in] key_iterator Iterator used to fetch individual keys from key_container. @return VOID */ void (*mysql_key_iterator_deinit)(void* key_iterator); /** Get details of key. Every call to this service will change internal pointers to advance to next position, so that the next call will fetch the next key. In case iterator moves to the end, this service will return error. @param[in] key_iterator Iterator used to fetch individual keys from key_container. @param[out] key_id id of the key @param[out] user_id id of the owner @return Operation status @retval 0 OK @retval 1 ERROR */ bool (*mysql_key_iterator_get_key)(void* key_iterator, char *key_id, char *user_id); }; #endif PKp255 no short option is created, but a long option still can be identified uniquely in the my_get_one_option() callback. If an opton needs neither special treatment in the my_get_one_option() nor one-letter short equivalent use id=0. id=-1 is a special case and is used to generate deprecation warnings for plugin options. It should not be used for anything else. */ const char *comment; /**< option comment, for autom. --help. if it's NULL the option is not visible in --help. */ void *value; /**< A pointer to the variable value */ void *u_max_value; /**< The user def. max variable value */ struct st_typelib *typelib; /**< Pointer to possible values */ ulong var_type; /**< GET_BOOL, GET_ULL, etc */ enum get_opt_arg_type arg_type; /**< e.g. REQUIRED_ARG or OPT_ARG */ longlong def_value; /**< Default value */ longlong min_value; /**< Min allowed value (for numbers) */ ulonglong max_value; /**< Max allowed value (for numbers) */ longlong sub_size; /**< Unused */ long block_size; /**< Value should be a mult. of this (for numbers) */ void *app_type; /**< To be used by an application */ }; typedef my_bool (*my_get_one_option)(int, const struct my_option *, char *); /** Used to retrieve a reference to the object (variable) that holds the value for the given option. For example, if var_type is GET_UINT, the function must return a pointer to a variable of type uint. A argument is stored in the location pointed to by the returned pointer. */ typedef void *(*my_getopt_value)(const char *, size_t, const struct my_option *, int *); extern char *disabled_my_option; extern my_bool my_getopt_print_errors; extern my_bool my_getopt_skip_unknown; extern my_error_reporter my_getopt_error_reporter; extern int handle_options (int *argc, char ***argv, const struct my_option *longopts, my_get_one_option); extern int my_handle_options (int *argc, char ***argv, const struct my_option *longopts, my_get_one_option, const char **command_list, my_bool ignore_unknown_option); extern void print_cmdline_password_warning(); extern void my_cleanup_options(const struct my_option *options); extern void my_handle_options_end(); extern void my_cleanup_options(const struct my_option *options); extern void my_print_help(const struct my_option *options); extern void my_print_variables(const struct my_option *options); extern void my_print_variables_ex(const struct my_option *options, FILE* file); extern void my_getopt_register_get_addr(my_getopt_value); ulonglong getopt_ull_limit_value(ulonglong num, const struct my_option *optp, my_bool *fix); longlong getopt_ll_limit_value(longlong, const struct my_option *, my_bool *fix); double getopt_double_limit_value(double num, const struct my_option *optp, my_bool *fix); my_bool getopt_compare_strings(const char *s, const char *t, uint length); ulonglong max_of_int_range(int var_type); /* Get the specific range constraint for the value named. If you do not have the name length availa ble, specify 0. Specify 0 for 'create' to simply obtain the existong value or specify a size value to have the storage allocated if it does not yet exist. */ extern const void* getopt_constraint_get_max_value(const char *name, size_t length, size_t create); extern const void* getopt_constraint_get_min_value(const char *name, size_t length, size_t create); extern const my_bool* getopt_constraint_get_hidden_value(const char *name, size_t length, my_bool create); extern const my_bool* getopt_constraint_get_readonly_value(const char *name, size_t length, my_bool create); ulonglong getopt_double2ulonglong(double); double getopt_ulonglong2double(ulonglong); C_MODE_END #endif /* _my_getopt_h */ PKp #ifdef __cplusplus extern "C" { #endif /* Defines for my_dir and my_stat */ #ifdef _WIN32 #define S_IROTH _S_IREAD #define S_IFIFO _S_IFIFO #endif #define MY_S_IFMT S_IFMT /* type of file */ #define MY_S_IFDIR S_IFDIR /* directory */ #define MY_S_IFCHR S_IFCHR /* character special */ #define MY_S_IFBLK S_IFBLK /* block special */ #define MY_S_IFREG S_IFREG /* regular */ #define MY_S_IFIFO S_IFIFO /* fifo */ #define MY_S_IFSOCK S_IFSOCK /* socket */ #define MY_S_ISUID S_ISUID /* set user id on execution */ #define MY_S_ISGID S_ISGID /* set group id on execution */ #define MY_S_ISVTX S_ISVTX /* save swapped text even after use */ #define MY_S_IREAD S_IREAD /* read permission, owner */ #define MY_S_IWRITE S_IWRITE /* write permission, owner */ #define MY_S_IEXEC S_IEXEC /* execute/search permission, owner */ #define MY_S_ISDIR(m) (((m) & MY_S_IFMT) == MY_S_IFDIR) #define MY_S_ISCHR(m) (((m) & MY_S_IFMT) == MY_S_IFCHR) #define MY_S_ISBLK(m) (((m) & MY_S_IFMT) == MY_S_IFBLK) #define MY_S_ISREG(m) (((m) & MY_S_IFMT) == MY_S_IFREG) #define MY_S_ISFIFO(m) (((m) & MY_S_IFMT) == MY_S_IFIFO) #define MY_S_ISSOCK(m) (((m) & MY_S_IFMT) == MY_S_IFSOCK) #define MY_DONT_SORT 512 /* my_lib; Don't sort files */ #define MY_WANT_STAT 1024 /* my_lib; stat files */ /* typedefs for my_dir & my_stat */ #if(_MSC_VER) #define MY_STAT struct _stati64 /* 64 bit file size */ #else #define MY_STAT struct stat /* Orginal struct have what we need */ #endif /* Struct describing one file returned from my_dir */ typedef struct fileinfo { char *name; MY_STAT *mystat; } FILEINFO; typedef struct st_my_dir /* Struct returned from my_dir */ { /* These members are just copies of parts of DYNAMIC_ARRAY structure, which is allocated right after the end of MY_DIR structure (MEM_ROOT for storing names is also resides there). We've left them here because we don't want to change code that uses my_dir. */ struct fileinfo *dir_entry; uint number_off_files; } MY_DIR; extern MY_DIR *my_dir(const char *path,myf MyFlags); extern void my_dirend(MY_DIR *buffer); extern MY_STAT *my_stat(const char *path, MY_STAT *stat_area, myf my_flags); extern int my_fstat(int filenr, MY_STAT *stat_area, myf MyFlags); #ifdef __cplusplus } #endif #endif /* MY_DIR_H */ PKp static inline void float4get (float *V, const uchar *M) { memcpy(V, (M), sizeof(float)); } static inline void float4store(uchar *V, float M) { memcpy(V, (&M), sizeof(float)); } static inline void float8get (double *V, const uchar *M) { memcpy(V, M, sizeof(double)); } static inline void float8store(uchar *V, double M) { memcpy(V, &M, sizeof(double)); } static inline void floatget (float *V, const uchar *M) { float4get(V, M); } static inline void floatstore (uchar *V, float M) { float4store(V, M); } /* Bi-endian hardware.... */ #if defined(__FLOAT_WORD_ORDER) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN) static inline void doublestore(uchar *T, double V) { *(((char*)T)+0)=(char) ((uchar *) &V)[4]; *(((char*)T)+1)=(char) ((uchar *) &V)[5]; *(((char*)T)+2)=(char) ((uchar *) &V)[6]; *(((char*)T)+3)=(char) ((uchar *) &V)[7]; *(((char*)T)+4)=(char) ((uchar *) &V)[0]; *(((char*)T)+5)=(char) ((uchar *) &V)[1]; *(((char*)T)+6)=(char) ((uchar *) &V)[2]; *(((char*)T)+7)=(char) ((uchar *) &V)[3]; } static inline void doubleget(double *V, const uchar *M) { double def_temp; ((uchar*) &def_temp)[0]=(M)[4]; ((uchar*) &def_temp)[1]=(M)[5]; ((uchar*) &def_temp)[2]=(M)[6]; ((uchar*) &def_temp)[3]=(M)[7]; ((uchar*) &def_temp)[4]=(M)[0]; ((uchar*) &def_temp)[5]=(M)[1]; ((uchar*) &def_temp)[6]=(M)[2]; ((uchar*) &def_temp)[7]=(M)[3]; (*V) = def_temp; } #else /* Bi-endian hardware.... */ static inline void doublestore(uchar *T, double V) { memcpy(T, &V, sizeof(double)); } static inline void doubleget (double *V, const uchar *M) { memcpy(V, M, sizeof(double)); } #endif /* Bi-endian hardware.... */ static inline void ushortget(uint16 *V, const uchar *pM) { *V= uint2korr(pM); } static inline void shortget (int16 *V, const uchar *pM) { *V= sint2korr(pM); } static inline void longget (int32 *V, const uchar *pM) { *V= sint4korr(pM); } static inline void ulongget (uint32 *V, const uchar *pM) { *V= uint4korr(pM); } static inline void shortstore(uchar *T, int16 V) { int2store(T, V); } static inline void longstore (uchar *T, int32 V) { int4store(T, V); } static inline void longlongget(longlong *V, const uchar *M) { memcpy(V, (M), sizeof(ulonglong)); } static inline void longlongstore(uchar *T, longlong V) { memcpy((T), &V, sizeof(ulonglong)); } #endif /* LITTLE_ENDIAN_INCLUDED */ PKp= CR_ERROR_FIRST && (X) <= CR_ERROR_LAST)? \ client_errors[(X)-CR_ERROR_FIRST]: client_errors[CR_UNKNOWN_ERROR]) #endif #define CLIENT_ERRMAP 2 /* Errormap used by my_error() */ /* Do not add error numbers before CR_ERROR_FIRST. */ /* If necessary to add lower numbers, change CR_ERROR_FIRST accordingly. */ #define CR_ERROR_FIRST 2000 /*Copy first error nr.*/ #define CR_UNKNOWN_ERROR 2000 #define CR_SOCKET_CREATE_ERROR 2001 #define CR_CONNECTION_ERROR 2002 #define CR_CONN_HOST_ERROR 2003 #define CR_IPSOCK_ERROR 2004 #define CR_UNKNOWN_HOST 2005 #define CR_SERVER_GONE_ERROR 2006 #define CR_VERSION_ERROR 2007 #define CR_OUT_OF_MEMORY 2008 #define CR_WRONG_HOST_INFO 2009 #define CR_LOCALHOST_CONNECTION 2010 #define CR_TCP_CONNECTION 2011 #define CR_SERVER_HANDSHAKE_ERR 2012 #define CR_SERVER_LOST 2013 #define CR_COMMANDS_OUT_OF_SYNC 2014 #define CR_NAMEDPIPE_CONNECTION 2015 #define CR_NAMEDPIPEWAIT_ERROR 2016 #define CR_NAMEDPIPEOPEN_ERROR 2017 #define CR_NAMEDPIPESETSTATE_ERROR 2018 #define CR_CANT_READ_CHARSET 2019 #define CR_NET_PACKET_TOO_LARGE 2020 #define CR_EMBEDDED_CONNECTION 2021 #define CR_PROBE_SLAVE_STATUS 2022 #define CR_PROBE_SLAVE_HOSTS 2023 #define CR_PROBE_SLAVE_CONNECT 2024 #define CR_PROBE_MASTER_CONNECT 2025 #define CR_SSL_CONNECTION_ERROR 2026 #define CR_MALFORMED_PACKET 2027 #define CR_WRONG_LICENSE 2028 /* new 4.1 error codes */ #define CR_NULL_POINTER 2029 #define CR_NO_PREPARE_STMT 2030 #define CR_PARAMS_NOT_BOUND 2031 #define CR_DATA_TRUNCATED 2032 #define CR_NO_PARAMETERS_EXISTS 2033 #define CR_INVALID_PARAMETER_NO 2034 #define CR_INVALID_BUFFER_USE 2035 #define CR_UNSUPPORTED_PARAM_TYPE 2036 #define CR_SHARED_MEMORY_CONNECTION 2037 #define CR_SHARED_MEMORY_CONNECT_REQUEST_ERROR 2038 #define CR_SHARED_MEMORY_CONNECT_ANSWER_ERROR 2039 #define CR_SHARED_MEMORY_CONNECT_FILE_MAP_ERROR 2040 #define CR_SHARED_MEMORY_CONNECT_MAP_ERROR 2041 #define CR_SHARED_MEMORY_FILE_MAP_ERROR 2042 #define CR_SHARED_MEMORY_MAP_ERROR 2043 #define CR_SHARED_MEMORY_EVENT_ERROR 2044 #define CR_SHARED_MEMORY_CONNECT_ABANDONED_ERROR 2045 #define CR_SHARED_MEMORY_CONNECT_SET_ERROR 2046 #define CR_CONN_UNKNOW_PROTOCOL 2047 #define CR_INVALID_CONN_HANDLE 2048 #define CR_UNUSED_1 2049 #define CR_FETCH_CANCELED 2050 #define CR_NO_DATA 2051 #define CR_NO_STMT_METADATA 2052 #define CR_NO_RESULT_SET 2053 #define CR_NOT_IMPLEMENTED 2054 #define CR_SERVER_LOST_EXTENDED 2055 #define CR_STMT_CLOSED 2056 #define CR_NEW_STMT_METADATA 2057 #define CR_ALREADY_CONNECTED 2058 #define CR_AUTH_PLUGIN_CANNOT_LOAD 2059 #define CR_DUPLICATE_CONNECTION_ATTR 2060 #define CR_AUTH_PLUGIN_ERR 2061 #define CR_INSECURE_API_ERR 2062 #define CR_ERROR_LAST /*Copy last error nr:*/ 2062 /* Add error numbers before CR_ERROR_LAST and change it accordingly. */ #endif /* ERRMSG_INCLUDED */ PKp # include /* SOCKET */ # include /* access(), chmod() */ #endif #include #include #include #include #include #include #include #include #include #include /* Recommended by debian */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #if !defined(_WIN32) #include #endif #ifdef MY_MSCRT_DEBUG #include #endif /* A lot of our programs uses asserts, so better to always include it This also fixes a problem when people uses DBUG_ASSERT without including assert.h */ #include /* Include standard definitions of operator new and delete. */ #ifdef __cplusplus # include #endif #include "my_compiler.h" /* InnoDB depends on some MySQL internals which other plugins should not need. This is because of InnoDB's foreign key support, "safe" binlog truncation, and other similar legacy features. We define accessors for these internals unconditionally, but do not expose them in mysql/plugin.h. They are declared in ha_innodb.h for InnoDB's use. */ #define INNODB_COMPATIBILITY_HOOKS /* Macros to make switching between C and C++ mode easier */ #ifdef __cplusplus #define C_MODE_START extern "C" { #define C_MODE_END } #else #define C_MODE_START #define C_MODE_END #endif #ifdef WITH_PERFSCHEMA_STORAGE_ENGINE #define HAVE_PSI_INTERFACE #endif /* WITH_PERFSCHEMA_STORAGE_ENGINE */ /* Make it easier to add conditional code in _expressions_ */ #ifdef _WIN32 #define IF_WIN(A,B) A #else #define IF_WIN(A,B) B #endif #if defined (_WIN32) /* off_t is 32 bit long. We do not use C runtime functions with off_t but native Win32 file IO APIs, that work with 64 bit offsets. */ #undef SIZEOF_OFF_T #define SIZEOF_OFF_T 8 static inline void sleep(unsigned long seconds) { Sleep(seconds * 1000); } /* Define missing access() modes. */ #define F_OK 0 #define W_OK 2 #define R_OK 4 /* Test for read permission. */ /* Define missing file locking constants. */ #define F_RDLCK 1 #define F_WRLCK 2 #define F_UNLCK 3 #define F_TO_EOF 0x3FFFFFFF #define O_NONBLOCK 1 /* For emulation of fcntl() */ /* SHUT_RDWR is called SD_BOTH in windows and is defined to 2 in winsock2.h #define SD_BOTH 0x02 */ #define SHUT_RDWR 0x02 /* Shared memory and named pipe connections are supported. */ #define shared_memory_buffer_length 16000 #define default_shared_memory_base_name "MYSQL" #endif /* _WIN32*/ /** Cast a member of a structure to the structure that contains it. @param ptr Pointer to the member. @param type Type of the structure that contains the member. @param member Name of the member within the structure. */ #define my_container_of(ptr, type, member) \ ((type *)((char *)ptr - offsetof(type, member))) /* an assert that works at compile-time. only for constant expression */ #define compile_time_assert(X) \ do \ { \ typedef char compile_time_assert[(X) ? 1 : -1] MY_ATTRIBUTE((unused)); \ } while(0) #define QUOTE_ARG(x) #x /* Quote argument (before cpp) */ #define STRINGIFY_ARG(x) QUOTE_ARG(x) /* Quote argument, after cpp */ #ifdef _WIN32 #define SO_EXT ".dll" #elif defined(__APPLE__) #define SO_EXT ".dylib" #else #define SO_EXT ".so" #endif #if !defined(HAVE_UINT) typedef unsigned int uint; typedef unsigned short ushort; #endif #define swap_variables(t, a, b) { t dummy; dummy= a; a= b; b= dummy; } #define MY_TEST(a) ((a) ? 1 : 0) #define set_if_bigger(a,b) do { if ((a) < (b)) (a)=(b); } while(0) #define set_if_smaller(a,b) do { if ((a) > (b)) (a)=(b); } while(0) #define test_all_bits(a,b) (((a) & (b)) == (b)) #define array_elements(A) ((uint) (sizeof(A)/sizeof(A[0]))) /* Define some general constants */ #ifndef TRUE #define TRUE (1) /* Logical true */ #define FALSE (0) /* Logical false */ #endif /* Some types that is different between systems */ typedef int File; /* File descriptor */ #ifdef _WIN32 typedef SOCKET my_socket; #else typedef int my_socket; /* File descriptor for sockets */ #define INVALID_SOCKET -1 #endif C_MODE_START typedef void (*sig_return)();/* Returns type from signal */ C_MODE_END #if defined(__GNUC__) typedef char pchar; /* Mixed prototypes can take char */ typedef char pbool; /* Mixed prototypes can take char */ #else typedef int pchar; /* Mixed prototypes can't take char */ typedef int pbool; /* Mixed prototypes can't take char */ #endif C_MODE_START typedef int (*qsort_cmp)(const void *,const void *); typedef int (*qsort_cmp2)(const void*, const void *,const void *); C_MODE_END #ifdef _WIN32 typedef int socket_len_t; typedef int sigset_t; typedef int mode_t; typedef SSIZE_T ssize_t; #else typedef socklen_t socket_len_t; #endif typedef socket_len_t SOCKET_SIZE_TYPE; /* Used by NDB */ /* file create flags */ #ifndef O_SHARE /* Probably not windows */ #define O_SHARE 0 /* Flag to my_open for shared files */ #ifndef O_BINARY #define O_BINARY 0 /* Flag to my_open for binary files */ #endif #ifndef FILE_BINARY #define FILE_BINARY O_BINARY /* Flag to my_fopen for binary streams */ #endif #ifdef HAVE_FCNTL #define HAVE_FCNTL_LOCK #define F_TO_EOF 0L /* Param to lockf() to lock rest of file */ #endif #endif /* O_SHARE */ #ifndef O_TEMPORARY #define O_TEMPORARY 0 #endif #ifndef O_SHORT_LIVED #define O_SHORT_LIVED 0 #endif #ifndef O_NOFOLLOW #define O_NOFOLLOW 0 #endif /* additional file share flags for win32 */ #ifdef _WIN32 #define _SH_DENYRWD 0x110 /* deny read/write mode & delete */ #define _SH_DENYWRD 0x120 /* deny write mode & delete */ #define _SH_DENYRDD 0x130 /* deny read mode & delete */ #define _SH_DENYDEL 0x140 /* deny delete only */ #endif /* _WIN32 */ /* General constants */ #define FN_LEN 256 /* Max file name len */ #define FN_HEADLEN 253 /* Max length of filepart of file name */ #define FN_EXTLEN 20 /* Max length of extension (part of FN_LEN) */ #define FN_REFLEN 512 /* Max length of full path-name */ #define FN_REFLEN_SE 4000 /* Max length of full path-name in SE */ #define FN_EXTCHAR '.' #define FN_HOMELIB '~' /* ~/ is used as abbrev for home dir */ #define FN_CURLIB '.' /* ./ is used as abbrev for current dir */ #define FN_PARENTDIR ".." /* Parent directory; Must be a string */ #ifdef _WIN32 #define FN_LIBCHAR '\\' #define FN_LIBCHAR2 '/' #define FN_DIRSEP "/\\" /* Valid directory separators */ #define FN_EXEEXT ".exe" #define FN_SOEXT ".dll" #define FN_ROOTDIR "\\" #define FN_DEVCHAR ':' #define FN_NETWORK_DRIVES /* Uses \\ to indicate network drives */ #else #define FN_LIBCHAR '/' /* FN_LIBCHAR2 is not defined on !Windows. Use is_directory_separator(). */ #define FN_DIRSEP "/" /* Valid directory separators */ #define FN_EXEEXT "" #define FN_SOEXT ".so" #define FN_ROOTDIR "/" #endif static inline int is_directory_separator(char c) { #ifdef _WIN32 return c == FN_LIBCHAR || c == FN_LIBCHAR2; #else return c == FN_LIBCHAR; #endif } /* MY_FILE_MIN is Windows speciality and is used to quickly detect the mismatch of CRT and mysys file IO usage on Windows at runtime. CRT file descriptors can be in the range 0-2047, whereas descriptors returned by my_open() will start with 2048. If a file descriptor with value less then MY_FILE_MIN is passed to mysys IO function, chances are it stemms from open()/fileno() and not my_open()/my_fileno. For Posix, mysys functions are light wrappers around libc, and MY_FILE_MIN is logically 0. */ #ifdef _WIN32 #define MY_FILE_MIN 2048 #else #define MY_FILE_MIN 0 #endif /* MY_NFILE is the default size of my_file_info array. It is larger on Windows, because it all file handles are stored in my_file_info Default size is 16384 and this should be enough for most cases.If it is not enough, --max-open-files with larger value can be used. For Posix , my_file_info array is only used to store filenames for error reporting and its size is not a limitation for number of open files. */ #ifdef _WIN32 #define MY_NFILE (16384 + MY_FILE_MIN) #else #define MY_NFILE 64 #endif #define OS_FILE_LIMIT UINT_MAX /* Io buffer size; Must be a power of 2 and a multiple of 512. May be smaller what the disk page size. This influences the speed of the isam btree library. eg to big to slow. */ #define IO_SIZE 4096 /* How much overhead does malloc have. The code often allocates something like 1024-MALLOC_OVERHEAD bytes */ #define MALLOC_OVERHEAD 8 /* get memory in huncs */ #define ONCE_ALLOC_INIT (uint) (4096-MALLOC_OVERHEAD) /* Typical record cash */ #define RECORD_CACHE_SIZE (uint) (64*1024-MALLOC_OVERHEAD) /* Typical key cash */ #define KEY_CACHE_SIZE (uint) (8*1024*1024) /* Default size of a key cache block */ #define KEY_CACHE_BLOCK_SIZE (uint) 1024 /* Some defines of functions for portability */ #if (_WIN32) #if !defined(_WIN64) inline double my_ulonglong2double(unsigned long long value) { long long nr=(long long) value; if (nr >= 0) return (double) nr; return (18446744073709551616.0 + (double) nr); } #define ulonglong2double my_ulonglong2double #define my_off_t2double my_ulonglong2double #endif /* _WIN64 */ inline unsigned long long my_double2ulonglong(double d) { double t= d - (double) 0x8000000000000000ULL; if (t >= 0) return ((unsigned long long) t) + 0x8000000000000000ULL; return (unsigned long long) d; } #define double2ulonglong my_double2ulonglong #endif /* _WIN32 */ #ifndef ulonglong2double #define ulonglong2double(A) ((double) (ulonglong) (A)) #define my_off_t2double(A) ((double) (my_off_t) (A)) #endif #ifndef double2ulonglong #define double2ulonglong(A) ((ulonglong) (double) (A)) #endif #define INT_MIN64 (~0x7FFFFFFFFFFFFFFFLL) #define INT_MAX64 0x7FFFFFFFFFFFFFFFLL #define INT_MIN32 (~0x7FFFFFFFL) #define INT_MAX32 0x7FFFFFFFL #define UINT_MAX32 0xFFFFFFFFL #define INT_MIN24 (~0x007FFFFF) #define INT_MAX24 0x007FFFFF #define UINT_MAX24 0x00FFFFFF #define INT_MIN16 (~0x7FFF) #define INT_MAX16 0x7FFF #define UINT_MAX16 0xFFFF #define INT_MIN8 (~0x7F) #define INT_MAX8 0x7F #define UINT_MAX8 0xFF #ifndef SIZE_T_MAX #define SIZE_T_MAX (~((size_t) 0)) #endif // Our ifdef trickery for my_isfinite does not work with gcc/solaris unless we: #ifdef HAVE_IEEEFP_H #include #endif #if (__cplusplus >= 201103L) /* For C++11 use the new std functions rather than C99 macros. */ #include #define my_isfinite(X) std::isfinite(X) #define my_isnan(X) std::isnan(X) #define my_isinf(X) std::isinf(X) #else #ifdef HAVE_LLVM_LIBCPP /* finite is deprecated in libc++ */ #define my_isfinite(X) isfinite(X) #elif defined _WIN32 #define my_isfinite(X) _finite(X) #else #define my_isfinite(X) finite(X) #endif #define my_isnan(X) isnan(X) #ifdef HAVE_ISINF /* System-provided isinf() is available and safe to use */ #define my_isinf(X) isinf(X) #else /* !HAVE_ISINF */ #define my_isinf(X) (!my_isfinite(X) && !my_isnan(X)) #endif #endif /* __cplusplus >= 201103L */ /* Max size that must be added to a so that we know Size to make adressable obj. */ #if SIZEOF_CHARP == 4 typedef long my_ptrdiff_t; #else typedef long long my_ptrdiff_t; #endif #define MY_ALIGN(A,L) (((A) + (L) - 1) & ~((L) - 1)) #define ALIGN_SIZE(A) MY_ALIGN((A),sizeof(double)) /* Size to make adressable obj. */ #define ADD_TO_PTR(ptr,size,type) (type) ((uchar*) (ptr)+size) #define PTR_BYTE_DIFF(A,B) (my_ptrdiff_t) ((uchar*) (A) - (uchar*) (B)) /* Custom version of standard offsetof() macro which can be used to get offsets of members in class for non-POD types (according to the current version of C++ standard offsetof() macro can't be used in such cases and attempt to do so causes warnings to be emitted, OTOH in many cases it is still OK to assume that all instances of the class has the same offsets for the same members). This is temporary solution which should be removed once File_parser class and related routines are refactored. */ #define my_offsetof(TYPE, MEMBER) \ ((size_t)((char *)&(((TYPE *)0x10)->MEMBER) - (char*)0x10)) #define NullS (char *) 0 #ifdef _WIN32 #define STDCALL __stdcall #else #define STDCALL #endif /* Typdefs for easyier portability */ typedef unsigned char uchar; /* Short for unsigned char */ typedef signed char int8; /* Signed integer >= 8 bits */ typedef unsigned char uint8; /* Unsigned integer >= 8 bits */ typedef short int16; typedef unsigned short uint16; #if SIZEOF_INT == 4 typedef int int32; typedef unsigned int uint32; #elif SIZEOF_LONG == 4 typedef long int32; typedef unsigned long uint32; #else #error Neither int or long is of 4 bytes width #endif #if !defined(HAVE_ULONG) typedef unsigned long ulong; /* Short for unsigned long */ #endif /* Using [unsigned] long long is preferable as [u]longlong because we use [unsigned] long long unconditionally in many places, for example in constants with [U]LL suffix. */ typedef unsigned long long int ulonglong; /* ulong or unsigned long long */ typedef long long int longlong; typedef longlong int64; typedef ulonglong uint64; #if defined (_WIN32) typedef unsigned __int64 my_ulonglong; #else typedef unsigned long long my_ulonglong; #endif #if SIZEOF_CHARP == SIZEOF_INT typedef int intptr; #elif SIZEOF_CHARP == SIZEOF_LONG typedef long intptr; #elif SIZEOF_CHARP == SIZEOF_LONG_LONG typedef long long intptr; #else #error sizeof(void *) is neither sizeof(int) nor sizeof(long) nor sizeof(long long) #endif #define MY_ERRPTR ((void*)(intptr)1) #if defined(_WIN32) typedef unsigned long long my_off_t; typedef unsigned long long os_off_t; #else typedef off_t os_off_t; #if SIZEOF_OFF_T > 4 typedef ulonglong my_off_t; #else typedef unsigned long my_off_t; #endif #endif /*_WIN32*/ #define MY_FILEPOS_ERROR (~(my_off_t) 0) /* TODO Convert these to use Bitmap class. */ typedef ulonglong table_map; /* Used for table bits in join */ typedef ulonglong nesting_map; /* Used for flags of nesting constructs */ #if defined(_WIN32) #define socket_errno WSAGetLastError() #define SOCKET_EINTR WSAEINTR #define SOCKET_EAGAIN WSAEINPROGRESS #define SOCKET_EWOULDBLOCK WSAEWOULDBLOCK #define SOCKET_EADDRINUSE WSAEADDRINUSE #define SOCKET_ETIMEDOUT WSAETIMEDOUT #define SOCKET_ECONNRESET WSAECONNRESET #define SOCKET_ENFILE ENFILE #define SOCKET_EMFILE EMFILE #else /* Unix */ #define socket_errno errno #define closesocket(A) close(A) #define SOCKET_EINTR EINTR #define SOCKET_EAGAIN EAGAIN #define SOCKET_EWOULDBLOCK EWOULDBLOCK #define SOCKET_EADDRINUSE EADDRINUSE #define SOCKET_ETIMEDOUT ETIMEDOUT #define SOCKET_ECONNRESET ECONNRESET #define SOCKET_ENFILE ENFILE #define SOCKET_EMFILE EMFILE #endif typedef int myf; /* Type of MyFlags in my_funcs */ typedef char my_bool; /* Small bool */ /* Macros for converting *constants* to the right type */ #define MYF(v) (myf) (v) /* Some helper macros */ #define YESNO(X) ((X) ? "yes" : "no") #define MY_HOW_OFTEN_TO_WRITE 1000 /* How often we want info on screen */ #include #ifdef HAVE_CHARSET_utf8 #define MYSQL_UNIVERSAL_CLIENT_CHARSET "utf8" #else #define MYSQL_UNIVERSAL_CLIENT_CHARSET MYSQL_DEFAULT_CHARSET_NAME #endif #if defined(_WIN32) #define dlsym(lib, name) (void*)GetProcAddress((HMODULE)lib, name) #define dlopen(libname, unused) LoadLibraryEx(libname, NULL, 0) #define dlclose(lib) FreeLibrary((HMODULE)lib) #ifndef HAVE_DLOPEN #define HAVE_DLOPEN #endif #define DLERROR_GENERATE(errmsg, error_number) \ char win_errormsg[2048]; \ if(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, \ 0, error_number, 0, win_errormsg, 2048, NULL)) \ { \ char *ptr; \ for (ptr= &win_errormsg[0] + strlen(win_errormsg) - 1; \ ptr >= &win_errormsg[0] && strchr("\r\n\t\0x20", *ptr); \ ptr--) \ *ptr= 0; \ errmsg= win_errormsg; \ } \ else \ errmsg= "" #define dlerror() "" #define dlopen_errno GetLastError() #else /* _WIN32 */ #define DLERROR_GENERATE(errmsg, error_number) errmsg= dlerror() #define dlopen_errno errno #endif /* _WIN32 */ /* Length of decimal number represented by INT32. */ #define MY_INT32_NUM_DECIMAL_DIGITS 11U /* Length of decimal number represented by INT64. */ #define MY_INT64_NUM_DECIMAL_DIGITS 21U /* Define some useful general macros (should be done after all headers). */ #define MY_MAX(a, b) ((a) > (b) ? (a) : (b)) #define MY_MIN(a, b) ((a) < (b) ? (a) : (b)) #if !defined(__cplusplus) && !defined(bool) #define bool In_C_you_should_use_my_bool_instead() #endif /* MYSQL_PLUGIN_IMPORT macro is used to export mysqld data (i.e variables) for usage in storage engine loadable plugins. Outside of Windows, it is dummy. */ #if (defined(_WIN32) && defined(MYSQL_DYNAMIC_PLUGIN)) #define MYSQL_PLUGIN_IMPORT __declspec(dllimport) #else #define MYSQL_PLUGIN_IMPORT #endif #include #ifdef EMBEDDED_LIBRARY #define NO_EMBEDDED_ACCESS_CHECKS /* Things we don't need in the embedded version of MySQL */ #undef HAVE_OPENSSL #endif /* EMBEDDED_LIBRARY */ enum loglevel { ERROR_LEVEL= 0, WARNING_LEVEL= 1, INFORMATION_LEVEL= 2 }; #ifdef _WIN32 /**************************************************************************** ** Replacements for localtime_r and gmtime_r ****************************************************************************/ static inline struct tm *localtime_r(const time_t *timep, struct tm *tmp) { localtime_s(tmp, timep); return tmp; } static inline struct tm *gmtime_r(const time_t *clock, struct tm *res) { gmtime_s(res, clock); return res; } #endif /* _WIN32 */ #ifndef HAVE_STRUCT_TIMESPEC /* Windows before VS2015 */ /* Declare a union to make sure FILETIME is properly aligned so it can be used directly as a 64 bit value. The value stored is in 100ns units. */ union ft64 { FILETIME ft; __int64 i64; }; struct timespec { union ft64 tv; /* The max timeout value in millisecond for native_cond_timedwait */ long max_timeout_msec; }; #endif /* !HAVE_STRUCT_TIMESPEC */ C_MODE_START extern ulonglong my_getsystime(void); C_MODE_END static inline void set_timespec_nsec(struct timespec *abstime, ulonglong nsec) { #ifdef HAVE_STRUCT_TIMESPEC ulonglong now= my_getsystime() + (nsec / 100); ulonglong tv_sec= now / 10000000ULL; #if SIZEOF_TIME_T < SIZEOF_LONG_LONG /* Ensure that the number of seconds don't overflow. */ tv_sec= MY_MIN(tv_sec, ((ulonglong)INT_MAX32)); #endif abstime->tv_sec= (time_t)tv_sec; abstime->tv_nsec= (now % 10000000ULL) * 100 + (nsec % 100); #else /* !HAVE_STRUCT_TIMESPEC */ ulonglong max_timeout_msec= (nsec / 1000000); union ft64 tv; GetSystemTimeAsFileTime(&tv.ft); abstime->tv.i64= tv.i64 + (__int64)(nsec / 100); #if SIZEOF_LONG < SIZEOF_LONG_LONG /* Ensure that the msec value doesn't overflow. */ max_timeout_msec= MY_MIN(max_timeout_msec, ((ulonglong)INT_MAX32)); #endif abstime->max_timeout_msec= (long)max_timeout_msec; #endif /* !HAVE_STRUCT_TIMESPEC */ } static inline void set_timespec(struct timespec *abstime, ulonglong sec) { set_timespec_nsec(abstime, sec * 1000000000ULL); } /** Compare two timespec structs. @retval 1 If ts1 ends after ts2. @retval -1 If ts1 ends before ts2. @retval 0 If ts1 is equal to ts2. */ static inline int cmp_timespec(struct timespec *ts1, struct timespec *ts2) { #ifdef HAVE_STRUCT_TIMESPEC if (ts1->tv_sec > ts2->tv_sec || (ts1->tv_sec == ts2->tv_sec && ts1->tv_nsec > ts2->tv_nsec)) return 1; if (ts1->tv_sec < ts2->tv_sec || (ts1->tv_sec == ts2->tv_sec && ts1->tv_nsec < ts2->tv_nsec)) return -1; #else if (ts1->tv.i64 > ts2->tv.i64) return 1; if (ts1->tv.i64 < ts2->tv.i64) return -1; #endif return 0; } static inline ulonglong diff_timespec(struct timespec *ts1, struct timespec *ts2) { #ifdef HAVE_STRUCT_TIMESPEC return (ts1->tv_sec - ts2->tv_sec) * 1000000000ULL + ts1->tv_nsec - ts2->tv_nsec; #else return (ts1->tv.i64 - ts2->tv.i64) * 100; #endif } #ifdef _WIN32 typedef int MY_MODE; #else typedef mode_t MY_MODE; #endif /* _WIN32 */ /* File permissions */ #define USER_READ (1L << 0) #define USER_WRITE (1L << 1) #define USER_EXECUTE (1L << 2) #define GROUP_READ (1L << 3) #define GROUP_WRITE (1L << 4) #define GROUP_EXECUTE (1L << 5) #define OTHERS_READ (1L << 6) #define OTHERS_WRITE (1L << 7) #define OTHERS_EXECUTE (1L << 8) #define USER_RWX USER_READ | USER_WRITE | USER_EXECUTE #define GROUP_RWX GROUP_READ | GROUP_WRITE | GROUP_EXECUTE #define OTHERS_RWX OTHERS_READ | OTHERS_WRITE | OTHERS_EXECUTE /* Defaults */ #define DEFAULT_SSL_CA_CERT "ca.pem" #define DEFAULT_SSL_CA_KEY "ca-key.pem" #define DEFAULT_SSL_SERVER_CERT "server-cert.pem" #define DEFAULT_SSL_SERVER_KEY "server-key.pem" #if defined(_WIN32) || defined(_WIN64) #define strcasecmp _stricmp #endif #if defined(HAVE_IPV6) && defined(__APPLE__) #define s6_addr32 __u6_addr.__u6_addr32 #endif #endif // MY_GLOBAL_INCLUDED PKp #endif #ifdef _WIN32 #include #endif #ifdef HAVE_UNISTD_H #include #endif #include C_MODE_START #ifdef HAVE_VALGRIND # include # define MEM_MALLOCLIKE_BLOCK(p1, p2, p3, p4) VALGRIND_MALLOCLIKE_BLOCK(p1, p2, p3, p4) # define MEM_FREELIKE_BLOCK(p1, p2) VALGRIND_FREELIKE_BLOCK(p1, p2) # include # define MEM_UNDEFINED(a,len) VALGRIND_MAKE_MEM_UNDEFINED(a,len) # define MEM_NOACCESS(a,len) VALGRIND_MAKE_MEM_NOACCESS(a,len) # define MEM_CHECK_ADDRESSABLE(a,len) VALGRIND_CHECK_MEM_IS_ADDRESSABLE(a,len) #else /* HAVE_VALGRIND */ # define MEM_MALLOCLIKE_BLOCK(p1, p2, p3, p4) do {} while (0) # define MEM_FREELIKE_BLOCK(p1, p2) do {} while (0) # define MEM_UNDEFINED(a,len) ((void) 0) # define MEM_NOACCESS(a,len) ((void) 0) # define MEM_CHECK_ADDRESSABLE(a,len) ((void) 0) #endif /* HAVE_VALGRIND */ #include #define MY_INIT(name) { my_progname= name; my_init(); } /** Max length of an error message generated by mysys utilities. Some mysys functions produce error messages. These mostly go to stderr. This constant defines the size of the buffer used to format the message. It should be kept in sync with MYSQL_ERRMSG_SIZE, since sometimes mysys errors are stored in the server diagnostics area, and we would like to avoid unexpected truncation. */ #define MYSYS_ERRMSG_SIZE (512) #define MYSYS_STRERROR_SIZE (128) #define MY_FILE_ERROR ((size_t) -1) /* General bitmaps for my_func's */ #define MY_FFNF 1 /* Fatal if file not found */ #define MY_FNABP 2 /* Fatal if not all bytes read/writen */ #define MY_NABP 4 /* Error if not all bytes read/writen */ #define MY_FAE 8 /* Fatal if any error */ #define MY_WME 16 /* Write message on error */ #define MY_WAIT_IF_FULL 32 /* Wait and try again if disk full error */ #define MY_IGNORE_BADFD 32 /* my_sync: ignore 'bad descriptor' errors */ #define MY_SYNC_DIR 8192 /* my_create/delete/rename: sync directory */ #define MY_ENCRYPT 64 /* Encrypt IO_CACHE temporary files */ #define MY_FULL_IO 512 /* For my_read - loop intil I/O is complete */ #define MY_DONT_CHECK_FILESIZE 128 /* Option to init_io_cache() */ #define MY_LINK_WARNING 32 /* my_redel() gives warning if links */ #define MY_COPYTIME 64 /* my_redel() copys time */ #define MY_DELETE_OLD 256 /* my_create_with_symlink() */ #define MY_RESOLVE_LINK 128 /* my_realpath(); Only resolve links */ #define MY_HOLD_ORIGINAL_MODES 128 /* my_copy() holds to file modes */ #define MY_REDEL_MAKE_BACKUP 256 #define MY_REDEL_NO_COPY_STAT 512 /* my_redel() doesn't call my_copystat() */ #define MY_SEEK_NOT_DONE 32 /* my_lock may have to do a seek */ #define MY_DONT_WAIT 64 /* my_lock() don't wait if can't lock */ #define MY_ZEROFILL 32 /* my_malloc(), fill array with zero */ #define MY_ALLOW_ZERO_PTR 64 /* my_realloc() ; zero ptr -> malloc */ #define MY_FREE_ON_ERROR 128 /* my_realloc() ; Free old ptr on error */ #define MY_HOLD_ON_ERROR 256 /* my_realloc() ; Return old ptr on error */ #define MY_DONT_OVERWRITE_FILE 1024 /* my_copy: Don't overwrite file */ #define MY_THREADSAFE 2048 /* my_seek(): lock fd mutex */ #define MY_SYNC 4096 /* my_copy(): sync dst file */ #define MYF_RW MYF(MY_WME+MY_NABP) /* For my_read & my_write */ #define MY_CHECK_ERROR 1 /* Params to my_end; Check open-close */ #define MY_GIVE_INFO 2 /* Give time info about process*/ #define MY_DONT_FREE_DBUG 4 /* Do not call DBUG_END() in my_end() */ /* Flags for my_error() */ #define ME_BELL 4 /* DEPRECATED: Ring bell then printing message */ #define ME_ERRORLOG 64 /* Write the error message to error log */ #define ME_FATALERROR 1024 /* Fatal statement error */ /* Bits in last argument to fn_format */ #define MY_REPLACE_DIR 1 /* replace dir in name with 'dir' */ #define MY_REPLACE_EXT 2 /* replace extension with 'ext' */ #define MY_UNPACK_FILENAME 4 /* Unpack name (~ -> home) */ #define MY_PACK_FILENAME 8 /* Pack name (home -> ~) */ #define MY_RESOLVE_SYMLINKS 16 /* Resolve all symbolic links */ #define MY_RETURN_REAL_PATH 32 /* return full path for file */ #define MY_SAFE_PATH 64 /* Return NULL if too long path */ #define MY_RELATIVE_PATH 128 /* name is relative to 'dir' */ #define MY_APPEND_EXT 256 /* add 'ext' as additional extension*/ /* My seek flags */ #define MY_SEEK_SET 0 #define MY_SEEK_CUR 1 #define MY_SEEK_END 2 /* Some constants */ #define MY_WAIT_FOR_USER_TO_FIX_PANIC 60 /* in seconds */ #define MY_WAIT_GIVE_USER_A_MESSAGE 10 /* Every 10 times of prev */ #define MIN_COMPRESS_LENGTH 50 /* Don't compress small bl. */ #define DFLT_INIT_HITS 3 /* root_alloc flags */ #define MY_KEEP_PREALLOC 1 #define MY_MARK_BLOCKS_FREE 2 /* move used to free list and reuse them */ /* Internal error numbers (for assembler functions) */ #define MY_ERRNO_EDOM 33 #define MY_ERRNO_ERANGE 34 /* Bits for get_date timeflag */ #define GETDATE_DATE_TIME 1 #define GETDATE_SHORT_DATE 2 #define GETDATE_HHMMSSTIME 4 #define GETDATE_GMT 8 #define GETDATE_FIXEDLENGTH 16 #define GETDATE_T_DELIMITER 32 #define GETDATE_SHORT_DATE_FULL_YEAR 64 /* defines when allocating data */ extern void *my_multi_malloc(PSI_memory_key key, myf flags, ...); /* Switch to my_malloc() if the memory block to be allocated is bigger than max_alloca_sz. */ extern PSI_memory_key key_memory_max_alloca; #define my_safe_alloca(size, max_alloca_sz) ((size <= max_alloca_sz) ? \ my_alloca(size) : \ my_malloc(key_memory_max_alloca, size, MYF(0))) #define my_safe_afree(ptr, size, max_alloca_sz) if (size > max_alloca_sz) \ my_free(ptr) #if !defined(DBUG_OFF) || defined(HAVE_VALGRIND) /** Put bad content in memory to be sure it will segfault if dereferenced. With Valgrind, verify that memory is addressable, and mark it undefined. We cache value of B because if B is expression which depends on A, memset() trashes value of B. */ #define TRASH(A,B) do { \ void *p = (A); \ const size_t l= (B); \ MEM_CHECK_ADDRESSABLE(A, l); \ memset(p, 0x8F, l); \ MEM_UNDEFINED(A, l); \ } while (0) #else #define TRASH(A,B) do {} while(0) #endif #if defined(ENABLED_DEBUG_SYNC) extern void (*debug_sync_C_callback_ptr)(const char *, size_t); #define DEBUG_SYNC_C(_sync_point_name_) do { \ if (debug_sync_C_callback_ptr != NULL) \ (*debug_sync_C_callback_ptr)(STRING_WITH_LEN(_sync_point_name_)); } \ while(0) #define DEBUG_SYNC_C_IF_THD(thd, _sync_point_name_) do { \ if (debug_sync_C_callback_ptr != NULL && thd) \ (*debug_sync_C_callback_ptr)(STRING_WITH_LEN(_sync_point_name_)); } \ while(0) #else #define DEBUG_SYNC_C(_sync_point_name_) #define DEBUG_SYNC_C_IF_THD(thd, _sync_point_name_) #endif /* defined(ENABLED_DEBUG_SYNC) */ #ifdef HAVE_LINUX_LARGE_PAGES extern uint my_get_large_page_size(void); extern uchar * my_large_malloc(PSI_memory_key key, size_t size, myf my_flags); extern void my_large_free(uchar *ptr); extern my_bool my_use_large_pages; extern uint my_large_page_size; #else #define my_get_large_page_size() (0) #define my_large_malloc(A,B,C) my_malloc((A),(B),(C)) #define my_large_free(A) my_free((A)) #endif /* HAVE_LINUX_LARGE_PAGES */ #define my_alloca(SZ) alloca((size_t) (SZ)) #include /* errno is a define */ extern char *home_dir; /* Home directory for user */ extern const char *my_progname; /* program-name (printed in errors) */ extern char curr_dir[]; /* Current directory for user */ extern void (*error_handler_hook)(uint my_err, const char *str,myf MyFlags); extern void (*fatal_error_handler_hook)(uint my_err, const char *str, myf MyFlags); extern void (*local_message_hook)(enum loglevel ll, const char *format, va_list args); extern uint my_file_limit; extern MYSQL_PLUGIN_IMPORT ulong my_thread_stack_size; /* Hooks for reporting execution stage information. The server implementation of these will also set THD::current_cond/current_mutex. By having hooks, we avoid direct dependencies on server code. */ extern void (*enter_cond_hook)(void *opaque_thd, mysql_cond_t *cond, mysql_mutex_t *mutex, const PSI_stage_info *stage, PSI_stage_info *old_stage, const char *src_function, const char *src_file, int src_line); extern void (*exit_cond_hook)(void *opaque_thd, const PSI_stage_info *stage, const char *src_function, const char *src_file, int src_line); /* Hook for checking if the thread has been killed. */ extern int (*is_killed_hook)(const void *opaque_thd); /* charsets */ #define MY_ALL_CHARSETS_SIZE 2048 extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *default_charset_info; extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *all_charsets[MY_ALL_CHARSETS_SIZE]; extern CHARSET_INFO compiled_charsets[]; /* statistics */ extern ulong my_file_opened,my_stream_opened, my_tmp_file_created; extern ulong my_file_total_opened; extern my_bool my_init_done; extern MYSQL_PLUGIN_IMPORT int my_umask; /* Default creation mask */ extern int my_umask_dir; extern ulong my_default_record_cache_size; extern my_bool my_disable_locking, my_enable_symlinks; extern char wild_many,wild_one,wild_prefix; extern const char *charsets_dir; enum cache_type { TYPE_NOT_SET= 0, READ_CACHE, WRITE_CACHE, SEQ_READ_APPEND /* sequential read or append */, READ_FIFO, READ_NET}; enum flush_type { FLUSH_KEEP, /* flush block and keep it in the cache */ FLUSH_RELEASE, /* flush block and remove it from the cache */ FLUSH_IGNORE_CHANGED, /* remove block from the cache */ /* As my_disable_flush_pagecache_blocks is always 0, the following option is strictly equivalent to FLUSH_KEEP */ FLUSH_FORCE_WRITE }; enum file_type { UNOPEN = 0, FILE_BY_OPEN, FILE_BY_CREATE, STREAM_BY_FOPEN, STREAM_BY_FDOPEN, FILE_BY_MKSTEMP, FILE_BY_DUP }; struct st_my_file_info { char *name; #ifdef _WIN32 HANDLE fhandle; /* win32 file handle */ int oflag; /* open flags, e.g O_APPEND */ #endif enum file_type type; }; extern struct st_my_file_info *my_file_info; /* needed for client-only build */ #ifndef PSI_FILE_KEY_DEFINED typedef unsigned int PSI_file_key; #define PSI_FILE_KEY_DEFINED #endif typedef struct st_dynamic_array { uchar *buffer; uint elements,max_element; uint alloc_increment; uint size_of_element; PSI_memory_key m_psi_key; } DYNAMIC_ARRAY; typedef struct st_my_tmpdir { char **list; uint cur, max; mysql_mutex_t mutex; } MY_TMPDIR; typedef struct st_dynamic_string { char *str; size_t length,max_length,alloc_increment; } DYNAMIC_STRING; struct st_io_cache; typedef int (*IO_CACHE_CALLBACK)(struct st_io_cache*); typedef struct st_io_cache_share { mysql_mutex_t mutex; /* To sync on reads into buffer. */ mysql_cond_t cond; /* To wait for signals. */ mysql_cond_t cond_writer; /* For a synchronized writer. */ /* Offset in file corresponding to the first byte of buffer. */ my_off_t pos_in_file; /* If a synchronized write cache is the source of the data. */ struct st_io_cache *source_cache; uchar *buffer; /* The read buffer. */ uchar *read_end; /* Behind last valid byte of buffer. */ int running_threads; /* threads not in lock. */ int total_threads; /* threads sharing the cache. */ int error; /* Last error. */ } IO_CACHE_SHARE; typedef struct st_io_cache /* Used when cacheing files */ { /* Offset in file corresponding to the first byte of uchar* buffer. */ my_off_t pos_in_file; /* The offset of end of file for READ_CACHE and WRITE_CACHE. For SEQ_READ_APPEND it the maximum of the actual end of file and the position represented by read_end. */ my_off_t end_of_file; /* Points to current read position in the buffer */ uchar *read_pos; /* the non-inclusive boundary in the buffer for the currently valid read */ uchar *read_end; uchar *buffer; /* The read buffer */ /* Used in ASYNC_IO */ uchar *request_pos; /* Only used in WRITE caches and in SEQ_READ_APPEND to buffer writes */ uchar *write_buffer; /* Only used in SEQ_READ_APPEND, and points to the current read position in the write buffer. Note that reads in SEQ_READ_APPEND caches can happen from both read buffer (uchar* buffer) and write buffer (uchar* write_buffer). */ uchar *append_read_pos; /* Points to current write position in the write buffer */ uchar *write_pos; /* The non-inclusive boundary of the valid write area */ uchar *write_end; /* Current_pos and current_end are convenience variables used by my_b_tell() and other routines that need to know the current offset current_pos points to &write_pos, and current_end to &write_end in a WRITE_CACHE, and &read_pos and &read_end respectively otherwise */ uchar **current_pos, **current_end; /* The lock is for append buffer used in SEQ_READ_APPEND cache need mutex copying from append buffer to read buffer. */ mysql_mutex_t append_buffer_lock; /* The following is used when several threads are reading the same file in parallel. They are synchronized on disk accesses reading the cached part of the file asynchronously. It should be set to NULL to disable the feature. Only READ_CACHE mode is supported. */ IO_CACHE_SHARE *share; /* A caller will use my_b_read() macro to read from the cache if the data is already in cache, it will be simply copied with memcpy() and internal variables will be accordinging updated with no functions invoked. However, if the data is not fully in the cache, my_b_read() will call read_function to fetch the data. read_function must never be invoked directly. */ int (*read_function)(struct st_io_cache *,uchar *,size_t); /* Same idea as in the case of read_function, except my_b_write() needs to be replaced with my_b_append() for a SEQ_READ_APPEND cache */ int (*write_function)(struct st_io_cache *,const uchar *,size_t); /* Specifies the type of the cache. Depending on the type of the cache certain operations might not be available and yield unpredicatable results. Details to be documented later */ enum cache_type type; /* Callbacks when the actual read I/O happens. These were added and are currently used for binary logging of LOAD DATA INFILE - when a block is read from the file, we create a block create/append event, and when IO_CACHE is closed, we create an end event. These functions could, of course be used for other things */ IO_CACHE_CALLBACK pre_read; IO_CACHE_CALLBACK post_read; IO_CACHE_CALLBACK pre_close; /* Counts the number of times, when we were forced to use disk. We use it to increase the binlog_cache_disk_use and binlog_stmt_cache_disk_use status variables. */ ulong disk_writes; void* arg; /* for use by pre/post_read */ char *file_name; /* if used with 'open_cached_file' */ char *dir,*prefix; File file; /* file descriptor */ PSI_file_key file_key; /* instrumented file key */ /* seek_not_done is set by my_b_seek() to inform the upcoming read/write operation that a seek needs to be preformed prior to the actual I/O error is 0 if the cache operation was successful, -1 if there was a "hard" error, and the actual number of I/O-ed bytes if the read/write was partial. */ int seek_not_done,error; /* buffer_length is memory size allocated for buffer or write_buffer */ size_t buffer_length; /* read_length is the same as buffer_length except when we use async io */ size_t read_length; myf myflags; /* Flags used to my_read/my_write */ /* alloced_buffer is 1 if the buffer was allocated by init_io_cache() and 0 if it was supplied by the user. Currently READ_NET is the only one that will use a buffer allocated somewhere else */ my_bool alloced_buffer; } IO_CACHE; typedef int (*qsort2_cmp)(const void *, const void *, const void *); /* Subset of struct stat fields filled by stat/lstat/fstat that uniquely identify a file */ typedef struct st_file_id { dev_t st_dev; ino_t st_ino; } ST_FILE_ID; typedef void (*my_error_reporter)(enum loglevel level, const char *format, ...) MY_ATTRIBUTE((format(printf, 2, 3))); extern my_error_reporter my_charset_error_reporter; extern PSI_file_key key_file_io_cache; MY_NODISCARD extern int _my_b_get(IO_CACHE *info); MY_NODISCARD extern int _my_b_read(IO_CACHE *info, uchar *Buffer, size_t Count); MY_NODISCARD extern int _my_b_write(IO_CACHE *info, const uchar *Buffer, size_t Count); /* inline functions for mf_iocache */ static inline void my_b_clear(IO_CACHE *info) { info->buffer= 0; } /* Test if buffer is inited */ MY_NODISCARD static inline int my_b_inited(const IO_CACHE *info) { return MY_TEST(info->buffer); } #define my_b_EOF INT_MIN MY_NODISCARD static inline int my_b_read(IO_CACHE *info, uchar *Buffer, size_t Count) { if (info->read_pos + Count <= info->read_end) { memcpy(Buffer, info->read_pos, Count); info->read_pos+= Count; return 0; } return _my_b_read(info, Buffer, Count); } MY_NODISCARD static inline int my_b_write(IO_CACHE *info, const uchar *Buffer, size_t Count) { if (info->write_pos + Count <= info->write_end) { memcpy(info->write_pos, Buffer, Count); info->write_pos+= Count; return 0; } return _my_b_write(info, Buffer, Count); } MY_NODISCARD static inline int my_b_get(IO_CACHE *info) { if (info->read_pos != info->read_end) { info->read_pos++; return info->read_pos[-1]; } return _my_b_get(info); } MY_NODISCARD static inline my_off_t my_b_tell(const IO_CACHE *info) { return info->pos_in_file + (*info->current_pos - info->request_pos); } MY_NODISCARD static inline uchar* my_b_get_buffer_start(const IO_CACHE *info) { return info->request_pos; } MY_NODISCARD static inline size_t my_b_get_bytes_in_buffer(const IO_CACHE *info) { return info->read_end - info->request_pos; } MY_NODISCARD static inline my_off_t my_b_get_pos_in_file(const IO_CACHE *info) { return info->pos_in_file; } MY_NODISCARD static inline size_t my_b_bytes_in_cache(const IO_CACHE *info) { return *info->current_end - *info->current_pos; } /* tell write offset in the SEQ_APPEND cache */ int my_b_copy_to_file(IO_CACHE *cache, FILE *file); my_off_t my_b_append_tell(IO_CACHE* info); my_off_t my_b_safe_tell(IO_CACHE* info); /* picks the correct tell() */ MY_NODISCARD int my_b_pread(IO_CACHE *info, uchar *Buffer, size_t Count, my_off_t pos); typedef uint32 ha_checksum; #include /* Prototypes for mysys and my_func functions */ extern int my_copy(const char *from,const char *to,myf MyFlags); extern int my_delete(const char *name,myf MyFlags); extern int my_getwd(char * buf,size_t size,myf MyFlags); extern int my_setwd(const char *dir,myf MyFlags); extern int my_lock(File fd,int op,my_off_t start, my_off_t length,myf MyFlags); extern void *my_once_alloc(size_t Size,myf MyFlags); extern void my_once_free(void); extern char *my_once_strdup(const char *src,myf myflags); extern void *my_once_memdup(const void *src, size_t len, myf myflags); extern File my_open(const char *FileName,int Flags,myf MyFlags); #ifndef __WIN__ extern File my_unix_socket_connect(const char *FileName,myf MyFlags); #endif extern File my_register_filename(File fd, const char *FileName, enum file_type type_of_file, uint error_message_number, myf MyFlags); extern File my_create(const char *FileName,int CreateFlags, int AccessFlags, myf MyFlags); extern int my_close(File Filedes,myf MyFlags); extern int my_mkdir(const char *dir, int Flags, myf MyFlags); extern int my_readlink(char *to, const char *filename, myf MyFlags); extern int my_is_symlink(const char *filename, ST_FILE_ID *file_id); extern int my_realpath(char *to, const char *filename, myf MyFlags); extern int my_is_same_file(File file, const ST_FILE_ID *file_id); extern File my_create_with_symlink(const char *linkname, const char *filename, int createflags, int access_flags, myf MyFlags); extern int my_delete_with_symlink(const char *name, myf MyFlags); extern int my_rename_with_symlink(const char *from,const char *to,myf MyFlags); extern int my_symlink(const char *content, const char *linkname, myf MyFlags); extern size_t my_read(File Filedes,uchar *Buffer,size_t Count,myf MyFlags); extern size_t my_pread(File Filedes,uchar *Buffer,size_t Count,my_off_t offset, myf MyFlags); extern int my_rename(const char *from,const char *to,myf MyFlags); extern my_off_t my_seek(File fd,my_off_t pos,int whence,myf MyFlags); extern my_off_t my_tell(File fd,myf MyFlags); extern size_t my_write(File Filedes,const uchar *Buffer,size_t Count, myf MyFlags); extern size_t my_pwrite(File Filedes,const uchar *Buffer,size_t Count, my_off_t offset,myf MyFlags); extern size_t my_fread(FILE *stream,uchar *Buffer,size_t Count,myf MyFlags); extern size_t my_fwrite(FILE *stream,const uchar *Buffer,size_t Count, myf MyFlags); extern my_off_t my_fseek(FILE *stream,my_off_t pos,int whence,myf MyFlags); extern my_off_t my_ftell(FILE *stream,myf MyFlags); #if !defined(HAVE_MEMSET_S) void memset_s(void *dest, size_t dest_max, int c, size_t n); #endif /* implemented in my_syslog.c */ // Maximum size of message that will be logged. #define MAX_SYSLOG_MESSAGE_SIZE 1024 /* Platform-independent SysLog support */ /* facilities on unixoid syslog. harmless on systemd / Win platforms. */ typedef struct st_syslog_facility { int id; const char *name; } SYSLOG_FACILITY; extern SYSLOG_FACILITY syslog_facility[]; enum my_syslog_options { MY_SYSLOG_PIDS= 1 }; int my_openlog(const char *eventSourceName, int option, int facility); int my_closelog(); int my_syslog(const CHARSET_INFO *cs, enum loglevel level, const char *msg); /* implemented in my_memmem.c */ extern void *my_memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen); #ifdef _WIN32 extern int my_access(const char *path, int amode); #else #define my_access access #endif extern int check_if_legal_filename(const char *path); extern int check_if_legal_tablename(const char *path); #ifdef _WIN32 extern my_bool is_filename_allowed(const char *name, size_t length, my_bool allow_current_dir); #else /* _WIN32 */ # define is_filename_allowed(name, length, allow_cwd) (TRUE) #endif /* _WIN32 */ #ifdef _WIN32 extern int nt_share_delete(const char *name,myf MyFlags); #define my_delete_allow_opened(fname,flags) nt_share_delete((fname),(flags)) #else #define my_delete_allow_opened(fname,flags) my_delete((fname),(flags)) #endif #ifdef _WIN32 /* Windows-only functions (CRT equivalents)*/ extern HANDLE my_get_osfhandle(File fd); extern void my_osmaperr(unsigned long last_error); #endif extern const char* get_global_errmsg(int nr); extern void wait_for_free_space(const char *filename, int errors); extern FILE *my_fopen(const char *FileName,int Flags,myf MyFlags); extern FILE *my_fdopen(File Filedes,const char *name, int Flags,myf MyFlags); extern FILE *my_freopen(const char *path, const char *mode, FILE *stream); extern int my_fclose(FILE *fd,myf MyFlags); extern File my_fileno(FILE *fd); extern int my_chsize(File fd,my_off_t newlength, int filler, myf MyFlags); extern void thr_set_sync_wait_callback(void (*before_sync)(void), void (*after_sync)(void)); extern int my_sync(File fd, myf my_flags); extern int my_sync_dir(const char *dir_name, myf my_flags); extern int my_sync_dir_by_file(const char *file_name, myf my_flags); extern char *my_strerror(char *buf, size_t len, int errnum); extern const char *my_get_err_msg(int nr); extern void my_error(int nr,myf MyFlags, ...); extern void my_printf_error(uint my_err, const char *format, myf MyFlags, ...) MY_ATTRIBUTE((format(printf, 2, 4))); extern void my_printv_error(uint error, const char *format, myf MyFlags, va_list ap); extern int my_error_register(const char* (*get_errmsg) (int), int first, int last); extern my_bool my_error_unregister(int first, int last); extern void my_message(uint my_err, const char *str,myf MyFlags); extern void my_message_stderr(uint my_err, const char *str, myf MyFlags); void my_message_local_stderr(enum loglevel ll, const char *format, va_list args); extern void my_message_local(enum loglevel ll, const char *format, ...); extern my_bool my_init(void); extern void my_end(int infoflag); extern int my_redel(const char *from, const char *to, int MyFlags); extern int my_copystat(const char *from, const char *to, int MyFlags); extern char * my_filename(File fd); extern MY_MODE get_file_perm(ulong perm_flags); extern my_bool my_chmod(const char *filename, ulong perm_flags, myf my_flags); #ifdef EXTRA_DEBUG void my_print_open_files(void); #else #define my_print_open_files() #endif extern my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist); extern char *my_tmpdir(MY_TMPDIR *tmpdir); extern void free_tmpdir(MY_TMPDIR *tmpdir); extern size_t dirname_part(char * to,const char *name, size_t *to_res_length); extern size_t dirname_length(const char *name); #define base_name(A) (A+dirname_length(A)) extern int test_if_hard_path(const char *dir_name); extern my_bool has_path(const char *name); extern char *convert_dirname(char *to, const char *from, const char *from_end); extern void to_unix_path(char * name); extern char * fn_ext(const char *name); extern char * fn_same(char * toname,const char *name,int flag); extern char * fn_format(char * to,const char *name,const char *dir, const char *form, uint flag); extern size_t strlength(const char *str); extern void pack_dirname(char * to,const char *from); extern size_t normalize_dirname(char * to, const char *from); extern size_t unpack_dirname(char * to,const char *from); extern size_t cleanup_dirname(char * to,const char *from); extern size_t system_filename(char * to,const char *from); extern size_t unpack_filename(char * to,const char *from); extern char * intern_filename(char * to,const char *from); extern int pack_filename(char * to, const char *name, size_t max_length); extern char * my_path(char * to,const char *progname, const char *own_pathname_part); extern char * my_load_path(char * to, const char *path, const char *own_path_prefix); extern int wild_compare(const char *str,const char *wildstr, pbool str_is_pattern); extern my_bool array_append_string_unique(const char *str, const char **array, size_t size); extern void get_date(char * to,int timeflag,time_t use_time); extern void soundex(CHARSET_INFO *, char * out_pntr, char * in_pntr, pbool remove_garbage); extern my_bool radixsort_is_appliccable(uint n_items, size_t size_of_element); extern void radixsort_for_str_ptr(uchar* base[], uint number_of_elements, size_t size_of_element,uchar *buffer[]); extern void my_qsort(void *base_ptr, size_t total_elems, size_t size, qsort_cmp cmp); extern void my_qsort2(void *base_ptr, size_t total_elems, size_t size, qsort2_cmp cmp, const void *cmp_argument); void my_store_ptr(uchar *buff, size_t pack_length, my_off_t pos); my_off_t my_get_ptr(uchar *ptr, size_t pack_length); typedef int (*io_cache_encr_read_function)(IO_CACHE*, uchar*, size_t); typedef int (*io_cache_encr_write_function)(IO_CACHE*, const uchar*, size_t); extern void init_io_cache_encryption_ext( io_cache_encr_read_function read_function, io_cache_encr_write_function write_function, size_t encr_block_size, size_t encr_header_size); extern void init_io_cache_encryption(my_bool enable); MY_NODISCARD extern int init_io_cache_ext(IO_CACHE *info,File file,size_t cachesize, enum cache_type type,my_off_t seek_offset, my_bool use_async_io, myf cache_myflags, PSI_file_key file_key); MY_NODISCARD extern int init_io_cache(IO_CACHE *info,File file,size_t cachesize, enum cache_type type,my_off_t seek_offset, my_bool use_async_io, myf cache_myflags); MY_NODISCARD extern my_bool reinit_io_cache(IO_CACHE *info,enum cache_type type, my_off_t seek_offset, my_bool use_async_io, my_bool clear_cache); extern void setup_io_cache(IO_CACHE* info); extern void init_io_cache_share(IO_CACHE *read_cache, IO_CACHE_SHARE *cshare, IO_CACHE *write_cache, uint num_threads); extern void remove_io_thread(IO_CACHE *info); extern int _my_b_net_read(IO_CACHE *info,uchar *Buffer,size_t Count); extern int my_b_append(IO_CACHE *info,const uchar *Buffer,size_t Count); extern int my_b_safe_write(IO_CACHE *info,const uchar *Buffer,size_t Count); extern int my_block_write(IO_CACHE *info, const uchar *Buffer, size_t Count, my_off_t pos); extern int my_b_flush_io_cache(IO_CACHE *info, int need_append_buffer_lock); #define flush_io_cache(info) my_b_flush_io_cache((info),1) extern int end_io_cache(IO_CACHE *info); extern size_t my_b_fill(IO_CACHE *info); extern void my_b_seek(IO_CACHE *info,my_off_t pos); extern size_t my_b_gets(IO_CACHE *info, char *to, size_t max_length); extern my_off_t my_b_filelength(IO_CACHE *info); extern size_t my_b_printf(IO_CACHE *info, const char* fmt, ...) MY_ATTRIBUTE((format(printf, 2, 3))); extern size_t my_b_vprintf(IO_CACHE *info, const char* fmt, va_list ap); extern my_bool open_cached_file(IO_CACHE *cache,const char *dir, const char *prefix, size_t cache_size, myf cache_myflags); extern my_bool real_open_cached_file(IO_CACHE *cache); extern void close_cached_file(IO_CACHE *cache); File create_temp_file(char *to, const char *dir, const char *pfx, int mode, myf MyFlags); // Use Prealloced_array or std::vector or something similar in C++ #ifdef __cplusplus extern "C" { #endif extern my_bool my_init_dynamic_array(DYNAMIC_ARRAY *array, PSI_memory_key key, uint element_size, void *init_buffer, uint init_alloc, uint alloc_increment); /* init_dynamic_array() function is deprecated */ extern my_bool init_dynamic_array(DYNAMIC_ARRAY *array, uint element_size, uint init_alloc, uint alloc_increment); #define dynamic_element(array,array_index,type) \ ((type)((array)->buffer) +(array_index)) #ifdef __cplusplus } #endif /* Some functions are still in use in C++, because HASH uses DYNAMIC_ARRAY */ extern my_bool insert_dynamic(DYNAMIC_ARRAY *array, const void *element); extern void *alloc_dynamic(DYNAMIC_ARRAY *array); extern void *pop_dynamic(DYNAMIC_ARRAY*); extern void get_dynamic(DYNAMIC_ARRAY *array, void *element, uint array_index); extern void claim_dynamic(DYNAMIC_ARRAY *array); extern void delete_dynamic(DYNAMIC_ARRAY *array); extern void freeze_size(DYNAMIC_ARRAY *array); static inline void reset_dynamic(DYNAMIC_ARRAY *array) { array->elements= 0; } extern my_bool init_dynamic_string(DYNAMIC_STRING *str, const char *init_str, size_t init_alloc,size_t alloc_increment); extern my_bool dynstr_append(DYNAMIC_STRING *str, const char *append); my_bool dynstr_append_mem(DYNAMIC_STRING *str, const char *append, size_t length); extern my_bool dynstr_append_os_quoted(DYNAMIC_STRING *str, const char *append, ...); extern my_bool dynstr_set(DYNAMIC_STRING *str, const char *init_str); extern my_bool dynstr_realloc(DYNAMIC_STRING *str, size_t additional_size); extern my_bool dynstr_trunc(DYNAMIC_STRING *str, size_t n); extern void dynstr_free(DYNAMIC_STRING *str); #define alloc_root_inited(A) ((A)->min_malloc != 0) #define ALLOC_ROOT_MIN_BLOCK_SIZE (MALLOC_OVERHEAD + sizeof(USED_MEM) + 8) #define clear_alloc_root(A) do { (A)->free= (A)->used= (A)->pre_alloc= 0; (A)->min_malloc=0;} while(0) extern void init_alloc_root(PSI_memory_key key, MEM_ROOT *mem_root, size_t block_size, size_t pre_alloc_size); extern void *alloc_root(MEM_ROOT *mem_root, size_t Size); extern void *multi_alloc_root(MEM_ROOT *mem_root, ...); extern void claim_root(MEM_ROOT *root); extern void free_root(MEM_ROOT *root, myf MyFLAGS); extern void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size, size_t prealloc_size); extern char *strdup_root(MEM_ROOT *root,const char *str); static inline char *safe_strdup_root(MEM_ROOT *root, const char *str) { return str ? strdup_root(root, str) : 0; } extern char *strmake_root(MEM_ROOT *root,const char *str,size_t len); extern void *memdup_root(MEM_ROOT *root,const void *str, size_t len); extern void set_memroot_max_capacity(MEM_ROOT *mem_root, size_t size); extern void set_memroot_error_reporting(MEM_ROOT *mem_root, my_bool report_error); extern my_bool my_compress(uchar *, size_t *, size_t *); extern my_bool my_uncompress(uchar *, size_t , size_t *); extern uchar *my_compress_alloc(const uchar *packet, size_t *len, size_t *complen); extern int packfrm(uchar *, size_t, uchar **, size_t *); extern int unpackfrm(uchar **, size_t *, const uchar *); extern ha_checksum my_checksum(ha_checksum crc, const uchar *mem, size_t count); /* Wait a given number of microseconds */ static inline void my_sleep(time_t m_seconds) { #if defined(_WIN32) Sleep((DWORD)m_seconds/1000+1); /* Sleep() has millisecond arg */ #else struct timeval t; t.tv_sec= m_seconds / 1000000L; t.tv_usec= m_seconds % 1000000L; select(0,0,0,0,&t); /* sleep */ #endif } extern ulong crc32(ulong crc, const uchar *buf, uint len); extern uint my_set_max_open_files(uint files); void my_free_open_file_info(void); extern time_t my_time(myf flags); extern ulonglong my_getsystime(void); extern ulonglong my_micro_time(); extern my_bool my_gethwaddr(uchar *to); #define my_microsecond_getsystime() (my_getsystime()/10) #ifdef HAVE_SYS_MMAN_H #include #ifndef MAP_NOSYNC #define MAP_NOSYNC 0 #endif /* Not defined in FreeBSD 11. Was never implemented in FreeBSD, so we just set it to 0. */ #ifndef MAP_NORESERVE #define MAP_NORESERVE 0 #endif #ifdef HAVE_MMAP64 #define my_mmap(a,b,c,d,e,f) mmap64(a,b,c,d,e,f) #else #define my_mmap(a,b,c,d,e,f) mmap(a,b,c,d,e,f) #endif #define my_munmap(a,b) munmap((a),(b)) #else /* not a complete set of mmap() flags, but only those that nesessary */ #define PROT_READ 1 #define PROT_WRITE 2 #define MAP_NORESERVE 0 #define MAP_SHARED 0x0001 #define MAP_PRIVATE 0x0002 #define MAP_NOSYNC 0x0800 #define MAP_FAILED ((void *)-1) #define MS_SYNC 0x0000 void *my_mmap(void *, size_t, int, int, int, my_off_t); int my_munmap(void *, size_t); #endif /* my_getpagesize */ static inline int my_getpagesize() { #ifndef _WIN32 return getpagesize(); #else SYSTEM_INFO si; GetSystemInfo(&si); return (int)si.dwPageSize; #endif } int my_msync(int, void *, size_t, int); /* character sets */ extern void my_charset_loader_init_mysys(MY_CHARSET_LOADER *loader); extern uint get_charset_number(const char *cs_name, uint cs_flags); extern uint get_collation_number(const char *name); extern const char *get_charset_name(uint cs_number); extern CHARSET_INFO *get_charset(uint cs_number, myf flags); extern CHARSET_INFO *get_charset_by_name(const char *cs_name, myf flags); extern CHARSET_INFO *my_collation_get_by_name(MY_CHARSET_LOADER *loader, const char *name, myf flags); extern CHARSET_INFO *get_charset_by_csname(const char *cs_name, uint cs_flags, myf my_flags); extern CHARSET_INFO *my_charset_get_by_name(MY_CHARSET_LOADER *loader, const char *name, uint cs_flags, myf my_flags); extern my_bool resolve_charset(const char *cs_name, const CHARSET_INFO *default_cs, const CHARSET_INFO **cs); extern my_bool resolve_collation(const char *cl_name, const CHARSET_INFO *default_cl, const CHARSET_INFO **cl); extern void free_charsets(void); extern char *get_charsets_dir(char *buf); extern my_bool my_charset_same(const CHARSET_INFO *cs1, const CHARSET_INFO *cs2); extern my_bool init_compiled_charsets(myf flags); extern void add_compiled_collation(CHARSET_INFO *cs); extern size_t escape_string_for_mysql(const CHARSET_INFO *charset_info, char *to, size_t to_length, const char *from, size_t length); #ifdef _WIN32 /* File system character set */ extern CHARSET_INFO *fs_character_set(void); #endif extern size_t escape_quotes_for_mysql(CHARSET_INFO *charset_info, char *to, size_t to_length, const char *from, size_t length, char quote); #ifdef _WIN32 extern my_bool have_tcpip; /* Is set if tcpip is used */ /* implemented in my_windac.c */ int my_security_attr_create(SECURITY_ATTRIBUTES **psa, const char **perror, DWORD owner_rights, DWORD everybody_rights); void my_security_attr_free(SECURITY_ATTRIBUTES *sa); /* implemented in my_conio.c */ my_bool my_win_is_console(FILE *file); char *my_win_console_readline(const CHARSET_INFO *cs, char *mbbuf, size_t mbbufsize, size_t *nread); void my_win_console_write(const CHARSET_INFO *cs, const char *data, size_t datalen); void my_win_console_fputs(const CHARSET_INFO *cs, const char *data); void my_win_console_putc(const CHARSET_INFO *cs, int c); void my_win_console_vfprintf(const CHARSET_INFO *cs, const char *fmt, va_list args); int my_win_translate_command_line_args(const CHARSET_INFO *cs, int *ac, char ***av); #endif /* _WIN32 */ #ifdef HAVE_PSI_INTERFACE extern MYSQL_PLUGIN_IMPORT struct PSI_bootstrap *PSI_hook; extern void set_psi_server(PSI *psi); void my_init_mysys_psi_keys(void); #endif struct st_mysql_file; extern struct st_mysql_file *mysql_stdin; C_MODE_END #endif /* _my_sys_h */ PKpnext) #define list_push(a,b) (a)=list_cons((b),(a)) #define list_pop(A) {LIST *old=(A); (A)=list_delete(old,old); my_free(old); } #ifdef __cplusplus } #endif #endif PKp #endif #ifdef __cplusplus extern "C" { #endif struct st_transaction_termination_ctx { unsigned long m_thread_id; unsigned int m_flags; // reserved /* If the instruction is to rollback the transaction, then this flag is set to false. Note: type is char like on my_bool. */ char m_rollback_transaction; /* If the plugin has generated a GTID, then the follwoing fields MUST be set. Note: type is char like on my_bool. */ char m_generated_gtid; int m_sidno; long long int m_gno; }; typedef struct st_transaction_termination_ctx Transaction_termination_ctx; extern struct rpl_transaction_ctx_service_st { int (*set_transaction_ctx)(Transaction_termination_ctx transaction_termination_ctx); } *rpl_transaction_ctx_service; #ifdef MYSQL_DYNAMIC_PLUGIN #define set_transaction_ctx(transaction_termination_ctx) \ (rpl_transaction_ctx_service->set_transaction_ctx((transaction_termination_ctx))) #else int set_transaction_ctx(Transaction_termination_ctx transaction_termination_ctx); #endif #ifdef __cplusplus } #endif #define MYSQL_SERVICE_RPL_TRANSACTION_CTX_INCLUDED #endif PKp #include #endif /* On Windows, exports from DLL need to be declared. Also, plugin needs to be declared as extern "C" because MSVC unlike other compilers, uses C++ mangling for variables not only for functions. */ #undef MYSQL_PLUGIN_EXPORT #if defined(_MSC_VER) #if defined(MYSQL_DYNAMIC_PLUGIN) #ifdef __cplusplus #define MYSQL_PLUGIN_EXPORT extern "C" __declspec(dllexport) #else #define MYSQL_PLUGIN_EXPORT __declspec(dllexport) #endif #else /* MYSQL_DYNAMIC_PLUGIN */ #ifdef __cplusplus #define MYSQL_PLUGIN_EXPORT extern "C" #else #define MYSQL_PLUGIN_EXPORT #endif #endif /*MYSQL_DYNAMIC_PLUGIN */ #else /*_MSC_VER */ #define MYSQL_PLUGIN_EXPORT #endif #ifdef __cplusplus extern "C" { #endif /* known plugin types */ #define MYSQL_CLIENT_reserved1 0 #define MYSQL_CLIENT_reserved2 1 #define MYSQL_CLIENT_AUTHENTICATION_PLUGIN 2 #define MYSQL_CLIENT_TRACE_PLUGIN 3 #define MYSQL_CLIENT_AUTHENTICATION_PLUGIN_INTERFACE_VERSION 0x0100 #define MYSQL_CLIENT_TRACE_PLUGIN_INTERFACE_VERSION 0x0100 #define MYSQL_CLIENT_MAX_PLUGINS 4 #define mysql_declare_client_plugin(X) \ MYSQL_PLUGIN_EXPORT struct st_mysql_client_plugin_ ## X \ _mysql_client_plugin_declaration_ = { \ MYSQL_CLIENT_ ## X ## _PLUGIN, \ MYSQL_CLIENT_ ## X ## _PLUGIN_INTERFACE_VERSION, #define mysql_end_client_plugin } /* generic plugin header structure */ #define MYSQL_CLIENT_PLUGIN_HEADER \ int type; \ unsigned int interface_version; \ const char *name; \ const char *author; \ const char *desc; \ unsigned int version[3]; \ const char *license; \ void *mysql_api; \ int (*init)(char *, size_t, int, va_list); \ int (*deinit)(void); \ int (*options)(const char *option, const void *); struct st_mysql_client_plugin { MYSQL_CLIENT_PLUGIN_HEADER }; struct st_mysql; /******** authentication plugin specific declarations *********/ #include "plugin_auth_common.h" struct st_mysql_client_plugin_AUTHENTICATION { MYSQL_CLIENT_PLUGIN_HEADER int (*authenticate_user)(MYSQL_PLUGIN_VIO *vio, struct st_mysql *mysql); }; /******** using plugins ************/ /** loads a plugin and initializes it @param mysql MYSQL structure. @param name a name of the plugin to load @param type type of plugin that should be loaded, -1 to disable type check @param argc number of arguments to pass to the plugin initialization function @param ... arguments for the plugin initialization function @retval a pointer to the loaded plugin, or NULL in case of a failure */ struct st_mysql_client_plugin * mysql_load_plugin(struct st_mysql *mysql, const char *name, int type, int argc, ...); /** loads a plugin and initializes it, taking va_list as an argument This is the same as mysql_load_plugin, but take va_list instead of a list of arguments. @param mysql MYSQL structure. @param name a name of the plugin to load @param type type of plugin that should be loaded, -1 to disable type check @param argc number of arguments to pass to the plugin initialization function @param args arguments for the plugin initialization function @retval a pointer to the loaded plugin, or NULL in case of a failure */ struct st_mysql_client_plugin * mysql_load_plugin_v(struct st_mysql *mysql, const char *name, int type, int argc, va_list args); /** finds an already loaded plugin by name, or loads it, if necessary @param mysql MYSQL structure. @param name a name of the plugin to load @param type type of plugin that should be loaded @retval a pointer to the plugin, or NULL in case of a failure */ struct st_mysql_client_plugin * mysql_client_find_plugin(struct st_mysql *mysql, const char *name, int type); /** adds a plugin structure to the list of loaded plugins This is useful if an application has the necessary functionality (for example, a special load data handler) statically linked into the application binary. It can use this function to register the plugin directly, avoiding the need to factor it out into a shared object. @param mysql MYSQL structure. It is only used for error reporting @param plugin an st_mysql_client_plugin structure to register @retval a pointer to the plugin, or NULL in case of a failure */ struct st_mysql_client_plugin * mysql_client_register_plugin(struct st_mysql *mysql, struct st_mysql_client_plugin *plugin); /** set plugin options Can be used to set extra options and affect behavior for a plugin. This function may be called multiple times to set several options @param plugin an st_mysql_client_plugin structure @param option a string which specifies the option to set @param value value for the option. @retval 0 on success, 1 in case of failure **/ int mysql_plugin_options(struct st_mysql_client_plugin *plugin, const char *option, const void *value); #ifdef __cplusplus } #endif #endif PKp typedef void * MYSQL_PLUGIN; struct st_mysql_xid { long formatID; long gtrid_length; long bqual_length; char data[128]; }; typedef struct st_mysql_xid MYSQL_XID; enum enum_mysql_show_type { SHOW_UNDEF, SHOW_BOOL, SHOW_INT, SHOW_LONG, SHOW_LONGLONG, SHOW_SIGNED_INT, SHOW_SIGNED_LONG, SHOW_SIGNED_LONGLONG, SHOW_CHAR, SHOW_CHAR_PTR, SHOW_ARRAY, SHOW_FUNC, SHOW_DOUBLE }; enum enum_mysql_show_scope { SHOW_SCOPE_UNDEF, SHOW_SCOPE_GLOBAL }; struct st_mysql_show_var { const char *name; char *value; enum enum_mysql_show_type type; enum enum_mysql_show_scope scope; }; typedef int (*mysql_show_var_func)(void*, struct st_mysql_show_var*, char *); struct st_mysql_sys_var; struct st_mysql_value; typedef int (*mysql_var_check_func)(void* thd, struct st_mysql_sys_var *var, void *save, struct st_mysql_value *value); typedef void (*mysql_var_update_func)(void* thd, struct st_mysql_sys_var *var, void *var_ptr, const void *save); struct st_mysql_plugin { int type; void *info; const char *name; const char *author; const char *descr; int license; int (*init)(MYSQL_PLUGIN); int (*deinit)(MYSQL_PLUGIN); unsigned int version; struct st_mysql_show_var *status_vars; struct st_mysql_sys_var **system_vars; void * __reserved1; unsigned long flags; }; struct st_mysql_daemon { int interface_version; }; struct st_mysql_information_schema { int interface_version; }; struct st_mysql_storage_engine { int interface_version; }; struct handlerton; struct Mysql_replication { int interface_version; }; struct st_mysql_value { int (*value_type)(struct st_mysql_value *); const char *(*val_str)(struct st_mysql_value *, char *buffer, int *length); int (*val_real)(struct st_mysql_value *, double *realbuf); int (*val_int)(struct st_mysql_value *, long long *intbuf); int (*is_unsigned)(struct st_mysql_value *); }; int thd_in_lock_tables(const void* thd); int thd_tablespace_op(const void* thd); long long thd_test_options(const void* thd, long long test_options); int thd_sql_command(const void* thd); const char *set_thd_proc_info(void* thd, const char *info, const char *calling_func, const char *calling_file, const unsigned int calling_line); void **thd_ha_data(const void* thd, const struct handlerton *hton); void thd_storage_lock_wait(void* thd, long long value); int thd_tx_isolation(const void* thd); int thd_tx_is_read_only(const void* thd); void* thd_tx_arbitrate(void* requestor, void* holder); int thd_tx_priority(const void* thd); int thd_tx_is_dd_trx(const void* thd); char *thd_security_context(void* thd, char *buffer, size_t length, size_t max_query_len); void thd_inc_row_count(void* thd); int thd_allow_batch(void* thd); void thd_mark_transaction_to_rollback(void* thd, int all); enum mysql_trx_stat_type { MYSQL_TRX_STAT_IO_READ_BYTES, MYSQL_TRX_STAT_IO_READ_WAIT_USECS, MYSQL_TRX_STAT_LOCK_WAIT_USECS, MYSQL_TRX_STAT_INNODB_QUEUE_WAIT_USECS, MYSQL_TRX_STAT_ACCESS_PAGE_ID }; void thd_report_innodb_stat(void* thd, unsigned long long trx_id, enum mysql_trx_stat_type type, unsigned long long value); unsigned long thd_log_slow_verbosity(const void* thd); int thd_opt_slow_log(); int thd_is_background_thread(const void* thd); int mysql_tmpfile(const char *prefix); int thd_killed(const void* thd); void thd_set_kill_status(const void* thd); void thd_binlog_pos(const void* thd, const char **file_var, unsigned long long *pos_var); unsigned long thd_get_thread_id(const void* thd); int64_t thd_get_query_id(const void* thd); void thd_get_xid(const void* thd, MYSQL_XID *xid); void mysql_query_cache_invalidate4(void* thd, const char *key, unsigned int key_length, int using_trx); void *thd_get_ha_data(const void* thd, const struct handlerton *hton); void thd_set_ha_data(void* thd, const struct handlerton *hton, const void *ha_data); int thd_command(const void* thd); long long thd_start_time(const void* thd); void thd_kill(unsigned long id); int thd_get_ft_query_extra_word_chars(void); #include "plugin_auth_common.h" typedef struct st_plugin_vio_info { enum { MYSQL_VIO_INVALID, MYSQL_VIO_TCP, MYSQL_VIO_SOCKET, MYSQL_VIO_PIPE, MYSQL_VIO_MEMORY } protocol; int socket; } MYSQL_PLUGIN_VIO_INFO; typedef struct st_plugin_vio { int (*read_packet)(struct st_plugin_vio *vio, unsigned char **buf); int (*write_packet)(struct st_plugin_vio *vio, const unsigned char *packet, int packet_len); void (*info)(struct st_plugin_vio *vio, struct st_plugin_vio_info *info); } MYSQL_PLUGIN_VIO; typedef struct st_mysql_server_auth_info { char *user_name; unsigned int user_name_length; const char *auth_string; unsigned long auth_string_length; char authenticated_as[96 +1]; char external_user[512]; int password_used; const char *host_or_ip; unsigned int host_or_ip_length; } MYSQL_SERVER_AUTH_INFO; struct st_mysql_auth { int interface_version; const char *client_auth_plugin; int (*authenticate_user)(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info); int (*generate_authentication_string)(char *outbuf, unsigned int *outbuflen, const char *inbuf, unsigned int inbuflen); int (*validate_authentication_string)(char* const inbuf, unsigned int buflen); int (*set_salt)(const char *password, unsigned int password_len, unsigned char* salt, unsigned char *salt_len); const unsigned long authentication_flags; }; PKpmysql_key_iterator_init(&iterator_ptr); if (iterator_ptr == NULL) report error; while (!(plugin_handle->mysql_key_iterator_get_key(iterator_ptr, key_id, user_id))) { Fetch the keys. Perform operations on the fetched keys. .. } plugin_handle->mysql_key_iterator_deinit(iterator_ptr); init() method accepts a void pointer which is the made to point to Keys_iterator instance. Keys_iterator instance internal pointer points to Key_metadata list. This list holds information about all keys stored in the backed end data store of keyring plugin. After call to init() please check iterator_ptr. get_key() method accepts the above iterator_ptr as IN param and then fills the passes in key_id and user_id with valid values. This can be used to fetch actual key information. Every call to this method will change internal pointers to advance to next position, so that the next call will fetch the next key. deinit() method frees all internal pointers along with iterator_ptr. */ /** Initialize an iterator. @param[out] key_iterator Iterator used to fetch individual keys from key_container. @return VOID */ void (*mysql_key_iterator_init)(void** key_iterator); /** Deinitialize an iterator. @param[in] key_iterator Iterator used to fetch individual keys from key_container. @return VOID */ void (*mysql_key_iterator_deinit)(void* key_iterator); /** Get details of key. Every call to this service will change internal pointers to advance to next position, so that the next call will fetch the next key. In case iterator moves to the end, this service will return error. @param[in] key_iterator Iterator used to fetch individual keys from key_container. @param[out] key_id id of the key @param[out] user_id id of the owner @return Operation status @retval 0 OK @retval 1 ERROR */ bool (*mysql_key_iterator_get_key)(void* key_iterator, char *key_id, char *user_id); }; #endif PKp /* uint16_t */ #endif #ifdef __cplusplus extern "C" { #endif extern struct srv_session_info_service_st { MYSQL_THD (*get_thd)(MYSQL_SESSION session); my_thread_id (*get_session_id)(MYSQL_SESSION session); LEX_CSTRING (*get_current_db)(MYSQL_SESSION session); uint16_t (*get_client_port)(MYSQL_SESSION session); int (*set_client_port)(MYSQL_SESSION session, uint16_t port); int (*set_connection_type)(MYSQL_SESSION session, enum enum_vio_type type); int (*killed)(MYSQL_SESSION session); unsigned int (*session_count)(); unsigned int (*thread_count)(const void *plugin); } *srv_session_info_service; #ifdef MYSQL_DYNAMIC_PLUGIN #define srv_session_info_get_thd(session) srv_session_info_service->get_thd((session)) #define srv_session_info_get_session_id(sess) srv_session_info_service->get_session_id((sess)) #define srv_session_info_get_current_db(sess) srv_session_info_service->get_current_db((sess)) #define srv_session_info_get_client_port(sess) srv_session_info_service->get_client_port((sess)) #define srv_session_info_set_client_port(sess, port) srv_session_info_service->set_client_port((sess), (port)) #define srv_session_info_set_connection_type(sess, type) srv_session_info_service->set_connection_type((sess), (type)) #define srv_session_info_killed(sess) srv_session_info_service->killed((sess)) #define srv_session_info_session_count(sess) srv_session_info_service->session_count(sess) #define srv_session_info_thread_count(plugin) srv_session_info_service->thread_count(plugin) #else /** Returns the THD of a session. @param session Session @returns address of the THD */ MYSQL_THD srv_session_info_get_thd(MYSQL_SESSION session); /** Returns the ID of a session. @param session Session */ my_thread_id srv_session_info_get_session_id(MYSQL_SESSION session); /** Returns the current database of a session. @note {NULL, 0} is returned case of no current database or session is NULL @param session Session */ LEX_CSTRING srv_session_info_get_current_db(MYSQL_SESSION session); /** Returns the client port of a session. @note The client port in SHOW PROCESSLIST, INFORMATION_SCHEMA.PROCESSLIST. This port is NOT shown in PERFORMANCE_SCHEMA.THREADS. @param session Session */ uint16_t srv_session_info_get_client_port(MYSQL_SESSION session); /** Sets the client port of a session. @note The client port in SHOW PROCESSLIST, INFORMATION_SCHEMA.PROCESSLIST. This port is NOT shown in PERFORMANCE_SCHEMA.THREADS. @param session Session @param port Port number @return 0 success 1 failure */ int srv_session_info_set_client_port(MYSQL_SESSION session, uint16_t port); /** Sets the connection type of a session. @see enum_vio_type @note The type is shown in PERFORMANCE_SCHEMA.THREADS. The value is translated from the enum to a string according to @see vio_type_names array in vio/vio.c @note If NO_VIO_TYPE passed as type the call will fail. @return 0 success 1 failure */ int srv_session_info_set_connection_type(MYSQL_SESSION session, enum enum_vio_type type); /** Returns whether the session was killed @param session Session @return 0 not killed 1 killed */ int srv_session_info_killed(MYSQL_SESSION session); /** Returns the number opened sessions in thread initialized by srv_session service. */ unsigned int srv_session_info_session_count(); /** Returns the number opened sessions in thread initialized by srv_session service. @param plugin Pointer to the plugin structure, passed to the plugin over the plugin init function. */ unsigned int srv_session_info_thread_count(const void *plugin); #endif /* MYSQL_DYNAMIC_PLUGIN */ #ifdef __cplusplus } /* extern "C" */ #endif #endif /* MYSQL_SERVICE_SRV_SESSION_INFO_INCLUDED */ PKp where everithing but the format is optional. Three one-character flags are recognized: '0' has the standard zero-padding semantics; '-' is parsed, but silently ignored; '`' (backtick) is only supported for strings (%s) and means that the string will be quoted according to MySQL identifier quoting rules. Both and can be specified as numbers or '*'. If an asterisk is used, an argument of type int is consumed. can be 'l', 'll', or 'z'. Supported formats are 's' (null pointer is accepted, printed as "(null)"), 'b' (extension, see below), 'c', 'd', 'i', 'u', 'x', 'o', 'X', 'p' (works as 0x%x). Standard syntax for positional arguments $n is supported. Extensions: Flag '`' (backtick): see above. Format 'b': binary buffer, prints exactly bytes from the argument, without stopping at '\0'. */ #ifdef __cplusplus extern "C" { #endif #ifndef MYSQL_ABI_CHECK #include #include #endif extern struct my_snprintf_service_st { size_t (*my_snprintf_type)(char*, size_t, const char*, ...); size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list); } *my_snprintf_service; #ifdef MYSQL_DYNAMIC_PLUGIN #define my_vsnprintf my_snprintf_service->my_vsnprintf_type #define my_snprintf my_snprintf_service->my_snprintf_type #else size_t my_snprintf(char* to, size_t n, const char* fmt, ...); size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap); #endif #ifdef __cplusplus } #endif #endif /* #define MYSQL_SERVICE_MY_SNPRINTF_INCLUDED */ PKp #endif #ifdef __cplusplus extern "C" { #endif /** This structure is used to keep the list of the hash values of the records changed in the transaction. */ struct st_trans_write_set { unsigned int m_flags; // reserved unsigned long write_set_size; // Size of the PKE set of the transaction. unsigned long long* write_set; // A pointer to the PKE set. }; typedef struct st_trans_write_set Transaction_write_set; extern struct transaction_write_set_service_st { Transaction_write_set* (*get_transaction_write_set)(unsigned long m_thread_id); } *transaction_write_set_service; #ifdef MYSQL_DYNAMIC_PLUGIN #define get_transaction_write_set(m_thread_id) \ (transaction_write_set_service->get_transaction_write_set((m_thread_id))) #else Transaction_write_set* get_transaction_write_set(unsigned long m_thread_id); #endif #ifdef __cplusplus } #endif #define MYSQL_SERVICE_TRANSACTION_WRITE_SET_INCLUDED #endif PKpmy_validate_password_policy_func(buffer, length) #define my_calculate_password_strength(buffer, length) \ mysql_password_policy_service->my_calculate_password_strength_func(buffer, length) #else int my_validate_password_policy(const char *, unsigned int); int my_calculate_password_strength(const char *, unsigned int); #endif #ifdef __cplusplus } #endif #endif PKp #ifdef __cplusplus extern "C" { #endif /* Lists of protocol stages and trace events ========================================= These lists are defined with PROTOCOL_STAGE_LIST() and TRACE_EVENT_LIST(), respectively. Macros accept a disposition name as an argument. For example, to process list of protocol stages using disposition "foo", define protocol_stage_foo(Stage) macro and then put PROTOCOL_STAGE_LIST(foo) in your code. This will expand to sequence of protocol_stage_foo(X) macros where X ranges over the list of protocol stages, and these macros should generate the actual code. See below how this technique is used to generate protocol_stage and trace_events enums. */ /** Protocol stages --------------- A client following the MySQL protocol goes through several stages of it. Each stage determines what packets can be expected from the server or can be send by the client. Upon receiving each trace event, trace plugin will be notified of the current protocol stage so that it can correctly interpret the event. These are the possible protocol stages and the transitions between them. .. digraph:: protocol_stages CONNECTING -> WAIT_FOR_INIT_PACKET; CONNECTING -> DISCONNECTED [ label = "failed connection" ]; WAIT_FOR_INIT_PACKET -> AUTHENTICATE; WAIT_FOR_INIT_PACKET -> SSL_NEGOTIATION -> AUTHENTICATE; AUTHENTICATE -> READY_FOR_COMMAND [ label = "accepted" ]; AUTHENTICATE -> DISCONNECTED [ label = "rejected" ]; READY_FOR_COMMAND -> DISCONNECTED [ label = "COM_QUIT" ]; READY_FOR_COMMAND -> AUTHENTICATE [ label="after change user" ]; READY_FOR_COMMAND -> WAIT_FOR_PACKET [ label="wait for a single packet after, e.g., COM_STATISTICS" ]; READY_FOR_COMMAND -> WAIT_FOR_RESULT; READY_FOR_COMMAND -> WAIT_FOR_PS_DESCRIPTION [ label="after prepare command" ]; WAIT_FOR_PACKET -> READY_FOR_COMAND; WAIT_FOR_RESULT -> READY_FOR_COMMAND [ label="simple reply" ]; WAIT_FOR_RESULT -> WAIT_FOR_FIELD_DEF; WAIT_FOR_RESULT -> FILE_REQUEST; WAIT_FOR_FIELD_DEF -> WAIT_FOR_ROW [ label="in a resultset" ]; WAIT_FOR_FIELD_DEF -> READY_FOR_COMMAND [ label="after describe table or prepare command" ]; WAIT_FOR_ROW -> READY_FOR_COMMAND; WAIT_FOR_ROW -> WAIT_FOR_RESULT [ label="multi-resultset" ]; WAIT_FOR_PS_DESCRIPTION -> WAIT_FOR_PARAM_DEF; WAIT_FOR_PS_DESCRIPTION -> READY_FOR_COMMAND [ label="no params and result" ]; WAIT_FOR_PS_DESCRIPTION -> WAIT_FOR_FIELD_DEF [ label="no params" ]; WAIT_FOR_PARAM_DEF -> WAIT_FOR_FIELD_DEF; WAIT_FOR_PARAM_DEF -> READY_FOR_COMMAND [ label="no result" ]; FILE_REQUEST -> WAIT_FOR_RESULT [label="when whole file sent"]; */ #define PROTOCOL_STAGE_LIST(X) \ protocol_stage_ ## X(CONNECTING) \ protocol_stage_ ## X(WAIT_FOR_INIT_PACKET) \ protocol_stage_ ## X(AUTHENTICATE) \ protocol_stage_ ## X(SSL_NEGOTIATION) \ protocol_stage_ ## X(READY_FOR_COMMAND) \ protocol_stage_ ## X(WAIT_FOR_PACKET) \ protocol_stage_ ## X(WAIT_FOR_RESULT) \ protocol_stage_ ## X(WAIT_FOR_FIELD_DEF) \ protocol_stage_ ## X(WAIT_FOR_ROW) \ protocol_stage_ ## X(FILE_REQUEST) \ protocol_stage_ ## X(WAIT_FOR_PS_DESCRIPTION) \ protocol_stage_ ## X(WAIT_FOR_PARAM_DEF) \ protocol_stage_ ## X(DISCONNECTED) /** Trace events ------------ The following events are generated during the various stages of the client-server conversation. ---------------------- ----------------------------------------------------- Connection events ---------------------- ----------------------------------------------------- CONNECTING Client is connecting to the server. CONNECTED Physical connection has been established. DISCONNECTED Connection with server was broken. ---------------------- ----------------------------------------------------- SSL events ---------------------- ----------------------------------------------------- SEND_SSL_REQUEST Client is sending SSL connection request. SSL_CONNECT Client is initiating SSL handshake. SSL_CONNECTED SSL connection has been established. ---------------------- ----------------------------------------------------- Authentication events ---------------------- ----------------------------------------------------- CHALLENGE_RECEIVED Client received authentication challenge. AUTH_PLUGIN Client selects an authentication plugin to be used in the following authentication exchange. SEND_AUTH_RESPONSE Client sends response to the authentication challenge. SEND_AUTH_DATA Client sends extra authentication data packet. AUTHENTICATED Server has accepted connection. ---------------------- ----------------------------------------------------- Command phase events ---------------------- ----------------------------------------------------- SEND_COMMAND Client is sending a command to the server. SEND_FILE Client is sending local file contents to the server. ---------------------- ----------------------------------------------------- General events ---------------------- ----------------------------------------------------- READ_PACKET Client starts waiting for a packet from server. PACKET_RECEIVED A packet from server has been received. PACKET_SENT After successful sending of a packet to the server. ERROR Client detected an error. ---------------------- ----------------------------------------------------- */ #define TRACE_EVENT_LIST(X) \ trace_event_ ## X(ERROR) \ trace_event_ ## X(CONNECTING) \ trace_event_ ## X(CONNECTED) \ trace_event_ ## X(DISCONNECTED) \ trace_event_ ## X(SEND_SSL_REQUEST) \ trace_event_ ## X(SSL_CONNECT) \ trace_event_ ## X(SSL_CONNECTED) \ trace_event_ ## X(INIT_PACKET_RECEIVED) \ trace_event_ ## X(AUTH_PLUGIN) \ trace_event_ ## X(SEND_AUTH_RESPONSE) \ trace_event_ ## X(SEND_AUTH_DATA) \ trace_event_ ## X(AUTHENTICATED) \ trace_event_ ## X(SEND_COMMAND) \ trace_event_ ## X(SEND_FILE) \ trace_event_ ## X(READ_PACKET) \ trace_event_ ## X(PACKET_RECEIVED) \ trace_event_ ## X(PACKET_SENT) /** Some trace events have additional arguments. These are stored in st_trace_event_args structure. Various events store their arguments in the structure as follows. Unused members are set to 0/NULL. AUTH_PLUGIN ------------- ---------------------------------- plugin_name the name of the plugin ------------- ---------------------------------- SEND_COMMAND ------------- ---------------------------------- cmd the command code hdr pointer to command packet header hdr_len length of the header pkt pointer to command arguments pkt_len length of arguments ------------- ---------------------------------- Other SEND_* and *_RECEIVED events ------------- ---------------------------------- pkt the data sent or received pkt_len length of the data ------------- ---------------------------------- PACKET_SENT ------------- ---------------------------------- pkt_len number of bytes sent ------------- ---------------------------------- */ struct st_trace_event_args { const char *plugin_name; int cmd; const unsigned char *hdr; size_t hdr_len; const unsigned char *pkt; size_t pkt_len; }; /* Definitions of protocol_stage and trace_event enums. */ #define protocol_stage_enum(X) PROTOCOL_STAGE_ ## X, enum protocol_stage { PROTOCOL_STAGE_LIST(enum) PROTOCOL_STAGE_LAST }; #define trace_event_enum(X) TRACE_EVENT_ ## X, enum trace_event { TRACE_EVENT_LIST(enum) TRACE_EVENT_LAST }; /* Trace plugin methods ==================== */ struct st_mysql_client_plugin_TRACE; struct st_mysql; /** Trace plugin tracing_start() method. Called when tracing with this plugin starts on a connection. A trace plugin might want to maintain per-connection information. It can return a pointer to memory area holding such information. It will be stored in a connection handle and passed to other plugin methods. @param self pointer to the plugin instance @param connection_handle @param stage protocol stage in which tracing has started - currently it is always CONNECTING stage. @return A pointer to plugin-specific, per-connection data if any. */ typedef void* (tracing_start_callback)(struct st_mysql_client_plugin_TRACE *self, struct st_mysql *connection_handle, enum protocol_stage stage); /** Trace plugin tracing_stop() method. Called when tracing of the connection has ended. If a plugin allocated any per-connection resources, it should de-allocate them here. @param self pointer to the plugin instance @param connection_handle @param plugin_data pointer to plugin's per-connection data. */ typedef void (tracing_stop_callback)(struct st_mysql_client_plugin_TRACE *self, struct st_mysql *connection_handle, void *plugin_data); /** Trace plugin trace_event() method. Called when a trace event occurs. Plugin can decide to stop tracing this connection by returning non-zero value. @param self pointer to the plugin instance @param plugin_data pointer to plugin's per-connection data @param connection_handle @param stage current protocol stage @param event the trace event @param args trace event arguments @return Non-zero if tracing of the connection should end here. */ typedef int (trace_event_handler)(struct st_mysql_client_plugin_TRACE *self, void *plugin_data, struct st_mysql *connection_handle, enum protocol_stage stage, enum trace_event event, struct st_trace_event_args args); struct st_mysql_client_plugin_TRACE { MYSQL_CLIENT_PLUGIN_HEADER tracing_start_callback *tracing_start; tracing_stop_callback *tracing_stop; trace_event_handler *trace_event; }; /** The global trace_plugin pointer. If it is not NULL, it points at a loaded trace plugin which should be used to trace all connections made to the server. */ extern struct st_mysql_client_plugin_TRACE *trace_plugin; #ifndef DBUG_OFF /* Functions for getting names of trace events and protocol stages for debugging purposes. */ const char* protocol_stage_name(enum protocol_stage stage); const char* trace_event_name(enum trace_event ev); #endif #ifdef __cplusplus } #endif #endif PKp #ifndef MYSQL_ABI_CHECK #include #endif #ifdef __cplusplus class THD; class Item; #define MYSQL_THD THD* typedef Item* MYSQL_ITEM; #else #define MYSQL_THD void* typedef void* MYSQL_ITEM; #endif /* __cplusplus */ #ifdef __cplusplus extern "C" { #endif /** @file service_parser Plugin service that provides access to the parser and some operations on the parse tree. */ #define PARSER_SERVICE_DIGEST_LENGTH MD5_HASH_SIZE #define STATEMENT_TYPE_SELECT 1 #define STATEMENT_TYPE_OTHER 2 typedef int (*parse_node_visit_function)(MYSQL_ITEM item, unsigned char* arg); typedef int (*sql_condition_handler_function)(int sql_errno, const char* sqlstate, const char* msg, void *state); struct st_my_thread_handle; extern struct mysql_parser_service_st { MYSQL_THD (*mysql_current_session)(); MYSQL_THD (*mysql_open_session)(); void (*mysql_start_thread)(MYSQL_THD thd, void *(*callback_fun)(void*), void *arg, struct st_my_thread_handle *thread_handle); void (*mysql_join_thread)(struct st_my_thread_handle *thread_handle); void (*mysql_set_current_database)(MYSQL_THD thd, const MYSQL_LEX_STRING db); /** Parses the query. @param thd The session in which to parse. @param query The query to parse. @param is_prepared If non-zero, the query will be parsed as a prepared statement and won't throw errors when the query string contains '?'. @param handle_condition Callback function that is called if a condition is raised during the preparation, parsing or cleanup after parsing. If this argument is non-NULL, the diagnostics area will be cleared before this function returns. @param condition_handler_state Will be passed to handle_condition when called. Otherwise ignored. @retval 0 Success. @retval 1 Parse error. */ int (*mysql_parse)(MYSQL_THD thd, const MYSQL_LEX_STRING query, unsigned char is_prepared, sql_condition_handler_function handle_condition, void *condition_handler_state); int (*mysql_get_statement_type)(MYSQL_THD thd); /** Returns the digest of the last parsed statement in the session. @param thd The session in which the statement was parsed. @param digest[out] An area of at least size PARSER_SERVICE_DIGEST_LENGTH, where the digest is written. @retval 0 Success. @retval 1 Parse error. */ int (*mysql_get_statement_digest)(MYSQL_THD thd, unsigned char *digest); /** Returns the number of parameters ('?') in the parsed query. This works only if the last query was parsed as a prepared statement. @param thd The session in which the query was parsed. @return The number of parameter markers. */ int (*mysql_get_number_params)(MYSQL_THD thd); /** Stores in 'positions' the positions in the last parsed query of each parameter marker('?'). Positions must be an already allocated array of at least mysql_parser_service_st::mysql_get_number_params() size. This works only if the last query was parsed as a prepared statement. @param thd The session in which the query was parsed. @param positions An already allocated array of at least mysql_parser_service_st::mysql_get_number_params() size. @return The number of parameter markers and hence number of written positions. */ int (*mysql_extract_prepared_params)(MYSQL_THD thd, int *positions); /** Walks the tree depth first and applies a user defined function on each literal. @param thd The session in which the query was parsed. @param processor Will be called for each literal in the parse tree. @param arg Will be passed as argument to each call to 'processor'. */ int (*mysql_visit_tree)(MYSQL_THD thd, parse_node_visit_function processor, unsigned char* arg); /** Renders the MYSQL_ITEM as a string and returns a reference in the form of a MYSQL_LEX_STRING. The string buffer is allocated by the server and must be freed by mysql_free_string(). @param item The literal to print. @return The result of printing the literal. @see mysql_parser_service_st::mysql_free_string(). */ MYSQL_LEX_STRING (*mysql_item_string)(MYSQL_ITEM item); /** Frees a string buffer allocated by the server. @param The string whose buffer will be freed. */ void (*mysql_free_string)(MYSQL_LEX_STRING string); /** Returns the current query string. This string is managed by the server and should @b not be freed by a plugin. @param thd The session in which the query was submitted. @return The query string. */ MYSQL_LEX_STRING (*mysql_get_query)(MYSQL_THD thd); /** Returns the current query in normalized form. This string is managed by the server and should @b not be freed by a plugin. @param thd The session in which the query was submitted. @return The query string normalized. */ MYSQL_LEX_STRING (*mysql_get_normalized_query)(MYSQL_THD thd); } *mysql_parser_service; #ifdef MYSQL_DYNAMIC_PLUGIN #define mysql_parser_current_session() \ mysql_parser_service->mysql_current_session() #define mysql_parser_open_session() \ mysql_parser_service->mysql_open_session() #define mysql_parser_start_thread(thd, func, arg, thread_handle) \ mysql_parser_service->mysql_start_thread(thd, func, arg, thread_handle) #define mysql_parser_join_thread(thread_handle) \ mysql_parser_service->mysql_join_thread(thread_handle) #define mysql_parser_set_current_database(thd, db) \ mysql_parser_service->mysql_set_current_database(thd, db) #define mysql_parser_parse(thd, query, is_prepared, \ condition_handler, condition_handler_state) \ mysql_parser_service->mysql_parse(thd, query, is_prepared, \ condition_handler, \ condition_handler_state) #define mysql_parser_get_statement_type(thd) \ mysql_parser_service->mysql_get_statement_type(thd) #define mysql_parser_get_statement_digest(thd, digest) \ mysql_parser_service->mysql_get_statement_digest(thd, digest) #define mysql_parser_get_number_params(thd) \ mysql_parser_service->mysql_get_number_params(thd) #define mysql_parser_extract_prepared_params(thd, positions) \ mysql_parser_service->mysql_extract_prepared_params(thd, positions) #define mysql_parser_visit_tree(thd, processor, arg) \ mysql_parser_service->mysql_visit_tree(thd, processor, arg) #define mysql_parser_item_string(item) \ mysql_parser_service->mysql_item_string(item) #define mysql_parser_free_string(string) \ mysql_parser_service->mysql_free_string(string) #define mysql_parser_get_query(thd) \ mysql_parser_service->mysql_get_query(thd) #define mysql_parser_get_normalized_query(thd) \ mysql_parser_service->mysql_get_normalized_query(thd) #else typedef void *(*callback_function)(void*); MYSQL_THD mysql_parser_current_session(); MYSQL_THD mysql_parser_open_session(); void mysql_parser_start_thread(MYSQL_THD thd, callback_function fun, void *arg, struct st_my_thread_handle *thread_handle); void mysql_parser_join_thread(struct st_my_thread_handle *thread_handle); void mysql_parser_set_current_database(MYSQL_THD thd, const MYSQL_LEX_STRING db); int mysql_parser_parse(MYSQL_THD thd, const MYSQL_LEX_STRING query, unsigned char is_prepared, sql_condition_handler_function handle_condition, void *condition_handler_state); int mysql_parser_get_statement_type(MYSQL_THD thd); int mysql_parser_get_statement_digest(MYSQL_THD thd, unsigned char *digest); int mysql_parser_get_number_params(MYSQL_THD thd); int mysql_parser_extract_prepared_params(MYSQL_THD thd, int *positions); int mysql_parser_visit_tree(MYSQL_THD thd, parse_node_visit_function processor, unsigned char* arg); MYSQL_LEX_STRING mysql_parser_item_string(MYSQL_ITEM item); void mysql_parser_free_string(MYSQL_LEX_STRING string); MYSQL_LEX_STRING mysql_parser_get_query(MYSQL_THD thd); MYSQL_LEX_STRING mysql_parser_get_normalized_query(MYSQL_THD thd); #endif /* MYSQL_DYNAMIC_PLUGIN */ #ifdef __cplusplus } #endif #endif /* MYSQL_SERVICE_PARSER_INCLUDED */ PKp #include "mysql.h" #include "mysql/client_plugin.h" C_MODE_START int sha256_password_auth_client(MYSQL_PLUGIN_VIO *vio, MYSQL *mysql); int sha256_password_init(char *, size_t, int, va_list); int sha256_password_deinit(void); int caching_sha2_password_auth_client(MYSQL_PLUGIN_VIO *vio, MYSQL *mysql); int caching_sha2_password_init(char *, size_t, int, va_list); int caching_sha2_password_deinit(void); C_MODE_END #endif PKp #endif /* keep in sync with the loglevel enum in my_sys.h */ enum plugin_log_level { MY_ERROR_LEVEL, MY_WARNING_LEVEL, MY_INFORMATION_LEVEL }; #ifdef __cplusplus extern "C" { #endif extern struct my_plugin_log_service { /** write a message to the log */ int (*my_plugin_log_message)(MYSQL_PLUGIN *, enum plugin_log_level, const char *, ...); } *my_plugin_log_service; #ifdef MYSQL_DYNAMIC_PLUGIN #define my_plugin_log_message my_plugin_log_service->my_plugin_log_message #else int my_plugin_log_message(MYSQL_PLUGIN *plugin, enum plugin_log_level level, const char *format, ...); #endif #ifdef __cplusplus } #endif #endif PKp /* 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 PKp /* To get ER_ERROR_ON_READ */ #define MYSQL_SERVER 1 #include #include #include #include #include #include "field.h" #include "sql_thd_internal_api.h" #include #ifdef __cplusplus extern "C" { #endif /** This structure must be populated by plugins which implement connection handlers and passed as an argument to my_connection_handler_set() in order to activate the connection handler. The structure contains pointers to plugin functions which the server will call when a new client connects or when the connection handler is unloaded. It also containts the maximum number of threads the connection handler will create. */ struct Connection_handler_functions { /** The maximum number of threads this connection handler will create. */ uint max_threads; /** Called by the server when a new client connects. @param channel_info Pointer to object containing information about the new connection. @retval true failure @retval false success */ bool (*add_connection)(Channel_info *channel_info); /** Called by the server when the connection handler is destroyed. */ void (*end)(void); }; /* create thd from channel_info object */ THD* create_thd(Channel_info* channel_info); /* destroy channel_info object */ void destroy_channel_info(Channel_info* channel_info); /* Decrement connection counter */ void dec_connection_count(); /* thread_created is maintained by thread pool when activated since user threads are created by the thread pool (and also special threads to maintain the thread pool). This is done through inc_thread_created. */ void inc_thread_created(); void thd_lock_thread_count(THD *thd); void thd_unlock_thread_count(THD *thd); #ifdef __cplusplus } #endif /* Interface to global thread list iterator functions. Executes a function with signature 'void f(THD*, uint64)' for all THDs. */ typedef void (do_thd_impl_uint64)(THD*, uint64); void do_for_all_thd(do_thd_impl_uint64, uint64); /* Needed to get access to scheduler variables */ void* thd_get_scheduler_data(THD *thd); void thd_set_scheduler_data(THD *thd, void *data); PSI_thread* thd_get_psi(THD *thd); void thd_set_psi(THD *thd, PSI_thread *psi); /* Interface to THD variables and functions */ void thd_set_killed(THD *thd); void thd_clear_errors(THD *thd); void thd_close_connection(THD *thd); THD *thd_get_current_thd(); void thd_lock_data(THD *thd); void thd_unlock_data(THD *thd); bool thd_is_transaction_active(THD *thd); int thd_connection_has_data(THD *thd); void thd_set_net_read_write(THD *thd, uint val); uint thd_get_net_read_write(THD *thd); void thd_set_not_killable(THD *thd); ulong thd_get_net_wait_timeout(THD *thd); my_socket thd_get_fd(THD *thd); int thd_store_globals(THD* thd); /* Print to the MySQL error log */ void sql_print_error(const char *format, ...); void sql_print_warning(const char *format, ...); void sql_print_information(const char *format, ...); /* Store a table record */ bool schema_table_store_record(THD *thd, TABLE *table); /* The thread pool must be able to execute statements using the connection state in THD object. This is the main objective of the thread pool to schedule the start of these commands. */ bool do_command(THD *thd); /* The thread pool requires an interface to the connection logic in the MySQL Server since the thread pool will maintain the event logic on the TCP connection of the MySQL Server. Thus new connections, dropped connections will be discovered by the thread pool and it needs to ensure that the proper MySQL Server logic attached to these events is executed. */ /* Prepare connection as part of connection set-up */ bool thd_prepare_connection(THD *thd, bool extra_port_connection); /* Release auditing before executing statement */ void mysql_audit_release(THD *thd); /* Check if connection is still alive */ bool thd_connection_alive(THD *thd); /* Close connection with possible error code */ void close_connection(THD *thd, uint sql_errno, bool server_shutdown, bool generate_event); /* End the connection before closing it */ void end_connection(THD *thd); /* Reset thread globals */ void reset_thread_globals(THD *thd); /* max_connections is needed to calculate the maximum number of threads that is allowed to be started by the thread pool. The method get_max_connections() gets reference to this variable. */ ulong get_max_connections(void); /* connection_attrib is the thread attributes for connection threads, the method get_connection_attrib provides a reference to these attributes. */ my_thread_attr_t *get_connection_attrib(void); #endif // THREAD_POOL_PRIV_INCLUDED PKpconnection_handler_set((F), (M)) #define my_connection_handler_reset() \ my_thread_scheduler_service->connection_handler_reset() #else /** Instantiates Plugin_connection_handler based on the supplied Conection_handler_functions and sets it as the current connection handler. Also sets the THD_event_functions functions which will be called by the server when e.g. begining a wait. Remembers the existing connection handler so that it can be restored later. @param chf struct with functions to be called when e.g. handling new clients. @param tef struct with functions to be called when events (e.g. lock wait) happens. @note Both pointers (i.e. not the structs themselves) will be copied, so the structs must not disappear. @note We don't support dynamically loading more than one connection handler. @retval 1 failure @retval 0 success */ int my_connection_handler_set(struct Connection_handler_functions *chf, struct THD_event_functions *tef); /** Destroys the current connection handler and restores the previous. Should only be called after calling my_connection_handler_set(). @retval 1 failure @retval 0 success */ int my_connection_handler_reset(); #endif /* MYSQL_DYNAMIC_PLUGIN */ #ifdef __cplusplus } #endif #endif /* SERVICE_THREAD_SCHEDULER_INCLUDED */ PKpinit_session_thread((plugin)) #define srv_session_deinit_thread() \ srv_session_service->deinit_session_thread() #define srv_session_open(cb, ctx) \ srv_session_service->open_session((cb), (ctx)) #define srv_session_detach(session) \ srv_session_service->detach_session((session)) #define srv_session_close(session) \ srv_session_service->close_session((session)) #define srv_session_server_is_available() \ srv_session_service->server_is_available() #else /** Initializes the current physical thread to use with session service. Call this function ONLY in physical threads which are not initialized in any way by the server. @param plugin Pointer to the plugin structure, passed to the plugin over the plugin init function. @return 0 success 1 failure */ int srv_session_init_thread(const void *plugin); /** Deinitializes the current physical thread to use with session service. Call this function ONLY in physical threads which were initialized using srv_session_init_thread(). */ void srv_session_deinit_thread(); /** Opens a server session. In a thread not initialized by the server itself, this function should be called only after srv_session_init_thread() has already been called. @param error_cb Default completion callback @param plugin_ctx Plugin's context, opaque pointer that would be provided to callbacks. Might be NULL. @return session on success NULL on failure */ MYSQL_SESSION srv_session_open(srv_session_error_cb cb, void *plugix_ctx); /** Detaches a session from current physical thread. Detaches a previously attached session. Sessions are automatically attached when they are used with the Command service (command_service_run_command()). If the session is opened in a spawned thread, then it will stay attached after command_service_run_command() until another session is used in the same physical thread. The command services will detach the previously used session and attach the one to be used for execution. This function should be called in case the session has to be used in different physical thread. It will unbound the session from the current physical thread. After that the session can be used in a different thread. @param session Session to detach @returns 0 success 1 failure */ int srv_session_detach(MYSQL_SESSION session); /** Closes a previously opened session. @param session Session to close @return 0 success 1 failure */ int srv_session_close(MYSQL_SESSION session); /** Returns if the server is available (not booting or shutting down) @return 0 not available 1 available */ int srv_session_server_is_available(); #endif #ifdef __cplusplus } #endif #endif /* MYSQL_SRV_SESSION_SERVICE_INCLUDED */ PKp struct Srv_session; typedef struct Srv_session* MYSQL_SESSION; typedef void (*srv_session_error_cb)(void *ctx, unsigned int sql_errno, const char *err_msg); extern struct srv_session_service_st { int (*init_session_thread)(const void *plugin); void (*deinit_session_thread)(); MYSQL_SESSION (*open_session)(srv_session_error_cb error_cb, void *plugix_ctx); int (*detach_session)(MYSQL_SESSION session); int (*close_session)(MYSQL_SESSION session); int (*server_is_available)(); } *srv_session_service; int srv_session_init_thread(const void *plugin); void srv_session_deinit_thread(); MYSQL_SESSION srv_session_open(srv_session_error_cb cb, void *plugix_ctx); int srv_session_detach(MYSQL_SESSION session); int srv_session_close(MYSQL_SESSION session); int srv_session_server_is_available(); #include #include "mysql/service_srv_session.h" extern struct srv_session_info_service_st { MYSQL_THD (*get_thd)(MYSQL_SESSION session); my_thread_id (*get_session_id)(MYSQL_SESSION session); LEX_CSTRING (*get_current_db)(MYSQL_SESSION session); uint16_t (*get_client_port)(MYSQL_SESSION session); int (*set_client_port)(MYSQL_SESSION session, uint16_t port); int (*set_connection_type)(MYSQL_SESSION session, enum enum_vio_type type); int (*killed)(MYSQL_SESSION session); unsigned int (*session_count)(); unsigned int (*thread_count)(const void *plugin); } *srv_session_info_service; MYSQL_THD srv_session_info_get_thd(MYSQL_SESSION session); my_thread_id srv_session_info_get_session_id(MYSQL_SESSION session); LEX_CSTRING srv_session_info_get_current_db(MYSQL_SESSION session); uint16_t srv_session_info_get_client_port(MYSQL_SESSION session); int srv_session_info_set_client_port(MYSQL_SESSION session, uint16_t port); int srv_session_info_set_connection_type(MYSQL_SESSION session, enum enum_vio_type type); int srv_session_info_killed(MYSQL_SESSION session); unsigned int srv_session_info_session_count(); unsigned int srv_session_info_thread_count(const void *plugin); #include #include "mysql/service_srv_session.h" #include "mysql/com_data.h" typedef struct st_com_init_db_data { const char *db_name; unsigned long length; } COM_INIT_DB_DATA; typedef struct st_com_refresh_data { unsigned char options; } COM_REFRESH_DATA; typedef struct st_com_shutdown_data { enum mysql_enum_shutdown_level level; } COM_SHUTDOWN_DATA; typedef struct st_com_kill_data { unsigned long id; } COM_KILL_DATA; typedef struct st_com_set_option_data { unsigned int opt_command; } COM_SET_OPTION_DATA; typedef struct st_com_stmt_execute_data { unsigned long stmt_id; unsigned long flags; unsigned char *params; unsigned long params_length; } COM_STMT_EXECUTE_DATA; typedef struct st_com_stmt_fetch_data { unsigned long stmt_id; unsigned long num_rows; } COM_STMT_FETCH_DATA; typedef struct st_com_stmt_send_long_data_data { unsigned long stmt_id; unsigned int param_number; unsigned char *longdata; unsigned long length; } COM_STMT_SEND_LONG_DATA_DATA; typedef struct st_com_stmt_prepare_data { const char *query; unsigned int length; } COM_STMT_PREPARE_DATA; typedef struct st_stmt_close_data { unsigned int stmt_id; } COM_STMT_CLOSE_DATA; typedef struct st_com_stmt_reset_data { unsigned int stmt_id; } COM_STMT_RESET_DATA; typedef struct st_com_query_data { const char *query; unsigned int length; } COM_QUERY_DATA; typedef struct st_com_field_list_data { unsigned char *table_name; unsigned int table_name_length; const unsigned char *query; unsigned int query_length; } COM_FIELD_LIST_DATA; union COM_DATA { COM_INIT_DB_DATA com_init_db; COM_REFRESH_DATA com_refresh; COM_SHUTDOWN_DATA com_shutdown; COM_KILL_DATA com_kill; COM_SET_OPTION_DATA com_set_option; COM_STMT_EXECUTE_DATA com_stmt_execute; COM_STMT_FETCH_DATA com_stmt_fetch; COM_STMT_SEND_LONG_DATA_DATA com_stmt_send_long_data; COM_STMT_PREPARE_DATA com_stmt_prepare; COM_STMT_CLOSE_DATA com_stmt_close; COM_STMT_RESET_DATA com_stmt_reset; COM_QUERY_DATA com_query; COM_FIELD_LIST_DATA com_field_list; }; #include "mysql_time.h" enum enum_mysql_timestamp_type { MYSQL_TIMESTAMP_NONE= -2, MYSQL_TIMESTAMP_ERROR= -1, MYSQL_TIMESTAMP_DATE= 0, MYSQL_TIMESTAMP_DATETIME= 1, MYSQL_TIMESTAMP_TIME= 2 }; typedef struct st_mysql_time { unsigned int year, month, day, hour, minute, second; unsigned long second_part; my_bool neg; enum enum_mysql_timestamp_type time_type; } MYSQL_TIME; #include "decimal.h" typedef enum {TRUNCATE=0, HALF_EVEN, HALF_UP, CEILING, FLOOR} decimal_round_mode; typedef int32 decimal_digit_t; typedef struct st_decimal_t { int intg, frac, len; my_bool sign; decimal_digit_t *buf; } decimal_t; 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 { int (*start_result_metadata)(void *ctx, uint num_cols, uint flags, const CHARSET_INFO *resultcs); int (*field_metadata)(void *ctx, struct st_send_field *field, const CHARSET_INFO *charset); int (*end_result_metadata)(void *ctx, uint server_status, uint warn_count); int (*start_row)(void *ctx); int (*end_row)(void *ctx); void (*abort_row)(void *ctx); ulong (*get_client_capabilities)(void *ctx); int (*get_null)(void * ctx); int (*get_integer)(void * ctx, longlong value); int (*get_longlong)(void * ctx, longlong value, uint is_unsigned); int (*get_decimal)(void * ctx, const decimal_t * value); int (*get_double)(void * ctx, double value, uint32_t decimals); int (*get_date)(void * ctx, const MYSQL_TIME * value); int (*get_time)(void * ctx, const MYSQL_TIME * value, uint decimals); int (*get_datetime)(void * ctx, const MYSQL_TIME * value, uint decimals); int (*get_string)(void * ctx, const char * value, size_t length, const CHARSET_INFO * valuecs); void (*handle_ok)(void * ctx, uint server_status, uint statement_warn_count, ulonglong affected_rows, ulonglong last_insert_id, const char * message); void (*handle_error)(void * ctx, uint sql_errno, const char * err_msg, const char * sqlstate); void (*shutdown)(void *ctx, int server_shutdown); }; enum cs_text_or_binary { CS_TEXT_REPRESENTATION= 1, CS_BINARY_REPRESENTATION= 2, }; 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; 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); #include extern struct my_snprintf_service_st { size_t (*my_snprintf_type)(char*, size_t, const char*, ...); size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list); } *my_snprintf_service; size_t my_snprintf(char* to, size_t n, const char* fmt, ...); size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap); #include #include struct st_mysql_lex_string { char *str; size_t length; }; typedef struct st_mysql_lex_string MYSQL_LEX_STRING; struct st_mysql_const_lex_string { const char *str; size_t length; }; typedef struct st_mysql_const_lex_string MYSQL_LEX_CSTRING; extern struct thd_alloc_service_st { void *(*thd_alloc_func)(void*, size_t); void *(*thd_calloc_func)(void*, size_t); char *(*thd_strdup_func)(void*, const char *); char *(*thd_strmake_func)(void*, const char *, size_t); void *(*thd_memdup_func)(void*, const void*, size_t); MYSQL_LEX_STRING *(*thd_make_lex_string_func)(void*, MYSQL_LEX_STRING *, const char *, size_t, int); } *thd_alloc_service; void *thd_alloc(void* thd, size_t size); void *thd_calloc(void* thd, size_t size); char *thd_strdup(void* thd, const char *str); char *thd_strmake(void* thd, const char *str, size_t size); void *thd_memdup(void* thd, const void* str, size_t size); MYSQL_LEX_STRING *thd_make_lex_string(void* thd, MYSQL_LEX_STRING *lex_str, const char *str, size_t size, int allocate_lex_string); #include typedef enum _thd_wait_type_e { THD_WAIT_SLEEP= 1, THD_WAIT_DISKIO= 2, THD_WAIT_ROW_LOCK= 3, THD_WAIT_GLOBAL_LOCK= 4, THD_WAIT_META_DATA_LOCK= 5, THD_WAIT_TABLE_LOCK= 6, THD_WAIT_USER_LOCK= 7, THD_WAIT_BINLOG= 8, THD_WAIT_GROUP_COMMIT= 9, THD_WAIT_SYNC= 10, THD_WAIT_NET= 11, THD_WAIT_LAST= 12 } thd_wait_type; extern struct thd_wait_service_st { void (*thd_wait_begin_func)(void*, int); void (*thd_wait_end_func)(void*); } *thd_wait_service; void thd_wait_begin(void* thd, int wait_type); void thd_wait_end(void* thd); #include struct Connection_handler_functions; struct THD_event_functions; extern struct my_thread_scheduler_service { int (*connection_handler_set)(struct Connection_handler_functions *, struct THD_event_functions *); int (*connection_handler_reset)(); } *my_thread_scheduler_service; int my_connection_handler_set(struct Connection_handler_functions *chf, struct THD_event_functions *tef); int my_connection_handler_reset(); #include enum plugin_log_level { MY_ERROR_LEVEL, MY_WARNING_LEVEL, MY_INFORMATION_LEVEL }; extern struct my_plugin_log_service { int (*my_plugin_log_message)(MYSQL_PLUGIN *, enum plugin_log_level, const char *, ...); } *my_plugin_log_service; int my_plugin_log_message(MYSQL_PLUGIN *plugin, enum plugin_log_level level, const char *format, ...); #include typedef void *mysql_string_iterator_handle; typedef void *mysql_string_handle; extern struct mysql_string_service_st { int (*mysql_string_convert_to_char_ptr_type) (mysql_string_handle, const char *, char *, unsigned int, int *); mysql_string_iterator_handle (*mysql_string_get_iterator_type) (mysql_string_handle); int (*mysql_string_iterator_next_type)(mysql_string_iterator_handle); int (*mysql_string_iterator_isupper_type)(mysql_string_iterator_handle); int (*mysql_string_iterator_islower_type)(mysql_string_iterator_handle); int (*mysql_string_iterator_isdigit_type)(mysql_string_iterator_handle); mysql_string_handle (*mysql_string_to_lowercase_type)(mysql_string_handle); void (*mysql_string_free_type)(mysql_string_handle); void (*mysql_string_iterator_free_type)(mysql_string_iterator_handle); } *mysql_string_service; int mysql_string_convert_to_char_ptr(mysql_string_handle string_handle, const char *charset_name, char *buffer, unsigned int buffer_size, int *error); mysql_string_iterator_handle mysql_string_get_iterator(mysql_string_handle string_handle); int mysql_string_iterator_next(mysql_string_iterator_handle iterator_handle); int mysql_string_iterator_isupper(mysql_string_iterator_handle iterator_handle); int mysql_string_iterator_islower(mysql_string_iterator_handle iterator_handle); int mysql_string_iterator_isdigit(mysql_string_iterator_handle iterator_handle); mysql_string_handle mysql_string_to_lowercase(mysql_string_handle string_handle); void mysql_string_free(mysql_string_handle); void mysql_string_iterator_free(mysql_string_iterator_handle); #include #include "mysql/psi/psi_memory.h" #include "psi_base.h" struct PSI_thread; typedef unsigned int PSI_memory_key; typedef int myf_t; typedef void * (*mysql_malloc_t)(PSI_memory_key key, size_t size, myf_t flags); typedef void * (*mysql_realloc_t)(PSI_memory_key key, void *ptr, size_t size, myf_t flags); typedef void (*mysql_claim_t)(void *ptr); typedef void (*mysql_free_t)(void *ptr); typedef void * (*my_memdup_t)(PSI_memory_key key, const void *from, size_t length, myf_t flags); typedef char * (*my_strdup_t)(PSI_memory_key key, const char *from, myf_t flags); typedef char * (*my_strndup_t)(PSI_memory_key key, const char *from, size_t length, myf_t flags); struct mysql_malloc_service_st { mysql_malloc_t mysql_malloc; mysql_realloc_t mysql_realloc; mysql_claim_t mysql_claim; mysql_free_t mysql_free; my_memdup_t my_memdup; my_strdup_t my_strdup; my_strndup_t my_strndup; }; extern struct mysql_malloc_service_st *mysql_malloc_service; extern void * my_malloc(PSI_memory_key key, size_t size, myf_t flags); extern void * my_realloc(PSI_memory_key key, void *ptr, size_t size, myf_t flags); extern void my_claim(void *ptr); extern void my_free(void *ptr); extern void * my_memdup(PSI_memory_key key, const void *from, size_t length, myf_t flags); extern char * my_strdup(PSI_memory_key key, const char *from, myf_t flags); extern char * my_strndup(PSI_memory_key key, const char *from, size_t length, myf_t flags); #include extern struct mysql_password_policy_service_st { int (*my_validate_password_policy_func)(const char *, unsigned int); int (*my_calculate_password_strength_func)(const char *, unsigned int); } *mysql_password_policy_service; int my_validate_password_policy(const char *, unsigned int); int my_calculate_password_strength(const char *, unsigned int); #include #include "my_md5_size.h" #include typedef void* MYSQL_ITEM; typedef int (*parse_node_visit_function)(MYSQL_ITEM item, unsigned char* arg); typedef int (*sql_condition_handler_function)(int sql_errno, const char* sqlstate, const char* msg, void *state); struct st_my_thread_handle; extern struct mysql_parser_service_st { void* (*mysql_current_session)(); void* (*mysql_open_session)(); void (*mysql_start_thread)(void* thd, void *(*callback_fun)(void*), void *arg, struct st_my_thread_handle *thread_handle); void (*mysql_join_thread)(struct st_my_thread_handle *thread_handle); void (*mysql_set_current_database)(void* thd, const MYSQL_LEX_STRING db); int (*mysql_parse)(void* thd, const MYSQL_LEX_STRING query, unsigned char is_prepared, sql_condition_handler_function handle_condition, void *condition_handler_state); int (*mysql_get_statement_type)(void* thd); int (*mysql_get_statement_digest)(void* thd, unsigned char *digest); int (*mysql_get_number_params)(void* thd); int (*mysql_extract_prepared_params)(void* thd, int *positions); int (*mysql_visit_tree)(void* thd, parse_node_visit_function processor, unsigned char* arg); MYSQL_LEX_STRING (*mysql_item_string)(MYSQL_ITEM item); void (*mysql_free_string)(MYSQL_LEX_STRING string); MYSQL_LEX_STRING (*mysql_get_query)(void* thd); MYSQL_LEX_STRING (*mysql_get_normalized_query)(void* thd); } *mysql_parser_service; typedef void *(*callback_function)(void*); void* mysql_parser_current_session(); void* mysql_parser_open_session(); void mysql_parser_start_thread(void* thd, callback_function fun, void *arg, struct st_my_thread_handle *thread_handle); void mysql_parser_join_thread(struct st_my_thread_handle *thread_handle); void mysql_parser_set_current_database(void* thd, const MYSQL_LEX_STRING db); int mysql_parser_parse(void* thd, const MYSQL_LEX_STRING query, unsigned char is_prepared, sql_condition_handler_function handle_condition, void *condition_handler_state); int mysql_parser_get_statement_type(void* thd); int mysql_parser_get_statement_digest(void* thd, unsigned char *digest); int mysql_parser_get_number_params(void* thd); int mysql_parser_extract_prepared_params(void* thd, int *positions); int mysql_parser_visit_tree(void* thd, parse_node_visit_function processor, unsigned char* arg); MYSQL_LEX_STRING mysql_parser_item_string(MYSQL_ITEM item); void mysql_parser_free_string(MYSQL_LEX_STRING string); MYSQL_LEX_STRING mysql_parser_get_query(void* thd); MYSQL_LEX_STRING mysql_parser_get_normalized_query(void* thd); #include struct st_transaction_termination_ctx { unsigned long m_thread_id; unsigned int m_flags; char m_rollback_transaction; char m_generated_gtid; int m_sidno; long long int m_gno; }; typedef struct st_transaction_termination_ctx Transaction_termination_ctx; extern struct rpl_transaction_ctx_service_st { int (*set_transaction_ctx)(Transaction_termination_ctx transaction_termination_ctx); } *rpl_transaction_ctx_service; int set_transaction_ctx(Transaction_termination_ctx transaction_termination_ctx); #include struct st_trans_write_set { unsigned int m_flags; unsigned long write_set_size; unsigned long long* write_set; }; typedef struct st_trans_write_set Transaction_write_set; extern struct transaction_write_set_service_st { Transaction_write_set* (*get_transaction_write_set)(unsigned long m_thread_id); } *transaction_write_set_service; Transaction_write_set* get_transaction_write_set(unsigned long m_thread_id); #include typedef char my_svc_bool; extern struct security_context_service_st { my_svc_bool (*thd_get_security_context)(void*, void* *out_ctx); my_svc_bool (*thd_set_security_context)(void*, void* in_ctx); my_svc_bool (*security_context_create)(void* *out_ctx); my_svc_bool (*security_context_destroy)(void*); my_svc_bool (*security_context_copy)(void* in_ctx, void* *out_ctx); my_svc_bool (*security_context_lookup)(void* ctx, const char *user, const char *host, const char *ip, const char *db); my_svc_bool (*security_context_get_option)(void*, const char *name, void *inout_pvalue); my_svc_bool (*security_context_set_option)(void*, const char *name, void *pvalue); } *security_context_service; my_svc_bool thd_get_security_context(void*, void* *out_ctx); my_svc_bool thd_set_security_context(void*, void* in_ctx); my_svc_bool security_context_create(void* *out_ctx); my_svc_bool security_context_destroy(void* ctx); my_svc_bool security_context_copy(void* in_ctx, void* *out_ctx); my_svc_bool security_context_lookup(void* ctx, const char *user, const char *host, const char *ip, const char *db); my_svc_bool security_context_get_option(void*, const char *name, void *inout_pvalue); my_svc_bool security_context_set_option(void*, const char *name, void *pvalue); #include enum enum_locking_service_lock_type { LOCKING_SERVICE_READ, LOCKING_SERVICE_WRITE }; extern struct mysql_locking_service_st { int (*mysql_acquire_locks)(void* opaque_thd, const char* lock_namespace, const char**lock_names, size_t lock_num, enum enum_locking_service_lock_type lock_type, unsigned long lock_timeout); int (*mysql_release_locks)(void* opaque_thd, const char* lock_namespace); } *mysql_locking_service; int mysql_acquire_locking_service_locks(void* opaque_thd, const char* lock_namespace, const char**lock_names, size_t lock_num, enum enum_locking_service_lock_type lock_type, unsigned long lock_timeout); int mysql_release_locking_service_locks(void* opaque_thd, const char* lock_namespace); #include extern struct mysql_keyring_service_st { int (*my_key_store_func)(const char *, const char *, const char *, const void *, size_t); int (*my_key_fetch_func)(const char *, char **, const char *, void **, size_t *); int (*my_key_remove_func)(const char *, const char *); int (*my_key_generate_func)(const char *, const char *, const char *, size_t); } *mysql_keyring_service; int my_key_store(const char *, const char *, const char *, const void *, size_t); int my_key_fetch(const char *, char **, const char *, void **, size_t *); int my_key_remove(const char *, const char *); int my_key_generate(const char *, const char *, const char *, size_t); PKp0 verification depth */ extern "C" long ssl_wrapper_verify_depth(Vio *vio); /** Return the verification mode set in SSL @param vio VIO connection descriptor @return -1 default values should be used >0 verification mode */ extern "C" long ssl_wrapper_verify_mode(Vio *vio); /** Return issuer name form peers ssl certificate @param vio VIO connection descriptor @param issuer Character buffer in which the issuer name is going to be placed @param issuer_size Size of character buffer for the issuer name */ extern "C" void ssl_wrapper_get_peer_certificate_issuer(Vio *vio, char *issuer, const size_t issuer_size); /** Return subject field form peers ssl certificate @param vio VIO connection descriptor @param subject Character buffer in which the subject is going to be placed @param subject_size Size of character buffer for the subject */ extern "C" void ssl_wrapper_get_peer_certificate_subject(Vio *vio, char *subject, const size_t subject_size); /** Check is peer certificate is present and try to verify it @param vio VIO connection descriptor @return X509_V_OK verification of peer certificate succeeded -1 verification failed */ extern "C" long ssl_wrapper_get_verify_result_and_cert(Vio *vio); /** Return the verification depth limit set in SSL context @param vio_ssl VIO SSL contex descriptor @return -1 default values should be used >0 verification depth */ extern "C" long ssl_wrapper_ctx_verify_depth(struct st_VioSSLFd *vio_ssl); /** Return the verification mode set in SSL context @param vio_ssl VIO SSL contex descriptor @return -1 default values should be used >0 verification mode */ extern "C" long ssl_wrapper_ctx_verify_mode(struct st_VioSSLFd *vio_ssl); /** Return the last day the server certificate is valid @param vio_ssl VIO SSL contex descriptor @param no_after Character buffer for to be filed with the date in human readble format @param no_after_size Size of the character buffer */ extern "C" void ssl_wrapper_ctx_server_not_after(struct st_VioSSLFd *vio_ssl, char *no_after, const size_t no_after_size); /** Return the first day the server certificate is valid @param vio_ssl VIO SSL contex descriptor @param no_before Character buffer for to be filed with the date in human readble format @param no_before_size Size of the character buffer */ extern "C" void ssl_wrapper_ctx_server_not_before(struct st_VioSSLFd *vio_ssl, char *no_before, const size_t no_before_size); extern "C" void ssl_wrapper_thread_cleanup(); extern "C" long ssl_wrapper_sess_accept(struct st_VioSSLFd *vio_ssl); /** Cleanup data allocated by SSL on thread stack */ extern "C" long ssl_wrapper_sess_accept_good(struct st_VioSSLFd *vio_ssl); #endif /* SSL_WRAPPER_INCLUDED */ PKpmysql_acquire_locks(_THD, _NAMESPACE, _NAMES, _NUM, \ _TYPE, _TIMEOUT) #define mysql_release_locking_service_locks(_THD, _NAMESPACE) \ mysql_locking_service->mysql_release_locks(_THD, _NAMESPACE) #else int mysql_acquire_locking_service_locks(MYSQL_THD opaque_thd, const char* lock_namespace, const char**lock_names, size_t lock_num, enum enum_locking_service_lock_type lock_type, unsigned long lock_timeout); int mysql_release_locking_service_locks(MYSQL_THD opaque_thd, const char* lock_namespace); #endif /* MYSQL_DYNAMIC_PLUGIN */ #ifdef __cplusplus } #endif #endif /* SERVICE_LOCKING_INCLUDED */ PKpnet.read_pos. A plugin may return this value if the number of roundtrips in the authentication protocol is not known in advance, and the client plugin needs to read one packet more to determine if the authentication is finished or not. */ #define CR_OK_HANDSHAKE_COMPLETE -2 /** Flag to be passed back to server from authentication plugins via authenticated_as when proxy mapping should be done by the server. */ #define PROXY_FLAG 0 /* We need HANDLE definition if on Windows. Define WIN32_LEAN_AND_MEAN (if not already done) to minimize amount of imported declarations. */ #ifdef _WIN32 #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include #endif typedef struct st_plugin_vio_info { enum { MYSQL_VIO_INVALID, MYSQL_VIO_TCP, MYSQL_VIO_SOCKET, MYSQL_VIO_PIPE, MYSQL_VIO_MEMORY } protocol; int socket; /**< it's set, if the protocol is SOCKET or TCP */ #ifdef _WIN32 HANDLE handle; /**< it's set, if the protocol is PIPE or MEMORY */ #endif } MYSQL_PLUGIN_VIO_INFO; /** Provides plugin access to communication channel */ typedef struct st_plugin_vio { /** Plugin provides a pointer reference and this function sets it to the contents of any incoming packet. Returns the packet length, or -1 if the plugin should terminate. */ int (*read_packet)(struct st_plugin_vio *vio, unsigned char **buf); /** Plugin provides a buffer with data and the length and this function sends it as a packet. Returns 0 on success, 1 on failure. */ int (*write_packet)(struct st_plugin_vio *vio, const unsigned char *packet, int packet_len); /** Fills in a st_plugin_vio_info structure, providing the information about the connection. */ void (*info)(struct st_plugin_vio *vio, struct st_plugin_vio_info *info); } MYSQL_PLUGIN_VIO; #endif PKp #define MYSQL_GROUP_REPLICATION_INTERFACE_VERSION 0x0101 /* Callbacks for get_connection_status_info function. context field can have NULL value, plugin will always pass it through all callbacks, independent of its value. Its value will not be used by plugin. All callbacks are mandatory. */ typedef struct st_group_replication_connection_status_callbacks { void* const context; void (*set_channel_name)(void* const context, const char& value, size_t length); void (*set_group_name)(void* const context, const char& value, size_t length); void (*set_source_uuid)(void* const context, const char& value, size_t length); void (*set_service_state)(void* const context, bool state); } GROUP_REPLICATION_CONNECTION_STATUS_CALLBACKS; /* Callbacks for get_group_members_info function. context field can have NULL value, plugin will always pass it through all callbacks, independent of its value. Its value will not be used by plugin. All callbacks are mandatory. */ typedef struct st_group_replication_group_members_callbacks { void* const context; void (*set_channel_name)(void* const context, const char& value, size_t length); void (*set_member_id)(void* const context, const char& value, size_t length); void (*set_member_host)(void* const context, const char& value, size_t length); void (*set_member_port)(void* const context, unsigned int value); void (*set_member_state)(void* const context, const char& value, size_t length); } GROUP_REPLICATION_GROUP_MEMBERS_CALLBACKS; /* Callbacks for get_group_member_stats_info function. context field can have NULL value, plugin will always pass it through all callbacks, independent of its value. Its value will not be used by plugin. All callbacks are mandatory. */ typedef struct st_group_replication_member_stats_callbacks { void* const context; void (*set_channel_name)(void* const context, const char& value, size_t length); void (*set_view_id)(void* const context, const char& value, size_t length); void (*set_member_id)(void* const context, const char& value, size_t length); void (*set_transactions_committed)(void* const context, const char& value, size_t length); void (*set_last_conflict_free_transaction)(void* const context, const char& value, size_t length); void (*set_transactions_in_queue)(void* const context, unsigned long long int value); void (*set_transactions_certified)(void* const context, unsigned long long int value); void (*set_transactions_conflicts_detected)(void* const context, unsigned long long int value); void (*set_transactions_rows_in_validation)(void* const context, unsigned long long int value); } GROUP_REPLICATION_GROUP_MEMBER_STATS_CALLBACKS; struct st_mysql_group_replication { int interface_version; /* This function is used to start the group replication. */ int (*start)(); /* This function is used to stop the group replication. */ int (*stop)(); /* This function is used to get the current group replication running status. */ bool (*is_running)(); /* This function initializes conflict checking module with info received from group on this member. @param info View_change_log_event with conflict checking info. */ int (*set_retrieved_certification_info)(void* info); /* This function is used to fetch information for group replication kernel stats. @param callbacks The set of callbacks and its context used to set the information on caller. @note The caller is responsible to free memory from the info structure and from all its fields. */ bool (*get_connection_status_info) (const GROUP_REPLICATION_CONNECTION_STATUS_CALLBACKS& callbacks); /* This function is used to fetch information for group replication members. @param callbacks The set of callbacks and its context used to set the information on caller. @note The caller is responsible to free memory from the info structure and from all its fields. */ bool (*get_group_members_info) (unsigned int index, const GROUP_REPLICATION_GROUP_MEMBERS_CALLBACKS& callbacks); /* This function is used to fetch information for group replication members statistics. @param callbacks The set of callbacks and its context used to set the information on caller. @note The caller is responsible to free memory from the info structure and from all its fields. */ bool (*get_group_member_stats_info) (const GROUP_REPLICATION_GROUP_MEMBER_STATS_CALLBACKS& callbacks); /* Get number of group replication members. */ unsigned int (*get_members_number_info)(); }; #endif PKp (mdl_type), static_cast (mdl_duration), static_cast (mdl_status), src_file, src_line); return result; } static inline void inline_mysql_mdl_set_status( PSI_metadata_lock *psi, MDL_ticket::enum_psi_status mdl_status) { if (psi != NULL) PSI_METADATA_CALL(set_metadata_lock_status)(psi, mdl_status); } static inline void inline_mysql_mdl_destroy( PSI_metadata_lock *psi, const char *src_file, uint src_line) { if (psi != NULL) PSI_METADATA_CALL(destroy_metadata_lock)(psi); } #endif /* HAVE_PSI_METADATA_INTERFACE */ /** @} (end of group Metadata_instrumentation) */ #endif PKpm_work_completed= val; } static inline ulonglong inline_mysql_stage_get_work_completed(PSI_stage_progress *progress) { return progress->m_work_completed; } #endif #ifdef HAVE_PSI_STAGE_INTERFACE static inline void inline_mysql_stage_inc_work_completed(PSI_stage_progress *progress, ulonglong val) { if (progress != NULL) progress->m_work_completed+= val; } #endif #ifdef HAVE_PSI_STAGE_INTERFACE static inline void inline_mysql_stage_set_work_estimated(PSI_stage_progress *progress, ulonglong val) { if (progress != NULL) progress->m_work_estimated= val; } static inline ulonglong inline_mysql_stage_get_work_estimated(PSI_stage_progress *progress) { return progress->m_work_estimated; } #endif /** @} (end of group Stage_instrumentation) */ #endif PKpm_mutex); #else #define mysql_mutex_assert_owner(M) { } #endif /** @def mysql_mutex_assert_not_owner(M) Wrapper, to use safe_mutex_assert_not_owner with instrumented mutexes. @c mysql_mutex_assert_not_owner is a drop-in replacement for @c safe_mutex_assert_not_owner. */ #ifdef SAFE_MUTEX #define mysql_mutex_assert_not_owner(M) \ safe_mutex_assert_not_owner(&(M)->m_mutex); #else #define mysql_mutex_assert_not_owner(M) { } #endif /** @def mysql_prlock_assert_write_owner(M) Drop-in replacement for @c rw_pr_lock_assert_write_owner. */ #define mysql_prlock_assert_write_owner(M) \ rw_pr_lock_assert_write_owner(&(M)->m_prlock) /** @def mysql_prlock_assert_not_write_owner(M) Drop-in replacement for @c rw_pr_lock_assert_not_write_owner. */ #define mysql_prlock_assert_not_write_owner(M) \ rw_pr_lock_assert_not_write_owner(&(M)->m_prlock) /** @def mysql_mutex_register(P1, P2, P3) Mutex registration. */ #define mysql_mutex_register(P1, P2, P3) \ inline_mysql_mutex_register(P1, P2, P3) /** @def mysql_mutex_init(K, M, A) Instrumented mutex_init. @c mysql_mutex_init is a replacement for @c pthread_mutex_init. @param K The PSI_mutex_key for this instrumented mutex @param M The mutex to initialize @param A Mutex attributes */ #ifdef HAVE_PSI_MUTEX_INTERFACE #ifdef SAFE_MUTEX #define mysql_mutex_init(K, M, A) \ inline_mysql_mutex_init(K, M, A, __FILE__, __LINE__) #else #define mysql_mutex_init(K, M, A) \ inline_mysql_mutex_init(K, M, A) #endif #else #ifdef SAFE_MUTEX #define mysql_mutex_init(K, M, A) \ inline_mysql_mutex_init(M, A, __FILE__, __LINE__) #else #define mysql_mutex_init(K, M, A) \ inline_mysql_mutex_init(M, A) #endif #endif /** @def mysql_mutex_destroy(M) Instrumented mutex_destroy. @c mysql_mutex_destroy is a drop-in replacement for @c pthread_mutex_destroy. */ #ifdef SAFE_MUTEX #define mysql_mutex_destroy(M) \ inline_mysql_mutex_destroy(M, __FILE__, __LINE__) #else #define mysql_mutex_destroy(M) \ inline_mysql_mutex_destroy(M) #endif /** @def mysql_mutex_lock(M) Instrumented mutex_lock. @c mysql_mutex_lock is a drop-in replacement for @c pthread_mutex_lock. @param M The mutex to lock */ #if defined(SAFE_MUTEX) || defined (HAVE_PSI_MUTEX_INTERFACE) #define mysql_mutex_lock(M) \ inline_mysql_mutex_lock(M, __FILE__, __LINE__) #else #define mysql_mutex_lock(M) \ inline_mysql_mutex_lock(M) #endif /** @def mysql_mutex_trylock(M) Instrumented mutex_lock. @c mysql_mutex_trylock is a drop-in replacement for @c my_mutex_trylock. */ #if defined(SAFE_MUTEX) || defined (HAVE_PSI_MUTEX_INTERFACE) #define mysql_mutex_trylock(M) \ inline_mysql_mutex_trylock(M, __FILE__, __LINE__) #else #define mysql_mutex_trylock(M) \ inline_mysql_mutex_trylock(M) #endif /** @def mysql_mutex_unlock(M) Instrumented mutex_unlock. @c mysql_mutex_unlock is a drop-in replacement for @c pthread_mutex_unlock. */ #ifdef SAFE_MUTEX #define mysql_mutex_unlock(M) \ inline_mysql_mutex_unlock(M, __FILE__, __LINE__) #else #define mysql_mutex_unlock(M) \ inline_mysql_mutex_unlock(M) #endif /** @def mysql_rwlock_register(P1, P2, P3) Rwlock registration. */ #define mysql_rwlock_register(P1, P2, P3) \ inline_mysql_rwlock_register(P1, P2, P3) /** @def mysql_rwlock_init(K, RW) Instrumented rwlock_init. @c mysql_rwlock_init is a replacement for @c pthread_rwlock_init. Note that pthread_rwlockattr_t is not supported in MySQL. @param K The PSI_rwlock_key for this instrumented rwlock @param RW The rwlock to initialize */ #ifdef HAVE_PSI_RWLOCK_INTERFACE #define mysql_rwlock_init(K, RW) inline_mysql_rwlock_init(K, RW) #else #define mysql_rwlock_init(K, RW) inline_mysql_rwlock_init(RW) #endif /** @def mysql_prlock_init(K, RW) Instrumented rw_pr_init. @c mysql_prlock_init is a replacement for @c rw_pr_init. @param K The PSI_rwlock_key for this instrumented prlock @param RW The prlock to initialize */ #ifdef HAVE_PSI_RWLOCK_INTERFACE #define mysql_prlock_init(K, RW) inline_mysql_prlock_init(K, RW) #else #define mysql_prlock_init(K, RW) inline_mysql_prlock_init(RW) #endif /** @def mysql_rwlock_destroy(RW) Instrumented rwlock_destroy. @c mysql_rwlock_destroy is a drop-in replacement for @c pthread_rwlock_destroy. */ #define mysql_rwlock_destroy(RW) inline_mysql_rwlock_destroy(RW) /** @def mysql_prlock_destroy(RW) Instrumented rw_pr_destroy. @c mysql_prlock_destroy is a drop-in replacement for @c rw_pr_destroy. */ #define mysql_prlock_destroy(RW) inline_mysql_prlock_destroy(RW) /** @def mysql_rwlock_rdlock(RW) Instrumented rwlock_rdlock. @c mysql_rwlock_rdlock is a drop-in replacement for @c pthread_rwlock_rdlock. */ #ifdef HAVE_PSI_RWLOCK_INTERFACE #define mysql_rwlock_rdlock(RW) \ inline_mysql_rwlock_rdlock(RW, __FILE__, __LINE__) #else #define mysql_rwlock_rdlock(RW) \ inline_mysql_rwlock_rdlock(RW) #endif /** @def mysql_prlock_rdlock(RW) Instrumented rw_pr_rdlock. @c mysql_prlock_rdlock is a drop-in replacement for @c rw_pr_rdlock. */ #ifdef HAVE_PSI_RWLOCK_INTERFACE #define mysql_prlock_rdlock(RW) \ inline_mysql_prlock_rdlock(RW, __FILE__, __LINE__) #else #define mysql_prlock_rdlock(RW) \ inline_mysql_prlock_rdlock(RW) #endif /** @def mysql_rwlock_wrlock(RW) Instrumented rwlock_wrlock. @c mysql_rwlock_wrlock is a drop-in replacement for @c pthread_rwlock_wrlock. */ #ifdef HAVE_PSI_RWLOCK_INTERFACE #define mysql_rwlock_wrlock(RW) \ inline_mysql_rwlock_wrlock(RW, __FILE__, __LINE__) #else #define mysql_rwlock_wrlock(RW) \ inline_mysql_rwlock_wrlock(RW) #endif /** @def mysql_prlock_wrlock(RW) Instrumented rw_pr_wrlock. @c mysql_prlock_wrlock is a drop-in replacement for @c rw_pr_wrlock. */ #ifdef HAVE_PSI_RWLOCK_INTERFACE #define mysql_prlock_wrlock(RW) \ inline_mysql_prlock_wrlock(RW, __FILE__, __LINE__) #else #define mysql_prlock_wrlock(RW) \ inline_mysql_prlock_wrlock(RW) #endif /** @def mysql_rwlock_tryrdlock(RW) Instrumented rwlock_tryrdlock. @c mysql_rwlock_tryrdlock is a drop-in replacement for @c pthread_rwlock_tryrdlock. */ #ifdef HAVE_PSI_RWLOCK_INTERFACE #define mysql_rwlock_tryrdlock(RW) \ inline_mysql_rwlock_tryrdlock(RW, __FILE__, __LINE__) #else #define mysql_rwlock_tryrdlock(RW) \ inline_mysql_rwlock_tryrdlock(RW) #endif /** @def mysql_rwlock_trywrlock(RW) Instrumented rwlock_trywrlock. @c mysql_rwlock_trywrlock is a drop-in replacement for @c pthread_rwlock_trywrlock. */ #ifdef HAVE_PSI_RWLOCK_INTERFACE #define mysql_rwlock_trywrlock(RW) \ inline_mysql_rwlock_trywrlock(RW, __FILE__, __LINE__) #else #define mysql_rwlock_trywrlock(RW) \ inline_mysql_rwlock_trywrlock(RW) #endif /** @def mysql_rwlock_unlock(RW) Instrumented rwlock_unlock. @c mysql_rwlock_unlock is a drop-in replacement for @c pthread_rwlock_unlock. */ #define mysql_rwlock_unlock(RW) inline_mysql_rwlock_unlock(RW) /** @def mysql_prlock_unlock(RW) Instrumented rw_pr_unlock. @c mysql_prlock_unlock is a drop-in replacement for @c rw_pr_unlock. */ #define mysql_prlock_unlock(RW) inline_mysql_prlock_unlock(RW) /** @def mysql_cond_register(P1, P2, P3) Cond registration. */ #define mysql_cond_register(P1, P2, P3) \ inline_mysql_cond_register(P1, P2, P3) /** @def mysql_cond_init(K, C) Instrumented cond_init. @c mysql_cond_init is a replacement for @c pthread_cond_init. Note that pthread_condattr_t is not supported in MySQL. @param C The cond to initialize @param K The PSI_cond_key for this instrumented cond */ #ifdef HAVE_PSI_COND_INTERFACE #define mysql_cond_init(K, C) inline_mysql_cond_init(K, C) #else #define mysql_cond_init(K, C) inline_mysql_cond_init(C) #endif /** @def mysql_cond_destroy(C) Instrumented cond_destroy. @c mysql_cond_destroy is a drop-in replacement for @c pthread_cond_destroy. */ #define mysql_cond_destroy(C) inline_mysql_cond_destroy(C) /** @def mysql_cond_wait(C) Instrumented cond_wait. @c mysql_cond_wait is a drop-in replacement for @c native_cond_wait. */ #if defined(SAFE_MUTEX) || defined(HAVE_PSI_COND_INTERFACE) #define mysql_cond_wait(C, M) \ inline_mysql_cond_wait(C, M, __FILE__, __LINE__) #else #define mysql_cond_wait(C, M) \ inline_mysql_cond_wait(C, M) #endif /** @def mysql_cond_timedwait(C, M, W) Instrumented cond_timedwait. @c mysql_cond_timedwait is a drop-in replacement for @c native_cond_timedwait. */ #if defined(SAFE_MUTEX) || defined(HAVE_PSI_COND_INTERFACE) #define mysql_cond_timedwait(C, M, W) \ inline_mysql_cond_timedwait(C, M, W, __FILE__, __LINE__) #else #define mysql_cond_timedwait(C, M, W) \ inline_mysql_cond_timedwait(C, M, W) #endif /** @def mysql_cond_signal(C) Instrumented cond_signal. @c mysql_cond_signal is a drop-in replacement for @c pthread_cond_signal. */ #define mysql_cond_signal(C) inline_mysql_cond_signal(C) /** @def mysql_cond_broadcast(C) Instrumented cond_broadcast. @c mysql_cond_broadcast is a drop-in replacement for @c pthread_cond_broadcast. */ #define mysql_cond_broadcast(C) inline_mysql_cond_broadcast(C) /** @def mysql_thread_register(P1, P2, P3) Thread registration. */ #define mysql_thread_register(P1, P2, P3) \ inline_mysql_thread_register(P1, P2, P3) /** @def mysql_thread_create(K, P1, P2, P3, P4) Instrumented my_thread_create. This function creates both the thread instrumentation and a thread. @c mysql_thread_create is a replacement for @c my_thread_create. The parameter P4 (or, if it is NULL, P1) will be used as the instrumented thread "indentity". Providing a P1 / P4 parameter with a different value for each call will on average improve performances, since this thread identity value is used internally to randomize access to data and prevent contention. This is optional, and the improvement is not guaranteed, only statistical. @param K The PSI_thread_key for this instrumented thread @param P1 my_thread_create parameter 1 @param P2 my_thread_create parameter 2 @param P3 my_thread_create parameter 3 @param P4 my_thread_create parameter 4 */ #ifdef HAVE_PSI_THREAD_INTERFACE #define mysql_thread_create(K, P1, P2, P3, P4) \ inline_mysql_thread_create(K, P1, P2, P3, P4) #else #define mysql_thread_create(K, P1, P2, P3, P4) \ my_thread_create(P1, P2, P3, P4) #endif /** @def mysql_thread_set_psi_id(I) Set the thread identifier for the instrumentation. @param I The thread identifier */ #ifdef HAVE_PSI_THREAD_INTERFACE #define mysql_thread_set_psi_id(I) inline_mysql_thread_set_psi_id(I) #else #define mysql_thread_set_psi_id(I) do {} while (0) #endif /** @def mysql_thread_set_psi_THD(T) Set the thread sql session for the instrumentation. @param I The thread identifier */ #ifdef HAVE_PSI_THREAD_INTERFACE #define mysql_thread_set_psi_THD(T) inline_mysql_thread_set_psi_THD(T) #else #define mysql_thread_set_psi_THD(T) do {} while (0) #endif static inline void inline_mysql_mutex_register( #ifdef HAVE_PSI_MUTEX_INTERFACE const char *category, PSI_mutex_info *info, int count #else const char *category MY_ATTRIBUTE ((unused)), void *info MY_ATTRIBUTE ((unused)), int count MY_ATTRIBUTE ((unused)) #endif ) { #ifdef HAVE_PSI_MUTEX_INTERFACE PSI_MUTEX_CALL(register_mutex)(category, info, count); #endif } static inline int inline_mysql_mutex_init( #ifdef HAVE_PSI_MUTEX_INTERFACE PSI_mutex_key key, #endif mysql_mutex_t *that, const native_mutexattr_t *attr #ifdef SAFE_MUTEX , const char *src_file, uint src_line #endif ) { #ifdef HAVE_PSI_MUTEX_INTERFACE that->m_psi= PSI_MUTEX_CALL(init_mutex)(key, &that->m_mutex); #else that->m_psi= NULL; #endif return my_mutex_init(&that->m_mutex, attr #ifdef SAFE_MUTEX , src_file, src_line #endif ); } static inline int inline_mysql_mutex_destroy( mysql_mutex_t *that #ifdef SAFE_MUTEX , const char *src_file, uint src_line #endif ) { #ifdef HAVE_PSI_MUTEX_INTERFACE if (that->m_psi != NULL) { PSI_MUTEX_CALL(destroy_mutex)(that->m_psi); that->m_psi= NULL; } #endif return my_mutex_destroy(&that->m_mutex #ifdef SAFE_MUTEX , src_file, src_line #endif ); } static inline int inline_mysql_mutex_lock( mysql_mutex_t *that #if defined(SAFE_MUTEX) || defined (HAVE_PSI_MUTEX_INTERFACE) , const char *src_file, uint src_line #endif ) { int result; #ifdef HAVE_PSI_MUTEX_INTERFACE if (that->m_psi != NULL) { /* Instrumentation start */ PSI_mutex_locker *locker; PSI_mutex_locker_state state; locker= PSI_MUTEX_CALL(start_mutex_wait)(&state, that->m_psi, PSI_MUTEX_LOCK, src_file, src_line); /* Instrumented code */ result= my_mutex_lock(&that->m_mutex #ifdef SAFE_MUTEX , src_file, src_line #endif ); /* Instrumentation end */ if (locker != NULL) PSI_MUTEX_CALL(end_mutex_wait)(locker, result); return result; } #endif /* Non instrumented code */ result= my_mutex_lock(&that->m_mutex #ifdef SAFE_MUTEX , src_file, src_line #endif ); return result; } static inline int inline_mysql_mutex_trylock( mysql_mutex_t *that #if defined(SAFE_MUTEX) || defined (HAVE_PSI_MUTEX_INTERFACE) , const char *src_file, uint src_line #endif ) { int result; #ifdef HAVE_PSI_MUTEX_INTERFACE if (that->m_psi != NULL) { /* Instrumentation start */ PSI_mutex_locker *locker; PSI_mutex_locker_state state; locker= PSI_MUTEX_CALL(start_mutex_wait)(&state, that->m_psi, PSI_MUTEX_TRYLOCK, src_file, src_line); /* Instrumented code */ result= my_mutex_trylock(&that->m_mutex #ifdef SAFE_MUTEX , src_file, src_line #endif ); /* Instrumentation end */ if (locker != NULL) PSI_MUTEX_CALL(end_mutex_wait)(locker, result); return result; } #endif /* Non instrumented code */ result= my_mutex_trylock(&that->m_mutex #ifdef SAFE_MUTEX , src_file, src_line #endif ); return result; } static inline int inline_mysql_mutex_unlock( mysql_mutex_t *that #ifdef SAFE_MUTEX , const char *src_file, uint src_line #endif ) { int result; #ifdef HAVE_PSI_MUTEX_INTERFACE if (that->m_psi != NULL) PSI_MUTEX_CALL(unlock_mutex)(that->m_psi); #endif result= my_mutex_unlock(&that->m_mutex #ifdef SAFE_MUTEX , src_file, src_line #endif ); return result; } static inline void inline_mysql_rwlock_register( #ifdef HAVE_PSI_RWLOCK_INTERFACE const char *category, PSI_rwlock_info *info, int count #else const char *category MY_ATTRIBUTE ((unused)), void *info MY_ATTRIBUTE ((unused)), int count MY_ATTRIBUTE ((unused)) #endif ) { #ifdef HAVE_PSI_RWLOCK_INTERFACE PSI_RWLOCK_CALL(register_rwlock)(category, info, count); #endif } static inline int inline_mysql_rwlock_init( #ifdef HAVE_PSI_RWLOCK_INTERFACE PSI_rwlock_key key, #endif mysql_rwlock_t *that) { #ifdef HAVE_PSI_RWLOCK_INTERFACE that->m_psi= PSI_RWLOCK_CALL(init_rwlock)(key, &that->m_rwlock); #else that->m_psi= NULL; #endif return native_rw_init(&that->m_rwlock); } #ifndef DISABLE_MYSQL_PRLOCK_H static inline int inline_mysql_prlock_init( #ifdef HAVE_PSI_RWLOCK_INTERFACE PSI_rwlock_key key, #endif mysql_prlock_t *that) { #ifdef HAVE_PSI_RWLOCK_INTERFACE that->m_psi= PSI_RWLOCK_CALL(init_rwlock)(key, &that->m_prlock); #else that->m_psi= NULL; #endif return rw_pr_init(&that->m_prlock); } #endif static inline int inline_mysql_rwlock_destroy( mysql_rwlock_t *that) { #ifdef HAVE_PSI_RWLOCK_INTERFACE if (that->m_psi != NULL) { PSI_RWLOCK_CALL(destroy_rwlock)(that->m_psi); that->m_psi= NULL; } #endif return native_rw_destroy(&that->m_rwlock); } #ifndef DISABLE_MYSQL_PRLOCK_H static inline int inline_mysql_prlock_destroy( mysql_prlock_t *that) { #ifdef HAVE_PSI_RWLOCK_INTERFACE if (that->m_psi != NULL) { PSI_RWLOCK_CALL(destroy_rwlock)(that->m_psi); that->m_psi= NULL; } #endif return rw_pr_destroy(&that->m_prlock); } #endif static inline int inline_mysql_rwlock_rdlock( mysql_rwlock_t *that #ifdef HAVE_PSI_RWLOCK_INTERFACE , const char *src_file, uint src_line #endif ) { int result; #ifdef HAVE_PSI_RWLOCK_INTERFACE if (that->m_psi != NULL) { /* Instrumentation start */ PSI_rwlock_locker *locker; PSI_rwlock_locker_state state; locker= PSI_RWLOCK_CALL(start_rwlock_rdwait)(&state, that->m_psi, PSI_RWLOCK_READLOCK, src_file, src_line); /* Instrumented code */ result= native_rw_rdlock(&that->m_rwlock); /* Instrumentation end */ if (locker != NULL) PSI_RWLOCK_CALL(end_rwlock_rdwait)(locker, result); return result; } #endif /* Non instrumented code */ result= native_rw_rdlock(&that->m_rwlock); return result; } #ifndef DISABLE_MYSQL_PRLOCK_H static inline int inline_mysql_prlock_rdlock( mysql_prlock_t *that #ifdef HAVE_PSI_RWLOCK_INTERFACE , const char *src_file, uint src_line #endif ) { int result; #ifdef HAVE_PSI_RWLOCK_INTERFACE if (that->m_psi != NULL) { /* Instrumentation start */ PSI_rwlock_locker *locker; PSI_rwlock_locker_state state; locker= PSI_RWLOCK_CALL(start_rwlock_rdwait)(&state, that->m_psi, PSI_RWLOCK_READLOCK, src_file, src_line); /* Instrumented code */ result= rw_pr_rdlock(&that->m_prlock); /* Instrumentation end */ if (locker != NULL) PSI_RWLOCK_CALL(end_rwlock_rdwait)(locker, result); return result; } #endif /* Non instrumented code */ result= rw_pr_rdlock(&that->m_prlock); return result; } #endif static inline int inline_mysql_rwlock_wrlock( mysql_rwlock_t *that #ifdef HAVE_PSI_RWLOCK_INTERFACE , const char *src_file, uint src_line #endif ) { int result; #ifdef HAVE_PSI_RWLOCK_INTERFACE if (that->m_psi != NULL) { /* Instrumentation start */ PSI_rwlock_locker *locker; PSI_rwlock_locker_state state; locker= PSI_RWLOCK_CALL(start_rwlock_wrwait)(&state, that->m_psi, PSI_RWLOCK_WRITELOCK, src_file, src_line); /* Instrumented code */ result= native_rw_wrlock(&that->m_rwlock); /* Instrumentation end */ if (locker != NULL) PSI_RWLOCK_CALL(end_rwlock_wrwait)(locker, result); return result; } #endif /* Non instrumented code */ result= native_rw_wrlock(&that->m_rwlock); return result; } #ifndef DISABLE_MYSQL_PRLOCK_H static inline int inline_mysql_prlock_wrlock( mysql_prlock_t *that #ifdef HAVE_PSI_RWLOCK_INTERFACE , const char *src_file, uint src_line #endif ) { int result; #ifdef HAVE_PSI_RWLOCK_INTERFACE if (that->m_psi != NULL) { /* Instrumentation start */ PSI_rwlock_locker *locker; PSI_rwlock_locker_state state; locker= PSI_RWLOCK_CALL(start_rwlock_wrwait)(&state, that->m_psi, PSI_RWLOCK_WRITELOCK, src_file, src_line); /* Instrumented code */ result= rw_pr_wrlock(&that->m_prlock); /* Instrumentation end */ if (locker != NULL) PSI_RWLOCK_CALL(end_rwlock_wrwait)(locker, result); return result; } #endif /* Non instrumented code */ result= rw_pr_wrlock(&that->m_prlock); return result; } #endif static inline int inline_mysql_rwlock_tryrdlock( mysql_rwlock_t *that #ifdef HAVE_PSI_RWLOCK_INTERFACE , const char *src_file, uint src_line #endif ) { int result; #ifdef HAVE_PSI_RWLOCK_INTERFACE if (that->m_psi != NULL) { /* Instrumentation start */ PSI_rwlock_locker *locker; PSI_rwlock_locker_state state; locker= PSI_RWLOCK_CALL(start_rwlock_rdwait)(&state, that->m_psi, PSI_RWLOCK_TRYREADLOCK, src_file, src_line); /* Instrumented code */ result= native_rw_tryrdlock(&that->m_rwlock); /* Instrumentation end */ if (locker != NULL) PSI_RWLOCK_CALL(end_rwlock_rdwait)(locker, result); return result; } #endif /* Non instrumented code */ result= native_rw_tryrdlock(&that->m_rwlock); return result; } static inline int inline_mysql_rwlock_trywrlock( mysql_rwlock_t *that #ifdef HAVE_PSI_RWLOCK_INTERFACE , const char *src_file, uint src_line #endif ) { int result; #ifdef HAVE_PSI_RWLOCK_INTERFACE if (that->m_psi != NULL) { /* Instrumentation start */ PSI_rwlock_locker *locker; PSI_rwlock_locker_state state; locker= PSI_RWLOCK_CALL(start_rwlock_wrwait)(&state, that->m_psi, PSI_RWLOCK_TRYWRITELOCK, src_file, src_line); /* Instrumented code */ result= native_rw_trywrlock(&that->m_rwlock); /* Instrumentation end */ if (locker != NULL) PSI_RWLOCK_CALL(end_rwlock_wrwait)(locker, result); return result; } #endif /* Non instrumented code */ result= native_rw_trywrlock(&that->m_rwlock); return result; } static inline int inline_mysql_rwlock_unlock( mysql_rwlock_t *that) { int result; #ifdef HAVE_PSI_RWLOCK_INTERFACE if (that->m_psi != NULL) PSI_RWLOCK_CALL(unlock_rwlock)(that->m_psi); #endif result= native_rw_unlock(&that->m_rwlock); return result; } #ifndef DISABLE_MYSQL_PRLOCK_H static inline int inline_mysql_prlock_unlock( mysql_prlock_t *that) { int result; #ifdef HAVE_PSI_RWLOCK_INTERFACE if (that->m_psi != NULL) PSI_RWLOCK_CALL(unlock_rwlock)(that->m_psi); #endif result= rw_pr_unlock(&that->m_prlock); return result; } #endif static inline void inline_mysql_cond_register( #ifdef HAVE_PSI_COND_INTERFACE const char *category, PSI_cond_info *info, int count #else const char *category MY_ATTRIBUTE ((unused)), void *info MY_ATTRIBUTE ((unused)), int count MY_ATTRIBUTE ((unused)) #endif ) { #ifdef HAVE_PSI_COND_INTERFACE PSI_COND_CALL(register_cond)(category, info, count); #endif } static inline int inline_mysql_cond_init( #ifdef HAVE_PSI_COND_INTERFACE PSI_cond_key key, #endif mysql_cond_t *that) { #ifdef HAVE_PSI_COND_INTERFACE that->m_psi= PSI_COND_CALL(init_cond)(key, &that->m_cond); #else that->m_psi= NULL; #endif return native_cond_init(&that->m_cond); } static inline int inline_mysql_cond_destroy( mysql_cond_t *that) { #ifdef HAVE_PSI_COND_INTERFACE if (that->m_psi != NULL) { PSI_COND_CALL(destroy_cond)(that->m_psi); that->m_psi= NULL; } #endif return native_cond_destroy(&that->m_cond); } static inline int inline_mysql_cond_wait( mysql_cond_t *that, mysql_mutex_t *mutex #if defined(SAFE_MUTEX) || defined(HAVE_PSI_COND_INTERFACE) , const char *src_file, uint src_line #endif ) { int result; #ifdef HAVE_PSI_COND_INTERFACE if (that->m_psi != NULL) { /* Instrumentation start */ PSI_cond_locker *locker; PSI_cond_locker_state state; locker= PSI_COND_CALL(start_cond_wait)(&state, that->m_psi, mutex->m_psi, PSI_COND_WAIT, src_file, src_line); /* Instrumented code */ result= my_cond_wait(&that->m_cond, &mutex->m_mutex #ifdef SAFE_MUTEX , src_file, src_line #endif ); /* Instrumentation end */ if (locker != NULL) PSI_COND_CALL(end_cond_wait)(locker, result); return result; } #endif /* Non instrumented code */ result= my_cond_wait(&that->m_cond, &mutex->m_mutex #ifdef SAFE_MUTEX , src_file, src_line #endif ); return result; } static inline int inline_mysql_cond_timedwait( mysql_cond_t *that, mysql_mutex_t *mutex, const struct timespec *abstime #if defined(SAFE_MUTEX) || defined(HAVE_PSI_COND_INTERFACE) , const char *src_file, uint src_line #endif ) { int result; #ifdef HAVE_PSI_COND_INTERFACE if (that->m_psi != NULL) { /* Instrumentation start */ PSI_cond_locker *locker; PSI_cond_locker_state state; locker= PSI_COND_CALL(start_cond_wait)(&state, that->m_psi, mutex->m_psi, PSI_COND_TIMEDWAIT, src_file, src_line); /* Instrumented code */ result= my_cond_timedwait(&that->m_cond, &mutex->m_mutex, abstime #ifdef SAFE_MUTEX , src_file, src_line #endif ); /* Instrumentation end */ if (locker != NULL) PSI_COND_CALL(end_cond_wait)(locker, result); return result; } #endif /* Non instrumented code */ result= my_cond_timedwait(&that->m_cond, &mutex->m_mutex, abstime #ifdef SAFE_MUTEX , src_file, src_line #endif ); return result; } static inline int inline_mysql_cond_signal( mysql_cond_t *that) { int result; #ifdef HAVE_PSI_COND_INTERFACE if (that->m_psi != NULL) PSI_COND_CALL(signal_cond)(that->m_psi); #endif result= native_cond_signal(&that->m_cond); return result; } static inline int inline_mysql_cond_broadcast( mysql_cond_t *that) { int result; #ifdef HAVE_PSI_COND_INTERFACE if (that->m_psi != NULL) PSI_COND_CALL(broadcast_cond)(that->m_psi); #endif result= native_cond_broadcast(&that->m_cond); return result; } static inline void inline_mysql_thread_register( #ifdef HAVE_PSI_THREAD_INTERFACE const char *category, PSI_thread_info *info, int count #else const char *category MY_ATTRIBUTE ((unused)), void *info MY_ATTRIBUTE ((unused)), int count MY_ATTRIBUTE ((unused)) #endif ) { #ifdef HAVE_PSI_THREAD_INTERFACE PSI_THREAD_CALL(register_thread)(category, info, count); #endif } #ifdef HAVE_PSI_THREAD_INTERFACE static inline int inline_mysql_thread_create( PSI_thread_key key, my_thread_handle *thread, const my_thread_attr_t *attr, my_start_routine start_routine, void *arg) { int result; result= PSI_THREAD_CALL(spawn_thread)(key, thread, attr, start_routine, arg); return result; } static inline void inline_mysql_thread_set_psi_id(my_thread_id id) { struct PSI_thread *psi= PSI_THREAD_CALL(get_thread)(); PSI_THREAD_CALL(set_thread_id)(psi, id); } #ifdef __cplusplus class THD; static inline void inline_mysql_thread_set_psi_THD(THD *thd) { struct PSI_thread *psi= PSI_THREAD_CALL(get_thread)(); PSI_THREAD_CALL(set_thread_THD)(psi, thd); } #endif /* __cplusplus */ #endif #endif /* DISABLE_MYSQL_THREAD_H */ /** @} (end of group Thread_instrumentation) */ #endif PKp /* For strlen() */ #include /* For MY_STAT */ #include /* For my_chsize */ #include /** @file mysql/psi/mysql_file.h Instrumentation helpers for mysys file io. This header file provides the necessary declarations to use the mysys file API with the performance schema instrumentation. In some compilers (SunStudio), 'static inline' functions, when declared but not used, are not optimized away (because they are unused) by default, so that including a static inline function from a header file does create unwanted dependencies, causing unresolved symbols at link time. Other compilers, like gcc, optimize these dependencies by default. Since the instrumented APIs declared here are wrapper on top of mysys file io APIs, including mysql/psi/mysql_file.h assumes that the dependency on my_sys already exists. */ #include "mysql/psi/psi.h" #ifndef PSI_FILE_CALL #define PSI_FILE_CALL(M) PSI_DYNAMIC_CALL(M) #endif /** @defgroup File_instrumentation File Instrumentation @ingroup Instrumentation_interface @{ */ /** @def mysql_file_register(P1, P2, P3) File registration. */ #define mysql_file_register(P1, P2, P3) \ inline_mysql_file_register(P1, P2, P3) /** @def mysql_file_fgets(P1, P2, F) Instrumented fgets. @c mysql_file_fgets is a replacement for @c fgets. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_fgets(P1, P2, F) \ inline_mysql_file_fgets(__FILE__, __LINE__, P1, P2, F) #else #define mysql_file_fgets(P1, P2, F) \ inline_mysql_file_fgets(P1, P2, F) #endif /** @def mysql_file_fgetc(F) Instrumented fgetc. @c mysql_file_fgetc is a replacement for @c fgetc. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_fgetc(F) inline_mysql_file_fgetc(__FILE__, __LINE__, F) #else #define mysql_file_fgetc(F) inline_mysql_file_fgetc(F) #endif /** @def mysql_file_fputs(P1, F) Instrumented fputs. @c mysql_file_fputs is a replacement for @c fputs. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_fputs(P1, F) \ inline_mysql_file_fputs(__FILE__, __LINE__, P1, F) #else #define mysql_file_fputs(P1, F)\ inline_mysql_file_fputs(P1, F) #endif /** @def mysql_file_fputc(P1, F) Instrumented fputc. @c mysql_file_fputc is a replacement for @c fputc. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_fputc(P1, F) \ inline_mysql_file_fputc(__FILE__, __LINE__, P1, F) #else #define mysql_file_fputc(P1, F) \ inline_mysql_file_fputc(P1, F) #endif /** @def mysql_file_fprintf Instrumented fprintf. @c mysql_file_fprintf is a replacement for @c fprintf. */ #define mysql_file_fprintf inline_mysql_file_fprintf /** @def mysql_file_vfprintf(F, P1, P2) Instrumented vfprintf. @c mysql_file_vfprintf is a replacement for @c vfprintf. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_vfprintf(F, P1, P2) \ inline_mysql_file_vfprintf(__FILE__, __LINE__, F, P1, P2) #else #define mysql_file_vfprintf(F, P1, P2) \ inline_mysql_file_vfprintf(F, P1, P2) #endif /** @def mysql_file_fflush(F, P1, P2) Instrumented fflush. @c mysql_file_fflush is a replacement for @c fflush. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_fflush(F) \ inline_mysql_file_fflush(__FILE__, __LINE__, F) #else #define mysql_file_fflush(F) \ inline_mysql_file_fflush(F) #endif /** @def mysql_file_feof(F) Instrumented feof. @c mysql_file_feof is a replacement for @c feof. */ #define mysql_file_feof(F) inline_mysql_file_feof(F) /** @def mysql_file_fstat(FN, S, FL) Instrumented fstat. @c mysql_file_fstat is a replacement for @c my_fstat. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_fstat(FN, S, FL) \ inline_mysql_file_fstat(__FILE__, __LINE__, FN, S, FL) #else #define mysql_file_fstat(FN, S, FL) \ inline_mysql_file_fstat(FN, S, FL) #endif /** @def mysql_file_stat(K, FN, S, FL) Instrumented stat. @c mysql_file_stat is a replacement for @c my_stat. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_stat(K, FN, S, FL) \ inline_mysql_file_stat(K, __FILE__, __LINE__, FN, S, FL) #else #define mysql_file_stat(K, FN, S, FL) \ inline_mysql_file_stat(FN, S, FL) #endif /** @def mysql_file_chsize(F, P1, P2, P3) Instrumented chsize. @c mysql_file_chsize is a replacement for @c my_chsize. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_chsize(F, P1, P2, P3) \ inline_mysql_file_chsize(__FILE__, __LINE__, F, P1, P2, P3) #else #define mysql_file_chsize(F, P1, P2, P3) \ inline_mysql_file_chsize(F, P1, P2, P3) #endif /** @def mysql_file_fopen(K, N, F1, F2) Instrumented fopen. @c mysql_file_fopen is a replacement for @c my_fopen. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_fopen(K, N, F1, F2) \ inline_mysql_file_fopen(K, __FILE__, __LINE__, N, F1, F2) #else #define mysql_file_fopen(K, N, F1, F2) \ inline_mysql_file_fopen(N, F1, F2) #endif /** @def mysql_file_fclose(FD, FL) Instrumented fclose. @c mysql_file_fclose is a replacement for @c my_fclose. Without the instrumentation, this call will have the same behavior as the undocumented and possibly platform specific my_fclose(NULL, ...) behavior. With the instrumentation, mysql_fclose(NULL, ...) will safely return 0, which is an extension compared to my_fclose and is therefore compliant. mysql_fclose is on purpose *not* implementing @code DBUG_ASSERT(file != NULL) @endcode, since doing so could introduce regressions. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_fclose(FD, FL) \ inline_mysql_file_fclose(__FILE__, __LINE__, FD, FL) #else #define mysql_file_fclose(FD, FL) \ inline_mysql_file_fclose(FD, FL) #endif /** @def mysql_file_fread(FD, P1, P2, P3) Instrumented fread. @c mysql_file_fread is a replacement for @c my_fread. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_fread(FD, P1, P2, P3) \ inline_mysql_file_fread(__FILE__, __LINE__, FD, P1, P2, P3) #else #define mysql_file_fread(FD, P1, P2, P3) \ inline_mysql_file_fread(FD, P1, P2, P3) #endif /** @def mysql_file_fwrite(FD, P1, P2, P3) Instrumented fwrite. @c mysql_file_fwrite is a replacement for @c my_fwrite. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_fwrite(FD, P1, P2, P3) \ inline_mysql_file_fwrite(__FILE__, __LINE__, FD, P1, P2, P3) #else #define mysql_file_fwrite(FD, P1, P2, P3) \ inline_mysql_file_fwrite(FD, P1, P2, P3) #endif /** @def mysql_file_fseek(FD, P, W, F) Instrumented fseek. @c mysql_file_fseek is a replacement for @c my_fseek. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_fseek(FD, P, W, F) \ inline_mysql_file_fseek(__FILE__, __LINE__, FD, P, W, F) #else #define mysql_file_fseek(FD, P, W, F) \ inline_mysql_file_fseek(FD, P, W, F) #endif /** @def mysql_file_ftell(FD, F) Instrumented ftell. @c mysql_file_ftell is a replacement for @c my_ftell. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_ftell(FD, F) \ inline_mysql_file_ftell(__FILE__, __LINE__, FD, F) #else #define mysql_file_ftell(FD, F) \ inline_mysql_file_ftell(FD, F) #endif /** @def mysql_file_create(K, N, F1, F2, F3) Instrumented create. @c mysql_file_create is a replacement for @c my_create. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_create(K, N, F1, F2, F3) \ inline_mysql_file_create(K, __FILE__, __LINE__, N, F1, F2, F3) #else #define mysql_file_create(K, N, F1, F2, F3) \ inline_mysql_file_create(N, F1, F2, F3) #endif /** @def mysql_file_create_temp(K, T, D, P, M, F) Instrumented create_temp_file. @c mysql_file_create_temp is a replacement for @c create_temp_file. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_create_temp(K, T, D, P, M, F) \ inline_mysql_file_create_temp(K, __FILE__, __LINE__, T, D, P, M, F) #else #define mysql_file_create_temp(K, T, D, P, M, F) \ inline_mysql_file_create_temp(T, D, P, M, F) #endif /** @def mysql_file_open(K, N, F1, F2) Instrumented open. @c mysql_file_open is a replacement for @c my_open. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_open(K, N, F1, F2) \ inline_mysql_file_open(K, __FILE__, __LINE__, N, F1, F2) #else #define mysql_file_open(K, N, F1, F2) \ inline_mysql_file_open(N, F1, F2) #endif /** @def mysql_unix_socket_connect(K, N, F) Instrumented open. @c mysql_unix_socket_connect connects to the unix domain socket. */ #ifndef __WIN__ #ifdef HAVE_PSI_INTERFACE #define mysql_unix_socket_connect(K, N, F) \ inline_mysql_unix_socket_connect(K, __FILE__, __LINE__, N, F) #else #define mysql_unix_socket_connect(K, N, F) \ inline_mysql_unix_socket_connect(N, F) #endif #endif /** @def mysql_file_close(FD, F) Instrumented close. @c mysql_file_close is a replacement for @c my_close. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_close(FD, F) \ inline_mysql_file_close(__FILE__, __LINE__, FD, F) #else #define mysql_file_close(FD, F) \ inline_mysql_file_close(FD, F) #endif /** @def mysql_file_read(FD, B, S, F) Instrumented read. @c mysql_read is a replacement for @c my_read. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_read(FD, B, S, F) \ inline_mysql_file_read(__FILE__, __LINE__, FD, B, S, F) #else #define mysql_file_read(FD, B, S, F) \ inline_mysql_file_read(FD, B, S, F) #endif /** @def mysql_file_write(FD, B, S, F) Instrumented write. @c mysql_file_write is a replacement for @c my_write. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_write(FD, B, S, F) \ inline_mysql_file_write(__FILE__, __LINE__, FD, B, S, F) #else #define mysql_file_write(FD, B, S, F) \ inline_mysql_file_write(FD, B, S, F) #endif /** @def mysql_file_pread(FD, B, S, O, F) Instrumented pread. @c mysql_pread is a replacement for @c my_pread. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_pread(FD, B, S, O, F) \ inline_mysql_file_pread(__FILE__, __LINE__, FD, B, S, O, F) #else #define mysql_file_pread(FD, B, S, O, F) \ inline_mysql_file_pread(FD, B, S, O, F) #endif /** @def mysql_file_pwrite(FD, B, S, O, F) Instrumented pwrite. @c mysql_file_pwrite is a replacement for @c my_pwrite. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_pwrite(FD, B, S, O, F) \ inline_mysql_file_pwrite(__FILE__, __LINE__, FD, B, S, O, F) #else #define mysql_file_pwrite(FD, B, S, O, F) \ inline_mysql_file_pwrite(FD, B, S, O, F) #endif /** @def mysql_file_seek(FD, P, W, F) Instrumented seek. @c mysql_file_seek is a replacement for @c my_seek. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_seek(FD, P, W, F) \ inline_mysql_file_seek(__FILE__, __LINE__, FD, P, W, F) #else #define mysql_file_seek(FD, P, W, F) \ inline_mysql_file_seek(FD, P, W, F) #endif /** @def mysql_file_tell(FD, F) Instrumented tell. @c mysql_file_tell is a replacement for @c my_tell. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_tell(FD, F) \ inline_mysql_file_tell(__FILE__, __LINE__, FD, F) #else #define mysql_file_tell(FD, F) \ inline_mysql_file_tell(FD, F) #endif /** @def mysql_file_delete(K, P1, P2) Instrumented delete. @c mysql_file_delete is a replacement for @c my_delete. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_delete(K, P1, P2) \ inline_mysql_file_delete(K, __FILE__, __LINE__, P1, P2) #else #define mysql_file_delete(K, P1, P2) \ inline_mysql_file_delete(P1, P2) #endif /** @def mysql_file_rename(K, P1, P2, P3) Instrumented rename. @c mysql_file_rename is a replacement for @c my_rename. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_rename(K, P1, P2, P3) \ inline_mysql_file_rename(K, __FILE__, __LINE__, P1, P2, P3) #else #define mysql_file_rename(K, P1, P2, P3) \ inline_mysql_file_rename(P1, P2, P3) #endif /** @def mysql_file_create_with_symlink(K, P1, P2, P3, P4, P5) Instrumented create with symbolic link. @c mysql_file_create_with_symlink is a replacement for @c my_create_with_symlink. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_create_with_symlink(K, P1, P2, P3, P4, P5) \ inline_mysql_file_create_with_symlink(K, __FILE__, __LINE__, \ P1, P2, P3, P4, P5) #else #define mysql_file_create_with_symlink(K, P1, P2, P3, P4, P5) \ inline_mysql_file_create_with_symlink(P1, P2, P3, P4, P5) #endif /** @def mysql_file_delete_with_symlink(K, P1, P2) Instrumented delete with symbolic link. @c mysql_file_delete_with_symlink is a replacement for @c my_delete_with_symlink. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_delete_with_symlink(K, P1, P2) \ inline_mysql_file_delete_with_symlink(K, __FILE__, __LINE__, P1, P2) #else #define mysql_file_delete_with_symlink(K, P1, P2) \ inline_mysql_file_delete_with_symlink(P1, P2) #endif /** @def mysql_file_rename_with_symlink(K, P1, P2, P3) Instrumented rename with symbolic link. @c mysql_file_rename_with_symlink is a replacement for @c my_rename_with_symlink. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_rename_with_symlink(K, P1, P2, P3) \ inline_mysql_file_rename_with_symlink(K, __FILE__, __LINE__, P1, P2, P3) #else #define mysql_file_rename_with_symlink(K, P1, P2, P3) \ inline_mysql_file_rename_with_symlink(P1, P2, P3) #endif /** @def mysql_file_sync(P1, P2) Instrumented file sync. @c mysql_file_sync is a replacement for @c my_sync. */ #ifdef HAVE_PSI_FILE_INTERFACE #define mysql_file_sync(P1, P2) \ inline_mysql_file_sync(__FILE__, __LINE__, P1, P2) #else #define mysql_file_sync(P1, P2) \ inline_mysql_file_sync(P1, P2) #endif /** An instrumented FILE structure. @sa MYSQL_FILE */ struct st_mysql_file { /** The real file. */ FILE *m_file; /** The instrumentation hook. Note that this hook is not conditionally defined, for binary compatibility of the @c MYSQL_FILE interface. */ struct PSI_file *m_psi; }; /** Type of an instrumented file. @c MYSQL_FILE is a drop-in replacement for @c FILE. @sa mysql_file_open */ typedef struct st_mysql_file MYSQL_FILE; static inline void inline_mysql_file_register( #ifdef HAVE_PSI_FILE_INTERFACE const char *category, PSI_file_info *info, int count #else const char *category MY_ATTRIBUTE ((unused)), void *info MY_ATTRIBUTE ((unused)), int count MY_ATTRIBUTE ((unused)) #endif ) { #ifdef HAVE_PSI_FILE_INTERFACE PSI_FILE_CALL(register_file)(category, info, count); #endif } static inline char * inline_mysql_file_fgets( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif char *str, int size, MYSQL_FILE *file) { char *result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_stream_locker) (&state, file->m_psi, PSI_FILE_READ); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, (size_t) size, src_file, src_line); result= fgets(str, size, file->m_file); PSI_FILE_CALL(end_file_wait)(locker, result ? strlen(result) : 0); return result; } #endif result= fgets(str, size, file->m_file); return result; } static inline int inline_mysql_file_fgetc( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif MYSQL_FILE *file) { int result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_stream_locker) (&state, file->m_psi, PSI_FILE_READ); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, (size_t) 1, src_file, src_line); result= fgetc(file->m_file); PSI_FILE_CALL(end_file_wait)(locker, (size_t) 1); return result; } #endif result= fgetc(file->m_file); return result; } static inline int inline_mysql_file_fputs( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif const char *str, MYSQL_FILE *file) { int result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; size_t bytes; locker= PSI_FILE_CALL(get_thread_file_stream_locker) (&state, file->m_psi, PSI_FILE_WRITE); if (likely(locker != NULL)) { bytes= str ? strlen(str) : 0; PSI_FILE_CALL(start_file_wait)(locker, bytes, src_file, src_line); result= fputs(str, file->m_file); PSI_FILE_CALL(end_file_wait)(locker, bytes); return result; } #endif result= fputs(str, file->m_file); return result; } static inline int inline_mysql_file_fputc( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif char c, MYSQL_FILE *file) { int result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_stream_locker) (&state, file->m_psi, PSI_FILE_WRITE); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, (size_t) 1, src_file, src_line); result= fputc(c, file->m_file); PSI_FILE_CALL(end_file_wait)(locker, (size_t) 1); return result; } #endif result= fputc(c, file->m_file); return result; } static inline int inline_mysql_file_fprintf(MYSQL_FILE *file, const char *format, ...) { /* TODO: figure out how to pass src_file and src_line from the caller. */ int result; va_list args; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_stream_locker) (&state, file->m_psi, PSI_FILE_WRITE); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, __FILE__, __LINE__); va_start(args, format); result= vfprintf(file->m_file, format, args); va_end(args); PSI_FILE_CALL(end_file_wait)(locker, (size_t) result); return result; } #endif va_start(args, format); result= vfprintf(file->m_file, format, args); va_end(args); return result; } static inline int inline_mysql_file_vfprintf( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif MYSQL_FILE *file, const char *format, va_list args) { int result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_stream_locker) (&state, file->m_psi, PSI_FILE_WRITE); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); result= vfprintf(file->m_file, format, args); PSI_FILE_CALL(end_file_wait)(locker, (size_t) result); return result; } #endif result= vfprintf(file->m_file, format, args); return result; } static inline int inline_mysql_file_fflush( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif MYSQL_FILE *file) { int result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_stream_locker) (&state, file->m_psi, PSI_FILE_FLUSH); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); result= fflush(file->m_file); PSI_FILE_CALL(end_file_wait)(locker, (size_t) 0); return result; } #endif result= fflush(file->m_file); return result; } static inline int inline_mysql_file_feof(MYSQL_FILE *file) { /* Not instrumented, there is no wait involved */ return feof(file->m_file); } static inline int inline_mysql_file_fstat( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif int filenr, MY_STAT *stat_area, myf flags) { int result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) (&state, filenr, PSI_FILE_FSTAT); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); result= my_fstat(filenr, stat_area, flags); PSI_FILE_CALL(end_file_wait)(locker, (size_t) 0); return result; } #endif result= my_fstat(filenr, stat_area, flags); return result; } static inline MY_STAT * inline_mysql_file_stat( #ifdef HAVE_PSI_FILE_INTERFACE PSI_file_key key, const char *src_file, uint src_line, #endif const char *path, MY_STAT *stat_area, myf flags) { MY_STAT *result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_name_locker) (&state, key, PSI_FILE_STAT, path, &locker); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_open_wait)(locker, src_file, src_line); result= my_stat(path, stat_area, flags); PSI_FILE_CALL(end_file_open_wait)(locker, result); return result; } #endif result= my_stat(path, stat_area, flags); return result; } static inline int inline_mysql_file_chsize( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif File file, my_off_t newlength, int filler, myf flags) { int result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) (&state, file, PSI_FILE_CHSIZE); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, (size_t) newlength, src_file, src_line); result= my_chsize(file, newlength, filler, flags); PSI_FILE_CALL(end_file_wait)(locker, (size_t) newlength); return result; } #endif result= my_chsize(file, newlength, filler, flags); return result; } static inline MYSQL_FILE* inline_mysql_file_fopen( #ifdef HAVE_PSI_FILE_INTERFACE PSI_file_key key, const char *src_file, uint src_line, #endif const char *filename, int flags, myf myFlags) { MYSQL_FILE *that; that= (MYSQL_FILE*) my_malloc(PSI_NOT_INSTRUMENTED, sizeof(MYSQL_FILE), MYF(MY_WME)); if (likely(that != NULL)) { #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_name_locker) (&state, key, PSI_FILE_STREAM_OPEN, filename, that); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_open_wait) (locker, src_file, src_line); that->m_file= my_fopen(filename, flags, myFlags); that->m_psi= PSI_FILE_CALL(end_file_open_wait)(locker, that->m_file); if (unlikely(that->m_file == NULL)) { my_free(that); return NULL; } return that; } #endif that->m_psi= NULL; that->m_file= my_fopen(filename, flags, myFlags); if (unlikely(that->m_file == NULL)) { my_free(that); return NULL; } } return that; } static inline int inline_mysql_file_fclose( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif MYSQL_FILE *file, myf flags) { int result= 0; if (likely(file != NULL)) { #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_stream_locker) (&state, file->m_psi, PSI_FILE_STREAM_CLOSE); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_close_wait)(locker, src_file, src_line); result= my_fclose(file->m_file, flags); PSI_FILE_CALL(end_file_close_wait)(locker, result); my_free(file); return result; } #endif result= my_fclose(file->m_file, flags); my_free(file); } return result; } static inline size_t inline_mysql_file_fread( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif MYSQL_FILE *file, uchar *buffer, size_t count, myf flags) { size_t result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; size_t bytes_read; locker= PSI_FILE_CALL(get_thread_file_stream_locker) (&state, file->m_psi, PSI_FILE_READ); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, count, src_file, src_line); result= my_fread(file->m_file, buffer, count, flags); if (flags & (MY_NABP | MY_FNABP)) bytes_read= (result == 0) ? count : 0; else bytes_read= (result != MY_FILE_ERROR) ? result : 0; PSI_FILE_CALL(end_file_wait)(locker, bytes_read); return result; } #endif result= my_fread(file->m_file, buffer, count, flags); return result; } static inline size_t inline_mysql_file_fwrite( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif MYSQL_FILE *file, const uchar *buffer, size_t count, myf flags) { size_t result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; size_t bytes_written; locker= PSI_FILE_CALL(get_thread_file_stream_locker) (&state, file->m_psi, PSI_FILE_WRITE); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, count, src_file, src_line); result= my_fwrite(file->m_file, buffer, count, flags); if (flags & (MY_NABP | MY_FNABP)) bytes_written= (result == 0) ? count : 0; else bytes_written= (result != MY_FILE_ERROR) ? result : 0; PSI_FILE_CALL(end_file_wait)(locker, bytes_written); return result; } #endif result= my_fwrite(file->m_file, buffer, count, flags); return result; } static inline my_off_t inline_mysql_file_fseek( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif MYSQL_FILE *file, my_off_t pos, int whence, myf flags) { my_off_t result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_stream_locker) (&state, file->m_psi, PSI_FILE_SEEK); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); result= my_fseek(file->m_file, pos, whence, flags); PSI_FILE_CALL(end_file_wait)(locker, (size_t) 0); return result; } #endif result= my_fseek(file->m_file, pos, whence, flags); return result; } static inline my_off_t inline_mysql_file_ftell( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif MYSQL_FILE *file, myf flags) { my_off_t result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_stream_locker) (&state, file->m_psi, PSI_FILE_TELL); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); result= my_ftell(file->m_file, flags); PSI_FILE_CALL(end_file_wait)(locker, (size_t) 0); return result; } #endif result= my_ftell(file->m_file, flags); return result; } static inline File inline_mysql_file_create( #ifdef HAVE_PSI_FILE_INTERFACE PSI_file_key key, const char *src_file, uint src_line, #endif const char *filename, int create_flags, int access_flags, myf myFlags) { File file; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_name_locker) (&state, key, PSI_FILE_CREATE, filename, &locker); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_open_wait)(locker, src_file, src_line); file= my_create(filename, create_flags, access_flags, myFlags); PSI_FILE_CALL(end_file_open_wait_and_bind_to_descriptor)(locker, file); return file; } #endif file= my_create(filename, create_flags, access_flags, myFlags); return file; } static inline File inline_mysql_file_create_temp( #ifdef HAVE_PSI_FILE_INTERFACE PSI_file_key key, const char *src_file, uint src_line, #endif char *to, const char *dir, const char *pfx, int mode, myf myFlags) { File file; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_name_locker) (&state, key, PSI_FILE_CREATE, NULL, &locker); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_open_wait)(locker, src_file, src_line); /* The file name is generated by create_temp_file(). */ file= create_temp_file(to, dir, pfx, mode, myFlags); PSI_FILE_CALL(end_temp_file_open_wait_and_bind_to_descriptor)(locker, file, (const char*)to); return file; } #endif file= create_temp_file(to, dir, pfx, mode, myFlags); return file; } static inline File inline_mysql_file_open( #ifdef HAVE_PSI_FILE_INTERFACE PSI_file_key key, const char *src_file, uint src_line, #endif const char *filename, int flags, myf myFlags) { File file; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_name_locker) (&state, key, PSI_FILE_OPEN, filename, &locker); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_open_wait)(locker, src_file, src_line); file= my_open(filename, flags, myFlags); PSI_FILE_CALL(end_file_open_wait_and_bind_to_descriptor)(locker, file); return file; } #endif file= my_open(filename, flags, myFlags); return file; } #ifndef __WIN__ static inline File inline_mysql_unix_socket_connect( #ifdef HAVE_PSI_INTERFACE PSI_file_key key, const char *src_file, uint src_line, #endif const char *filename, myf myFlags) { File file; #ifdef HAVE_PSI_INTERFACE struct PSI_file_locker *locker= NULL; PSI_file_locker_state state; if (likely(PSI_server != NULL)) { locker= PSI_server->get_thread_file_name_locker(&state, key, PSI_FILE_OPEN, filename, &locker); if (likely(locker != NULL)) PSI_server->start_file_open_wait(locker, src_file, src_line); } #endif file = my_unix_socket_connect(filename, myFlags); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_file_open_wait_and_bind_to_descriptor(locker, file); #endif return file; } #endif static inline int inline_mysql_file_close( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif File file, myf flags) { int result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) (&state, file, PSI_FILE_CLOSE); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_close_wait)(locker, src_file, src_line); result= my_close(file, flags); PSI_FILE_CALL(end_file_close_wait)(locker, result); return result; } #endif result= my_close(file, flags); return result; } static inline size_t inline_mysql_file_read( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif File file, uchar *buffer, size_t count, myf flags) { size_t result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; size_t bytes_read; locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) (&state, file, PSI_FILE_READ); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, count, src_file, src_line); result= my_read(file, buffer, count, flags); if (flags & (MY_NABP | MY_FNABP)) bytes_read= (result == 0) ? count : 0; else bytes_read= (result != MY_FILE_ERROR) ? result : 0; PSI_FILE_CALL(end_file_wait)(locker, bytes_read); return result; } #endif result= my_read(file, buffer, count, flags); return result; } static inline size_t inline_mysql_file_write( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif File file, const uchar *buffer, size_t count, myf flags) { size_t result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; size_t bytes_written; locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) (&state, file, PSI_FILE_WRITE); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, count, src_file, src_line); result= my_write(file, buffer, count, flags); if (flags & (MY_NABP | MY_FNABP)) bytes_written= (result == 0) ? count : 0; else bytes_written= (result != MY_FILE_ERROR) ? result : 0; PSI_FILE_CALL(end_file_wait)(locker, bytes_written); return result; } #endif result= my_write(file, buffer, count, flags); return result; } static inline size_t inline_mysql_file_pread( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif File file, uchar *buffer, size_t count, my_off_t offset, myf flags) { size_t result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; size_t bytes_read; locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) (&state, file, PSI_FILE_READ); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, count, src_file, src_line); result= my_pread(file, buffer, count, offset, flags); if (flags & (MY_NABP | MY_FNABP)) bytes_read= (result == 0) ? count : 0; else bytes_read= (result != MY_FILE_ERROR) ? result : 0; PSI_FILE_CALL(end_file_wait)(locker, bytes_read); return result; } #endif result= my_pread(file, buffer, count, offset, flags); return result; } static inline size_t inline_mysql_file_pwrite( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif File file, const uchar *buffer, size_t count, my_off_t offset, myf flags) { size_t result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; size_t bytes_written; locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) (&state, file, PSI_FILE_WRITE); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, count, src_file, src_line); result= my_pwrite(file, buffer, count, offset, flags); if (flags & (MY_NABP | MY_FNABP)) bytes_written= (result == 0) ? count : 0; else bytes_written= (result != MY_FILE_ERROR) ? result : 0; PSI_FILE_CALL(end_file_wait)(locker, bytes_written); return result; } #endif result= my_pwrite(file, buffer, count, offset, flags); return result; } static inline my_off_t inline_mysql_file_seek( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif File file, my_off_t pos, int whence, myf flags) { my_off_t result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) (&state, file, PSI_FILE_SEEK); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); result= my_seek(file, pos, whence, flags); PSI_FILE_CALL(end_file_wait)(locker, (size_t) 0); return result; } #endif result= my_seek(file, pos, whence, flags); return result; } static inline my_off_t inline_mysql_file_tell( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif File file, myf flags) { my_off_t result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) (&state, file, PSI_FILE_TELL); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); result= my_tell(file, flags); PSI_FILE_CALL(end_file_wait)(locker, (size_t) 0); return result; } #endif result= my_tell(file, flags); return result; } static inline int inline_mysql_file_delete( #ifdef HAVE_PSI_FILE_INTERFACE PSI_file_key key, const char *src_file, uint src_line, #endif const char *name, myf flags) { int result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_name_locker) (&state, key, PSI_FILE_DELETE, name, &locker); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_close_wait)(locker, src_file, src_line); result= my_delete(name, flags); PSI_FILE_CALL(end_file_close_wait)(locker, result); return result; } #endif result= my_delete(name, flags); return result; } static inline int inline_mysql_file_rename( #ifdef HAVE_PSI_FILE_INTERFACE PSI_file_key key, const char *src_file, uint src_line, #endif const char *from, const char *to, myf flags) { int result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_name_locker) (&state, key, PSI_FILE_RENAME, from, &locker); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); result= my_rename(from, to, flags); PSI_FILE_CALL(end_file_rename_wait)(locker, from, to, result); return result; } #endif result= my_rename(from, to, flags); return result; } static inline File inline_mysql_file_create_with_symlink( #ifdef HAVE_PSI_FILE_INTERFACE PSI_file_key key, const char *src_file, uint src_line, #endif const char *linkname, const char *filename, int create_flags, int access_flags, myf flags) { File file; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_name_locker) (&state, key, PSI_FILE_CREATE, filename, &locker); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_open_wait)(locker, src_file, src_line); file= my_create_with_symlink(linkname, filename, create_flags, access_flags, flags); PSI_FILE_CALL(end_file_open_wait_and_bind_to_descriptor)(locker, file); return file; } #endif file= my_create_with_symlink(linkname, filename, create_flags, access_flags, flags); return file; } static inline int inline_mysql_file_delete_with_symlink( #ifdef HAVE_PSI_FILE_INTERFACE PSI_file_key key, const char *src_file, uint src_line, #endif const char *name, myf flags) { int result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_name_locker) (&state, key, PSI_FILE_DELETE, name, &locker); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_close_wait)(locker, src_file, src_line); result= my_delete_with_symlink(name, flags); PSI_FILE_CALL(end_file_close_wait)(locker, result); return result; } #endif result= my_delete_with_symlink(name, flags); return result; } static inline int inline_mysql_file_rename_with_symlink( #ifdef HAVE_PSI_FILE_INTERFACE PSI_file_key key, const char *src_file, uint src_line, #endif const char *from, const char *to, myf flags) { int result; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_name_locker) (&state, key, PSI_FILE_RENAME, from, &locker); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); result= my_rename_with_symlink(from, to, flags); PSI_FILE_CALL(end_file_rename_wait)(locker, from, to, result); return result; } #endif result= my_rename_with_symlink(from, to, flags); return result; } static inline int inline_mysql_file_sync( #ifdef HAVE_PSI_FILE_INTERFACE const char *src_file, uint src_line, #endif File fd, myf flags) { int result= 0; #ifdef HAVE_PSI_FILE_INTERFACE struct PSI_file_locker *locker; PSI_file_locker_state state; locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) (&state, fd, PSI_FILE_SYNC); if (likely(locker != NULL)) { PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); result= my_sync(fd, flags); PSI_FILE_CALL(end_file_wait)(locker, (size_t) 0); return result; } #endif result= my_sync(fd, flags); return result; } /** @} (end of group File_instrumentation) */ #endif PKpM /** @} */ C_MODE_END #endif /* MYSQL_PERFORMANCE_SCHEMA_INTERFACE_H */ PKp /* For MY_STAT */ #include /* For my_chsize */ #include /* For socket api */ #ifdef _WIN32 #include #include #include #define SOCKBUF_T char #else #include #define SOCKBUF_T void #endif /** @file mysql/psi/mysql_socket.h [...] */ #include "mysql/psi/psi.h" #ifndef PSI_SOCKET_CALL #define PSI_SOCKET_CALL(M) PSI_DYNAMIC_CALL(M) #endif /** @defgroup Socket_instrumentation Socket Instrumentation @ingroup Instrumentation_interface @{ */ /** @def mysql_socket_register(P1, P2, P3) Socket registration. */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define mysql_socket_register(P1, P2, P3) \ inline_mysql_socket_register(P1, P2, P3) #else #define mysql_socket_register(P1, P2, P3) \ do {} while (0) #endif /** An instrumented socket. */ struct st_mysql_socket { /** The real socket descriptor. */ my_socket fd; /** The instrumentation hook. Note that this hook is not conditionally defined, for binary compatibility of the @c MYSQL_SOCKET interface. */ struct PSI_socket *m_psi; }; /** An instrumented socket. @c MYSQL_SOCKET is a replacement for @c my_socket. */ typedef struct st_mysql_socket MYSQL_SOCKET; /** @def MYSQL_INVALID_SOCKET MYSQL_SOCKET initial value. */ //MYSQL_SOCKET MYSQL_INVALID_SOCKET= {INVALID_SOCKET, NULL}; #define MYSQL_INVALID_SOCKET mysql_socket_invalid() /** MYSQL_SOCKET helper. Initialize instrumented socket. @sa mysql_socket_getfd @sa mysql_socket_setfd */ static inline MYSQL_SOCKET mysql_socket_invalid() { MYSQL_SOCKET mysql_socket= {INVALID_SOCKET, NULL}; return mysql_socket; } /** Set socket descriptor and address. @param socket nstrumented socket @param addr unformatted socket address @param addr_len length of socket addres */ static inline void mysql_socket_set_address( #ifdef HAVE_PSI_SOCKET_INTERFACE MYSQL_SOCKET socket, const struct sockaddr *addr, socklen_t addr_len #else MYSQL_SOCKET socket MY_ATTRIBUTE ((unused)), const struct sockaddr *addr MY_ATTRIBUTE ((unused)), socklen_t addr_len MY_ATTRIBUTE ((unused)) #endif ) { #ifdef HAVE_PSI_SOCKET_INTERFACE if (socket.m_psi != NULL) PSI_SOCKET_CALL(set_socket_info)(socket.m_psi, NULL, addr, addr_len); #endif } /** Set socket descriptor and address. @param socket instrumented socket */ static inline void mysql_socket_set_thread_owner( #ifdef HAVE_PSI_SOCKET_INTERFACE MYSQL_SOCKET socket #else MYSQL_SOCKET socket MY_ATTRIBUTE ((unused)) #endif ) { #ifdef HAVE_PSI_SOCKET_INTERFACE if (socket.m_psi != NULL) PSI_SOCKET_CALL(set_socket_thread_owner)(socket.m_psi); #endif } /** MYSQL_SOCKET helper. Get socket descriptor. @param mysql_socket Instrumented socket @sa mysql_socket_setfd */ static inline my_socket mysql_socket_getfd(MYSQL_SOCKET mysql_socket) { return mysql_socket.fd; } /** MYSQL_SOCKET helper. Set socket descriptor. @param mysql_socket Instrumented socket @param fd Socket descriptor @sa mysql_socket_getfd */ static inline void mysql_socket_setfd(MYSQL_SOCKET *mysql_socket, my_socket fd) { if (likely(mysql_socket != NULL)) mysql_socket->fd= fd; } /** @def MYSQL_SOCKET_WAIT_VARIABLES Instrumentation helper for socket waits. This instrumentation declares local variables. Do not use a ';' after this macro @param LOCKER locker @param STATE locker state @sa MYSQL_START_SOCKET_WAIT. @sa MYSQL_END_SOCKET_WAIT. */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define MYSQL_SOCKET_WAIT_VARIABLES(LOCKER, STATE) \ struct PSI_socket_locker* LOCKER; \ PSI_socket_locker_state STATE; #else #define MYSQL_SOCKET_WAIT_VARIABLES(LOCKER, STATE) #endif /** @def MYSQL_START_SOCKET_WAIT Instrumentation helper for socket waits. This instrumentation marks the start of a wait event. @param LOCKER locker @param STATE locker state @param SOCKET instrumented socket @param OP The socket operation to be performed @param COUNT bytes to be written/read @sa MYSQL_END_SOCKET_WAIT. */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define MYSQL_START_SOCKET_WAIT(LOCKER, STATE, SOCKET, OP, COUNT) \ LOCKER= inline_mysql_start_socket_wait(STATE, SOCKET, OP, COUNT,\ __FILE__, __LINE__) #else #define MYSQL_START_SOCKET_WAIT(LOCKER, STATE, SOCKET, OP, COUNT) \ do {} while (0) #endif /** @def MYSQL_END_SOCKET_WAIT Instrumentation helper for socket waits. This instrumentation marks the end of a wait event. @param LOCKER locker @param COUNT actual bytes written/read, or -1 @sa MYSQL_START_SOCKET_WAIT. */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define MYSQL_END_SOCKET_WAIT(LOCKER, COUNT) \ inline_mysql_end_socket_wait(LOCKER, COUNT) #else #define MYSQL_END_SOCKET_WAIT(LOCKER, COUNT) \ do {} while (0) #endif /** @def MYSQL_SOCKET_SET_STATE Set the state (IDLE, ACTIVE) of an instrumented socket. @param SOCKET the instrumented socket @param STATE the new state @sa PSI_socket_state */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define MYSQL_SOCKET_SET_STATE(SOCKET, STATE) \ inline_mysql_socket_set_state(SOCKET, STATE) #else #define MYSQL_SOCKET_SET_STATE(SOCKET, STATE) \ do {} while (0) #endif #ifdef HAVE_PSI_SOCKET_INTERFACE /** Instrumentation calls for MYSQL_START_SOCKET_WAIT. @sa MYSQL_START_SOCKET_WAIT. */ static inline struct PSI_socket_locker* inline_mysql_start_socket_wait(PSI_socket_locker_state *state, MYSQL_SOCKET mysql_socket, enum PSI_socket_operation op, size_t byte_count, const char *src_file, int src_line) { struct PSI_socket_locker *locker; if (mysql_socket.m_psi != NULL) { locker= PSI_SOCKET_CALL(start_socket_wait) (state, mysql_socket.m_psi, op, byte_count, src_file, src_line); } else locker= NULL; return locker; } /** Instrumentation calls for MYSQL_END_SOCKET_WAIT. @sa MYSQL_END_SOCKET_WAIT. */ static inline void inline_mysql_end_socket_wait(struct PSI_socket_locker *locker, size_t byte_count) { if (locker != NULL) PSI_SOCKET_CALL(end_socket_wait)(locker, byte_count); } /** Set the state (IDLE, ACTIVE) of an instrumented socket. @param socket the instrumented socket @param state the new state @sa PSI_socket_state */ static inline void inline_mysql_socket_set_state(MYSQL_SOCKET socket, enum PSI_socket_state state) { if (socket.m_psi != NULL) PSI_SOCKET_CALL(set_socket_state)(socket.m_psi, state); } #endif /* HAVE_PSI_SOCKET_INTERFACE */ /** @def mysql_socket_socket(K, D, T, P) Create a socket. @c mysql_socket_socket is a replacement for @c socket. @param K PSI_socket_key for this instrumented socket @param D Socket domain @param T Protocol type @param P Transport protocol */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define mysql_socket_socket(K, D, T, P) \ inline_mysql_socket_socket(K, D, T, P) #else #define mysql_socket_socket(K, D, T, P) \ inline_mysql_socket_socket(D, T, P) #endif /** @def mysql_socket_bind(FD, AP, L) Bind a socket to a local port number and IP address @c mysql_socket_bind is a replacement for @c bind. @param FD Instrumented socket descriptor returned by socket() @param AP Pointer to local port number and IP address in sockaddr structure @param L Length of sockaddr structure */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define mysql_socket_bind(FD, AP, L) \ inline_mysql_socket_bind(__FILE__, __LINE__, FD, AP, L) #else #define mysql_socket_bind(FD, AP, L) \ inline_mysql_socket_bind(FD, AP, L) #endif /** @def mysql_socket_getsockname(FD, AP, LP) Return port number and IP address of the local host @c mysql_socket_getsockname is a replacement for @c getsockname. @param FD Instrumented socket descriptor returned by socket() @param AP Pointer to returned address of local host in @c sockaddr structure @param LP Pointer to length of @c sockaddr structure */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define mysql_socket_getsockname(FD, AP, LP) \ inline_mysql_socket_getsockname(__FILE__, __LINE__, FD, AP, LP) #else #define mysql_socket_getsockname(FD, AP, LP) \ inline_mysql_socket_getsockname(FD, AP, LP) #endif /** @def mysql_socket_connect(FD, AP, L) Establish a connection to a remote host. @c mysql_socket_connect is a replacement for @c connect. @param FD Instrumented socket descriptor returned by socket() @param AP Pointer to target address in sockaddr structure @param L Length of sockaddr structure */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define mysql_socket_connect(FD, AP, L) \ inline_mysql_socket_connect(__FILE__, __LINE__, FD, AP, L) #else #define mysql_socket_connect(FD, AP, L) \ inline_mysql_socket_connect(FD, AP, L) #endif /** @def mysql_socket_getpeername(FD, AP, LP) Get port number and IP address of remote host that a socket is connected to. @c mysql_socket_getpeername is a replacement for @c getpeername. @param FD Instrumented socket descriptor returned by socket() or accept() @param AP Pointer to returned address of remote host in sockaddr structure @param LP Pointer to length of sockaddr structure */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define mysql_socket_getpeername(FD, AP, LP) \ inline_mysql_socket_getpeername(__FILE__, __LINE__, FD, AP, LP) #else #define mysql_socket_getpeername(FD, AP, LP) \ inline_mysql_socket_getpeername(FD, AP, LP) #endif /** @def mysql_socket_send(FD, B, N, FL) Send data from the buffer, B, to a connected socket. @c mysql_socket_send is a replacement for @c send. @param FD Instrumented socket descriptor returned by socket() or accept() @param B Buffer to send @param N Number of bytes to send @param FL Control flags */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define mysql_socket_send(FD, B, N, FL) \ inline_mysql_socket_send(__FILE__, __LINE__, FD, B, N, FL) #else #define mysql_socket_send(FD, B, N, FL) \ inline_mysql_socket_send(FD, B, N, FL) #endif /** @def mysql_socket_recv(FD, B, N, FL) Receive data from a connected socket. @c mysql_socket_recv is a replacement for @c recv. @param FD Instrumented socket descriptor returned by socket() or accept() @param B Buffer to receive to @param N Maximum bytes to receive @param FL Control flags */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define mysql_socket_recv(FD, B, N, FL) \ inline_mysql_socket_recv(__FILE__, __LINE__, FD, B, N, FL) #else #define mysql_socket_recv(FD, B, N, FL) \ inline_mysql_socket_recv(FD, B, N, FL) #endif /** @def mysql_socket_sendto(FD, B, N, FL, AP, L) Send data to a socket at the specified address. @c mysql_socket_sendto is a replacement for @c sendto. @param FD Instrumented socket descriptor returned by socket() @param B Buffer to send @param N Number of bytes to send @param FL Control flags @param AP Pointer to destination sockaddr structure @param L Size of sockaddr structure */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define mysql_socket_sendto(FD, B, N, FL, AP, L) \ inline_mysql_socket_sendto(__FILE__, __LINE__, FD, B, N, FL, AP, L) #else #define mysql_socket_sendto(FD, B, N, FL, AP, L) \ inline_mysql_socket_sendto(FD, B, N, FL, AP, L) #endif /** @def mysql_socket_recvfrom(FD, B, N, FL, AP, L) Receive data from a socket and return source address information @c mysql_socket_recvfrom is a replacement for @c recvfrom. @param FD Instrumented socket descriptor returned by socket() @param B Buffer to receive to @param N Maximum bytes to receive @param FL Control flags @param AP Pointer to source address in sockaddr_storage structure @param LP Size of sockaddr_storage structure */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define mysql_socket_recvfrom(FD, B, N, FL, AP, LP) \ inline_mysql_socket_recvfrom(__FILE__, __LINE__, FD, B, N, FL, AP, LP) #else #define mysql_socket_recvfrom(FD, B, N, FL, AP, LP) \ inline_mysql_socket_recvfrom(FD, B, N, FL, AP, LP) #endif /** @def mysql_socket_getsockopt(FD, LV, ON, OP, OL) Get a socket option for the specified socket. @c mysql_socket_getsockopt is a replacement for @c getsockopt. @param FD Instrumented socket descriptor returned by socket() @param LV Protocol level @param ON Option to query @param OP Buffer which will contain the value for the requested option @param OL Pointer to length of OP */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define mysql_socket_getsockopt(FD, LV, ON, OP, OL) \ inline_mysql_socket_getsockopt(__FILE__, __LINE__, FD, LV, ON, OP, OL) #else #define mysql_socket_getsockopt(FD, LV, ON, OP, OL) \ inline_mysql_socket_getsockopt(FD, LV, ON, OP, OL) #endif /** @def mysql_socket_setsockopt(FD, LV, ON, OP, OL) Set a socket option for the specified socket. @c mysql_socket_setsockopt is a replacement for @c setsockopt. @param FD Instrumented socket descriptor returned by socket() @param LV Protocol level @param ON Option to modify @param OP Buffer containing the value for the specified option @param OL Pointer to length of OP */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define mysql_socket_setsockopt(FD, LV, ON, OP, OL) \ inline_mysql_socket_setsockopt(__FILE__, __LINE__, FD, LV, ON, OP, OL) #else #define mysql_socket_setsockopt(FD, LV, ON, OP, OL) \ inline_mysql_socket_setsockopt(FD, LV, ON, OP, OL) #endif /** @def mysql_sock_set_nonblocking Set socket to non-blocking. @param FD instrumented socket descriptor */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define mysql_sock_set_nonblocking(FD) \ inline_mysql_sock_set_nonblocking(__FILE__, __LINE__, FD) #else #define mysql_sock_set_nonblocking(FD) \ inline_mysql_sock_set_nonblocking(FD) #endif /** @def mysql_socket_listen(FD, N) Set socket state to listen for an incoming connection. @c mysql_socket_listen is a replacement for @c listen. @param FD Instrumented socket descriptor, bound and connected @param N Maximum number of pending connections allowed. */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define mysql_socket_listen(FD, N) \ inline_mysql_socket_listen(__FILE__, __LINE__, FD, N) #else #define mysql_socket_listen(FD, N) \ inline_mysql_socket_listen(FD, N) #endif /** @def mysql_socket_accept(K, FD, AP, LP) Accept a connection from any remote host; TCP only. @c mysql_socket_accept is a replacement for @c accept. @param K PSI_socket_key for this instrumented socket @param FD Instrumented socket descriptor, bound and placed in a listen state @param AP Pointer to sockaddr structure with returned IP address and port of connected host @param LP Pointer to length of valid information in AP */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define mysql_socket_accept(K, FD, AP, LP) \ inline_mysql_socket_accept(__FILE__, __LINE__, K, FD, AP, LP) #else #define mysql_socket_accept(K, FD, AP, LP) \ inline_mysql_socket_accept(FD, AP, LP) #endif /** @def mysql_socket_close(FD) Close a socket and sever any connections. @c mysql_socket_close is a replacement for @c close. @param FD Instrumented socket descriptor returned by socket() or accept() */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define mysql_socket_close(FD) \ inline_mysql_socket_close(__FILE__, __LINE__, FD) #else #define mysql_socket_close(FD) \ inline_mysql_socket_close(FD) #endif /** @def mysql_socket_shutdown(FD, H) Disable receives and/or sends on a socket. @c mysql_socket_shutdown is a replacement for @c shutdown. @param FD Instrumented socket descriptor returned by socket() or accept() @param H Specifies which operations to shutdown */ #ifdef HAVE_PSI_SOCKET_INTERFACE #define mysql_socket_shutdown(FD, H) \ inline_mysql_socket_shutdown(__FILE__, __LINE__, FD, H) #else #define mysql_socket_shutdown(FD, H) \ inline_mysql_socket_shutdown(FD, H) #endif #ifdef HAVE_PSI_SOCKET_INTERFACE static inline void inline_mysql_socket_register( const char *category, PSI_socket_info *info, int count) { PSI_SOCKET_CALL(register_socket)(category, info, count); } #endif /** mysql_socket_socket */ static inline MYSQL_SOCKET inline_mysql_socket_socket ( #ifdef HAVE_PSI_SOCKET_INTERFACE PSI_socket_key key, #endif int domain, int type, int protocol) { MYSQL_SOCKET mysql_socket= MYSQL_INVALID_SOCKET; mysql_socket.fd= socket(domain, type, protocol); #ifdef HAVE_PSI_SOCKET_INTERFACE if (likely(mysql_socket.fd != INVALID_SOCKET)) { mysql_socket.m_psi= PSI_SOCKET_CALL(init_socket) (key, (const my_socket*)&mysql_socket.fd, NULL, 0); } #endif return mysql_socket; } /** mysql_socket_bind */ static inline int inline_mysql_socket_bind ( #ifdef HAVE_PSI_SOCKET_INTERFACE const char *src_file, uint src_line, #endif MYSQL_SOCKET mysql_socket, const struct sockaddr *addr, socklen_t len) { int result; #ifdef HAVE_PSI_SOCKET_INTERFACE if (mysql_socket.m_psi != NULL) { /* Instrumentation start */ PSI_socket_locker_state state; PSI_socket_locker *locker; locker= PSI_SOCKET_CALL(start_socket_wait) (&state, mysql_socket.m_psi, PSI_SOCKET_BIND, (size_t)0, src_file, src_line); /* Instrumented code */ result= bind(mysql_socket.fd, addr, len); /* Instrumentation end */ if (result == 0) PSI_SOCKET_CALL(set_socket_info)(mysql_socket.m_psi, NULL, addr, len); if (locker != NULL) PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); return result; } #endif /* Non instrumented code */ result= bind(mysql_socket.fd, addr, len); return result; } /** mysql_socket_getsockname */ static inline int inline_mysql_socket_getsockname ( #ifdef HAVE_PSI_SOCKET_INTERFACE const char *src_file, uint src_line, #endif MYSQL_SOCKET mysql_socket, struct sockaddr *addr, socklen_t *len) { int result; #ifdef HAVE_PSI_SOCKET_INTERFACE if (mysql_socket.m_psi != NULL) { /* Instrumentation start */ PSI_socket_locker *locker; PSI_socket_locker_state state; locker= PSI_SOCKET_CALL(start_socket_wait) (&state, mysql_socket.m_psi, PSI_SOCKET_BIND, (size_t)0, src_file, src_line); /* Instrumented code */ result= getsockname(mysql_socket.fd, addr, len); /* Instrumentation end */ if (locker != NULL) PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); return result; } #endif /* Non instrumented code */ result= getsockname(mysql_socket.fd, addr, len); return result; } /** mysql_socket_connect */ static inline int inline_mysql_socket_connect ( #ifdef HAVE_PSI_SOCKET_INTERFACE const char *src_file, uint src_line, #endif MYSQL_SOCKET mysql_socket, const struct sockaddr *addr, socklen_t len) { int result; #ifdef HAVE_PSI_SOCKET_INTERFACE if (mysql_socket.m_psi != NULL) { /* Instrumentation start */ PSI_socket_locker *locker; PSI_socket_locker_state state; locker= PSI_SOCKET_CALL(start_socket_wait) (&state, mysql_socket.m_psi, PSI_SOCKET_CONNECT, (size_t)0, src_file, src_line); /* Instrumented code */ result= connect(mysql_socket.fd, addr, len); /* Instrumentation end */ if (locker != NULL) PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); return result; } #endif /* Non instrumented code */ result= connect(mysql_socket.fd, addr, len); return result; } /** mysql_socket_getpeername */ static inline int inline_mysql_socket_getpeername ( #ifdef HAVE_PSI_SOCKET_INTERFACE const char *src_file, uint src_line, #endif MYSQL_SOCKET mysql_socket, struct sockaddr *addr, socklen_t *len) { int result; #ifdef HAVE_PSI_SOCKET_INTERFACE if (mysql_socket.m_psi != NULL) { /* Instrumentation start */ PSI_socket_locker *locker; PSI_socket_locker_state state; locker= PSI_SOCKET_CALL(start_socket_wait) (&state, mysql_socket.m_psi, PSI_SOCKET_BIND, (size_t)0, src_file, src_line); /* Instrumented code */ result= getpeername(mysql_socket.fd, addr, len); /* Instrumentation end */ if (locker != NULL) PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); return result; } #endif /* Non instrumented code */ result= getpeername(mysql_socket.fd, addr, len); return result; } /** mysql_socket_send */ static inline ssize_t inline_mysql_socket_send ( #ifdef HAVE_PSI_SOCKET_INTERFACE const char *src_file, uint src_line, #endif MYSQL_SOCKET mysql_socket, const SOCKBUF_T *buf, size_t n, int flags) { ssize_t result; #ifdef HAVE_PSI_SOCKET_INTERFACE if (mysql_socket.m_psi != NULL) { /* Instrumentation start */ PSI_socket_locker *locker; PSI_socket_locker_state state; locker= PSI_SOCKET_CALL(start_socket_wait) (&state, mysql_socket.m_psi, PSI_SOCKET_SEND, n, src_file, src_line); /* Instrumented code */ result= send(mysql_socket.fd, buf, IF_WIN((int),) n, flags); /* Instrumentation end */ if (locker != NULL) { size_t bytes_written; bytes_written= (result > -1) ? result : 0; PSI_SOCKET_CALL(end_socket_wait)(locker, bytes_written); } return result; } #endif /* Non instrumented code */ result= send(mysql_socket.fd, buf, IF_WIN((int),) n, flags); return result; } /** mysql_socket_recv */ static inline ssize_t inline_mysql_socket_recv ( #ifdef HAVE_PSI_SOCKET_INTERFACE const char *src_file, uint src_line, #endif MYSQL_SOCKET mysql_socket, SOCKBUF_T *buf, size_t n, int flags) { ssize_t result; #ifdef HAVE_PSI_SOCKET_INTERFACE if (mysql_socket.m_psi != NULL) { /* Instrumentation start */ PSI_socket_locker *locker; PSI_socket_locker_state state; locker= PSI_SOCKET_CALL(start_socket_wait) (&state, mysql_socket.m_psi, PSI_SOCKET_RECV, (size_t)0, src_file, src_line); /* Instrumented code */ result= recv(mysql_socket.fd, buf, IF_WIN((int),) n, flags); /* Instrumentation end */ if (locker != NULL) { size_t bytes_read; bytes_read= (result > -1) ? result : 0; PSI_SOCKET_CALL(end_socket_wait)(locker, bytes_read); } return result; } #endif /* Non instrumented code */ result= recv(mysql_socket.fd, buf, IF_WIN((int),) n, flags); return result; } /** mysql_socket_sendto */ static inline ssize_t inline_mysql_socket_sendto ( #ifdef HAVE_PSI_SOCKET_INTERFACE const char *src_file, uint src_line, #endif MYSQL_SOCKET mysql_socket, const SOCKBUF_T *buf, size_t n, int flags, const struct sockaddr *addr, socklen_t addr_len) { ssize_t result; #ifdef HAVE_PSI_SOCKET_INTERFACE if (mysql_socket.m_psi != NULL) { /* Instrumentation start */ PSI_socket_locker *locker; PSI_socket_locker_state state; locker= PSI_SOCKET_CALL(start_socket_wait) (&state, mysql_socket.m_psi, PSI_SOCKET_SEND, n, src_file, src_line); /* Instrumented code */ result= sendto(mysql_socket.fd, buf, IF_WIN((int),) n, flags, addr, addr_len); /* Instrumentation end */ if (locker != NULL) { size_t bytes_written; bytes_written = (result > -1) ? result : 0; PSI_SOCKET_CALL(end_socket_wait)(locker, bytes_written); } return result; } #endif /* Non instrumented code */ result= sendto(mysql_socket.fd, buf, IF_WIN((int),) n, flags, addr, addr_len); return result; } /** mysql_socket_recvfrom */ static inline ssize_t inline_mysql_socket_recvfrom ( #ifdef HAVE_PSI_SOCKET_INTERFACE const char *src_file, uint src_line, #endif MYSQL_SOCKET mysql_socket, SOCKBUF_T *buf, size_t n, int flags, struct sockaddr *addr, socklen_t *addr_len) { ssize_t result; #ifdef HAVE_PSI_SOCKET_INTERFACE if (mysql_socket.m_psi != NULL) { /* Instrumentation start */ PSI_socket_locker *locker; PSI_socket_locker_state state; locker= PSI_SOCKET_CALL(start_socket_wait) (&state, mysql_socket.m_psi, PSI_SOCKET_RECV, (size_t)0, src_file, src_line); /* Instrumented code */ result= recvfrom(mysql_socket.fd, buf, IF_WIN((int),) n, flags, addr, addr_len); /* Instrumentation end */ if (locker != NULL) { size_t bytes_read; bytes_read = (result > -1) ? result : 0; PSI_SOCKET_CALL(end_socket_wait)(locker, bytes_read); } return result; } #endif /* Non instrumented code */ result= recvfrom(mysql_socket.fd, buf, IF_WIN((int),) n, flags, addr, addr_len); return result; } /** mysql_socket_getsockopt */ static inline int inline_mysql_socket_getsockopt ( #ifdef HAVE_PSI_SOCKET_INTERFACE const char *src_file, uint src_line, #endif MYSQL_SOCKET mysql_socket, int level, int optname, SOCKBUF_T *optval, socklen_t *optlen) { int result; #ifdef HAVE_PSI_SOCKET_INTERFACE if (mysql_socket.m_psi != NULL) { /* Instrumentation start */ PSI_socket_locker *locker; PSI_socket_locker_state state; locker= PSI_SOCKET_CALL(start_socket_wait) (&state, mysql_socket.m_psi, PSI_SOCKET_OPT, (size_t)0, src_file, src_line); /* Instrumented code */ result= getsockopt(mysql_socket.fd, level, optname, optval, optlen); /* Instrumentation end */ if (locker != NULL) PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); return result; } #endif /* Non instrumented code */ result= getsockopt(mysql_socket.fd, level, optname, optval, optlen); return result; } /** mysql_socket_setsockopt */ static inline int inline_mysql_socket_setsockopt ( #ifdef HAVE_PSI_SOCKET_INTERFACE const char *src_file, uint src_line, #endif MYSQL_SOCKET mysql_socket, int level, int optname, const SOCKBUF_T *optval, socklen_t optlen) { int result; #ifdef HAVE_PSI_SOCKET_INTERFACE if (mysql_socket.m_psi) { /* Instrumentation start */ PSI_socket_locker *locker; PSI_socket_locker_state state; locker= PSI_SOCKET_CALL(start_socket_wait) (&state, mysql_socket.m_psi, PSI_SOCKET_OPT, (size_t)0, src_file, src_line); /* Instrumented code */ result= setsockopt(mysql_socket.fd, level, optname, optval, optlen); /* Instrumentation end */ if (locker != NULL) PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); return result; } #endif /* Non instrumented code */ result= setsockopt(mysql_socket.fd, level, optname, optval, optlen); return result; } /** set_socket_nonblock */ static inline int set_socket_nonblock(my_socket fd) { int ret= 0; #ifdef _WIN32 { u_long nonblocking= 1; ret= ioctlsocket(fd, FIONBIO, &nonblocking); } #else { int fd_flags; fd_flags= fcntl(fd, F_GETFL, 0); if (fd_flags < 0) return errno; #if defined(O_NONBLOCK) fd_flags |= O_NONBLOCK; #elif defined(O_NDELAY) fd_flags |= O_NDELAY; #elif defined(O_FNDELAY) fd_flags |= O_FNDELAY; #else #error "No definition of non-blocking flag found." #endif /* O_NONBLOCK */ if (fcntl(fd, F_SETFL, fd_flags) == -1) ret= errno; } #endif /* _WIN32 */ return ret; } /** mysql_socket_set_nonblocking */ static inline int inline_mysql_sock_set_nonblocking ( #ifdef HAVE_PSI_SOCKET_INTERFACE const char *src_file, uint src_line, #endif MYSQL_SOCKET mysql_socket ) { int result= 0; #ifdef HAVE_PSI_SOCKET_INTERFACE if (mysql_socket.m_psi) { /* Instrumentation start */ PSI_socket_locker *locker; PSI_socket_locker_state state; locker= PSI_SOCKET_CALL(start_socket_wait) (&state, mysql_socket.m_psi, PSI_SOCKET_OPT, (size_t)0, src_file, src_line); /* Instrumented code */ result= set_socket_nonblock(mysql_socket.fd); /* Instrumentation end */ if (locker != NULL) PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); return result; } #endif /* Non instrumented code */ result= set_socket_nonblock(mysql_socket.fd); return result; } /** mysql_socket_listen */ static inline int inline_mysql_socket_listen ( #ifdef HAVE_PSI_SOCKET_INTERFACE const char *src_file, uint src_line, #endif MYSQL_SOCKET mysql_socket, int backlog) { int result; #ifdef HAVE_PSI_SOCKET_INTERFACE if (mysql_socket.m_psi != NULL) { /* Instrumentation start */ PSI_socket_locker *locker; PSI_socket_locker_state state; locker= PSI_SOCKET_CALL(start_socket_wait) (&state, mysql_socket.m_psi, PSI_SOCKET_CONNECT, (size_t)0, src_file, src_line); /* Instrumented code */ result= listen(mysql_socket.fd, backlog); /* Instrumentation end */ if (locker != NULL) PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); return result; } #endif /* Non instrumented code */ result= listen(mysql_socket.fd, backlog); return result; } /** mysql_socket_accept */ static inline MYSQL_SOCKET inline_mysql_socket_accept ( #ifdef HAVE_PSI_SOCKET_INTERFACE const char *src_file, uint src_line, PSI_socket_key key, #endif MYSQL_SOCKET socket_listen, struct sockaddr *addr, socklen_t *addr_len) { MYSQL_SOCKET socket_accept= MYSQL_INVALID_SOCKET; socklen_t addr_length= (addr_len != NULL) ? *addr_len : 0; #ifdef HAVE_PSI_SOCKET_INTERFACE if (socket_listen.m_psi != NULL) { /* Instrumentation start */ PSI_socket_locker *locker; PSI_socket_locker_state state; locker= PSI_SOCKET_CALL(start_socket_wait) (&state, socket_listen.m_psi, PSI_SOCKET_CONNECT, (size_t)0, src_file, src_line); /* Instrumented code */ socket_accept.fd= accept(socket_listen.fd, addr, &addr_length); /* Instrumentation end */ if (locker != NULL) PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); } else #endif { /* Non instrumented code */ socket_accept.fd= accept(socket_listen.fd, addr, &addr_length); } #ifdef HAVE_PSI_SOCKET_INTERFACE if (likely(socket_accept.fd != INVALID_SOCKET)) { /* Initialize the instrument with the new socket descriptor and address */ socket_accept.m_psi= PSI_SOCKET_CALL(init_socket) (key, (const my_socket*)&socket_accept.fd, addr, addr_length); } #endif return socket_accept; } /** mysql_socket_close */ static inline int inline_mysql_socket_close ( #ifdef HAVE_PSI_SOCKET_INTERFACE const char *src_file, uint src_line, #endif MYSQL_SOCKET mysql_socket) { int result; #ifdef HAVE_PSI_SOCKET_INTERFACE if (mysql_socket.m_psi != NULL) { /* Instrumentation start */ PSI_socket_locker *locker; PSI_socket_locker_state state; locker= PSI_SOCKET_CALL(start_socket_wait) (&state, mysql_socket.m_psi, PSI_SOCKET_CLOSE, (size_t)0, src_file, src_line); /* Instrumented code */ result= closesocket(mysql_socket.fd); /* Instrumentation end */ if (locker != NULL) PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); /* Remove the instrumentation for this socket. */ if (mysql_socket.m_psi != NULL) PSI_SOCKET_CALL(destroy_socket)(mysql_socket.m_psi); return result; } #endif /* Non instrumented code */ result= closesocket(mysql_socket.fd); return result; } /** mysql_socket_shutdown */ static inline int inline_mysql_socket_shutdown ( #ifdef HAVE_PSI_SOCKET_INTERFACE const char *src_file, uint src_line, #endif MYSQL_SOCKET mysql_socket, int how) { int result; #ifdef _WIN32 static LPFN_DISCONNECTEX DisconnectEx = NULL; if (DisconnectEx == NULL) { DWORD dwBytesReturned; GUID guidDisconnectEx = WSAID_DISCONNECTEX; WSAIoctl(mysql_socket.fd, SIO_GET_EXTENSION_FUNCTION_POINTER, &guidDisconnectEx, sizeof(GUID), &DisconnectEx, sizeof(DisconnectEx), &dwBytesReturned, NULL, NULL); } #endif /* Instrumentation start */ #ifdef HAVE_PSI_SOCKET_INTERFACE if (mysql_socket.m_psi != NULL) { PSI_socket_locker *locker; PSI_socket_locker_state state; locker= PSI_SOCKET_CALL(start_socket_wait) (&state, mysql_socket.m_psi, PSI_SOCKET_SHUTDOWN, (size_t)0, src_file, src_line); /* Instrumented code */ #ifdef _WIN32 if (DisconnectEx) result= (DisconnectEx(mysql_socket.fd, (LPOVERLAPPED) NULL, (DWORD) 0, (DWORD) 0) == TRUE) ? 0 : -1; else #endif result= shutdown(mysql_socket.fd, how); /* Instrumentation end */ if (locker != NULL) PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); return result; } #endif /* Non instrumented code */ #ifdef _WIN32 if (DisconnectEx) result= (DisconnectEx(mysql_socket.fd, (LPOVERLAPPED) NULL, (DWORD) 0, (DWORD) 0) == TRUE) ? 0 : -1; else #endif result= shutdown(mysql_socket.fd, how); return result; } /** @} (end of group Socket_instrumentation) */ #endif PKpM #endif /* HAVE_PSI_INTERFACE */ /** @} */ #ifdef __cplusplus } #endif #endif /* MYSQL_PSI_BASE_H */ PKp #include #include #ifndef MYSQL_ABI_CHECK #include #endif /** @file service_rules_table.h Plugin service that provides access to the rewrite rules table that is used by the Rewriter plugin. No other use intended. */ class THD; struct TABLE_LIST; class Field; namespace rules_table_service { /** There must be one function of this kind in order for the symbols in the server's dynamic library to be visible to plugins. */ int dummy_function_to_ensure_we_are_linked_into_the_server(); /** Frees a const char pointer allocated in the server's dynamic library using new[]. */ void free_string(const char *str); /** Writable cursor that allows reading and updating of rows in a persistent table. */ class Cursor { public: typedef int column_id; static const column_id ILLEGAL_COLUMN_ID= -1; /** Creates a cursor to an already-opened table. The constructor is kept explicit because of implicit conversions from void*. */ explicit Cursor(THD *thd); /// Creates a past-the-end cursor. Cursor() : m_thd(NULL), m_table_list(NULL), m_is_finished(true) {} column_id pattern_column() const { return m_pattern_column; } column_id pattern_database_column() const { return m_pattern_database_column; } column_id replacement_column() const { return m_replacement_column; } column_id enabled_column() const { return m_enabled_column; } column_id message_column() const { return m_message_column; } column_id pattern_digest_column() const { return m_pattern_digest_column; } column_id normalized_pattern_column() const { return m_normalized_pattern_column; } /** True if the table does not contain columns named 'pattern', 'replacement', 'enabled' and 'message'. In this case the cursor is equal to any past-the-end Cursor. */ bool table_is_malformed() { return m_table_is_malformed; } /** Fetches the value of the column with the given number as a C string. This interface is meant for crossing dynamic library boundaries, hence the use of C-style const char*. The function casts a column value to a C string and returns a copy, allocated in the callee's DL. The pointer must be freed using free_string(). @param fieldno One of PATTERN_COLUMN, REPLACEMENT_COLUMN, ENABLED_COLUMN or MESSAGE_COLUMN. */ const char *fetch_string(int fieldno); /** Equality operator. The only cursors that are equal are past-the-end cursors. */ bool operator== (const Cursor &other) { return (m_is_finished == other.m_is_finished); } /** Inequality operator. All cursors are considered different except past-the-end cursors. */ bool operator!= (const Cursor &other) { return !(*this == other); } /** Advances this Cursor. Read errors are kept, and had_serious_read_error() will tell if there was an unexpected error (e.g. not EOF) while reading. */ Cursor &operator++ () { if (!m_is_finished) read(); return *this; } /// Prepares the write buffer for updating the current row. void make_writeable(); /** Sets the value of column colno to a string value. @param colno The column number. @param str The string. @param length The string's length. */ void set(int colno, const char* str, size_t length); /// Writes the row in the write buffer to the table at the current row. int write(); /// True if there was an unexpected error while reading, e.g. other than EOF. bool had_serious_read_error() const; /// Closes the table scan if initiated and commits the transaction. ~Cursor(); private: int field_index(const char *field_name); int m_pattern_column; int m_pattern_database_column; int m_replacement_column; int m_enabled_column; int m_message_column; int m_pattern_digest_column; int m_normalized_pattern_column; THD *m_thd; TABLE_LIST *m_table_list; bool m_is_finished; bool m_table_is_malformed; int m_last_read_status; int read(); }; /** A past-the-end Cursor. All past-the-end cursors are considered equal when compared with operator ==. */ Cursor end(); } #endif // SERVICE_RULES_TABLE_INCLUDED #endif // __cplusplus PKp #include #include #endif #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __cplusplus } #endif #ifdef __cplusplus #include #endif #define MYSQL_SERVICES_INCLUDED #endif /* MYSQL_SERVICES_INCLUDED */ PKp0 Must be present <0 Must not be present 0 Neither; the word is optional but its presence increases the relevance With the default settings of the ft_boolean_syntax system variable, >0 corresponds to the '+' operator, <0 corrresponds to the '-' operator, and 0 means neither operator was used. weight_adjust: A weighting factor that determines how much a match for the word counts. Positive values increase, negative - decrease the relative word's importance in the query. wasign: The sign of the word's weight in the query. If it's non-negative the match for the word will increase document relevance, if it's negative - decrease (the word becomes a "noise word", the less of it the better). trunc: Corresponds to the '*' operator in the default setting of the ft_boolean_syntax system variable. position: Start position in bytes of the word in the document, used by InnoDB FTS. */ typedef struct st_mysql_ftparser_boolean_info { enum enum_ft_token_type type; int yesno; int weight_adjust; char wasign; char trunc; int position; /* These are parser state and must be removed. */ char prev; char *quot; } MYSQL_FTPARSER_BOOLEAN_INFO; /* The following flag means that buffer with a string (document, word) may be overwritten by the caller before the end of the parsing (that is before st_mysql_ftparser::deinit() call). If one needs the string to survive between two successive calls of the parsing function, she needs to save a copy of it. The flag may be set by MySQL before calling st_mysql_ftparser::parse(), or it may be set by a plugin before calling st_mysql_ftparser_param::mysql_parse() or st_mysql_ftparser_param::mysql_add_word(). */ #define MYSQL_FTFLAGS_NEED_COPY 1 /* An argument of the full-text parser plugin. This structure is filled in by MySQL server and passed to the parsing function of the plugin as an in/out parameter. mysql_parse: A pointer to the built-in parser implementation of the server. It's set by the server and can be used by the parser plugin to invoke the MySQL default parser. If plugin's role is to extract textual data from .doc, .pdf or .xml content, it might extract plaintext from the content, and then pass the text to the default MySQL parser to be parsed. mysql_add_word: A server callback to add a new word. When parsing a document, the server sets this to point at a function that adds the word to MySQL full-text index. When parsing a search query, this function will add the new word to the list of words to search for. The boolean_info argument can be NULL for all cases except when mode is MYSQL_FTPARSER_FULL_BOOLEAN_INFO. ftparser_state: A generic pointer. The plugin can set it to point to information to be used internally for its own purposes. mysql_ftparam: This is set by the server. It is used by MySQL functions called via mysql_parse() and mysql_add_word() callback. The plugin should not modify it. cs: Information about the character set of the document or query string. doc: A pointer to the document or query string to be parsed. length: Length of the document or query string, in bytes. flags: See MYSQL_FTFLAGS_* constants above. mode: The parsing mode. With boolean operators, with stopwords, or nothing. See enum_ftparser_mode above. */ typedef struct st_mysql_ftparser_param { int (*mysql_parse)(struct st_mysql_ftparser_param *, char *doc, int doc_len); int (*mysql_add_word)(struct st_mysql_ftparser_param *, char *word, int word_len, MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info); void *ftparser_state; void *mysql_ftparam; const struct charset_info_st *cs; char *doc; int length; int flags; enum enum_ftparser_mode mode; } MYSQL_FTPARSER_PARAM; /* Full-text parser descriptor. interface_version is, e.g., MYSQL_FTPARSER_INTERFACE_VERSION. The parsing, initialization, and deinitialization functions are invoked per SQL statement for which the parser is used. */ struct st_mysql_ftparser { int interface_version; int (*parse)(MYSQL_FTPARSER_PARAM *param); int (*init)(MYSQL_FTPARSER_PARAM *param); int (*deinit)(MYSQL_FTPARSER_PARAM *param); }; #endif PKp #define MYSQL_AUTHENTICATION_INTERFACE_VERSION 0x0101 #include "plugin_auth_common.h" /* defines for MYSQL_SERVER_AUTH_INFO.password_used */ #define PASSWORD_USED_NO 0 #define PASSWORD_USED_YES 1 #define PASSWORD_USED_NO_MENTION 2 /* Authentication flags */ #define AUTH_FLAG_PRIVILEGED_USER_FOR_PASSWORD_CHANGE (1L << 0) #define AUTH_FLAG_USES_INTERNAL_STORAGE (1L << 1) /** Provides server plugin access to authentication information */ typedef struct st_mysql_server_auth_info { /** User name as sent by the client and shown in USER(). NULL if the client packet with the user name was not received yet. */ char *user_name; /** Length of user_name */ unsigned int user_name_length; /** A corresponding column value from the mysql.user table for the matching account name */ const char *auth_string; /** Length of auth_string */ unsigned long auth_string_length; /** Matching account name as found in the mysql.user table. A plugin can override it with another name that will be used by MySQL for authorization, and shown in CURRENT_USER() */ char authenticated_as[MYSQL_USERNAME_LENGTH+1]; /** The unique user name that was used by the plugin to authenticate. Plugins should put null-terminated UTF-8 here. Available through the @@EXTERNAL_USER variable. */ char external_user[512]; /** This only affects the "Authentication failed. Password used: %s" error message. has the following values : 0 : %s will be NO. 1 : %s will be YES. 2 : there will be no %s. Set it as appropriate or ignore at will. */ int password_used; /** Set to the name of the connected client host, if it can be resolved, or to its IP address otherwise. */ const char *host_or_ip; /** Length of host_or_ip */ unsigned int host_or_ip_length; } MYSQL_SERVER_AUTH_INFO; /** Server authentication plugin descriptor */ struct st_mysql_auth { int interface_version; /** version plugin uses */ /** A plugin that a client must use for authentication with this server plugin. Can be NULL to mean "any plugin". */ const char *client_auth_plugin; /** Function provided by the plugin which should perform authentication (using the vio functions if necessary) and return 0 if successful. The plugin can also fill the info.authenticated_as field if a different username should be used for authorization. */ int (*authenticate_user)(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info); /** New plugin API to generate password digest out of authentication string. This function will first invoke a service to check for validity of the password based on the policies defined and then generate encrypted hash @param[OUT] outbuf A buffer provided by server which will hold the authentication string generated by plugin. @param[INOUT] outbuflen Length of server provided buffer as IN param and length of plugin generated string as OUT param. @param[IN] inbuf auth string provided by user. @param[IN] inbuflen auth string length. @retval 0 OK 1 ERROR */ int (*generate_authentication_string)(char *outbuf, unsigned int *outbuflen, const char *inbuf, unsigned int inbuflen); /** Plugin API to validate password digest. @param[IN] inbuf hash string to be validated. @param[IN] buflen hash string length. @retval 0 OK 1 ERROR */ int (*validate_authentication_string)(char* const inbuf, unsigned int buflen); /** Plugin API to convert scrambled password to binary form based on scramble type. @param[IN] password The password hash containing the salt. @param[IN] password_len The length of the password hash. @param[INOUT] salt Used as password hash based on the authentication plugin. @param[INOUT] salt_len The length of salt. @retval 0 OK 1 ERROR */ int (*set_salt)(const char *password, unsigned int password_len, unsigned char* salt, unsigned char *salt_len); /** Authentication plugin capabilities */ const unsigned long authentication_flags; }; #endif PKp #endif #ifdef __cplusplus extern "C" { #endif typedef void *mysql_string_iterator_handle; typedef void *mysql_string_handle; extern struct mysql_string_service_st { int (*mysql_string_convert_to_char_ptr_type) (mysql_string_handle, const char *, char *, unsigned int, int *); mysql_string_iterator_handle (*mysql_string_get_iterator_type) (mysql_string_handle); int (*mysql_string_iterator_next_type)(mysql_string_iterator_handle); int (*mysql_string_iterator_isupper_type)(mysql_string_iterator_handle); int (*mysql_string_iterator_islower_type)(mysql_string_iterator_handle); int (*mysql_string_iterator_isdigit_type)(mysql_string_iterator_handle); mysql_string_handle (*mysql_string_to_lowercase_type)(mysql_string_handle); void (*mysql_string_free_type)(mysql_string_handle); void (*mysql_string_iterator_free_type)(mysql_string_iterator_handle); } *mysql_string_service; #ifdef MYSQL_DYNAMIC_PLUGIN #define mysql_string_convert_to_char_ptr(string_handle, charset_name, \ buffer, buffer_size, error) \ mysql_string_service->mysql_string_convert_to_char_ptr_type \ (string_handle, charset_name, buffer, \ buffer_size, error) #define mysql_string_get_iterator(string_handle) \ mysql_string_service->mysql_string_get_iterator_type(string_handle) #define mysql_string_iterator_next(iterator_handle) \ mysql_string_service->mysql_string_iterator_next_type(iterator_handle) #define mysql_string_iterator_isupper(iterator_handle) \ mysql_string_service->mysql_string_iterator_isupper_type \ (iterator_handle) #define mysql_string_iterator_islower(iterator_handle) \ mysql_string_service->mysql_string_iterator_islower_type \ (iterator_handle) #define mysql_string_iterator_isdigit(iterator_handle) \ mysql_string_service->mysql_string_iterator_isdigit_type \ (iterator_handle) #define mysql_string_to_lowercase(string_handle) \ mysql_string_service->mysql_string_to_lowercase_type(string_handle) #define mysql_string_free(mysql_string_handle) \ mysql_string_service->mysql_string_free_type(mysql_string_handle) #define mysql_string_iterator_free(mysql_string_iterator_handle) \ mysql_string_service->mysql_string_iterator_free_type \ (mysql_string_iterator_handle) #else /* This service function convert string into given character set */ int mysql_string_convert_to_char_ptr(mysql_string_handle string_handle, const char *charset_name, char *buffer, unsigned int buffer_size, int *error); /* This service function returns the beginning of the iterator handle */ mysql_string_iterator_handle mysql_string_get_iterator(mysql_string_handle string_handle); /* This service function gets the next iterator handle returns 0 if reached the end else return 1 */ int mysql_string_iterator_next(mysql_string_iterator_handle iterator_handle); /* This service function return 1 if current iterator handle points to a uppercase character else return 0 for client character set. */ int mysql_string_iterator_isupper(mysql_string_iterator_handle iterator_handle); /* This service function return 1 if current iterator handle points to a lowercase character else return 0 for client character set. */ int mysql_string_iterator_islower(mysql_string_iterator_handle iterator_handle); /* This service function return 1 if current iterator handle points to a digit else return 0 for client character sets. */ int mysql_string_iterator_isdigit(mysql_string_iterator_handle iterator_handle); /* convert string_handle into lowercase */ mysql_string_handle mysql_string_to_lowercase(mysql_string_handle string_handle); /* It deallocates the string created on server side during plugin operations */ void mysql_string_free(mysql_string_handle); /* It deallocates the string iterator created on server side during plugin operations */ void mysql_string_iterator_free(mysql_string_iterator_handle); #endif #ifdef __cplusplus } #endif #endif PKp #endif /* PSI_memory_key */ #include "mysql/psi/psi_memory.h" #ifdef __cplusplus extern "C" { #endif /* myf */ typedef int myf_t; typedef void * (*mysql_malloc_t)(PSI_memory_key key, size_t size, myf_t flags); typedef void * (*mysql_realloc_t)(PSI_memory_key key, void *ptr, size_t size, myf_t flags); typedef void (*mysql_claim_t)(void *ptr); typedef void (*mysql_free_t)(void *ptr); typedef void * (*my_memdup_t)(PSI_memory_key key, const void *from, size_t length, myf_t flags); typedef char * (*my_strdup_t)(PSI_memory_key key, const char *from, myf_t flags); typedef char * (*my_strndup_t)(PSI_memory_key key, const char *from, size_t length, myf_t flags); struct mysql_malloc_service_st { mysql_malloc_t mysql_malloc; mysql_realloc_t mysql_realloc; mysql_claim_t mysql_claim; mysql_free_t mysql_free; my_memdup_t my_memdup; my_strdup_t my_strdup; my_strndup_t my_strndup; }; extern struct mysql_malloc_service_st *mysql_malloc_service; #ifdef MYSQL_DYNAMIC_PLUGIN #define my_malloc mysql_malloc_service->mysql_malloc #define my_realloc mysql_malloc_service->mysql_realloc #define my_claim mysql_malloc_service->mysql_claim #define my_free mysql_malloc_service->mysql_free #define my_memdup mysql_malloc_service->my_memdup #define my_strdup mysql_malloc_service->my_strdup #define my_strndup mysql_malloc_service->my_strndup #else extern void * my_malloc(PSI_memory_key key, size_t size, myf_t flags); extern void * my_realloc(PSI_memory_key key, void *ptr, size_t size, myf_t flags); extern void my_claim(void *ptr); extern void my_free(void *ptr); extern void * my_memdup(PSI_memory_key key, const void *from, size_t length, myf_t flags); extern char * my_strdup(PSI_memory_key key, const char *from, myf_t flags); extern char * my_strndup(PSI_memory_key key, const char *from, size_t length, myf_t flags); #endif #ifdef __cplusplus } #endif #endif PKp #include #include #include #include #include #include #include #include /** Server side initializations and cleanup. */ int group_replication_init(const char* plugin_name); int group_replication_cleanup(); int group_replication_start(); int group_replication_stop(); /** Returns the server connection attribute @Note This method implementation is on sql_class.cc @return the pthread for the connection attribute. */ my_thread_attr_t *get_connection_attrib(); /** Returns the server hostname, port and uuid. @param[out] hostname @param[out] port @param[out] uuid @param[out] server_version @param[out] server_ssl_variables */ void get_server_parameters(char **hostname, uint *port, char **uuid, unsigned int *server_version, st_server_ssl_variables* server_ssl_variables); /** Returns the server_id. @return server_id */ ulong get_server_id(); /** Returns the server auto_increment_increment @return auto_increment_increment */ ulong get_auto_increment_increment(); /** Returns the server auto_increment_offset @return auto_increment_offset */ ulong get_auto_increment_offset(); /** Set server auto_increment_increment @param[in] auto_increment_increment */ void set_auto_increment_increment(ulong auto_increment_increment); /** Set server auto_increment_offset @param[in] auto_increment_offset */ void set_auto_increment_offset(ulong auto_increment_offset); /** Returns a struct containing all server startup information needed to evaluate if one has conditions to proceed executing master-master replication. @param[out] requirements @param[in] has_lock Caller should set this to true if the calling thread holds gtid_mode_lock; otherwise set it to false. */ void get_server_startup_prerequirements(Trans_context_info& requirements, bool has_lock); /** Returns the server GTID_EXECUTED encoded as a binary string. @note Memory allocated to encoded_gtid_executed must be release by caller. @param[out] encoded_gtid_executed binary string @param[out] length binary string length */ bool get_server_encoded_gtid_executed(uchar **encoded_gtid_executed, size_t *length); #if !defined(DBUG_OFF) /** Returns a text representation of a encoded GTID set. @note Memory allocated to returned pointer must be release by caller. @param[in] encoded_gtid_set binary string @param[in] length binary string length @return a pointer to text representation of the encoded set */ char* encoded_gtid_set_to_string(uchar *encoded_gtid_set, size_t length); #endif /** Return last gno for a given sidno, see Gtid_state::get_last_executed_gno() for details. */ rpl_gno get_last_executed_gno(rpl_sidno sidno); /** Return sidno for a given sid, see Sid_map::add_sid() for details. */ rpl_sidno get_sidno_from_global_sid_map(rpl_sid sid); /** Set slave thread default options. @param[in] thd The thread */ void set_slave_thread_options(THD* thd); /** Add thread to Global_THD_manager singleton. @param[in] thd The thread */ void global_thd_manager_add_thd(THD *thd); /** Remove thread from Global_THD_manager singleton. @param[in] thd The thread */ void global_thd_manager_remove_thd(THD *thd); /** Function that returns the write set extraction algorithm name. @param[in] algorithm The algorithm value @return the algorithm name */ const char* get_write_set_algorithm_string(unsigned int algorithm); #endif /* GROUP_REPLICATION_PRIV_INCLUDE */ PKpthd_get_security_context(_THD, _CTX) #define thd_set_security_context(_THD, _CTX) \ security_context_service->thd_set_security_context(_THD, _CTX) #define security_context_create(_CTX) \ security_context_service->security_context_create(_CTX) #define security_context_destroy(_CTX) \ security_context_service->security_context_destroy(_CTX) #define security_context_copy(_CTX1, _CTX2) \ security_context_service->security_context_copy(_CTX1,_CTX2) #define security_context_lookup(_CTX, _U, _H, _IP, _DB) \ security_context_service->security_context_lookup(_CTX, _U, _H, _IP, _DB) #define security_context_get_option(_SEC_CTX, _NAME, _VALUE) \ security_context_service->security_context_get_option(_SEC_CTX, _NAME, _VALUE) #define security_context_set_option(_SEC_CTX, _NAME, _VALUE) \ security_context_service->security_context_set_option(_SEC_CTX, _NAME, _VALUE) #else my_svc_bool thd_get_security_context(MYSQL_THD, MYSQL_SECURITY_CONTEXT *out_ctx); my_svc_bool thd_set_security_context(MYSQL_THD, MYSQL_SECURITY_CONTEXT in_ctx); my_svc_bool security_context_create(MYSQL_SECURITY_CONTEXT *out_ctx); my_svc_bool security_context_destroy(MYSQL_SECURITY_CONTEXT ctx); my_svc_bool security_context_copy(MYSQL_SECURITY_CONTEXT in_ctx, MYSQL_SECURITY_CONTEXT *out_ctx); my_svc_bool security_context_lookup(MYSQL_SECURITY_CONTEXT ctx, const char *user, const char *host, const char *ip, const char *db); my_svc_bool security_context_get_option(MYSQL_SECURITY_CONTEXT, const char *name, void *inout_pvalue); my_svc_bool security_context_set_option(MYSQL_SECURITY_CONTEXT, const char *name, void *pvalue); #endif /* !MYSQL_DYNAMIC_PLUGIN */ #ifdef __cplusplus } #endif /* _cplusplus */ #endif /* !MYSQL_SERVICE_SECURITY_CONTEXT */ PKp #include "mysql_version.h" /* MYSQL_VERSION_ID */ #endif /* On Windows, exports from DLL need to be declared. Also, plugin needs to be declared as extern "C" because MSVC unlike other compilers, uses C++ mangling for variables not only for functions. */ #if defined(_MSC_VER) #if defined(MYSQL_DYNAMIC_PLUGIN) #ifdef __cplusplus #define MYSQL_PLUGIN_EXPORT extern "C" __declspec(dllexport) #else #define MYSQL_PLUGIN_EXPORT __declspec(dllexport) #endif #else /* MYSQL_DYNAMIC_PLUGIN */ #ifdef __cplusplus #define MYSQL_PLUGIN_EXPORT extern "C" #else #define MYSQL_PLUGIN_EXPORT #endif #endif /*MYSQL_DYNAMIC_PLUGIN */ #else /*_MSC_VER */ #define MYSQL_PLUGIN_EXPORT #endif #ifdef __cplusplus class THD; class Item; #define MYSQL_THD THD* #else #define MYSQL_THD void* #endif typedef void * MYSQL_PLUGIN; #ifndef MYSQL_ABI_CHECK #include #ifndef __WIN__ #ifndef __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS /* Enable C99 printf format macros */ #endif /* !__STDC_FORMAT_MACROS */ #include #endif /* !__WIN__ */ #endif /* !MYSQL_ABI_CHECK */ #define MYSQL_XIDDATASIZE 128 /** struct st_mysql_xid is binary compatible with the XID structure as in the X/Open CAE Specification, Distributed Transaction Processing: The XA Specification, X/Open Company Ltd., 1991. http://www.opengroup.org/bookstore/catalog/c193.htm @see XID in sql/handler.h */ struct st_mysql_xid { long formatID; long gtrid_length; long bqual_length; char data[MYSQL_XIDDATASIZE]; /* Not \0-terminated */ }; typedef struct st_mysql_xid MYSQL_XID; /************************************************************************* Plugin API. Common for all plugin types. */ #define MYSQL_PLUGIN_INTERFACE_VERSION 0x0107 /* The allowable types of plugins */ #define MYSQL_UDF_PLUGIN 0 /* User-defined function */ #define MYSQL_STORAGE_ENGINE_PLUGIN 1 /* Storage Engine */ #define MYSQL_FTPARSER_PLUGIN 2 /* Full-text parser plugin */ #define MYSQL_DAEMON_PLUGIN 3 /* The daemon/raw plugin type */ #define MYSQL_INFORMATION_SCHEMA_PLUGIN 4 /* The I_S plugin type */ #define MYSQL_AUDIT_PLUGIN 5 /* The Audit plugin type */ #define MYSQL_REPLICATION_PLUGIN 6 /* The replication plugin type */ #define MYSQL_AUTHENTICATION_PLUGIN 7 /* The authentication plugin type */ #define MYSQL_VALIDATE_PASSWORD_PLUGIN 8 /* validate password plugin type */ #define MYSQL_GROUP_REPLICATION_PLUGIN 9 /* The Group Replication plugin */ #define MYSQL_KEYRING_PLUGIN 10 /* The Keyring plugin type */ #define MYSQL_MAX_PLUGIN_TYPE_NUM 11 /* The number of plugin types */ /* We use the following strings to define licenses for plugins */ #define PLUGIN_LICENSE_PROPRIETARY 0 #define PLUGIN_LICENSE_GPL 1 #define PLUGIN_LICENSE_BSD 2 #define PLUGIN_LICENSE_PROPRIETARY_STRING "PROPRIETARY" #define PLUGIN_LICENSE_GPL_STRING "GPL" #define PLUGIN_LICENSE_BSD_STRING "BSD" /* Macros for beginning and ending plugin declarations. Between mysql_declare_plugin and mysql_declare_plugin_end there should be a st_mysql_plugin struct for each plugin to be declared. */ #ifndef MYSQL_DYNAMIC_PLUGIN #define __MYSQL_DECLARE_PLUGIN(NAME, VERSION, PSIZE, DECLS) \ MYSQL_PLUGIN_EXPORT int VERSION= MYSQL_PLUGIN_INTERFACE_VERSION; \ MYSQL_PLUGIN_EXPORT int PSIZE= sizeof(struct st_mysql_plugin); \ MYSQL_PLUGIN_EXPORT struct st_mysql_plugin DECLS[]= { #else #define __MYSQL_DECLARE_PLUGIN(NAME, VERSION, PSIZE, DECLS) \ MYSQL_PLUGIN_EXPORT int _mysql_plugin_interface_version_= MYSQL_PLUGIN_INTERFACE_VERSION; \ MYSQL_PLUGIN_EXPORT int _mysql_sizeof_struct_st_plugin_= sizeof(struct st_mysql_plugin); \ MYSQL_PLUGIN_EXPORT struct st_mysql_plugin _mysql_plugin_declarations_[]= { #endif #define mysql_declare_plugin(NAME) \ __MYSQL_DECLARE_PLUGIN(NAME, \ builtin_ ## NAME ## _plugin_interface_version, \ builtin_ ## NAME ## _sizeof_struct_st_plugin, \ builtin_ ## NAME ## _plugin) #define mysql_declare_plugin_end ,{0,0,0,0,0,0,0,0,0,0,0,0,0}} /** Declarations for SHOW STATUS support in plugins */ enum enum_mysql_show_type { SHOW_UNDEF, SHOW_BOOL, SHOW_INT, ///< shown as _unsigned_ int SHOW_LONG, ///< shown as _unsigned_ long SHOW_LONGLONG, ///< shown as _unsigned_ longlong SHOW_SIGNED_INT, SHOW_SIGNED_LONG, SHOW_SIGNED_LONGLONG, SHOW_CHAR, SHOW_CHAR_PTR, SHOW_ARRAY, SHOW_FUNC, SHOW_DOUBLE #ifdef MYSQL_SERVER /* This include defines server-only values of the enum. Using them in plugins is not supported. */ #include "sql_plugin_enum.h" #endif }; /** Status variable scope. Only GLOBAL status variable scope is available in plugins. */ enum enum_mysql_show_scope { SHOW_SCOPE_UNDEF, SHOW_SCOPE_GLOBAL #ifdef MYSQL_SERVER /* Server-only values. Not supported in plugins. */ , SHOW_SCOPE_SESSION, SHOW_SCOPE_ALL #endif }; /** SHOW STATUS Server status variable */ struct st_mysql_show_var { const char *name; char *value; enum enum_mysql_show_type type; enum enum_mysql_show_scope scope; }; #define SHOW_VAR_MAX_NAME_LEN 64 #define SHOW_VAR_FUNC_BUFF_SIZE 1024 typedef int (*mysql_show_var_func)(MYSQL_THD, struct st_mysql_show_var*, char *); /* Constants for plugin flags. */ #define PLUGIN_OPT_NO_INSTALL 1UL /* Not dynamically loadable */ #define PLUGIN_OPT_NO_UNINSTALL 2UL /* Not dynamically unloadable */ /* declarations for server variables and command line options */ #define PLUGIN_VAR_BOOL 0x0001 #define PLUGIN_VAR_INT 0x0002 #define PLUGIN_VAR_LONG 0x0003 #define PLUGIN_VAR_LONGLONG 0x0004 #define PLUGIN_VAR_STR 0x0005 #define PLUGIN_VAR_ENUM 0x0006 #define PLUGIN_VAR_SET 0x0007 #define PLUGIN_VAR_DOUBLE 0x0008 #define PLUGIN_VAR_UNSIGNED 0x0080 #define PLUGIN_VAR_THDLOCAL 0x0100 /* Variable is per-connection */ #define PLUGIN_VAR_READONLY 0x0200 /* Server variable is read only */ #define PLUGIN_VAR_NOSYSVAR 0x0400 /* Not a server variable */ #define PLUGIN_VAR_NOCMDOPT 0x0800 /* Not a command line option */ #define PLUGIN_VAR_NOCMDARG 0x1000 /* No argument for cmd line */ #define PLUGIN_VAR_RQCMDARG 0x0000 /* Argument required for cmd line */ #define PLUGIN_VAR_OPCMDARG 0x2000 /* Argument optional for cmd line */ #define PLUGIN_VAR_NODEFAULT 0x4000 /* SET DEFAULT is prohibited */ #define PLUGIN_VAR_MEMALLOC 0x8000 /* String needs memory allocated */ struct st_mysql_sys_var; struct st_mysql_value; /* SYNOPSIS (*mysql_var_check_func)() thd thread handle var dynamic variable being altered save pointer to temporary storage value user provided value RETURN 0 user provided value is OK and the update func may be called. any other value indicates error. This function should parse the user provided value and store in the provided temporary storage any data as required by the update func. There is sufficient space in the temporary storage to store a double. Note that the update func may not be called if any other error occurs so any memory allocated should be thread-local so that it may be freed automatically at the end of the statement. */ typedef int (*mysql_var_check_func)(MYSQL_THD thd, struct st_mysql_sys_var *var, void *save, struct st_mysql_value *value); /* SYNOPSIS (*mysql_var_update_func)() thd thread handle var dynamic variable being altered var_ptr pointer to dynamic variable save pointer to temporary storage RETURN NONE This function should use the validated value stored in the temporary store and persist it in the provided pointer to the dynamic variable. For example, strings may require memory to be allocated. */ typedef void (*mysql_var_update_func)(MYSQL_THD thd, struct st_mysql_sys_var *var, void *var_ptr, const void *save); /* the following declarations are for internal use only */ #define PLUGIN_VAR_MASK \ (PLUGIN_VAR_READONLY | PLUGIN_VAR_NOSYSVAR | \ PLUGIN_VAR_NOCMDOPT | PLUGIN_VAR_NOCMDARG | \ PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_MEMALLOC | \ PLUGIN_VAR_NODEFAULT) #define MYSQL_PLUGIN_VAR_HEADER \ int flags; \ const char *name; \ const char *comment; \ mysql_var_check_func check; \ mysql_var_update_func update #define MYSQL_SYSVAR_NAME(name) mysql_sysvar_ ## name #define MYSQL_SYSVAR(name) \ ((struct st_mysql_sys_var *)&(MYSQL_SYSVAR_NAME(name))) /* for global variables, the value pointer is the first element after the header, the default value is the second. for thread variables, the value offset is the first element after the header, the default value is the second. */ #define DECLARE_MYSQL_SYSVAR_BASIC(name, type) struct { \ MYSQL_PLUGIN_VAR_HEADER; \ type *value; \ const type def_val; \ } MYSQL_SYSVAR_NAME(name) #define DECLARE_MYSQL_SYSVAR_SIMPLE(name, type) struct { \ MYSQL_PLUGIN_VAR_HEADER; \ type *value; type def_val; \ type min_val; type max_val; \ type blk_sz; \ } MYSQL_SYSVAR_NAME(name) #define DECLARE_MYSQL_SYSVAR_TYPELIB(name, type) struct { \ MYSQL_PLUGIN_VAR_HEADER; \ type *value; type def_val; \ TYPELIB *typelib; \ } MYSQL_SYSVAR_NAME(name) #define DECLARE_THDVAR_FUNC(type) \ type *(*resolve)(MYSQL_THD thd, int offset) #define DECLARE_MYSQL_THDVAR_BASIC(name, type) struct { \ MYSQL_PLUGIN_VAR_HEADER; \ int offset; \ const type def_val; \ DECLARE_THDVAR_FUNC(type); \ } MYSQL_SYSVAR_NAME(name) #define DECLARE_MYSQL_THDVAR_SIMPLE(name, type) struct { \ MYSQL_PLUGIN_VAR_HEADER; \ int offset; \ type def_val; type min_val; \ type max_val; type blk_sz; \ DECLARE_THDVAR_FUNC(type); \ } MYSQL_SYSVAR_NAME(name) #define DECLARE_MYSQL_THDVAR_TYPELIB(name, type) struct { \ MYSQL_PLUGIN_VAR_HEADER; \ int offset; \ type def_val; \ DECLARE_THDVAR_FUNC(type); \ TYPELIB *typelib; \ } MYSQL_SYSVAR_NAME(name) /* the following declarations are for use by plugin implementors */ #define MYSQL_SYSVAR_BOOL(name, varname, opt, comment, check, update, def) \ DECLARE_MYSQL_SYSVAR_BASIC(name, char) = { \ PLUGIN_VAR_BOOL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def} #define MYSQL_SYSVAR_STR(name, varname, opt, comment, check, update, def) \ DECLARE_MYSQL_SYSVAR_BASIC(name, char *) = { \ PLUGIN_VAR_STR | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def} #define MYSQL_SYSVAR_INT(name, varname, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_SYSVAR_SIMPLE(name, int) = { \ PLUGIN_VAR_INT | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, min, max, blk } #define MYSQL_SYSVAR_UINT(name, varname, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_SYSVAR_SIMPLE(name, unsigned int) = { \ PLUGIN_VAR_INT | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, min, max, blk } #define MYSQL_SYSVAR_LONG(name, varname, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_SYSVAR_SIMPLE(name, long) = { \ PLUGIN_VAR_LONG | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, min, max, blk } #define MYSQL_SYSVAR_ULONG(name, varname, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_SYSVAR_SIMPLE(name, unsigned long) = { \ PLUGIN_VAR_LONG | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, min, max, blk } #define MYSQL_SYSVAR_LONGLONG(name, varname, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_SYSVAR_SIMPLE(name, long long) = { \ PLUGIN_VAR_LONGLONG | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, min, max, blk } #define MYSQL_SYSVAR_ULONGLONG(name, varname, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_SYSVAR_SIMPLE(name, unsigned long long) = { \ PLUGIN_VAR_LONGLONG | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, min, max, blk } #define MYSQL_SYSVAR_ENUM(name, varname, opt, comment, check, update, def, typelib) \ DECLARE_MYSQL_SYSVAR_TYPELIB(name, unsigned long) = { \ PLUGIN_VAR_ENUM | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, typelib } #define MYSQL_SYSVAR_SET(name, varname, opt, comment, check, update, def, typelib) \ DECLARE_MYSQL_SYSVAR_TYPELIB(name, unsigned long long) = { \ PLUGIN_VAR_SET | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, typelib } #define MYSQL_SYSVAR_DOUBLE(name, varname, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_SYSVAR_SIMPLE(name, double) = { \ PLUGIN_VAR_DOUBLE | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, min, max, blk } #define MYSQL_THDVAR_BOOL(name, opt, comment, check, update, def) \ DECLARE_MYSQL_THDVAR_BASIC(name, char) = { \ PLUGIN_VAR_BOOL | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, NULL} #define MYSQL_THDVAR_STR(name, opt, comment, check, update, def) \ DECLARE_MYSQL_THDVAR_BASIC(name, char *) = { \ PLUGIN_VAR_STR | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, NULL} #define MYSQL_THDVAR_INT(name, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_THDVAR_SIMPLE(name, int) = { \ PLUGIN_VAR_INT | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, min, max, blk, NULL } #define MYSQL_THDVAR_UINT(name, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_THDVAR_SIMPLE(name, unsigned int) = { \ PLUGIN_VAR_INT | PLUGIN_VAR_THDLOCAL | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, min, max, blk, NULL } #define MYSQL_THDVAR_LONG(name, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_THDVAR_SIMPLE(name, long) = { \ PLUGIN_VAR_LONG | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, min, max, blk, NULL } #define MYSQL_THDVAR_ULONG(name, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_THDVAR_SIMPLE(name, unsigned long) = { \ PLUGIN_VAR_LONG | PLUGIN_VAR_THDLOCAL | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, min, max, blk, NULL } #define MYSQL_THDVAR_LONGLONG(name, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_THDVAR_SIMPLE(name, long long) = { \ PLUGIN_VAR_LONGLONG | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, min, max, blk, NULL } #define MYSQL_THDVAR_ULONGLONG(name, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_THDVAR_SIMPLE(name, unsigned long long) = { \ PLUGIN_VAR_LONGLONG | PLUGIN_VAR_THDLOCAL | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, min, max, blk, NULL } #define MYSQL_THDVAR_ENUM(name, opt, comment, check, update, def, typelib) \ DECLARE_MYSQL_THDVAR_TYPELIB(name, unsigned long) = { \ PLUGIN_VAR_ENUM | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, NULL, typelib } #define MYSQL_THDVAR_SET(name, opt, comment, check, update, def, typelib) \ DECLARE_MYSQL_THDVAR_TYPELIB(name, unsigned long long) = { \ PLUGIN_VAR_SET | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, NULL, typelib } #define MYSQL_THDVAR_DOUBLE(name, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_THDVAR_SIMPLE(name, double) = { \ PLUGIN_VAR_DOUBLE | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, min, max, blk, NULL } /* accessor macros */ #define SYSVAR(name) \ (*(MYSQL_SYSVAR_NAME(name).value)) /* when thd == null, result points to global value */ #define THDVAR(thd, name) \ (*(MYSQL_SYSVAR_NAME(name).resolve(thd, MYSQL_SYSVAR_NAME(name).offset))) #define THDVAR_SET(thd, name, value) \ plugin_thdvar_safe_update(thd, MYSQL_SYSVAR(name), \ (char **) &THDVAR(thd, name), \ (const char *) value); /* Plugin description structure. */ struct st_mysql_plugin { int type; /* the plugin type (a MYSQL_XXX_PLUGIN value) */ void *info; /* pointer to type-specific plugin descriptor */ const char *name; /* plugin name */ const char *author; /* plugin author (for I_S.PLUGINS) */ const char *descr; /* general descriptive text (for I_S.PLUGINS) */ int license; /* the plugin license (PLUGIN_LICENSE_XXX) */ int (*init)(MYSQL_PLUGIN); /* the function to invoke when plugin is loaded */ int (*deinit)(MYSQL_PLUGIN);/* the function to invoke when plugin is unloaded */ unsigned int version; /* plugin version (for I_S.PLUGINS) */ struct st_mysql_show_var *status_vars; struct st_mysql_sys_var **system_vars; void * __reserved1; /* reserved for dependency checking */ unsigned long flags; /* flags for plugin */ }; /************************************************************************* API for Full-text parser plugin. (MYSQL_FTPARSER_PLUGIN) */ #define MYSQL_FTPARSER_INTERFACE_VERSION 0x0101 /************************************************************************* API for Query Rewrite plugin. (MYSQL_QUERY_REWRITE_PLUGIN) */ #define MYSQL_REWRITE_PRE_PARSE_INTERFACE_VERSION 0x0010 #define MYSQL_REWRITE_POST_PARSE_INTERFACE_VERSION 0x0010 /************************************************************************* API for Storage Engine plugin. (MYSQL_DAEMON_PLUGIN) */ /* handlertons of different MySQL releases are incompatible */ #define MYSQL_DAEMON_INTERFACE_VERSION (MYSQL_VERSION_ID << 8) /* Here we define only the descriptor structure, that is referred from st_mysql_plugin. */ struct st_mysql_daemon { int interface_version; }; /************************************************************************* API for I_S plugin. (MYSQL_INFORMATION_SCHEMA_PLUGIN) */ /* handlertons of different MySQL releases are incompatible */ #define MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION (MYSQL_VERSION_ID << 8) /* Here we define only the descriptor structure, that is referred from st_mysql_plugin. */ struct st_mysql_information_schema { int interface_version; }; /************************************************************************* API for Storage Engine plugin. (MYSQL_STORAGE_ENGINE_PLUGIN) */ /* handlertons of different MySQL releases are incompatible */ #define MYSQL_HANDLERTON_INTERFACE_VERSION (MYSQL_VERSION_ID << 8) /* The real API is in the sql/handler.h Here we define only the descriptor structure, that is referred from st_mysql_plugin. */ struct st_mysql_storage_engine { int interface_version; }; struct handlerton; /* API for Replication plugin. (MYSQL_REPLICATION_PLUGIN) */ #define MYSQL_REPLICATION_INTERFACE_VERSION 0x0400 /** Replication plugin descriptor */ struct Mysql_replication { int interface_version; }; /************************************************************************* st_mysql_value struct for reading values from mysqld. Used by server variables framework to parse user-provided values. Will be used for arguments when implementing UDFs. Note that val_str() returns a string in temporary memory that will be freed at the end of statement. Copy the string if you need it to persist. */ #define MYSQL_VALUE_TYPE_STRING 0 #define MYSQL_VALUE_TYPE_REAL 1 #define MYSQL_VALUE_TYPE_INT 2 struct st_mysql_value { int (*value_type)(struct st_mysql_value *); const char *(*val_str)(struct st_mysql_value *, char *buffer, int *length); int (*val_real)(struct st_mysql_value *, double *realbuf); int (*val_int)(struct st_mysql_value *, long long *intbuf); int (*is_unsigned)(struct st_mysql_value *); }; /************************************************************************* Miscellaneous functions for plugin implementors */ #ifdef __cplusplus extern "C" { #endif int thd_in_lock_tables(const MYSQL_THD thd); int thd_tablespace_op(const MYSQL_THD thd); long long thd_test_options(const MYSQL_THD thd, long long test_options); int thd_sql_command(const MYSQL_THD thd); const char *set_thd_proc_info(MYSQL_THD thd, const char *info, const char *calling_func, const char *calling_file, const unsigned int calling_line); void **thd_ha_data(const MYSQL_THD thd, const struct handlerton *hton); void thd_storage_lock_wait(MYSQL_THD thd, long long value); int thd_tx_isolation(const MYSQL_THD thd); int thd_tx_is_read_only(const MYSQL_THD thd); MYSQL_THD thd_tx_arbitrate(MYSQL_THD requestor, MYSQL_THD holder); int thd_tx_priority(const MYSQL_THD thd); int thd_tx_is_dd_trx(const MYSQL_THD thd); char *thd_security_context(MYSQL_THD thd, char *buffer, size_t length, size_t max_query_len); /* Increments the row counter, see THD::row_count */ void thd_inc_row_count(MYSQL_THD thd); int thd_allow_batch(MYSQL_THD thd); /** Mark transaction to rollback and mark error as fatal to a sub-statement if in sub statement mode. @param thd user thread connection handle @param all if all != 0, rollback the main transaction */ void thd_mark_transaction_to_rollback(MYSQL_THD thd, int all); /** Types of statistics that can be passed to thd_report_innodb_stat */ enum mysql_trx_stat_type { /** Volume of I/O read requests in bytes */ MYSQL_TRX_STAT_IO_READ_BYTES, /** Time in microseconds spent waiting for I/O reads to complete */ MYSQL_TRX_STAT_IO_READ_WAIT_USECS, /** Time in microseconds spent waiting for row locks */ MYSQL_TRX_STAT_LOCK_WAIT_USECS, /** Time in microseconds spent waiting to enter InnoDB */ MYSQL_TRX_STAT_INNODB_QUEUE_WAIT_USECS, /** A logical data page accessed */ MYSQL_TRX_STAT_ACCESS_PAGE_ID }; /** Report various InnoDB statistics for the slow query log extensions @param[in] thd user thread connection handle @param[in] trx_id InnoDB tranaction ID @param[in] type type of statistics being reported @param[in] value the value of statistics */ void thd_report_innodb_stat(MYSQL_THD thd, unsigned long long trx_id, enum mysql_trx_stat_type type, unsigned long long value); unsigned long thd_log_slow_verbosity(const MYSQL_THD thd); int thd_opt_slow_log(); /** Check whether given connection handle is associated with a background thread. @param thd connection handle @retval non-zero the connection handle belongs to a background thread @retval 0 the connection handle belongs to a different thread type */ int thd_is_background_thread(const MYSQL_THD thd); /** Create a temporary file. @details The temporary file is created in a location specified by the mysql server configuration (--tmpdir option). The caller does not need to delete the file, it will be deleted automatically. @param prefix prefix for temporary file name @retval -1 error @retval >= 0 a file handle that can be passed to dup or my_close */ int mysql_tmpfile(const char *prefix); /** Check the killed state of a connection @details In MySQL support for the KILL statement is cooperative. The KILL statement only sets a "killed" flag. This function returns the value of that flag. A thread should check it often, especially inside time-consuming loops, and gracefully abort the operation if it is non-zero. @param thd user thread connection handle @retval 0 the connection is active @retval 1 the connection has been killed */ int thd_killed(const MYSQL_THD thd); /** Set the killed status of the current statement. @param thd user thread connection handle */ void thd_set_kill_status(const MYSQL_THD thd); /** Get binary log position for latest written entry. @note The file variable will be set to a buffer holding the name of the file name currently, but this can change if a rotation occur. Copy the string if you want to retain it. @param thd Use thread connection handle @param file_var Pointer to variable that will hold the file name. @param pos_var Pointer to variable that will hold the file position. */ void thd_binlog_pos(const MYSQL_THD thd, const char **file_var, unsigned long long *pos_var); /** Return the thread id of a user thread @param thd user thread connection handle @return thread id */ unsigned long thd_get_thread_id(const MYSQL_THD thd); /** Return the query id of a thread @param thd user thread @return query id */ int64_t thd_get_query_id(const MYSQL_THD thd); /** Get the XID for this connection's transaction @param thd user thread connection handle @param xid location where identifier is stored */ void thd_get_xid(const MYSQL_THD thd, MYSQL_XID *xid); /** Invalidate the query cache for a given table. @param thd user thread connection handle @param key databasename/tablename in the canonical format. @param key_length length of key in bytes, including the PATH separator @param using_trx flag: TRUE if using transactions, FALSE otherwise */ void mysql_query_cache_invalidate4(MYSQL_THD thd, const char *key, unsigned int key_length, int using_trx); /** Provide a handler data getter to simplify coding */ void *thd_get_ha_data(const MYSQL_THD thd, const struct handlerton *hton); /** Provide a handler data setter to simplify coding @details Set ha_data pointer (storage engine per-connection information). To avoid unclean deactivation (uninstall) of storage engine plugin in the middle of transaction, additional storage engine plugin lock is acquired. If ha_data is not null and storage engine plugin was not locked by thd_set_ha_data() in this connection before, storage engine plugin gets locked. If ha_data is null and storage engine plugin was locked by thd_set_ha_data() in this connection before, storage engine plugin lock gets released. If handlerton::close_connection() didn't reset ha_data, server does it immediately after calling handlerton::close_connection(). */ void thd_set_ha_data(MYSQL_THD thd, const struct handlerton *hton, const void *ha_data); int thd_command(const MYSQL_THD thd); long long thd_start_time(const MYSQL_THD thd); void thd_kill(unsigned long id); /** Check whether ft_query_extra_word_chars server variable is enabled for the current session @return ft_query_extra_word_chars value */ int thd_get_ft_query_extra_word_chars(void); #ifdef __cplusplus } #endif #endif /* _my_plugin_h */ PKp #define MYSQL_VALIDATE_PASSWORD_INTERFACE_VERSION 0x0100 /* The descriptor structure for the plugin, that is referred from st_mysql_plugin. */ typedef void* mysql_string_handle; struct st_mysql_validate_password { int interface_version; /* This function retuns TRUE for passwords which satisfy the password policy (as choosen by plugin variable) and FALSE for all other password */ int (*validate_password)(mysql_string_handle password); /* This function returns the password strength (0-100) depending upon the policies */ int (*get_password_strength)(mysql_string_handle password); }; #endif PKpmy_key_store_func(key_id, key_type, user_id, key, \ key_len) #define my_key_fetch(key_id, key_type, user_id, key, key_len) \ mysql_keyring_service->my_key_fetch_func(key_id, key_type, user_id, key, \ key_len) #define my_key_remove(key_id, user_id) \ mysql_keyring_service->my_key_remove_func(key_id, user_id) #define my_key_generate(key_id, key_type, user_id, key_len) \ mysql_keyring_service->my_key_generate_func(key_id, key_type, user_id, \ key_len) #else int my_key_store(const char *, const char *, const char *, const void *, size_t); int my_key_fetch(const char *, char **, const char *, void **, size_t *); int my_key_remove(const char *, const char *); int my_key_generate(const char *, const char *, const char *, size_t); #endif #ifdef __cplusplus } #endif #endif //MYSQL_SERVICE_MYSQL_PLUGIN_KEYRING_INCLUDED PKpthd_wait_begin_func(_THD, _WAIT_TYPE) #define thd_wait_end(_THD) thd_wait_service->thd_wait_end_func(_THD) #else void thd_wait_begin(MYSQL_THD thd, int wait_type); void thd_wait_end(MYSQL_THD thd); #endif #ifdef __cplusplus } #endif #endif PKp #endif #ifdef __cplusplus class THD; #define MYSQL_THD THD* #else #define MYSQL_THD void* #endif #ifdef __cplusplus extern "C" { #endif #include extern struct thd_alloc_service_st { void *(*thd_alloc_func)(MYSQL_THD, size_t); void *(*thd_calloc_func)(MYSQL_THD, size_t); char *(*thd_strdup_func)(MYSQL_THD, const char *); char *(*thd_strmake_func)(MYSQL_THD, const char *, size_t); void *(*thd_memdup_func)(MYSQL_THD, const void*, size_t); MYSQL_LEX_STRING *(*thd_make_lex_string_func)(MYSQL_THD, MYSQL_LEX_STRING *, const char *, size_t, int); } *thd_alloc_service; #ifdef MYSQL_DYNAMIC_PLUGIN #define thd_alloc(thd,size) (thd_alloc_service->thd_alloc_func((thd), (size))) #define thd_calloc(thd,size) (thd_alloc_service->thd_calloc_func((thd), (size))) #define thd_strdup(thd,str) (thd_alloc_service->thd_strdup_func((thd), (str))) #define thd_strmake(thd,str,size) \ (thd_alloc_service->thd_strmake_func((thd), (str), (size))) #define thd_memdup(thd,str,size) \ (thd_alloc_service->thd_memdup_func((thd), (str), (size))) #define thd_make_lex_string(thd, lex_str, str, size, allocate_lex_string) \ (thd_alloc_service->thd_make_lex_string_func((thd), (lex_str), (str), \ (size), (allocate_lex_string))) #else /** Allocate memory in the connection's local memory pool @details When properly used in place of @c my_malloc(), this can significantly improve concurrency. Don't use this or related functions to allocate large chunks of memory. Use for temporary storage only. The memory will be freed automatically at the end of the statement; no explicit code is required to prevent memory leaks. @see alloc_root() */ void *thd_alloc(MYSQL_THD thd, size_t size); /** @see thd_alloc() */ void *thd_calloc(MYSQL_THD thd, size_t size); /** @see thd_alloc() */ char *thd_strdup(MYSQL_THD thd, const char *str); /** @see thd_alloc() */ char *thd_strmake(MYSQL_THD thd, const char *str, size_t size); /** @see thd_alloc() */ void *thd_memdup(MYSQL_THD thd, const void* str, size_t size); /** Create a LEX_STRING in this connection's local memory pool @param thd user thread connection handle @param lex_str pointer to LEX_STRING object to be initialized @param str initializer to be copied into lex_str @param size length of str, in bytes @param allocate_lex_string flag: if TRUE, allocate new LEX_STRING object, instead of using lex_str value @return NULL on failure, or pointer to the LEX_STRING object @see thd_alloc() */ MYSQL_LEX_STRING *thd_make_lex_string(MYSQL_THD thd, MYSQL_LEX_STRING *lex_str, const char *str, size_t size, int allocate_lex_string); #endif #ifdef __cplusplus } #endif #define MYSQL_SERVICE_THD_ALLOC_INCLUDED #endif PKp> 8); *(T+2)= (uchar) (A >> 16); } static inline void int5store(uchar *T, ulonglong A) { *(T)= (uchar) (A); *(T+1)= (uchar) (A >> 8); *(T+2)= (uchar) (A >> 16); *(T+3)= (uchar) (A >> 24); *(T+4)= (uchar) (A >> 32); } static inline void int6store(uchar *T, ulonglong A) { *(T)= (uchar) (A); *(T+1)= (uchar) (A >> 8); *(T+2)= (uchar) (A >> 16); *(T+3)= (uchar) (A >> 24); *(T+4)= (uchar) (A >> 32); *(T+5)= (uchar) (A >> 40); } #ifdef __cplusplus static inline int16 sint2korr(const char *pT) { return sint2korr(static_cast(static_cast(pT))); } static inline uint16 uint2korr(const char *pT) { return uint2korr(static_cast(static_cast(pT))); } static inline uint32 uint3korr(const char *pT) { return uint3korr(static_cast(static_cast(pT))); } static inline int32 sint3korr(const char *pT) { return sint3korr(static_cast(static_cast(pT))); } static inline uint32 uint4korr(const char *pT) { return uint4korr(static_cast(static_cast(pT))); } static inline int32 sint4korr(const char *pT) { return sint4korr(static_cast(static_cast(pT))); } static inline ulonglong uint6korr(const char *pT) { return uint6korr(static_cast(static_cast(pT))); } static inline ulonglong uint8korr(const char *pT) { return uint8korr(static_cast(static_cast(pT))); } static inline longlong sint8korr(const char *pT) { return sint8korr(static_cast(static_cast(pT))); } static inline void int2store(char *pT, uint16 A) { int2store(static_cast(static_cast(pT)), A); } static inline void int3store(char *pT, uint A) { int3store(static_cast(static_cast(pT)), A); } static inline void int4store(char *pT, uint32 A) { int4store(static_cast(static_cast(pT)), A); } static inline void int5store(char *pT, ulonglong A) { int5store(static_cast(static_cast(pT)), A); } static inline void int6store(char *pT, ulonglong A) { int6store(static_cast(static_cast(pT)), A); } static inline void int8store(char *pT, ulonglong A) { int8store(static_cast(static_cast(pT)), A); } #endif /* __cplusplus */ /* Functions for reading and storing in machine format from/to short/long to/from some place in memory V should be a variable and M a pointer to byte. */ #ifdef WORDS_BIGENDIAN #include "big_endian.h" #else #include "little_endian.h" #endif #ifdef __cplusplus static inline void float4store(char *V, float M) { float4store(static_cast(static_cast(V)), M); } static inline void float8get(double *V, const char *M) { float8get(V, static_cast(static_cast(M))); } static inline void float8store(char *V, double M) { float8store(static_cast(static_cast(V)), M); } #endif /* __cplusplus */ #endif /* MY_BYTEORDER_INCLUDED */ PKp #include extern const char *unknown_sqlstate; extern const char *cant_connect_sqlstate; extern const char *not_error_sqlstate; /* Free all memory allocated in MYSQL handle except the current options. */ void mysql_close_free(MYSQL *mysql); /* Clear connection options stored in MYSQL handle and free memory used by them. */ void mysql_close_free_options(MYSQL *mysql); /** The structure is used to hold the state change information received from the server. LIST functions are used for manipulation of the members of the structure. */ typedef struct st_session_track_info_node { /** head_node->data is a LEX_STRING which contains the variable name. */ LIST *head_node; LIST *current_node; } STATE_INFO_NODE; /** Store the change info received from the server in an array of linked lists with STATE_INFO_NODE elements (one per state type). */ typedef struct st_session_track_info { /** Array of STATE_NODE_INFO elements (one per state type). */ struct st_session_track_info_node info_list[SESSION_TRACK_END + 1]; } STATE_INFO; /* Access to MYSQL::extension member. Note: functions mysql_extension_{init,free}() are defined in client.c. */ struct st_mysql_trace_info; typedef struct st_mysql_extension { struct st_mysql_trace_info *trace_data; struct st_session_track_info state_change; } MYSQL_EXTENSION; /* "Constructor/destructor" for MYSQL extension structure. */ struct st_mysql_extension* mysql_extension_init(struct st_mysql*); void mysql_extension_free(struct st_mysql_extension*); /* Note: Allocated extension structure is freed in mysql_close_free() called by mysql_close(). */ #define MYSQL_EXTENSION_PTR(H) \ ( \ (struct st_mysql_extension*) \ ( (H)->extension ? \ (H)->extension : ((H)->extension= mysql_extension_init(H)) \ ) \ ) struct st_mysql_options_extention { char *plugin_dir; char *default_auth; char *ssl_crl; /* PEM CRL file */ char *ssl_crlpath; /* PEM directory of CRL-s? */ HASH connection_attributes; char *server_public_key_path; size_t connection_attributes_length; my_bool enable_cleartext_plugin; my_bool get_server_public_key; char *tls_version; /* TLS version option */ long ssl_ctx_flags; /* SSL ctx options flag */ unsigned int ssl_mode; }; typedef struct st_mysql_methods { my_bool (*read_query_result)(MYSQL *mysql); my_bool (*advanced_command)(MYSQL *mysql, enum enum_server_command command, const unsigned char *header, size_t header_length, const unsigned char *arg, size_t arg_length, my_bool skip_check, MYSQL_STMT *stmt); MYSQL_DATA *(*read_rows)(MYSQL *mysql,MYSQL_FIELD *mysql_fields, unsigned int fields); MYSQL_RES * (*use_result)(MYSQL *mysql); void (*fetch_lengths)(unsigned long *to, MYSQL_ROW column, unsigned int field_count); void (*flush_use_result)(MYSQL *mysql, my_bool flush_all_results); int (*read_change_user_result)(MYSQL *mysql); #if !defined(MYSQL_SERVER) || defined(EMBEDDED_LIBRARY) MYSQL_FIELD * (*list_fields)(MYSQL *mysql); my_bool (*read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt); int (*stmt_execute)(MYSQL_STMT *stmt); int (*read_binary_rows)(MYSQL_STMT *stmt); int (*unbuffered_fetch)(MYSQL *mysql, char **row); void (*free_embedded_thd)(MYSQL *mysql); const char *(*read_statistics)(MYSQL *mysql); my_bool (*next_result)(MYSQL *mysql); int (*read_rows_from_cursor)(MYSQL_STMT *stmt); void (*free_rows)(MYSQL_DATA *cur); #endif } MYSQL_METHODS; #define simple_command(mysql, command, arg, length, skip_check) \ ((mysql)->methods \ ? (*(mysql)->methods->advanced_command)(mysql, command, 0, \ 0, arg, length, skip_check, NULL) \ : (set_mysql_error(mysql, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate), 1)) #define stmt_command(mysql, command, arg, length, stmt) \ ((mysql)->methods \ ? (*(mysql)->methods->advanced_command)(mysql, command, 0, \ 0, arg, length, 1, stmt) \ : (set_mysql_error(mysql, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate), 1)) extern CHARSET_INFO *default_client_charset_info; MYSQL_FIELD *unpack_fields(MYSQL *mysql, MYSQL_ROWS *data,MEM_ROOT *alloc, uint fields, my_bool default_value, uint server_capabilities); MYSQL_FIELD * cli_read_metadata_ex(MYSQL *mysql, MEM_ROOT *alloc, unsigned long field_count, unsigned int fields); MYSQL_FIELD * cli_read_metadata(MYSQL *mysql, unsigned long field_count, unsigned int fields); void free_rows(MYSQL_DATA *cur); void free_old_query(MYSQL *mysql); void end_server(MYSQL *mysql); my_bool mysql_reconnect(MYSQL *mysql); void mysql_read_default_options(struct st_mysql_options *options, const char *filename,const char *group); my_bool cli_advanced_command(MYSQL *mysql, enum enum_server_command command, const unsigned char *header, size_t header_length, const unsigned char *arg, size_t arg_length, my_bool skip_check, MYSQL_STMT *stmt); unsigned long cli_safe_read(MYSQL *mysql, my_bool *is_data_packet); unsigned long cli_safe_read_with_ok(MYSQL *mysql, my_bool parse_ok, my_bool *is_data_packet); void net_clear_error(NET *net); void set_stmt_errmsg(MYSQL_STMT *stmt, NET *net); void set_stmt_error(MYSQL_STMT *stmt, int errcode, const char *sqlstate, const char *err); void set_mysql_error(MYSQL *mysql, int errcode, const char *sqlstate); void set_mysql_extended_error(MYSQL *mysql, int errcode, const char *sqlstate, const char *format, ...); #ifdef EMBEDDED_LIBRARY int embedded_ssl_check(MYSQL *mysql); #endif /* client side of the pluggable authentication */ struct st_plugin_vio_info; void mpvio_info(Vio *vio, struct st_plugin_vio_info *info); int run_plugin_auth(MYSQL *mysql, char *data, uint data_len, const char *data_plugin, const char *db); int mysql_client_plugin_init(); void mysql_client_plugin_deinit(); struct st_mysql_client_plugin; extern struct st_mysql_client_plugin *mysql_client_builtins[]; uchar * send_client_connect_attrs(MYSQL *mysql, uchar *buf); extern my_bool libmysql_cleartext_plugin_enabled; int is_file_or_dir_world_writable(const char *filepath); void read_ok_ex(MYSQL *mysql, unsigned long len); #ifdef __cplusplus } #endif #define protocol_41(A) ((A)->server_capabilities & CLIENT_PROTOCOL_41) #endif /* SQL_COMMON_INCLUDED */ PKp= D (column \'%-.192s\')." }, { "ER_WRONG_LOCK_OF_SYSTEM_TABLE", 1428, "You can\'t combine write-locking of system tables with other tables or lock types" }, { "ER_CONNECT_TO_FOREIGN_DATA_SOURCE", 1429, "Unable to connect to foreign data source: %.64s" }, { "ER_QUERY_ON_FOREIGN_DATA_SOURCE", 1430, "There was a problem processing the query on the foreign data source. Data source error: %-.64s" }, { "ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST", 1431, "The foreign data source you are trying to reference does not exist. Data source error: %-.64s" }, { "ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE", 1432, "Can\'t create federated table. The data source connection string \'%-.64s\' is not in the correct format" }, { "ER_FOREIGN_DATA_STRING_INVALID", 1433, "The data source connection string \'%-.64s\' is not in the correct format" }, { "ER_CANT_CREATE_FEDERATED_TABLE", 1434, "Can\'t create federated table. Foreign data src error: %-.64s" }, { "ER_TRG_IN_WRONG_SCHEMA", 1435, "Trigger in wrong schema" }, { "ER_STACK_OVERRUN_NEED_MORE", 1436, "Thread stack overrun: %ld bytes used of a %ld byte stack, and %ld bytes needed. Use \'mysqld --thread_stack=#\' to specify a bigger stack." }, { "ER_TOO_LONG_BODY", 1437, "Routine body for \'%-.100s\' is too long" }, { "ER_WARN_CANT_DROP_DEFAULT_KEYCACHE", 1438, "Cannot drop default keycache" }, { "ER_TOO_BIG_DISPLAYWIDTH", 1439, "Display width out of range for column \'%-.192s\' (max = %lu)" }, { "ER_XAER_DUPID", 1440, "XAER_DUPID: The XID already exists" }, { "ER_DATETIME_FUNCTION_OVERFLOW", 1441, "Datetime function: %-.32s field overflow" }, { "ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG", 1442, "Can\'t update table \'%-.192s\' in stored function/trigger because it is already used by statement which invoked this stored function/trigger." }, { "ER_VIEW_PREVENT_UPDATE", 1443, "The definition of table \'%-.192s\' prevents operation %.192s on table \'%-.192s\'." }, { "ER_PS_NO_RECURSION", 1444, "The prepared statement contains a stored routine call that refers to that same statement. It\'s not allowed to execute a prepared statement in such a recursive manner" }, { "ER_SP_CANT_SET_AUTOCOMMIT", 1445, "Not allowed to set autocommit from a stored function or trigger" }, { "ER_MALFORMED_DEFINER", 1446, "Definer is not fully qualified" }, { "ER_VIEW_FRM_NO_USER", 1447, "View \'%-.192s\'.\'%-.192s\' has no definer information (old table format). Current user is used as definer. Please recreate the view!" }, { "ER_VIEW_OTHER_USER", 1448, "You need the SUPER privilege for creation view with \'%-.192s\'@\'%-.192s\' definer" }, { "ER_NO_SUCH_USER", 1449, "The user specified as a definer (\'%-.64s\'@\'%-.64s\') does not exist" }, { "ER_FORBID_SCHEMA_CHANGE", 1450, "Changing schema from \'%-.192s\' to \'%-.192s\' is not allowed." }, { "ER_ROW_IS_REFERENCED_2", 1451, "Cannot delete or update a parent row: a foreign key constraint fails (%.192s)" }, { "ER_NO_REFERENCED_ROW_2", 1452, "Cannot add or update a child row: a foreign key constraint fails (%.192s)" }, { "ER_SP_BAD_VAR_SHADOW", 1453, "Variable \'%-.64s\' must be quoted with `...`, or renamed" }, { "ER_TRG_NO_DEFINER", 1454, "No definer attribute for trigger \'%-.192s\'.\'%-.192s\'. The trigger will be activated under the authorization of the invoker, which may have insufficient privileges. Please recreate the trigger." }, { "ER_OLD_FILE_FORMAT", 1455, "\'%-.192s\' has an old format, you should re-create the \'%s\' object(s)" }, { "ER_SP_RECURSION_LIMIT", 1456, "Recursive limit %d (as set by the max_sp_recursion_depth variable) was exceeded for routine %.192s" }, { "ER_SP_PROC_TABLE_CORRUPT", 1457, "Failed to load routine %-.192s. The table mysql.proc is missing, corrupt, or contains bad data (internal code %d)" }, { "ER_SP_WRONG_NAME", 1458, "Incorrect routine name \'%-.192s\'" }, { "ER_TABLE_NEEDS_UPGRADE", 1459, "Table upgrade required. Please do \"REPAIR TABLE `%-.64s`\" or dump/reload to fix it!" }, { "ER_SP_NO_AGGREGATE", 1460, "AGGREGATE is not supported for stored functions" }, { "ER_MAX_PREPARED_STMT_COUNT_REACHED", 1461, "Can\'t create more than max_prepared_stmt_count statements (current value: %lu)" }, { "ER_VIEW_RECURSIVE", 1462, "`%-.192s`.`%-.192s` contains view recursion" }, { "ER_NON_GROUPING_FIELD_USED", 1463, "Non-grouping field \'%-.192s\' is used in %-.64s clause" }, { "ER_TABLE_CANT_HANDLE_SPKEYS", 1464, "The used table type doesn\'t support SPATIAL indexes" }, { "ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA", 1465, "Triggers can not be created on system tables" }, { "ER_REMOVED_SPACES", 1466, "Leading spaces are removed from name \'%s\'" }, { "ER_AUTOINC_READ_FAILED", 1467, "Failed to read auto-increment value from storage engine" }, { "ER_USERNAME", 1468, "user name" }, { "ER_HOSTNAME", 1469, "host name" }, { "ER_WRONG_STRING_LENGTH", 1470, "String \'%-.70s\' is too long for %s (should be no longer than %d)" }, { "ER_NON_INSERTABLE_TABLE", 1471, "The target table %-.100s of the %s is not insertable-into" }, { "ER_ADMIN_WRONG_MRG_TABLE", 1472, "Table \'%-.64s\' is differently defined or of non-MyISAM type or doesn\'t exist" }, { "ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT", 1473, "Too high level of nesting for select" }, { "ER_NAME_BECOMES_EMPTY", 1474, "Name \'%-.64s\' has become \'\'" }, { "ER_AMBIGUOUS_FIELD_TERM", 1475, "First character of the FIELDS TERMINATED string is ambiguous; please use non-optional and non-empty FIELDS ENCLOSED BY" }, { "ER_FOREIGN_SERVER_EXISTS", 1476, "The foreign server, %s, you are trying to create already exists." }, { "ER_FOREIGN_SERVER_DOESNT_EXIST", 1477, "The foreign server name you are trying to reference does not exist. Data source error: %-.64s" }, { "ER_ILLEGAL_HA_CREATE_OPTION", 1478, "Table storage engine \'%-.64s\' does not support the create option \'%.64s\'" }, { "ER_PARTITION_REQUIRES_VALUES_ERROR", 1479, "Syntax error: %-.64s PARTITIONING requires definition of VALUES %-.64s for each partition" }, { "ER_PARTITION_WRONG_VALUES_ERROR", 1480, "Only %-.64s PARTITIONING can use VALUES %-.64s in partition definition" }, { "ER_PARTITION_MAXVALUE_ERROR", 1481, "MAXVALUE can only be used in last partition definition" }, { "ER_PARTITION_SUBPARTITION_ERROR", 1482, "Subpartitions can only be hash partitions and by key" }, { "ER_PARTITION_SUBPART_MIX_ERROR", 1483, "Must define subpartitions on all partitions if on one partition" }, { "ER_PARTITION_WRONG_NO_PART_ERROR", 1484, "Wrong number of partitions defined, mismatch with previous setting" }, { "ER_PARTITION_WRONG_NO_SUBPART_ERROR", 1485, "Wrong number of subpartitions defined, mismatch with previous setting" }, { "ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR", 1486, "Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed" }, { "ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR", 1487, "Expression in RANGE/LIST VALUES must be constant" }, { "ER_FIELD_NOT_FOUND_PART_ERROR", 1488, "Field in list of fields for partition function not found in table" }, { "ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR", 1489, "List of fields is only allowed in KEY partitions" }, { "ER_INCONSISTENT_PARTITION_INFO_ERROR", 1490, "The partition info in the frm file is not consistent with what can be written into the frm file" }, { "ER_PARTITION_FUNC_NOT_ALLOWED_ERROR", 1491, "The %-.192s function returns the wrong type" }, { "ER_PARTITIONS_MUST_BE_DEFINED_ERROR", 1492, "For %-.64s partitions each partition must be defined" }, { "ER_RANGE_NOT_INCREASING_ERROR", 1493, "VALUES LESS THAN value must be strictly increasing for each partition" }, { "ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR", 1494, "VALUES value must be of same type as partition function" }, { "ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR", 1495, "Multiple definition of same constant in list partitioning" }, { "ER_PARTITION_ENTRY_ERROR", 1496, "Partitioning can not be used stand-alone in query" }, { "ER_MIX_HANDLER_ERROR", 1497, "The mix of handlers in the partitions is not allowed in this version of MySQL" }, { "ER_PARTITION_NOT_DEFINED_ERROR", 1498, "For the partitioned engine it is necessary to define all %-.64s" }, { "ER_TOO_MANY_PARTITIONS_ERROR", 1499, "Too many partitions (including subpartitions) were defined" }, { "ER_SUBPARTITION_ERROR", 1500, "It is only possible to mix RANGE/LIST partitioning with HASH/KEY partitioning for subpartitioning" }, { "ER_CANT_CREATE_HANDLER_FILE", 1501, "Failed to create specific handler file" }, { "ER_BLOB_FIELD_IN_PART_FUNC_ERROR", 1502, "A BLOB field is not allowed in partition function" }, { "ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF", 1503, "A %-.192s must include all columns in the table\'s partitioning function" }, { "ER_NO_PARTS_ERROR", 1504, "Number of %-.64s = 0 is not an allowed value" }, { "ER_PARTITION_MGMT_ON_NONPARTITIONED", 1505, "Partition management on a not partitioned table is not possible" }, { "ER_FOREIGN_KEY_ON_PARTITIONED", 1506, "Foreign keys are not yet supported in conjunction with partitioning" }, { "ER_DROP_PARTITION_NON_EXISTENT", 1507, "Error in list of partitions to %-.64s" }, { "ER_DROP_LAST_PARTITION", 1508, "Cannot remove all partitions, use DROP TABLE instead" }, { "ER_COALESCE_ONLY_ON_HASH_PARTITION", 1509, "COALESCE PARTITION can only be used on HASH/KEY partitions" }, { "ER_REORG_HASH_ONLY_ON_SAME_NO", 1510, "REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers" }, { "ER_REORG_NO_PARAM_ERROR", 1511, "REORGANIZE PARTITION without parameters can only be used on auto-partitioned tables using HASH PARTITIONs" }, { "ER_ONLY_ON_RANGE_LIST_PARTITION", 1512, "%-.64s PARTITION can only be used on RANGE/LIST partitions" }, { "ER_ADD_PARTITION_SUBPART_ERROR", 1513, "Trying to Add partition(s) with wrong number of subpartitions" }, { "ER_ADD_PARTITION_NO_NEW_PARTITION", 1514, "At least one partition must be added" }, { "ER_COALESCE_PARTITION_NO_PARTITION", 1515, "At least one partition must be coalesced" }, { "ER_REORG_PARTITION_NOT_EXIST", 1516, "More partitions to reorganize than there are partitions" }, { "ER_SAME_NAME_PARTITION", 1517, "Duplicate partition name %-.192s" }, { "ER_NO_BINLOG_ERROR", 1518, "It is not allowed to shut off binlog on this command" }, { "ER_CONSECUTIVE_REORG_PARTITIONS", 1519, "When reorganizing a set of partitions they must be in consecutive order" }, { "ER_REORG_OUTSIDE_RANGE", 1520, "Reorganize of range partitions cannot change total ranges except for last partition where it can extend the range" }, { "ER_PARTITION_FUNCTION_FAILURE", 1521, "Partition function not supported in this version for this handler" }, { "ER_PART_STATE_ERROR", 1522, "Partition state cannot be defined from CREATE/ALTER TABLE" }, { "ER_LIMITED_PART_RANGE", 1523, "The %-.64s handler only supports 32 bit integers in VALUES" }, { "ER_PLUGIN_IS_NOT_LOADED", 1524, "Plugin \'%-.192s\' is not loaded" }, { "ER_WRONG_VALUE", 1525, "Incorrect %-.32s value: \'%-.128s\'" }, { "ER_NO_PARTITION_FOR_GIVEN_VALUE", 1526, "Table has no partition for value %-.64s" }, { "ER_FILEGROUP_OPTION_ONLY_ONCE", 1527, "It is not allowed to specify %s more than once" }, { "ER_CREATE_FILEGROUP_FAILED", 1528, "Failed to create %s" }, { "ER_DROP_FILEGROUP_FAILED", 1529, "Failed to drop %s" }, { "ER_TABLESPACE_AUTO_EXTEND_ERROR", 1530, "The handler doesn\'t support autoextend of tablespaces" }, { "ER_WRONG_SIZE_NUMBER", 1531, "A size parameter was incorrectly specified, either number or on the form 10M" }, { "ER_SIZE_OVERFLOW_ERROR", 1532, "The size number was correct but we don\'t allow the digit part to be more than 2 billion" }, { "ER_ALTER_FILEGROUP_FAILED", 1533, "Failed to alter: %s" }, { "ER_BINLOG_ROW_LOGGING_FAILED", 1534, "Writing one row to the row-based binary log failed" }, { "ER_BINLOG_ROW_WRONG_TABLE_DEF", 1535, "Table definition on master and slave does not match: %s" }, { "ER_BINLOG_ROW_RBR_TO_SBR", 1536, "Slave running with --log-slave-updates must use row-based binary logging to be able to replicate row-based binary log events" }, { "ER_EVENT_ALREADY_EXISTS", 1537, "Event \'%-.192s\' already exists" }, { "ER_EVENT_STORE_FAILED", 1538, "Failed to store event %s. Error code %d from storage engine." }, { "ER_EVENT_DOES_NOT_EXIST", 1539, "Unknown event \'%-.192s\'" }, { "ER_EVENT_CANT_ALTER", 1540, "Failed to alter event \'%-.192s\'" }, { "ER_EVENT_DROP_FAILED", 1541, "Failed to drop %s" }, { "ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG", 1542, "INTERVAL is either not positive or too big" }, { "ER_EVENT_ENDS_BEFORE_STARTS", 1543, "ENDS is either invalid or before STARTS" }, { "ER_EVENT_EXEC_TIME_IN_THE_PAST", 1544, "Event execution time is in the past. Event has been disabled" }, { "ER_EVENT_OPEN_TABLE_FAILED", 1545, "Failed to open mysql.event" }, { "ER_EVENT_NEITHER_M_EXPR_NOR_M_AT", 1546, "No datetime expression provided" }, { "ER_OBSOLETE_COL_COUNT_DOESNT_MATCH_CORRUPTED", 1547, "Column count of mysql.%s is wrong. Expected %d, found %d. The table is probably corrupted" }, { "ER_OBSOLETE_CANNOT_LOAD_FROM_TABLE", 1548, "Cannot load from mysql.%s. The table is probably corrupted" }, { "ER_EVENT_CANNOT_DELETE", 1549, "Failed to delete the event from mysql.event" }, { "ER_EVENT_COMPILE_ERROR", 1550, "Error during compilation of event\'s body" }, { "ER_EVENT_SAME_NAME", 1551, "Same old and new event name" }, { "ER_EVENT_DATA_TOO_LONG", 1552, "Data for column \'%s\' too long" }, { "ER_DROP_INDEX_FK", 1553, "Cannot drop index \'%-.192s\': needed in a foreign key constraint" }, { "ER_WARN_DEPRECATED_SYNTAX_WITH_VER", 1554, "The syntax \'%s\' is deprecated and will be removed in MySQL %s. Please use %s instead" }, { "ER_CANT_WRITE_LOCK_LOG_TABLE", 1555, "You can\'t write-lock a log table. Only read access is possible" }, { "ER_CANT_LOCK_LOG_TABLE", 1556, "You can\'t use locks with log tables." }, { "ER_FOREIGN_DUPLICATE_KEY_OLD_UNUSED", 1557, "Upholding foreign key constraints for table \'%.192s\', entry \'%-.192s\', key %d would lead to a duplicate entry" }, { "ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE", 1558, "Column count of mysql.%s is wrong. Expected %d, found %d. Created with MySQL %d, now running %d. Please use mysql_upgrade to fix this error." }, { "ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR", 1559, "Cannot switch out of the row-based binary log format when the session has open temporary tables" }, { "ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT", 1560, "Cannot change the binary logging format inside a stored function or trigger" }, { "ER_NDB_CANT_SWITCH_BINLOG_FORMAT", 1561, "The NDB cluster engine does not support changing the binlog format on the fly yet" }, { "ER_PARTITION_NO_TEMPORARY", 1562, "Cannot create temporary table with partitions" }, { "ER_PARTITION_CONST_DOMAIN_ERROR", 1563, "Partition constant is out of partition function domain" }, { "ER_PARTITION_FUNCTION_IS_NOT_ALLOWED", 1564, "This partition function is not allowed" }, { "ER_DDL_LOG_ERROR", 1565, "Error in DDL log" }, { "ER_NULL_IN_VALUES_LESS_THAN", 1566, "Not allowed to use NULL value in VALUES LESS THAN" }, { "ER_WRONG_PARTITION_NAME", 1567, "Incorrect partition name" }, { "ER_CANT_CHANGE_TX_CHARACTERISTICS", 1568, "Transaction characteristics can\'t be changed while a transaction is in progress" }, { "ER_DUP_ENTRY_AUTOINCREMENT_CASE", 1569, "ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry \'%-.192s\' for key \'%-.192s\'" }, { "ER_EVENT_MODIFY_QUEUE_ERROR", 1570, "Internal scheduler error %d" }, { "ER_EVENT_SET_VAR_ERROR", 1571, "Error during starting/stopping of the scheduler. Error code %u" }, { "ER_PARTITION_MERGE_ERROR", 1572, "Engine cannot be used in partitioned tables" }, { "ER_CANT_ACTIVATE_LOG", 1573, "Cannot activate \'%-.64s\' log" }, { "ER_RBR_NOT_AVAILABLE", 1574, "The server was not built with row-based replication" }, { "ER_BASE64_DECODE_ERROR", 1575, "Decoding of base64 string failed" }, { "ER_EVENT_RECURSION_FORBIDDEN", 1576, "Recursion of EVENT DDL statements is forbidden when body is present" }, { "ER_EVENTS_DB_ERROR", 1577, "Cannot proceed because system tables used by Event Scheduler were found damaged at server start" }, { "ER_ONLY_INTEGERS_ALLOWED", 1578, "Only integers allowed as number here" }, { "ER_UNSUPORTED_LOG_ENGINE", 1579, "This storage engine cannot be used for log tables\"" }, { "ER_BAD_LOG_STATEMENT", 1580, "You cannot \'%s\' a log table if logging is enabled" }, { "ER_CANT_RENAME_LOG_TABLE", 1581, "Cannot rename \'%s\'. When logging enabled, rename to/from log table must rename two tables: the log table to an archive table and another table back to \'%s\'" }, { "ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT", 1582, "Incorrect parameter count in the call to native function \'%-.192s\'" }, { "ER_WRONG_PARAMETERS_TO_NATIVE_FCT", 1583, "Incorrect parameters in the call to native function \'%-.192s\'" }, { "ER_WRONG_PARAMETERS_TO_STORED_FCT", 1584, "Incorrect parameters in the call to stored function %-.192s" }, { "ER_NATIVE_FCT_NAME_COLLISION", 1585, "This function \'%-.192s\' has the same name as a native function" }, { "ER_DUP_ENTRY_WITH_KEY_NAME", 1586, "Duplicate entry \'%-.64s\' for key \'%-.192s\'" }, { "ER_BINLOG_PURGE_EMFILE", 1587, "Too many files opened, please execute the command again" }, { "ER_EVENT_CANNOT_CREATE_IN_THE_PAST", 1588, "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was dropped immediately after creation." }, { "ER_EVENT_CANNOT_ALTER_IN_THE_PAST", 1589, "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was not changed. Specify a time in the future." }, { "ER_SLAVE_INCIDENT", 1590, "The incident %s occured on the master. Message: %s" }, { "ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT", 1591, "Table has no partition for some existing values" }, { "ER_BINLOG_UNSAFE_STATEMENT", 1592, "Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. %s" }, { "ER_SLAVE_FATAL_ERROR", 1593, "Fatal error: %s" }, { "ER_SLAVE_RELAY_LOG_READ_FAILURE", 1594, "Relay log read failure: %s" }, { "ER_SLAVE_RELAY_LOG_WRITE_FAILURE", 1595, "Relay log write failure: %s" }, { "ER_SLAVE_CREATE_EVENT_FAILURE", 1596, "Failed to create %s" }, { "ER_SLAVE_MASTER_COM_FAILURE", 1597, "Master command %s failed: %s" }, { "ER_BINLOG_LOGGING_IMPOSSIBLE", 1598, "Binary logging not possible. Message: %s" }, { "ER_VIEW_NO_CREATION_CTX", 1599, "View `%-.64s`.`%-.64s` has no creation context" }, { "ER_VIEW_INVALID_CREATION_CTX", 1600, "Creation context of view `%-.64s`.`%-.64s\' is invalid" }, { "ER_SR_INVALID_CREATION_CTX", 1601, "Creation context of stored routine `%-.64s`.`%-.64s` is invalid" }, { "ER_TRG_CORRUPTED_FILE", 1602, "Corrupted TRG file for table `%-.64s`.`%-.64s`" }, { "ER_TRG_NO_CREATION_CTX", 1603, "Triggers for table `%-.64s`.`%-.64s` have no creation context" }, { "ER_TRG_INVALID_CREATION_CTX", 1604, "Trigger creation context of table `%-.64s`.`%-.64s` is invalid" }, { "ER_EVENT_INVALID_CREATION_CTX", 1605, "Creation context of event `%-.64s`.`%-.64s` is invalid" }, { "ER_TRG_CANT_OPEN_TABLE", 1606, "Cannot open table for trigger `%-.64s`.`%-.64s`" }, { "ER_CANT_CREATE_SROUTINE", 1607, "Cannot create stored routine `%-.64s`. Check warnings" }, { "ER_NEVER_USED", 1608, "Ambiguous slave modes combination. %s" }, { "ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT", 1609, "The BINLOG statement of type `%s` was not preceded by a format description BINLOG statement." }, { "ER_SLAVE_CORRUPT_EVENT", 1610, "Corrupted replication event was detected" }, { "ER_LOAD_DATA_INVALID_COLUMN_UNUSED", 1611, "Invalid column reference (%-.64s) in LOAD DATA" }, { "ER_LOG_PURGE_NO_FILE", 1612, "Being purged log %s was not found" }, { "ER_XA_RBTIMEOUT", 1613, "XA_RBTIMEOUT: Transaction branch was rolled back: took too long" }, { "ER_XA_RBDEADLOCK", 1614, "XA_RBDEADLOCK: Transaction branch was rolled back: deadlock was detected" }, { "ER_NEED_REPREPARE", 1615, "Prepared statement needs to be re-prepared" }, { "ER_DELAYED_NOT_SUPPORTED", 1616, "DELAYED option not supported for table \'%-.192s\'" }, { "WARN_NO_MASTER_INFO", 1617, "The master info structure does not exist" }, { "WARN_OPTION_IGNORED", 1618, "<%-.64s> option ignored" }, { "ER_PLUGIN_DELETE_BUILTIN", 1619, "Built-in plugins cannot be deleted" }, { "WARN_PLUGIN_BUSY", 1620, "Plugin is busy and will be uninstalled on shutdown" }, { "ER_VARIABLE_IS_READONLY", 1621, "%s variable \'%s\' is read-only. Use SET %s to assign the value" }, { "ER_WARN_ENGINE_TRANSACTION_ROLLBACK", 1622, "Storage engine %s does not support rollback for this statement. Transaction rolled back and must be restarted" }, { "ER_SLAVE_HEARTBEAT_FAILURE", 1623, "Unexpected master\'s heartbeat data: %s" }, { "ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE", 1624, "The requested value for the heartbeat period is either negative or exceeds the maximum allowed (%s seconds)." }, { "ER_NDB_REPLICATION_SCHEMA_ERROR", 1625, "Bad schema for mysql.ndb_replication table. Message: %-.64s" }, { "ER_CONFLICT_FN_PARSE_ERROR", 1626, "Error in parsing conflict function. Message: %-.64s" }, { "ER_EXCEPTIONS_WRITE_ERROR", 1627, "Write to exceptions table failed. Message: %-.128s\"" }, { "ER_TOO_LONG_TABLE_COMMENT", 1628, "Comment for table \'%-.64s\' is too long (max = %lu)" }, { "ER_TOO_LONG_FIELD_COMMENT", 1629, "Comment for field \'%-.64s\' is too long (max = %lu)" }, { "ER_FUNC_INEXISTENT_NAME_COLLISION", 1630, "FUNCTION %s does not exist. Check the \'Function Name Parsing and Resolution\' section in the Reference Manual" }, { "ER_DATABASE_NAME", 1631, "Database" }, { "ER_TABLE_NAME", 1632, "Table" }, { "ER_PARTITION_NAME", 1633, "Partition" }, { "ER_SUBPARTITION_NAME", 1634, "Subpartition" }, { "ER_TEMPORARY_NAME", 1635, "Temporary" }, { "ER_RENAMED_NAME", 1636, "Renamed" }, { "ER_TOO_MANY_CONCURRENT_TRXS", 1637, "Too many active concurrent transactions" }, { "WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED", 1638, "Non-ASCII separator arguments are not fully supported" }, { "ER_DEBUG_SYNC_TIMEOUT", 1639, "debug sync point wait timed out" }, { "ER_DEBUG_SYNC_HIT_LIMIT", 1640, "debug sync point hit limit reached" }, { "ER_DUP_SIGNAL_SET", 1641, "Duplicate condition information item \'%s\'" }, { "ER_SIGNAL_WARN", 1642, "Unhandled user-defined warning condition" }, { "ER_SIGNAL_NOT_FOUND", 1643, "Unhandled user-defined not found condition" }, { "ER_SIGNAL_EXCEPTION", 1644, "Unhandled user-defined exception condition" }, { "ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER", 1645, "RESIGNAL when handler not active" }, { "ER_SIGNAL_BAD_CONDITION_TYPE", 1646, "SIGNAL/RESIGNAL can only use a CONDITION defined with SQLSTATE" }, { "WARN_COND_ITEM_TRUNCATED", 1647, "Data truncated for condition item \'%s\'" }, { "ER_COND_ITEM_TOO_LONG", 1648, "Data too long for condition item \'%s\'" }, { "ER_UNKNOWN_LOCALE", 1649, "Unknown locale: \'%-.64s\'" }, { "ER_SLAVE_IGNORE_SERVER_IDS", 1650, "The requested server id %d clashes with the slave startup option --replicate-same-server-id" }, { "ER_QUERY_CACHE_DISABLED", 1651, "Query cache is disabled; restart the server with query_cache_type=1 to enable it" }, { "ER_SAME_NAME_PARTITION_FIELD", 1652, "Duplicate partition field name \'%-.192s\'" }, { "ER_PARTITION_COLUMN_LIST_ERROR", 1653, "Inconsistency in usage of column lists for partitioning" }, { "ER_WRONG_TYPE_COLUMN_VALUE_ERROR", 1654, "Partition column values of incorrect type" }, { "ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR", 1655, "Too many fields in \'%-.192s\'" }, { "ER_MAXVALUE_IN_VALUES_IN", 1656, "Cannot use MAXVALUE as value in VALUES IN" }, { "ER_TOO_MANY_VALUES_ERROR", 1657, "Cannot have more than one value for this type of %-.64s partitioning" }, { "ER_ROW_SINGLE_PARTITION_FIELD_ERROR", 1658, "Row expressions in VALUES IN only allowed for multi-field column partitioning" }, { "ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD", 1659, "Field \'%-.192s\' is of a not allowed type for this type of partitioning" }, { "ER_PARTITION_FIELDS_TOO_LONG", 1660, "The total length of the partitioning fields is too large" }, { "ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE", 1661, "Cannot execute statement: impossible to write to binary log since both row-incapable engines and statement-incapable engines are involved." }, { "ER_BINLOG_ROW_MODE_AND_STMT_ENGINE", 1662, "Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = ROW and at least one table uses a storage engine limited to statement-based logging." }, { "ER_BINLOG_UNSAFE_AND_STMT_ENGINE", 1663, "Cannot execute statement: impossible to write to binary log since statement is unsafe, storage engine is limited to statement-based logging, and BINLOG_FORMAT = MIXED. %s" }, { "ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE", 1664, "Cannot execute statement: impossible to write to binary log since statement is in row format and at least one table uses a storage engine limited to statement-based logging." }, { "ER_BINLOG_STMT_MODE_AND_ROW_ENGINE", 1665, "Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging.%s" }, { "ER_BINLOG_ROW_INJECTION_AND_STMT_MODE", 1666, "Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT." }, { "ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE", 1667, "Cannot execute statement: impossible to write to binary log since more than one engine is involved and at least one engine is self-logging." }, { "ER_BINLOG_UNSAFE_LIMIT", 1668, "The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted." }, { "ER_UNUSED4", 1669, "The statement is unsafe because it uses INSERT DELAYED. This is unsafe because the times when rows are inserted cannot be predicted." }, { "ER_BINLOG_UNSAFE_SYSTEM_TABLE", 1670, "The statement is unsafe because it uses the general log, slow query log, or performance_schema table(s). This is unsafe because system tables may differ on slaves." }, { "ER_BINLOG_UNSAFE_AUTOINC_COLUMNS", 1671, "Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTO_INCREMENT column. Inserted values cannot be logged correctly." }, { "ER_BINLOG_UNSAFE_UDF", 1672, "Statement is unsafe because it uses a UDF which may not return the same value on the slave." }, { "ER_BINLOG_UNSAFE_SYSTEM_VARIABLE", 1673, "Statement is unsafe because it uses a system variable that may have a different value on the slave." }, { "ER_BINLOG_UNSAFE_SYSTEM_FUNCTION", 1674, "Statement is unsafe because it uses a system function that may return a different value on the slave." }, { "ER_BINLOG_UNSAFE_NONTRANS_AFTER_TRANS", 1675, "Statement is unsafe because it accesses a non-transactional table after accessing a transactional table within the same transaction." }, { "ER_MESSAGE_AND_STATEMENT", 1676, "%s Statement: %s" }, { "ER_SLAVE_CONVERSION_FAILED", 1677, "Column %d of table \'%-.192s.%-.192s\' cannot be converted from type \'%-.32s\' to type \'%-.32s\'" }, { "ER_SLAVE_CANT_CREATE_CONVERSION", 1678, "Can\'t create conversion table for table \'%-.192s.%-.192s\'" }, { "ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT", 1679, "Cannot modify @@session.binlog_format inside a transaction" }, { "ER_PATH_LENGTH", 1680, "The path specified for %.64s is too long." }, { "ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT", 1681, "\'%s\' is deprecated and will be removed in a future release." }, { "ER_WRONG_NATIVE_TABLE_STRUCTURE", 1682, "Native table \'%-.64s\'.\'%-.64s\' has the wrong structure" }, { "ER_WRONG_PERFSCHEMA_USAGE", 1683, "Invalid performance_schema usage." }, { "ER_WARN_I_S_SKIPPED_TABLE", 1684, "Table \'%s\'.\'%s\' was skipped since its definition is being modified by concurrent DDL statement" }, { "ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT", 1685, "Cannot modify @@session.binlog_direct_non_transactional_updates inside a transaction" }, { "ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT", 1686, "Cannot change the binlog direct flag inside a stored function or trigger" }, { "ER_SPATIAL_MUST_HAVE_GEOM_COL", 1687, "A SPATIAL index may only contain a geometrical type column" }, { "ER_TOO_LONG_INDEX_COMMENT", 1688, "Comment for index \'%-.64s\' is too long (max = %lu)" }, { "ER_LOCK_ABORTED", 1689, "Wait on a lock was aborted due to a pending exclusive lock" }, { "ER_DATA_OUT_OF_RANGE", 1690, "%s value is out of range in \'%s\'" }, { "ER_WRONG_SPVAR_TYPE_IN_LIMIT", 1691, "A variable of a non-integer based type in LIMIT clause" }, { "ER_BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE", 1692, "Mixing self-logging and non-self-logging engines in a statement is unsafe." }, { "ER_BINLOG_UNSAFE_MIXED_STATEMENT", 1693, "Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them." }, { "ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN", 1694, "Cannot modify @@session.sql_log_bin inside a transaction" }, { "ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN", 1695, "Cannot change the sql_log_bin inside a stored function or trigger" }, { "ER_FAILED_READ_FROM_PAR_FILE", 1696, "Failed to read from the .par file" }, { "ER_VALUES_IS_NOT_INT_TYPE_ERROR", 1697, "VALUES value for partition \'%-.64s\' must have type INT" }, { "ER_ACCESS_DENIED_NO_PASSWORD_ERROR", 1698, "Access denied for user \'%-.48s\'@\'%-.64s\'" }, { "ER_SET_PASSWORD_AUTH_PLUGIN", 1699, "SET PASSWORD has no significance for users authenticating via plugins" }, { "ER_GRANT_PLUGIN_USER_EXISTS", 1700, "GRANT with IDENTIFIED WITH is illegal because the user %-.*s already exists" }, { "ER_TRUNCATE_ILLEGAL_FK", 1701, "Cannot truncate a table referenced in a foreign key constraint (%.192s)" }, { "ER_PLUGIN_IS_PERMANENT", 1702, "Plugin \'%s\' is force_plus_permanent and can not be unloaded" }, { "ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN", 1703, "The requested value for the heartbeat period is less than 1 millisecond. The value is reset to 0, meaning that heartbeating will effectively be disabled." }, { "ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX", 1704, "The requested value for the heartbeat period exceeds the value of `slave_net_timeout\' seconds. A sensible value for the period should be less than the timeout." }, { "ER_STMT_CACHE_FULL", 1705, "Multi-row statements required more than \'max_binlog_stmt_cache_size\' bytes of storage; increase this mysqld variable and try again" }, { "ER_MULTI_UPDATE_KEY_CONFLICT", 1706, "Primary key/partition key update is not allowed since the table is updated both as \'%-.192s\' and \'%-.192s\'." }, { "ER_TABLE_NEEDS_REBUILD", 1707, "Table rebuild required. Please do \"ALTER TABLE `%-.64s` FORCE\" or dump/reload to fix it!" }, { "WARN_OPTION_BELOW_LIMIT", 1708, "The value of \'%s\' should be no less than the value of \'%s\'" }, { "ER_INDEX_COLUMN_TOO_LONG", 1709, "Index column size too large. The maximum column size is %lu bytes." }, { "ER_ERROR_IN_TRIGGER_BODY", 1710, "Trigger \'%-.64s\' has an error in its body: \'%-.256s\'" }, { "ER_ERROR_IN_UNKNOWN_TRIGGER_BODY", 1711, "Unknown trigger has an error in its body: \'%-.256s\'" }, { "ER_INDEX_CORRUPT", 1712, "Index %s is corrupted" }, { "ER_UNDO_RECORD_TOO_BIG", 1713, "Undo log record is too big." }, { "ER_BINLOG_UNSAFE_INSERT_IGNORE_SELECT", 1714, "INSERT IGNORE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave." }, { "ER_BINLOG_UNSAFE_INSERT_SELECT_UPDATE", 1715, "INSERT... SELECT... ON DUPLICATE KEY UPDATE is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are updated. This order cannot be predicted and may differ on master and the slave." }, { "ER_BINLOG_UNSAFE_REPLACE_SELECT", 1716, "REPLACE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on master and the slave." }, { "ER_BINLOG_UNSAFE_CREATE_IGNORE_SELECT", 1717, "CREATE... IGNORE SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave." }, { "ER_BINLOG_UNSAFE_CREATE_REPLACE_SELECT", 1718, "CREATE... REPLACE SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on master and the slave." }, { "ER_BINLOG_UNSAFE_UPDATE_IGNORE", 1719, "UPDATE IGNORE is unsafe because the order in which rows are updated determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave." }, { "ER_PLUGIN_NO_UNINSTALL", 1720, "Plugin \'%s\' is marked as not dynamically uninstallable. You have to stop the server to uninstall it." }, { "ER_PLUGIN_NO_INSTALL", 1721, "Plugin \'%s\' is marked as not dynamically installable. You have to stop the server to install it." }, { "ER_BINLOG_UNSAFE_WRITE_AUTOINC_SELECT", 1722, "Statements writing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any) rows will be written. This order cannot be predicted and may differ on master and the slave." }, { "ER_BINLOG_UNSAFE_CREATE_SELECT_AUTOINC", 1723, "CREATE TABLE... SELECT... on a table with an auto-increment column is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are inserted. This order cannot be predicted and may differ on master and the slave." }, { "ER_BINLOG_UNSAFE_INSERT_TWO_KEYS", 1724, "INSERT... ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY is unsafe" }, { "ER_TABLE_IN_FK_CHECK", 1725, "Table is being used in foreign key check." }, { "ER_UNSUPPORTED_ENGINE", 1726, "Storage engine \'%s\' does not support system tables. [%s.%s]" }, { "ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST", 1727, "INSERT into autoincrement field which is not the first part in the composed primary key is unsafe." }, { "ER_CANNOT_LOAD_FROM_TABLE_V2", 1728, "Cannot load from %s.%s. The table is probably corrupted" }, { "ER_MASTER_DELAY_VALUE_OUT_OF_RANGE", 1729, "The requested value %s for the master delay exceeds the maximum %u" }, { "ER_ONLY_FD_AND_RBR_EVENTS_ALLOWED_IN_BINLOG_STATEMENT", 1730, "Only Format_description_log_event and row events are allowed in BINLOG statements (but %s was provided)" }, { "ER_PARTITION_EXCHANGE_DIFFERENT_OPTION", 1731, "Non matching attribute \'%-.64s\' between partition and table" }, { "ER_PARTITION_EXCHANGE_PART_TABLE", 1732, "Table to exchange with partition is partitioned: \'%-.64s\'" }, { "ER_PARTITION_EXCHANGE_TEMP_TABLE", 1733, "Table to exchange with partition is temporary: \'%-.64s\'" }, { "ER_PARTITION_INSTEAD_OF_SUBPARTITION", 1734, "Subpartitioned table, use subpartition instead of partition" }, { "ER_UNKNOWN_PARTITION", 1735, "Unknown partition \'%-.64s\' in table \'%-.64s\'" }, { "ER_TABLES_DIFFERENT_METADATA", 1736, "Tables have different definitions" }, { "ER_ROW_DOES_NOT_MATCH_PARTITION", 1737, "Found a row that does not match the partition" }, { "ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX", 1738, "Option binlog_cache_size (%lu) is greater than max_binlog_cache_size (%lu); setting binlog_cache_size equal to max_binlog_cache_size." }, { "ER_WARN_INDEX_NOT_APPLICABLE", 1739, "Cannot use %-.64s access on index \'%-.64s\' due to type or collation conversion on field \'%-.64s\'" }, { "ER_PARTITION_EXCHANGE_FOREIGN_KEY", 1740, "Table to exchange with partition has foreign key references: \'%-.64s\'" }, { "ER_NO_SUCH_KEY_VALUE", 1741, "Key value \'%-.192s\' was not found in table \'%-.192s.%-.192s\'" }, { "ER_RPL_INFO_DATA_TOO_LONG", 1742, "Data for column \'%s\' too long" }, { "ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE", 1743, "Replication event checksum verification failed while reading from network." }, { "ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE", 1744, "Replication event checksum verification failed while reading from a log file." }, { "ER_BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX", 1745, "Option binlog_stmt_cache_size (%lu) is greater than max_binlog_stmt_cache_size (%lu); setting binlog_stmt_cache_size equal to max_binlog_stmt_cache_size." }, { "ER_CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT", 1746, "Can\'t update table \'%-.192s\' while \'%-.192s\' is being created." }, { "ER_PARTITION_CLAUSE_ON_NONPARTITIONED", 1747, "PARTITION () clause on non partitioned table" }, { "ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET", 1748, "Found a row not matching the given partition set" }, { "ER_NO_SUCH_PARTITION__UNUSED", 1749, "partition \'%-.64s\' doesn\'t exist" }, { "ER_CHANGE_RPL_INFO_REPOSITORY_FAILURE", 1750, "Failure while changing the type of replication repository: %s." }, { "ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE", 1751, "The creation of some temporary tables could not be rolled back." }, { "ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE", 1752, "Some temporary tables were dropped, but these operations could not be rolled back." }, { "ER_MTS_FEATURE_IS_NOT_SUPPORTED", 1753, "%s is not supported in multi-threaded slave mode. %s" }, { "ER_MTS_UPDATED_DBS_GREATER_MAX", 1754, "The number of modified databases exceeds the maximum %d; the database names will not be included in the replication event metadata." }, { "ER_MTS_CANT_PARALLEL", 1755, "Cannot execute the current event group in the parallel mode. Encountered event %s, relay-log name %s, position %s which prevents execution of this event group in parallel mode. Reason: %s." }, { "ER_MTS_INCONSISTENT_DATA", 1756, "%s" }, { "ER_FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING", 1757, "FULLTEXT index is not supported for partitioned tables." }, { "ER_DA_INVALID_CONDITION_NUMBER", 1758, "Invalid condition number" }, { "ER_INSECURE_PLAIN_TEXT", 1759, "Sending passwords in plain text without SSL/TLS is extremely insecure." }, { "ER_INSECURE_CHANGE_MASTER", 1760, "Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the \'START SLAVE Syntax\' in the MySQL Manual for more information." }, { "ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO", 1761, "Foreign key constraint for table \'%.192s\', record \'%-.192s\' would lead to a duplicate entry in table \'%.192s\', key \'%.192s\'" }, { "ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO", 1762, "Foreign key constraint for table \'%.192s\', record \'%-.192s\' would lead to a duplicate entry in a child table" }, { "ER_SQLTHREAD_WITH_SECURE_SLAVE", 1763, "Setting authentication options is not possible when only the Slave SQL Thread is being started." }, { "ER_TABLE_HAS_NO_FT", 1764, "The table does not have FULLTEXT index to support this query" }, { "ER_VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER", 1765, "The system variable %.200s cannot be set in stored functions or triggers." }, { "ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION", 1766, "The system variable %.200s cannot be set when there is an ongoing transaction." }, { "ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST", 1767, "The system variable @@SESSION.GTID_NEXT has the value %.200s, which is not listed in @@SESSION.GTID_NEXT_LIST." }, { "ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION", 1768, "The system variable @@SESSION.GTID_NEXT cannot change inside a transaction." }, { "ER_SET_STATEMENT_CANNOT_INVOKE_FUNCTION", 1769, "The statement \'SET %.200s\' cannot invoke a stored function." }, { "ER_GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL", 1770, "The system variable @@SESSION.GTID_NEXT cannot be \'AUTOMATIC\' when @@SESSION.GTID_NEXT_LIST is non-NULL." }, { "ER_SKIPPING_LOGGED_TRANSACTION", 1771, "Skipping transaction %.200s because it has already been executed and logged." }, { "ER_MALFORMED_GTID_SET_SPECIFICATION", 1772, "Malformed GTID set specification \'%.200s\'." }, { "ER_MALFORMED_GTID_SET_ENCODING", 1773, "Malformed GTID set encoding." }, { "ER_MALFORMED_GTID_SPECIFICATION", 1774, "Malformed GTID specification \'%.200s\'." }, { "ER_GNO_EXHAUSTED", 1775, "Impossible to generate Global Transaction Identifier: the integer component reached the maximal value. Restart the server with a new server_uuid." }, { "ER_BAD_SLAVE_AUTO_POSITION", 1776, "Parameters MASTER_LOG_FILE, MASTER_LOG_POS, RELAY_LOG_FILE and RELAY_LOG_POS cannot be set when MASTER_AUTO_POSITION is active." }, { "ER_AUTO_POSITION_REQUIRES_GTID_MODE_NOT_OFF", 1777, "CHANGE MASTER TO MASTER_AUTO_POSITION = 1 cannot be executed because @@GLOBAL.GTID_MODE = OFF." }, { "ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET", 1778, "Cannot execute statements with implicit commit inside a transaction when @@SESSION.GTID_NEXT == \'UUID:NUMBER\'." }, { "ER_GTID_MODE_ON_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON", 1779, "GTID_MODE = ON requires ENFORCE_GTID_CONSISTENCY = ON." }, { "ER_GTID_MODE_REQUIRES_BINLOG", 1780, "@@GLOBAL.GTID_MODE = ON or ON_PERMISSIVE or OFF_PERMISSIVE requires --log-bin and --log-slave-updates." }, { "ER_CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF", 1781, "@@SESSION.GTID_NEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTID_MODE = OFF." }, { "ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON", 1782, "@@SESSION.GTID_NEXT cannot be set to ANONYMOUS when @@GLOBAL.GTID_MODE = ON." }, { "ER_CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF", 1783, "@@SESSION.GTID_NEXT_LIST cannot be set to a non-NULL value when @@GLOBAL.GTID_MODE = OFF." }, { "ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF__UNUSED", 1784, "Found a Gtid_log_event when @@GLOBAL.GTID_MODE = OFF." }, { "ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE", 1785, "Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables." }, { "ER_GTID_UNSAFE_CREATE_SELECT", 1786, "Statement violates GTID consistency: CREATE TABLE ... SELECT." }, { "ER_GTID_UNSAFE_CREATE_DROP_TEMPORARY_TABLE_IN_TRANSACTION", 1787, "Statement violates GTID consistency: Under statement binary log mode CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can only be executed outside transactional context. These statements are also not allowed in a function or trigger because functions and triggers are also considered to be multi-statement transactions." }, { "ER_GTID_MODE_CAN_ONLY_CHANGE_ONE_STEP_AT_A_TIME", 1788, "The value of @@GLOBAL.GTID_MODE can only be changed one step at a time: OFF <-> OFF_PERMISSIVE <-> ON_PERMISSIVE <-> ON. Also note that this value must be stepped up or down simultaneously on all servers. See the Manual for instructions." }, { "ER_MASTER_HAS_PURGED_REQUIRED_GTIDS", 1789, "The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires." }, { "ER_CANT_SET_GTID_NEXT_WHEN_OWNING_GTID", 1790, "@@SESSION.GTID_NEXT cannot be changed by a client that owns a GTID. The client owns %s. Ownership is released on COMMIT or ROLLBACK." }, { "ER_UNKNOWN_EXPLAIN_FORMAT", 1791, "Unknown EXPLAIN format name: \'%s\'" }, { "ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION", 1792, "Cannot execute statement in a READ ONLY transaction." }, { "ER_TOO_LONG_TABLE_PARTITION_COMMENT", 1793, "Comment for table partition \'%-.64s\' is too long (max = %lu)" }, { "ER_SLAVE_CONFIGURATION", 1794, "Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log." }, { "ER_INNODB_FT_LIMIT", 1795, "InnoDB presently supports one FULLTEXT index creation at a time" }, { "ER_INNODB_NO_FT_TEMP_TABLE", 1796, "Cannot create FULLTEXT index on temporary InnoDB table" }, { "ER_INNODB_FT_WRONG_DOCID_COLUMN", 1797, "Column \'%-.192s\' is of wrong type for an InnoDB FULLTEXT index" }, { "ER_INNODB_FT_WRONG_DOCID_INDEX", 1798, "Index \'%-.192s\' is of wrong type for an InnoDB FULLTEXT index" }, { "ER_INNODB_ONLINE_LOG_TOO_BIG", 1799, "Creating index \'%-.192s\' required more than \'innodb_online_alter_log_max_size\' bytes of modification log. Please try again." }, { "ER_UNKNOWN_ALTER_ALGORITHM", 1800, "Unknown ALGORITHM \'%s\'" }, { "ER_UNKNOWN_ALTER_LOCK", 1801, "Unknown LOCK type \'%s\'" }, { "ER_MTS_CHANGE_MASTER_CANT_RUN_WITH_GAPS", 1802, "CHANGE MASTER cannot be executed when the slave was stopped with an error or killed in MTS mode. Consider using RESET SLAVE or START SLAVE UNTIL." }, { "ER_MTS_RECOVERY_FAILURE", 1803, "Cannot recover after SLAVE errored out in parallel execution mode. Additional error messages can be found in the MySQL error log." }, { "ER_MTS_RESET_WORKERS", 1804, "Cannot clean up worker info tables. Additional error messages can be found in the MySQL error log." }, { "ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2", 1805, "Column count of %s.%s is wrong. Expected %d, found %d. The table is probably corrupted" }, { "ER_SLAVE_SILENT_RETRY_TRANSACTION", 1806, "Slave must silently retry current transaction" }, { "ER_DISCARD_FK_CHECKS_RUNNING", 1807, "There is a foreign key check running on table \'%-.192s\'. Cannot discard the table." }, { "ER_TABLE_SCHEMA_MISMATCH", 1808, "Schema mismatch (%s)" }, { "ER_TABLE_IN_SYSTEM_TABLESPACE", 1809, "Table \'%-.192s\' in system tablespace" }, { "ER_IO_READ_ERROR", 1810, "IO Read error: (%lu, %s) %s" }, { "ER_IO_WRITE_ERROR", 1811, "IO Write error: (%lu, %s) %s" }, { "ER_TABLESPACE_MISSING", 1812, "Tablespace is missing for table %s." }, { "ER_TABLESPACE_EXISTS", 1813, "Tablespace \'%-.192s\' exists." }, { "ER_TABLESPACE_DISCARDED", 1814, "Tablespace has been discarded for table \'%-.192s\'" }, { "ER_INTERNAL_ERROR", 1815, "Internal error: %s" }, { "ER_INNODB_IMPORT_ERROR", 1816, "ALTER TABLE %-.192s IMPORT TABLESPACE failed with error %lu : \'%s\'" }, { "ER_INNODB_INDEX_CORRUPT", 1817, "Index corrupt: %s" }, { "ER_INVALID_YEAR_COLUMN_LENGTH", 1818, "Supports only YEAR or YEAR(4) column." }, { "ER_NOT_VALID_PASSWORD", 1819, "Your password does not satisfy the current policy requirements" }, { "ER_MUST_CHANGE_PASSWORD", 1820, "You must reset your password using ALTER USER statement before executing this statement." }, { "ER_FK_NO_INDEX_CHILD", 1821, "Failed to add the foreign key constaint. Missing index for constraint \'%s\' in the foreign table \'%s\'" }, { "ER_FK_NO_INDEX_PARENT", 1822, "Failed to add the foreign key constaint. Missing index for constraint \'%s\' in the referenced table \'%s\'" }, { "ER_FK_FAIL_ADD_SYSTEM", 1823, "Failed to add the foreign key constraint \'%s\' to system tables" }, { "ER_FK_CANNOT_OPEN_PARENT", 1824, "Failed to open the referenced table \'%s\'" }, { "ER_FK_INCORRECT_OPTION", 1825, "Failed to add the foreign key constraint on table \'%s\'. Incorrect options in FOREIGN KEY constraint \'%s\'" }, { "ER_FK_DUP_NAME", 1826, "Duplicate foreign key constraint name \'%s\'" }, { "ER_PASSWORD_FORMAT", 1827, "The password hash doesn\'t have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function." }, { "ER_FK_COLUMN_CANNOT_DROP", 1828, "Cannot drop column \'%-.192s\': needed in a foreign key constraint \'%-.192s\'" }, { "ER_FK_COLUMN_CANNOT_DROP_CHILD", 1829, "Cannot drop column \'%-.192s\': needed in a foreign key constraint \'%-.192s\' of table \'%-.192s\'" }, { "ER_FK_COLUMN_NOT_NULL", 1830, "Column \'%-.192s\' cannot be NOT NULL: needed in a foreign key constraint \'%-.192s\' SET NULL" }, { "ER_DUP_INDEX", 1831, "Duplicate index \'%-.64s\' defined on the table \'%-.64s.%-.64s\'. This is deprecated and will be disallowed in a future release." }, { "ER_FK_COLUMN_CANNOT_CHANGE", 1832, "Cannot change column \'%-.192s\': used in a foreign key constraint \'%-.192s\'" }, { "ER_FK_COLUMN_CANNOT_CHANGE_CHILD", 1833, "Cannot change column \'%-.192s\': used in a foreign key constraint \'%-.192s\' of table \'%-.192s\'" }, { "ER_UNUSED5", 1834, "Cannot delete rows from table which is parent in a foreign key constraint \'%-.192s\' of table \'%-.192s\'" }, { "ER_MALFORMED_PACKET", 1835, "Malformed communication packet." }, { "ER_READ_ONLY_MODE", 1836, "Running in read-only mode" }, { "ER_GTID_NEXT_TYPE_UNDEFINED_GROUP", 1837, "When @@SESSION.GTID_NEXT is set to a GTID, you must explicitly set it to a different value after a COMMIT or ROLLBACK. Please check GTID_NEXT variable manual page for detailed explanation. Current @@SESSION.GTID_NEXT is \'%s\'." }, { "ER_VARIABLE_NOT_SETTABLE_IN_SP", 1838, "The system variable %.200s cannot be set in stored procedures." }, { "ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF", 1839, "@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_MODE = ON." }, { "ER_CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY", 1840, "@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty." }, { "ER_CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY", 1841, "@@GLOBAL.GTID_PURGED can only be set when there are no ongoing transactions (not even in other clients)." }, { "ER_GTID_PURGED_WAS_CHANGED", 1842, "@@GLOBAL.GTID_PURGED was changed from \'%s\' to \'%s\'." }, { "ER_GTID_EXECUTED_WAS_CHANGED", 1843, "@@GLOBAL.GTID_EXECUTED was changed from \'%s\' to \'%s\'." }, { "ER_BINLOG_STMT_MODE_AND_NO_REPL_TABLES", 1844, "Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT, and both replicated and non replicated tables are written to." }, { "ER_ALTER_OPERATION_NOT_SUPPORTED", 1845, "%s is not supported for this operation. Try %s." }, { "ER_ALTER_OPERATION_NOT_SUPPORTED_REASON", 1846, "%s is not supported. Reason: %s. Try %s." }, { "ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COPY", 1847, "COPY algorithm requires a lock" }, { "ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_PARTITION", 1848, "Partition specific operations do not yet support LOCK/ALGORITHM" }, { "ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME", 1849, "Columns participating in a foreign key are renamed" }, { "ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE", 1850, "Cannot change column type INPLACE" }, { "ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK", 1851, "Adding foreign keys needs foreign_key_checks=OFF" }, { "ER_UNUSED6", 1852, "Creating unique indexes with IGNORE requires COPY algorithm to remove duplicate rows" }, { "ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK", 1853, "Dropping a primary key is not allowed without also adding a new primary key" }, { "ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC", 1854, "Adding an auto-increment column requires a lock" }, { "ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS", 1855, "Cannot replace hidden FTS_DOC_ID with a user-visible one" }, { "ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_CHANGE_FTS", 1856, "Cannot drop or rename FTS_DOC_ID" }, { "ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FTS", 1857, "Fulltext index creation requires a lock" }, { "ER_SQL_SLAVE_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE", 1858, "sql_slave_skip_counter can not be set when the server is running with @@GLOBAL.GTID_MODE = ON. Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction" }, { "ER_DUP_UNKNOWN_IN_INDEX", 1859, "Duplicate entry for key \'%-.192s\'" }, { "ER_IDENT_CAUSES_TOO_LONG_PATH", 1860, "Long database name and identifier for object resulted in path length exceeding %d characters. Path: \'%s\'." }, { "ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL", 1861, "cannot silently convert NULL values, as required in this SQL_MODE" }, { "ER_MUST_CHANGE_PASSWORD_LOGIN", 1862, "Your password has expired. To log in you must change it using a client that supports expired passwords." }, { "ER_ROW_IN_WRONG_PARTITION", 1863, "Found a row in wrong partition %s" }, { "ER_MTS_EVENT_BIGGER_PENDING_JOBS_SIZE_MAX", 1864, "Cannot schedule event %s, relay-log name %s, position %s to Worker thread because its size %lu exceeds %lu of slave_pending_jobs_size_max." }, { "ER_INNODB_NO_FT_USES_PARSER", 1865, "Cannot CREATE FULLTEXT INDEX WITH PARSER on InnoDB table" }, { "ER_BINLOG_LOGICAL_CORRUPTION", 1866, "The binary log file \'%s\' is logically corrupted: %s" }, { "ER_WARN_PURGE_LOG_IN_USE", 1867, "file %s was not purged because it was being read by %d thread(s), purged only %d out of %d files." }, { "ER_WARN_PURGE_LOG_IS_ACTIVE", 1868, "file %s was not purged because it is the active log file." }, { "ER_AUTO_INCREMENT_CONFLICT", 1869, "Auto-increment value in UPDATE conflicts with internally generated values" }, { "WARN_ON_BLOCKHOLE_IN_RBR", 1870, "Row events are not logged for %s statements that modify BLACKHOLE tables in row format. Table(s): \'%-.192s\'" }, { "ER_SLAVE_MI_INIT_REPOSITORY", 1871, "Slave failed to initialize master info structure from the repository" }, { "ER_SLAVE_RLI_INIT_REPOSITORY", 1872, "Slave failed to initialize relay log info structure from the repository" }, { "ER_ACCESS_DENIED_CHANGE_USER_ERROR", 1873, "Access denied trying to change to user \'%-.48s\'@\'%-.64s\' (using password: %s). Disconnecting." }, { "ER_INNODB_READ_ONLY", 1874, "InnoDB is in read only mode." }, { "ER_STOP_SLAVE_SQL_THREAD_TIMEOUT", 1875, "STOP SLAVE command execution is incomplete: Slave SQL thread got the stop signal, thread is busy, SQL thread will stop once the current task is complete." }, { "ER_STOP_SLAVE_IO_THREAD_TIMEOUT", 1876, "STOP SLAVE command execution is incomplete: Slave IO thread got the stop signal, thread is busy, IO thread will stop once the current task is complete." }, { "ER_TABLE_CORRUPT", 1877, "Operation cannot be performed. The table \'%-.64s.%-.64s\' is missing, corrupt or contains bad data." }, { "ER_TEMP_FILE_WRITE_FAILURE", 1878, "Temporary file write failure." }, { "ER_INNODB_FT_AUX_NOT_HEX_ID", 1879, "Upgrade index name failed, please use create index(alter table) algorithm copy to rebuild index." }, { "ER_OLD_TEMPORALS_UPGRADED", 1880, "TIME/TIMESTAMP/DATETIME columns of old format have been upgraded to the new format." }, { "ER_INNODB_FORCED_RECOVERY", 1881, "Operation not allowed when innodb_forced_recovery > 0." }, { "ER_AES_INVALID_IV", 1882, "The initialization vector supplied to %s is too short. Must be at least %d bytes long" }, { "ER_PLUGIN_CANNOT_BE_UNINSTALLED", 1883, "Plugin \'%s\' cannot be uninstalled now. %s" }, { "ER_GTID_UNSAFE_BINLOG_SPLITTABLE_STATEMENT_AND_GTID_GROUP", 1884, "Cannot execute statement because it needs to be written to the binary log as multiple statements, and this is not allowed when @@SESSION.GTID_NEXT == \'UUID:NUMBER\'." }, { "ER_SLAVE_HAS_MORE_GTIDS_THAN_MASTER", 1885, "Slave has more GTIDs than the master has, using the master\'s SERVER_UUID. This may indicate that the end of the binary log was truncated or that the last binary log file was lost, e.g., after a power or disk failure when sync_binlog != 1. The master may or may not have rolled back transactions that were already replicated to the slave. Suggest to replicate any transactions that master has rolled back from slave to master, and/or commit empty transactions on master to account for transactions that have been committed on master but are not included in GTID_EXECUTED." }, { "ER_MISSING_KEY", 1886, "The table \'%s.%s\' does not have the necessary key(s) defined on it. Please check the table definition and create index(s) accordingly." }, { "ER_FILE_CORRUPT", 3000, "File %s is corrupted" }, { "ER_ERROR_ON_MASTER", 3001, "Query partially completed on the master (error on master: %d) and was aborted. There is a chance that your master is inconsistent at this point. If you are sure that your master is ok, run this query manually on the slave and then restart the slave with SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;. Query:\'%s\'" }, { "ER_INCONSISTENT_ERROR", 3002, "Query caused different errors on master and slave. Error on master: message (format)=\'%s\' error code=%d; Error on slave:actual message=\'%s\', error code=%d. Default database:\'%s\'. Query:\'%s\'" }, { "ER_STORAGE_ENGINE_NOT_LOADED", 3003, "Storage engine for table \'%s\'.\'%s\' is not loaded." }, { "ER_GET_STACKED_DA_WITHOUT_ACTIVE_HANDLER", 3004, "GET STACKED DIAGNOSTICS when handler not active" }, { "ER_WARN_LEGACY_SYNTAX_CONVERTED", 3005, "%s is no longer supported. The statement was converted to %s." }, { "ER_BINLOG_UNSAFE_FULLTEXT_PLUGIN", 3006, "Statement is unsafe because it uses a fulltext parser plugin which may not return the same value on the slave." }, { "ER_CANNOT_DISCARD_TEMPORARY_TABLE", 3007, "Cannot DISCARD/IMPORT tablespace associated with temporary table" }, { "ER_FK_DEPTH_EXCEEDED", 3008, "Foreign key cascade delete/update exceeds max depth of %d." }, { "ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE_V2", 3009, "Column count of %s.%s is wrong. Expected %d, found %d. Created with MySQL %d, now running %d. Please use mysql_upgrade to fix this error." }, { "ER_WARN_TRIGGER_DOESNT_HAVE_CREATED", 3010, "Trigger %s.%s.%s does not have CREATED attribute." }, { "ER_REFERENCED_TRG_DOES_NOT_EXIST", 3011, "Referenced trigger \'%s\' for the given action time and event type does not exist." }, { "ER_EXPLAIN_NOT_SUPPORTED", 3012, "EXPLAIN FOR CONNECTION command is supported only for SELECT/UPDATE/INSERT/DELETE/REPLACE" }, { "ER_INVALID_FIELD_SIZE", 3013, "Invalid size for column \'%-.192s\'." }, { "ER_MISSING_HA_CREATE_OPTION", 3014, "Table storage engine \'%-.64s\' found required create option missing" }, { "ER_ENGINE_OUT_OF_MEMORY", 3015, "Out of memory in storage engine \'%-.64s\'." }, { "ER_PASSWORD_EXPIRE_ANONYMOUS_USER", 3016, "The password for anonymous user cannot be expired." }, { "ER_SLAVE_SQL_THREAD_MUST_STOP", 3017, "This operation cannot be performed with a running slave sql thread; run STOP SLAVE SQL_THREAD first" }, { "ER_NO_FT_MATERIALIZED_SUBQUERY", 3018, "Cannot create FULLTEXT index on materialized subquery" }, { "ER_INNODB_UNDO_LOG_FULL", 3019, "Undo Log error: %s" }, { "ER_INVALID_ARGUMENT_FOR_LOGARITHM", 3020, "Invalid argument for logarithm" }, { "ER_SLAVE_CHANNEL_IO_THREAD_MUST_STOP", 3021, "This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL \'%s\' first." }, { "ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO", 3022, "This operation may not be safe when the slave has temporary tables. The tables will be kept open until the server restarts or until the tables are deleted by any replicated DROP statement. Suggest to wait until slave_open_temp_tables = 0." }, { "ER_WARN_ONLY_MASTER_LOG_FILE_NO_POS", 3023, "CHANGE MASTER TO with a MASTER_LOG_FILE clause but no MASTER_LOG_POS clause may not be safe. The old position value may not be valid for the new binary log file." }, { "ER_QUERY_TIMEOUT", 3024, "Query execution was interrupted, maximum statement execution time exceeded" }, { "ER_NON_RO_SELECT_DISABLE_TIMER", 3025, "Select is not a read only statement, disabling timer" }, { "ER_DUP_LIST_ENTRY", 3026, "Duplicate entry \'%-.192s\'." }, { "ER_SQL_MODE_NO_EFFECT", 3027, "\'%s\' mode no longer has any effect. Use STRICT_ALL_TABLES or STRICT_TRANS_TABLES instead." }, { "ER_AGGREGATE_ORDER_FOR_UNION", 3028, "Expression #%u of ORDER BY contains aggregate function and applies to a UNION" }, { "ER_AGGREGATE_ORDER_NON_AGG_QUERY", 3029, "Expression #%u of ORDER BY contains aggregate function and applies to the result of a non-aggregated query" }, { "ER_SLAVE_WORKER_STOPPED_PREVIOUS_THD_ERROR", 3030, "Slave worker has stopped after at least one previous worker encountered an error when slave-preserve-commit-order was enabled. To preserve commit order, the last transaction executed by this thread has not been committed. When restarting the slave after fixing any failed threads, you should fix this worker as well." }, { "ER_DONT_SUPPORT_SLAVE_PRESERVE_COMMIT_ORDER", 3031, "slave_preserve_commit_order is not supported %s." }, { "ER_SERVER_OFFLINE_MODE", 3032, "The server is currently in offline mode" }, { "ER_GIS_DIFFERENT_SRIDS", 3033, "Binary geometry function %s given two geometries of different srids: %u and %u, which should have been identical." }, { "ER_GIS_UNSUPPORTED_ARGUMENT", 3034, "Calling geometry function %s with unsupported types of arguments." }, { "ER_GIS_UNKNOWN_ERROR", 3035, "Unknown GIS error occured in function %s." }, { "ER_GIS_UNKNOWN_EXCEPTION", 3036, "Unknown exception caught in GIS function %s." }, { "ER_GIS_INVALID_DATA", 3037, "Invalid GIS data provided to function %s." }, { "ER_BOOST_GEOMETRY_EMPTY_INPUT_EXCEPTION", 3038, "The geometry has no data in function %s." }, { "ER_BOOST_GEOMETRY_CENTROID_EXCEPTION", 3039, "Unable to calculate centroid because geometry is empty in function %s." }, { "ER_BOOST_GEOMETRY_OVERLAY_INVALID_INPUT_EXCEPTION", 3040, "Geometry overlay calculation error: geometry data is invalid in function %s." }, { "ER_BOOST_GEOMETRY_TURN_INFO_EXCEPTION", 3041, "Geometry turn info calculation error: geometry data is invalid in function %s." }, { "ER_BOOST_GEOMETRY_SELF_INTERSECTION_POINT_EXCEPTION", 3042, "Analysis procedures of intersection points interrupted unexpectedly in function %s." }, { "ER_BOOST_GEOMETRY_UNKNOWN_EXCEPTION", 3043, "Unknown exception thrown in function %s." }, { "ER_STD_BAD_ALLOC_ERROR", 3044, "Memory allocation error: %-.256s in function %s." }, { "ER_STD_DOMAIN_ERROR", 3045, "Domain error: %-.256s in function %s." }, { "ER_STD_LENGTH_ERROR", 3046, "Length error: %-.256s in function %s." }, { "ER_STD_INVALID_ARGUMENT", 3047, "Invalid argument error: %-.256s in function %s." }, { "ER_STD_OUT_OF_RANGE_ERROR", 3048, "Out of range error: %-.256s in function %s." }, { "ER_STD_OVERFLOW_ERROR", 3049, "Overflow error error: %-.256s in function %s." }, { "ER_STD_RANGE_ERROR", 3050, "Range error: %-.256s in function %s." }, { "ER_STD_UNDERFLOW_ERROR", 3051, "Underflow error: %-.256s in function %s." }, { "ER_STD_LOGIC_ERROR", 3052, "Logic error: %-.256s in function %s." }, { "ER_STD_RUNTIME_ERROR", 3053, "Runtime error: %-.256s in function %s." }, { "ER_STD_UNKNOWN_EXCEPTION", 3054, "Unknown exception: %-.384s in function %s." }, { "ER_GIS_DATA_WRONG_ENDIANESS", 3055, "Geometry byte string must be little endian." }, { "ER_CHANGE_MASTER_PASSWORD_LENGTH", 3056, "The password provided for the replication user exceeds the maximum length of 32 characters" }, { "ER_USER_LOCK_WRONG_NAME", 3057, "Incorrect user-level lock name \'%-.192s\'." }, { "ER_USER_LOCK_DEADLOCK", 3058, "Deadlock found when trying to get user-level lock; try rolling back transaction/releasing locks and restarting lock acquisition." }, { "ER_REPLACE_INACCESSIBLE_ROWS", 3059, "REPLACE cannot be executed as it requires deleting rows that are not in the view" }, { "ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_GIS", 3060, "Do not support online operation on table with GIS index" }, { "ER_ILLEGAL_USER_VAR", 3061, "User variable name \'%-.100s\' is illegal" }, { "ER_GTID_MODE_OFF", 3062, "Cannot %s when GTID_MODE = OFF." }, { "ER_UNSUPPORTED_BY_REPLICATION_THREAD", 3063, "Cannot %s from a replication slave thread." }, { "ER_INCORRECT_TYPE", 3064, "Incorrect type for argument %s in function %s." }, { "ER_FIELD_IN_ORDER_NOT_SELECT", 3065, "Expression #%u of ORDER BY clause is not in SELECT list, references column \'%-.192s\' which is not in SELECT list; this is incompatible with %s" }, { "ER_AGGREGATE_IN_ORDER_NOT_SELECT", 3066, "Expression #%u of ORDER BY clause is not in SELECT list, contains aggregate function; this is incompatible with %s" }, { "ER_INVALID_RPL_WILD_TABLE_FILTER_PATTERN", 3067, "Supplied filter list contains a value which is not in the required format \'db_pattern.table_pattern\'" }, { "ER_NET_OK_PACKET_TOO_LARGE", 3068, "OK packet too large" }, { "ER_INVALID_JSON_DATA", 3069, "Invalid JSON data provided to function %s: %s" }, { "ER_INVALID_GEOJSON_MISSING_MEMBER", 3070, "Invalid GeoJSON data provided to function %s: Missing required member \'%s\'" }, { "ER_INVALID_GEOJSON_WRONG_TYPE", 3071, "Invalid GeoJSON data provided to function %s: Member \'%s\' must be of type \'%s\'" }, { "ER_INVALID_GEOJSON_UNSPECIFIED", 3072, "Invalid GeoJSON data provided to function %s" }, { "ER_DIMENSION_UNSUPPORTED", 3073, "Unsupported number of coordinate dimensions in function %s: Found %u, expected %u" }, { "ER_SLAVE_CHANNEL_DOES_NOT_EXIST", 3074, "Slave channel \'%s\' does not exist." }, { "ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT", 3075, "A slave channel \'%s\' already exists for the given host and port combination." }, { "ER_SLAVE_CHANNEL_NAME_INVALID_OR_TOO_LONG", 3076, "Couldn\'t create channel: Channel name is either invalid or too long." }, { "ER_SLAVE_NEW_CHANNEL_WRONG_REPOSITORY", 3077, "To have multiple channels, repository cannot be of type FILE; Please check the repository configuration and convert them to TABLE." }, { "ER_SLAVE_CHANNEL_DELETE", 3078, "Cannot delete slave info objects for channel \'%s\'." }, { "ER_SLAVE_MULTIPLE_CHANNELS_CMD", 3079, "Multiple channels exist on the slave. Please provide channel name as an argument." }, { "ER_SLAVE_MAX_CHANNELS_EXCEEDED", 3080, "Maximum number of replication channels allowed exceeded." }, { "ER_SLAVE_CHANNEL_MUST_STOP", 3081, "This operation cannot be performed with running replication threads; run STOP SLAVE FOR CHANNEL \'%s\' first" }, { "ER_SLAVE_CHANNEL_NOT_RUNNING", 3082, "This operation requires running replication threads; configure slave and run START SLAVE FOR CHANNEL \'%s\'" }, { "ER_SLAVE_CHANNEL_WAS_RUNNING", 3083, "Replication thread(s) for channel \'%s\' are already runnning." }, { "ER_SLAVE_CHANNEL_WAS_NOT_RUNNING", 3084, "Replication thread(s) for channel \'%s\' are already stopped." }, { "ER_SLAVE_CHANNEL_SQL_THREAD_MUST_STOP", 3085, "This operation cannot be performed with a running slave sql thread; run STOP SLAVE SQL_THREAD FOR CHANNEL \'%s\' first." }, { "ER_SLAVE_CHANNEL_SQL_SKIP_COUNTER", 3086, "When sql_slave_skip_counter > 0, it is not allowed to start more than one SQL thread by using \'START SLAVE [SQL_THREAD]\'. Value of sql_slave_skip_counter can only be used by one SQL thread at a time. Please use \'START SLAVE [SQL_THREAD] FOR CHANNEL\' to start the SQL thread which will use the value of sql_slave_skip_counter." }, { "ER_WRONG_FIELD_WITH_GROUP_V2", 3087, "Expression #%u of %s is not in GROUP BY clause and contains nonaggregated column \'%-.192s\' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by" }, { "ER_MIX_OF_GROUP_FUNC_AND_FIELDS_V2", 3088, "In aggregated query without GROUP BY, expression #%u of %s contains nonaggregated column \'%-.192s\'; this is incompatible with sql_mode=only_full_group_by" }, { "ER_WARN_DEPRECATED_SYSVAR_UPDATE", 3089, "Updating \'%s\' is deprecated. It will be made read-only in a future release." }, { "ER_WARN_DEPRECATED_SQLMODE", 3090, "Changing sql mode \'%s\' is deprecated. It will be removed in a future release." }, { "ER_CANNOT_LOG_PARTIAL_DROP_DATABASE_WITH_GTID", 3091, "DROP DATABASE failed; some tables may have been dropped but the database directory remains. The GTID has not been added to GTID_EXECUTED and the statement was not written to the binary log. Fix this as follows: (1) remove all files from the database directory %-.192s; (2) SET GTID_NEXT=\'%-.192s\'; (3) DROP DATABASE `%-.192s`." }, { "ER_GROUP_REPLICATION_CONFIGURATION", 3092, "The server is not configured properly to be an active member of the group. Please see more details on error log." }, { "ER_GROUP_REPLICATION_RUNNING", 3093, "The START GROUP_REPLICATION command failed since the group is already running." }, { "ER_GROUP_REPLICATION_APPLIER_INIT_ERROR", 3094, "The START GROUP_REPLICATION command failed as the applier module failed to start." }, { "ER_GROUP_REPLICATION_STOP_APPLIER_THREAD_TIMEOUT", 3095, "The STOP GROUP_REPLICATION command execution is incomplete: The applier thread got the stop signal while it was busy. The applier thread will stop once the current task is complete." }, { "ER_GROUP_REPLICATION_COMMUNICATION_LAYER_SESSION_ERROR", 3096, "The START GROUP_REPLICATION command failed as there was an error when initializing the group communication layer." }, { "ER_GROUP_REPLICATION_COMMUNICATION_LAYER_JOIN_ERROR", 3097, "The START GROUP_REPLICATION command failed as there was an error when joining the communication group." }, { "ER_BEFORE_DML_VALIDATION_ERROR", 3098, "The table does not comply with the requirements by an external plugin." }, { "ER_PREVENTS_VARIABLE_WITHOUT_RBR", 3099, "Cannot change the value of variable %s without binary log format as ROW." }, { "ER_RUN_HOOK_ERROR", 3100, "Error on observer while running replication hook \'%s\'." }, { "ER_TRANSACTION_ROLLBACK_DURING_COMMIT", 3101, "Plugin instructed the server to rollback the current transaction." }, { "ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED", 3102, "Expression of generated column \'%s\' contains a disallowed function." }, { "ER_UNSUPPORTED_ALTER_INPLACE_ON_VIRTUAL_COLUMN", 3103, "INPLACE ADD or DROP of virtual columns cannot be combined with other ALTER TABLE actions" }, { "ER_WRONG_FK_OPTION_FOR_GENERATED_COLUMN", 3104, "Cannot define foreign key with %s clause on a generated column." }, { "ER_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN", 3105, "The value specified for generated column \'%s\' in table \'%s\' is not allowed." }, { "ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN", 3106, "\'%s\' is not supported for generated columns." }, { "ER_GENERATED_COLUMN_NON_PRIOR", 3107, "Generated column can refer only to generated columns defined prior to it." }, { "ER_DEPENDENT_BY_GENERATED_COLUMN", 3108, "Column \'%s\' has a generated column dependency." }, { "ER_GENERATED_COLUMN_REF_AUTO_INC", 3109, "Generated column \'%s\' cannot refer to auto-increment column." }, { "ER_FEATURE_NOT_AVAILABLE", 3110, "The \'%-.64s\' feature is not available; you need to remove \'%-.64s\' or use MySQL built with \'%-.64s\'" }, { "ER_CANT_SET_GTID_MODE", 3111, "SET @@GLOBAL.GTID_MODE = %-.64s is not allowed because %-.384s." }, { "ER_CANT_USE_AUTO_POSITION_WITH_GTID_MODE_OFF", 3112, "The replication receiver thread%-.192s cannot start in AUTO_POSITION mode: this server uses @@GLOBAL.GTID_MODE = OFF." }, { "ER_CANT_REPLICATE_ANONYMOUS_WITH_AUTO_POSITION", 3113, "Cannot replicate anonymous transaction when AUTO_POSITION = 1, at file %.512s, position %lld." }, { "ER_CANT_REPLICATE_ANONYMOUS_WITH_GTID_MODE_ON", 3114, "Cannot replicate anonymous transaction when @@GLOBAL.GTID_MODE = ON, at file %.512s, position %lld." }, { "ER_CANT_REPLICATE_GTID_WITH_GTID_MODE_OFF", 3115, "Cannot replicate GTID-transaction when @@GLOBAL.GTID_MODE = OFF, at file %.512s, position %lld." }, { "ER_CANT_SET_ENFORCE_GTID_CONSISTENCY_ON_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS", 3116, "Cannot set ENFORCE_GTID_CONSISTENCY = ON because there are ongoing transactions that violate GTID consistency." }, { "ER_SET_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS", 3117, "There are ongoing transactions that violate GTID consistency." }, { "ER_ACCOUNT_HAS_BEEN_LOCKED", 3118, "Access denied for user \'%-.48s\'@\'%-.64s\'. Account is locked." }, { "ER_WRONG_TABLESPACE_NAME", 3119, "Incorrect tablespace name `%-.192s`" }, { "ER_TABLESPACE_IS_NOT_EMPTY", 3120, "Tablespace `%-.192s` is not empty." }, { "ER_WRONG_FILE_NAME", 3121, "Incorrect File Name \'%s\'." }, { "ER_BOOST_GEOMETRY_INCONSISTENT_TURNS_EXCEPTION", 3122, "Inconsistent intersection points." }, { "ER_WARN_OPTIMIZER_HINT_SYNTAX_ERROR", 3123, "Optimizer hint syntax error" }, { "ER_WARN_BAD_MAX_EXECUTION_TIME", 3124, "Unsupported MAX_EXECUTION_TIME" }, { "ER_WARN_UNSUPPORTED_MAX_EXECUTION_TIME", 3125, "MAX_EXECUTION_TIME hint is supported by top-level standalone SELECT statements only" }, { "ER_WARN_CONFLICTING_HINT", 3126, "Hint %s is ignored as conflicting/duplicated" }, { "ER_WARN_UNKNOWN_QB_NAME", 3127, "Query block name %s is not found for %s hint" }, { "ER_UNRESOLVED_HINT_NAME", 3128, "Unresolved name %s for %s hint" }, { "ER_WARN_ON_MODIFYING_GTID_EXECUTED_TABLE", 3129, "Please do not modify the %s table. This is a mysql internal system table to store GTIDs for committed transactions. Modifying it can lead to an inconsistent GTID state." }, { "ER_PLUGGABLE_PROTOCOL_COMMAND_NOT_SUPPORTED", 3130, "Command not supported by pluggable protocols" }, { "ER_LOCKING_SERVICE_WRONG_NAME", 3131, "Incorrect locking service lock name \'%-.192s\'." }, { "ER_LOCKING_SERVICE_DEADLOCK", 3132, "Deadlock found when trying to get locking service lock; try releasing locks and restarting lock acquisition." }, { "ER_LOCKING_SERVICE_TIMEOUT", 3133, "Service lock wait timeout exceeded." }, { "ER_GIS_MAX_POINTS_IN_GEOMETRY_OVERFLOWED", 3134, "Parameter %s exceeds the maximum number of points in a geometry (%lu) in function %s." }, { "ER_SQL_MODE_MERGED", 3135, "\'NO_ZERO_DATE\', \'NO_ZERO_IN_DATE\' and \'ERROR_FOR_DIVISION_BY_ZERO\' sql modes should be used with strict mode. They will be merged with strict mode in a future release." }, { "ER_VTOKEN_PLUGIN_TOKEN_MISMATCH", 3136, "Version token mismatch for %.*s. Correct value %.*s" }, { "ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND", 3137, "Version token %.*s not found." }, { "ER_CANT_SET_VARIABLE_WHEN_OWNING_GTID", 3138, "Variable %-.192s cannot be changed by a client that owns a GTID. The client owns %s. Ownership is released on COMMIT or ROLLBACK." }, { "ER_SLAVE_CHANNEL_OPERATION_NOT_ALLOWED", 3139, "%-.192s cannot be performed on channel \'%-.192s\'." }, { "ER_INVALID_JSON_TEXT", 3140, "Invalid JSON text: \"%s\" at position %u in value for column \'%-.200s\'." }, { "ER_INVALID_JSON_TEXT_IN_PARAM", 3141, "Invalid JSON text in argument %u to function %s: \"%s\" at position %u.%-.0s" }, { "ER_INVALID_JSON_BINARY_DATA", 3142, "The JSON binary value contains invalid data." }, { "ER_INVALID_JSON_PATH", 3143, "Invalid JSON path expression. The error is around character position %u.%-.200s" }, { "ER_INVALID_JSON_CHARSET", 3144, "Cannot create a JSON value from a string with CHARACTER SET \'%s\'." }, { "ER_INVALID_JSON_CHARSET_IN_FUNCTION", 3145, "Invalid JSON character data provided to function %s: \'%s\'; utf8 is required." }, { "ER_INVALID_TYPE_FOR_JSON", 3146, "Invalid data type for JSON data in argument %u to function %s; a JSON string or JSON type is required." }, { "ER_INVALID_CAST_TO_JSON", 3147, "Cannot CAST value to JSON." }, { "ER_INVALID_JSON_PATH_CHARSET", 3148, "A path expression must be encoded in the utf8 character set. The path expression \'%-.200s\' is encoded in character set \'%-.200s\'." }, { "ER_INVALID_JSON_PATH_WILDCARD", 3149, "In this situation, path expressions may not contain the * and ** tokens." }, { "ER_JSON_VALUE_TOO_BIG", 3150, "The JSON value is too big to be stored in a JSON column." }, { "ER_JSON_KEY_TOO_BIG", 3151, "The JSON object contains a key name that is too long." }, { "ER_JSON_USED_AS_KEY", 3152, "JSON column \'%-.192s\' cannot be used in key specification." }, { "ER_JSON_VACUOUS_PATH", 3153, "The path expression \'$\' is not allowed in this context." }, { "ER_JSON_BAD_ONE_OR_ALL_ARG", 3154, "The oneOrAll argument to %s may take these values: \'one\' or \'all\'." }, { "ER_NUMERIC_JSON_VALUE_OUT_OF_RANGE", 3155, "Out of range JSON value for CAST to %s%-.0s from column %s at row %ld" }, { "ER_INVALID_JSON_VALUE_FOR_CAST", 3156, "Invalid JSON value for CAST to %s%-.0s from column %s at row %ld" }, { "ER_JSON_DOCUMENT_TOO_DEEP", 3157, "The JSON document exceeds the maximum depth." }, { "ER_JSON_DOCUMENT_NULL_KEY", 3158, "JSON documents may not contain NULL member names." }, { "ER_SECURE_TRANSPORT_REQUIRED", 3159, "Connections using insecure transport are prohibited while --require_secure_transport=ON." }, { "ER_NO_SECURE_TRANSPORTS_CONFIGURED", 3160, "No secure transports (SSL or Shared Memory) are configured, unable to set --require_secure_transport=ON." }, { "ER_DISABLED_STORAGE_ENGINE", 3161, "Storage engine %s is disabled (Table creation is disallowed)." }, { "ER_USER_DOES_NOT_EXIST", 3162, "User %s does not exist." }, { "ER_USER_ALREADY_EXISTS", 3163, "User %s already exists." }, { "ER_AUDIT_API_ABORT", 3164, "Aborted by Audit API (\'%-.48s\';%d)." }, { "ER_INVALID_JSON_PATH_ARRAY_CELL", 3165, "A path expression is not a path to a cell in an array." }, { "ER_BUFPOOL_RESIZE_INPROGRESS", 3166, "Another buffer pool resize is already in progress." }, { "ER_FEATURE_DISABLED_SEE_DOC", 3167, "The \'%s\' feature is disabled; see the documentation for \'%s\'" }, { "ER_SERVER_ISNT_AVAILABLE", 3168, "Server isn\'t available" }, { "ER_SESSION_WAS_KILLED", 3169, "Session was killed" }, { "ER_CAPACITY_EXCEEDED", 3170, "Memory capacity of %llu bytes for \'%s\' exceeded. %s" }, { "ER_CAPACITY_EXCEEDED_IN_RANGE_OPTIMIZER", 3171, "Range optimization was not done for this query." }, { "ER_TABLE_NEEDS_UPG_PART", 3172, "Partitioning upgrade required. Please dump/reload to fix it or do: ALTER TABLE `%-.192s`.`%-.192s` UPGRADE PARTITIONING" }, { "ER_CANT_WAIT_FOR_EXECUTED_GTID_SET_WHILE_OWNING_A_GTID", 3173, "The client holds ownership of the GTID %s. Therefore, WAIT_FOR_EXECUTED_GTID_SET cannot wait for this GTID." }, { "ER_CANNOT_ADD_FOREIGN_BASE_COL_VIRTUAL", 3174, "Cannot add foreign key on the base column of indexed virtual column." }, { "ER_CANNOT_CREATE_VIRTUAL_INDEX_CONSTRAINT", 3175, "Cannot create index on virtual column whose base column has foreign constraint." }, { "ER_ERROR_ON_MODIFYING_GTID_EXECUTED_TABLE", 3176, "Please do not modify the %s table with an XA transaction. This is an internal system table used to store GTIDs for committed transactions. Although modifying it can lead to an inconsistent GTID state, if neccessary you can modify it with a non-XA transaction." }, { "ER_LOCK_REFUSED_BY_ENGINE", 3177, "Lock acquisition refused by storage engine." }, { "ER_UNSUPPORTED_ALTER_ONLINE_ON_VIRTUAL_COLUMN", 3178, "ADD COLUMN col...VIRTUAL, ADD INDEX(col)" }, { "ER_MASTER_KEY_ROTATION_NOT_SUPPORTED_BY_SE", 3179, "Master key rotation is not supported by storage engine." }, { "ER_MASTER_KEY_ROTATION_ERROR_BY_SE", 3180, "Encryption key rotation error reported by SE: %s" }, { "ER_MASTER_KEY_ROTATION_BINLOG_FAILED", 3181, "Write to binlog failed. However, master key rotation has been completed successfully." }, { "ER_MASTER_KEY_ROTATION_SE_UNAVAILABLE", 3182, "Storage engine is not available." }, { "ER_TABLESPACE_CANNOT_ENCRYPT", 3183, "This tablespace can\'t be encrypted." }, { "ER_INVALID_ENCRYPTION_OPTION", 3184, "Invalid encryption option." }, { "ER_CANNOT_FIND_KEY_IN_KEYRING", 3185, "Can\'t find master key from keyring, please check in the server log if a keyring plugin is loaded and initialized successfully." }, { "ER_CAPACITY_EXCEEDED_IN_PARSER", 3186, "Parser bailed out for this query." }, { "ER_UNSUPPORTED_ALTER_ENCRYPTION_INPLACE", 3187, "Cannot alter encryption attribute by inplace algorithm." }, { "ER_KEYRING_UDF_KEYRING_SERVICE_ERROR", 3188, "Function \'%s\' failed because underlying keyring service returned an error. Please check if a keyring plugin is installed and that provided arguments are valid for the keyring you are using." }, { "ER_USER_COLUMN_OLD_LENGTH", 3189, "It seems that your db schema is old. The %s column is 77 characters long and should be 93 characters long. Please run mysql_upgrade." }, { "ER_CANT_RESET_MASTER", 3190, "RESET MASTER is not allowed because %-.384s." }, { "ER_GROUP_REPLICATION_MAX_GROUP_SIZE", 3191, "The START GROUP_REPLICATION command failed since the group already has 9 members." }, { "ER_CANNOT_ADD_FOREIGN_BASE_COL_STORED", 3192, "Cannot add foreign key on the base column of stored column. " }, { "ER_TABLE_REFERENCED", 3193, "Cannot complete the operation because table is referenced by another connection." }, { "ER_PARTITION_ENGINE_DEPRECATED_FOR_TABLE", 3194, "The partition engine, used by table \'%-.192s.%-.192s\', is deprecated and will be removed in a future release. Please use native partitioning instead." }, { "ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID_ZERO", 3195, "%.192s(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use %.192s(st_aswkb(geometry), 0) instead." }, { "ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID", 3196, "%.192s(geometry, srid) is deprecated and will be replaced by st_srid(geometry, srid) in a future version. Use %.192s(st_aswkb(geometry), srid) instead." }, { "ER_XA_RETRY", 3197, "The resource manager is not able to commit the transaction branch at this time. Please retry later." }, { "ER_KEYRING_AWS_UDF_AWS_KMS_ERROR", 3198, "Function %s failed due to: %s." }, { "ER_BINLOG_UNSAFE_XA", 3199, "Statement is unsafe because it is being used inside a XA transaction. Concurrent XA transactions may deadlock on slaves when replicated using statements." }, { "ER_UDF_ERROR", 3200, "%s UDF failed; %s" }, { "ER_KEYRING_MIGRATION_FAILURE", 3201, "Can not perform keyring migration : %s" }, { "ER_KEYRING_ACCESS_DENIED_ERROR", 3202, "Access denied; you need %-.128s privileges for this operation" }, { "ER_KEYRING_MIGRATION_STATUS", 3203, "Keyring migration %s." }, { "ER_PLUGIN_FAILED_TO_OPEN_TABLES", 3204, "Failed to open the %s filter tables." }, { "ER_PLUGIN_FAILED_TO_OPEN_TABLE", 3205, "Failed to open \'%s.%s\' %s table." }, { "ER_AUDIT_LOG_NO_KEYRING_PLUGIN_INSTALLED", 3206, "No keyring plugin installed." }, { "ER_AUDIT_LOG_ENCRYPTION_PASSWORD_HAS_NOT_BEEN_SET", 3207, "Audit log encryption password has not been set; it will be generated automatically. Use audit_log_encryption_password_get to obtain the password or audit_log_encryption_password_set to set a new one." }, { "ER_AUDIT_LOG_COULD_NOT_CREATE_AES_KEY", 3208, "Could not create AES key. OpenSSL\'s EVP_BytesToKey function failed." }, { "ER_AUDIT_LOG_ENCRYPTION_PASSWORD_CANNOT_BE_FETCHED", 3209, "Audit log encryption password cannot be fetched from the keyring. Password used so far is used for encryption." }, { "ER_AUDIT_LOG_JSON_FILTERING_NOT_ENABLED", 3210, "Audit Log filtering has not been installed." }, { "ER_AUDIT_LOG_UDF_INSUFFICIENT_PRIVILEGE", 3211, "Request ignored for \'%s\'@\'%s\'. SUPER_ACL needed to perform operation" }, { "ER_AUDIT_LOG_SUPER_PRIVILEGE_REQUIRED", 3212, "SUPER privilege required for \'%s\'@\'%s\' user." }, { "ER_COULD_NOT_REINITIALIZE_AUDIT_LOG_FILTERS", 3213, "Could not reinitialize audit log filters." }, { "ER_AUDIT_LOG_UDF_INVALID_ARGUMENT_TYPE", 3214, "Invalid argument type" }, { "ER_AUDIT_LOG_UDF_INVALID_ARGUMENT_COUNT", 3215, "Invalid argument count" }, { "ER_AUDIT_LOG_HAS_NOT_BEEN_INSTALLED", 3216, "audit_log plugin has not been installed using INSTALL PLUGIN syntax." }, { "ER_AUDIT_LOG_UDF_READ_INVALID_MAX_ARRAY_LENGTH_ARG_TYPE", 3217, "Invalid \"max_array_length\" argument type." }, { "ER_AUDIT_LOG_UDF_READ_INVALID_MAX_ARRAY_LENGTH_ARG_VALUE", 3218, "Invalid \"max_array_length\" argument value." }, { "ER_AUDIT_LOG_JSON_FILTER_PARSING_ERROR", 3219, "%s" }, { "ER_AUDIT_LOG_JSON_FILTER_NAME_CANNOT_BE_EMPTY", 3220, "Filter name cannot be empty." }, { "ER_AUDIT_LOG_JSON_USER_NAME_CANNOT_BE_EMPTY", 3221, "User cannot be empty." }, { "ER_AUDIT_LOG_JSON_FILTER_DOES_NOT_EXISTS", 3222, "Specified filter has not been found." }, { "ER_AUDIT_LOG_USER_FIRST_CHARACTER_MUST_BE_ALPHANUMERIC", 3223, "First character of the user name must be alphanumeric." }, { "ER_AUDIT_LOG_USER_NAME_INVALID_CHARACTER", 3224, "Invalid character in the user name." }, { "ER_AUDIT_LOG_HOST_NAME_INVALID_CHARACTER", 3225, "Invalid character in the host name." }, { "WARN_DEPRECATED_MAXDB_SQL_MODE_FOR_TIMESTAMP", 3226, "With the MAXDB SQL mode enabled, TIMESTAMP is identical with DATETIME. The MAXDB SQL mode is deprecated and will be removed in a future release. Please disable the MAXDB SQL mode and use DATETIME instead." }, { "ER_XA_REPLICATION_FILTERS", 3227, "The use of replication filters with XA transactions is not supported, and can lead to an undefined state in the replication slave." }, { "ER_COMPRESSED_COLUMN_USED_AS_KEY", 3228, "Compressed column \'%-.192s\' is not allowed in the key list" }, { "ER_UNSUPPORTED_COMPRESSED_COLUMN_TYPE", 3229, "Can not define column \'%-.192s\' in compressed format" }, { "ER_COMPRESSION_DICTIONARY_EXISTS", 3230, "Compression dictionary \'%-.192s\' already exists" }, { "ER_COMPRESSION_DICTIONARY_DOES_NOT_EXIST", 3231, "Compression dictionary \'%-.192s\' does not exist" }, { "ER_COMPRESSION_DICTIONARY_NAME_TOO_LONG", 3232, "Compression dictionary name \'%-.192s\' is too long (max length = %lu)" }, { "ER_COMPRESSION_DICTIONARY_DATA_TOO_LONG", 3233, "Data for compression dictionary \'%-.192s\' is too long (max length = %lu)" }, { "ER_COMPRESSION_DICTIONARY_IS_REFERENCED", 3234, "Compression dictionary \'%-.192s\' is in use" }, { "ER_CANT_EXECUTE_WITH_BACKUP_LOCK", 3235, "Can\'t execute the query because you have a conflicting backup lock" }, { "ER_KEYS_OUT_OF_ORDER", 12000, "Keys are out order during bulk load" }, { "ER_OVERLAPPING_KEYS", 12001, "Bulk load rows overlap existing rows" }, { "ER_REQUIRE_ROW_BINLOG_FORMAT", 12002, "Can\'t execute updates on master with binlog_format != ROW." }, { "ER_ISOLATION_MODE_NOT_SUPPORTED", 12003, "MyRocks supports only READ COMMITTED and REPEATABLE READ isolation levels. Please change from current isolation level %s" }, { "ER_ON_DUPLICATE_DISABLED", 12004, "When unique checking is disabled in MyRocks, INSERT,UPDATE,LOAD statements with clauses that update or replace the key (i.e. INSERT ON DUPLICATE KEY UPDATE, REPLACE) are not allowed. Query: %s" }, { "ER_UPDATES_WITH_CONSISTENT_SNAPSHOT", 12005, "Can\'t execute updates when you started a transaction with START TRANSACTION WITH CONSISTENT [ROCKSDB] SNAPSHOT." }, { "ER_ROLLBACK_ONLY", 12006, "This transaction was rolled back and cannot be committed. Only supported operation is to roll it back, so all pending changes will be discarded. Please restart another transaction." }, { "ER_ROLLBACK_TO_SAVEPOINT", 12007, "MyRocks currently does not support ROLLBACK TO SAVEPOINT if modifying rows." }, { "ER_ISOLATION_LEVEL_WITH_CONSISTENT_SNAPSHOT", 12008, "Only REPEATABLE READ isolation level is supported for START TRANSACTION WITH CONSISTENT SNAPSHOT in RocksDB Storage Engine." }, { "ER_UNSUPPORTED_COLLATION", 12009, "Unsupported collation on string indexed column %s.%s Use binary collation (%s)." }, { "ER_METADATA_INCONSISTENCY", 12010, "Table \'%s\' does not exist, but metadata information exists inside MyRocks. This is a sign of data inconsistency. Please check if \'%s.frm\' exists, and try to restore it if it does not exist." }, { "ER_KEY_CREATE_DURING_ALTER", 12011, "MyRocks failed creating new key definitions during alter." }, { "ER_SK_POPULATE_DURING_ALTER", 12012, "MyRocks failed populating secondary key during alter." }, { "ER_CF_DIFFERENT", 12013, "Column family (\'%s\') flag (%d) is different from an existing flag (%d). Assign a new CF flag, or do not change existing CF flag." }, { "ER_RDB_TTL_UNSUPPORTED", 12014, "TTL support is currently disabled when table has a hidden PK." }, { "ER_RDB_TTL_COL_FORMAT", 12015, "TTL column (%s) in MyRocks must be an unsigned non-null 64-bit integer, exist inside the table, and have an accompanying ttl duration." }, { "ER_RDB_TTL_DURATION_FORMAT", 12016, "TTL duration (%s) in MyRocks must be an unsigned non-null 64-bit integer." }, { "ER_PER_INDEX_CF_DEPRECATED", 12017, "The per-index column family option has been deprecated." }, PKp #include "my_thread.h" C_MODE_START #ifdef _WIN32 typedef CRITICAL_SECTION native_mutex_t; typedef int native_mutexattr_t; #else typedef pthread_mutex_t native_mutex_t; typedef pthread_mutexattr_t native_mutexattr_t; #endif /* Define mutex types, see my_thr_init.c */ #define MY_MUTEX_INIT_SLOW NULL /* Can be set in /usr/include/pthread.h */ #ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP extern native_mutexattr_t my_fast_mutexattr; #define MY_MUTEX_INIT_FAST &my_fast_mutexattr #else #define MY_MUTEX_INIT_FAST NULL #endif /* Can be set in /usr/include/pthread.h */ #ifdef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP extern native_mutexattr_t my_errorcheck_mutexattr; #define MY_MUTEX_INIT_ERRCHK &my_errorcheck_mutexattr #else #define MY_MUTEX_INIT_ERRCHK NULL #endif static inline int native_mutex_init(native_mutex_t *mutex, const native_mutexattr_t *attr) { #ifdef _WIN32 InitializeCriticalSection(mutex); return 0; #else return pthread_mutex_init(mutex, attr); #endif } static inline int native_mutex_lock(native_mutex_t *mutex) { #ifdef _WIN32 EnterCriticalSection(mutex); return 0; #else return pthread_mutex_lock(mutex); #endif } static inline int native_mutex_trylock(native_mutex_t *mutex) { #ifdef _WIN32 if (TryEnterCriticalSection(mutex)) { /* Don't allow recursive lock */ if (mutex->RecursionCount > 1){ LeaveCriticalSection(mutex); return EBUSY; } return 0; } return EBUSY; #else return pthread_mutex_trylock(mutex); #endif } static inline int native_mutex_unlock(native_mutex_t *mutex) { #ifdef _WIN32 LeaveCriticalSection(mutex); return 0; #else return pthread_mutex_unlock(mutex); #endif } static inline int native_mutex_destroy(native_mutex_t *mutex) { #ifdef _WIN32 DeleteCriticalSection(mutex); return 0; #else return pthread_mutex_destroy(mutex); #endif } #ifdef SAFE_MUTEX /* safe_mutex adds checking to mutex for easier debugging */ typedef struct st_safe_mutex_t { native_mutex_t global, mutex; const char *file; uint line, count; my_thread_t thread; } my_mutex_t; void safe_mutex_global_init(); int safe_mutex_init(my_mutex_t *mp, const native_mutexattr_t *attr, const char *file, uint line); int safe_mutex_lock(my_mutex_t *mp, my_bool try_lock, const char *file, uint line); int safe_mutex_unlock(my_mutex_t *mp, const char *file, uint line); int safe_mutex_destroy(my_mutex_t *mp, const char *file, uint line); static inline void safe_mutex_assert_owner(const my_mutex_t *mp) { DBUG_ASSERT(mp->count > 0 && my_thread_equal(my_thread_self(), mp->thread)); } static inline void safe_mutex_assert_not_owner(const my_mutex_t *mp) { DBUG_ASSERT(!mp->count || !my_thread_equal(my_thread_self(), mp->thread)); } #else typedef native_mutex_t my_mutex_t; #endif static inline int my_mutex_init(my_mutex_t *mp, const native_mutexattr_t *attr #ifdef SAFE_MUTEX , const char *file, uint line #endif ) { #ifdef SAFE_MUTEX return safe_mutex_init(mp, attr, file, line); #else return native_mutex_init(mp, attr); #endif } static inline int my_mutex_lock(my_mutex_t *mp #ifdef SAFE_MUTEX , const char *file, uint line #endif ) { #ifdef SAFE_MUTEX return safe_mutex_lock(mp, FALSE, file, line); #else return native_mutex_lock(mp); #endif } static inline int my_mutex_trylock(my_mutex_t *mp #ifdef SAFE_MUTEX , const char *file, uint line #endif ) { #ifdef SAFE_MUTEX return safe_mutex_lock(mp, TRUE, file, line); #else return native_mutex_trylock(mp); #endif } static inline int my_mutex_unlock(my_mutex_t *mp #ifdef SAFE_MUTEX , const char *file, uint line #endif ) { #ifdef SAFE_MUTEX return safe_mutex_unlock(mp, file, line); #else return native_mutex_unlock(mp); #endif } static inline int my_mutex_destroy(my_mutex_t *mp #ifdef SAFE_MUTEX , const char *file, uint line #endif ) { #ifdef SAFE_MUTEX return safe_mutex_destroy(mp, file, line); #else return native_mutex_destroy(mp); #endif } C_MODE_END #endif /* THR_MUTEX_INCLUDED */ PKpsrwlock); rwp->have_exclusive_srwlock = FALSE; return 0; #else /* pthread_rwlockattr_t is not used in MySQL */ return pthread_rwlock_init(rwp, NULL); #endif } static inline int native_rw_destroy(native_rw_lock_t *rwp) { #ifdef _WIN32 return 0; /* no destroy function */ #else return pthread_rwlock_destroy(rwp); #endif } static inline int native_rw_rdlock(native_rw_lock_t *rwp) { #ifdef _WIN32 AcquireSRWLockShared(&rwp->srwlock); return 0; #else return pthread_rwlock_rdlock(rwp); #endif } static inline int native_rw_tryrdlock(native_rw_lock_t *rwp) { #ifdef _WIN32 if (!TryAcquireSRWLockShared(&rwp->srwlock)) return EBUSY; return 0; #else return pthread_rwlock_tryrdlock(rwp); #endif } static inline int native_rw_wrlock(native_rw_lock_t *rwp) { #ifdef _WIN32 AcquireSRWLockExclusive(&rwp->srwlock); rwp->have_exclusive_srwlock= TRUE; return 0; #else return pthread_rwlock_wrlock(rwp); #endif } static inline int native_rw_trywrlock(native_rw_lock_t *rwp) { #ifdef _WIN32 if (!TryAcquireSRWLockExclusive(&rwp->srwlock)) return EBUSY; rwp->have_exclusive_srwlock= TRUE; return 0; #else return pthread_rwlock_trywrlock(rwp); #endif } static inline int native_rw_unlock(native_rw_lock_t *rwp) { #ifdef _WIN32 if (rwp->have_exclusive_srwlock) { rwp->have_exclusive_srwlock= FALSE; ReleaseSRWLockExclusive(&rwp->srwlock); } else ReleaseSRWLockShared(&rwp->srwlock); return 0; #else return pthread_rwlock_unlock(rwp); #endif } /** Portable implementation of special type of read-write locks. These locks have two properties which are unusual for rwlocks: 1) They "prefer readers" in the sense that they do not allow situations in which rwlock is rd-locked and there is a pending rd-lock which is blocked (e.g. due to pending request for wr-lock). This is a stronger guarantee than one which is provided for PTHREAD_RWLOCK_PREFER_READER_NP rwlocks in Linux. MDL subsystem deadlock detector relies on this property for its correctness. 2) They are optimized for uncontended wr-lock/unlock case. This is scenario in which they are most oftenly used within MDL subsystem. Optimizing for it gives significant performance improvements in some of tests involving many connections. Another important requirement imposed on this type of rwlock by the MDL subsystem is that it should be OK to destroy rwlock object which is in unlocked state even though some threads might have not yet fully left unlock operation for it (of course there is an external guarantee that no thread will try to lock rwlock which is destroyed). Putting it another way the unlock operation should not access rwlock data after changing its state to unlocked. TODO/FIXME: We should consider alleviating this requirement as it blocks us from doing certain performance optimizations. */ typedef struct st_rw_pr_lock_t { /** Lock which protects the structure. Also held for the duration of wr-lock. */ native_mutex_t lock; /** Condition variable which is used to wake-up writers waiting for readers to go away. */ native_cond_t no_active_readers; /** Number of active readers. */ uint active_readers; /** Number of writers waiting for readers to go away. */ uint writers_waiting_readers; /** Indicates whether there is an active writer. */ my_bool active_writer; #ifdef SAFE_MUTEX /** Thread holding wr-lock (for debug purposes only). */ my_thread_t writer_thread; #endif } rw_pr_lock_t; extern int rw_pr_init(rw_pr_lock_t *); extern int rw_pr_rdlock(rw_pr_lock_t *); extern int rw_pr_wrlock(rw_pr_lock_t *); extern int rw_pr_unlock(rw_pr_lock_t *); extern int rw_pr_destroy(rw_pr_lock_t *); static inline void rw_pr_lock_assert_write_owner(const rw_pr_lock_t *rwlock MY_ATTRIBUTE((unused))) { #ifdef SAFE_MUTEX DBUG_ASSERT(rwlock->active_writer && my_thread_equal(my_thread_self(), rwlock->writer_thread)); #endif } static inline void rw_pr_lock_assert_not_write_owner(const rw_pr_lock_t *rwlock MY_ATTRIBUTE((unused))) { #ifdef SAFE_MUTEX DBUG_ASSERT(!rwlock->active_writer || !my_thread_equal(my_thread_self(), rwlock->writer_thread)); #endif } C_MODE_END #endif /* THR_RWLOCK_INCLUDED */ PKp #define DBUG_ABORT() (_db_flush_(),\ (void)_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE),\ (void)_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR),\ _exit(2)) #endif #define DBUG_CHECK_CRASH(func, op) \ do { char _dbuf_[255]; strxnmov(_dbuf_, sizeof(_dbuf_)-1, (func), (op)); \ DBUG_EXECUTE_IF(_dbuf_, DBUG_ABORT()); } while(0) #define DBUG_CRASH_ENTER(func) \ DBUG_ENTER(func); DBUG_CHECK_CRASH(func, "_crash_enter") #define DBUG_CRASH_RETURN(val) \ DBUG_CHECK_CRASH(_db_get_func_(), "_crash_return") #define DBUG_CRASH_VOID_RETURN \ DBUG_CHECK_CRASH (_db_get_func_(), "_crash_return") /* Make the program fail, without creating a core file. abort() will send SIGABRT which (most likely) generates core. Use SIGKILL instead, which cannot be caught. We also pause the current thread, until the signal is actually delivered. An alternative would be to use _exit(EXIT_FAILURE), but then valgrind would report lots of memory leaks. */ #ifdef _WIN32 #define DBUG_SUICIDE() DBUG_ABORT() #else extern void _db_suicide_(); extern void _db_flush_gcov_(); #define DBUG_SUICIDE() (_db_flush_(), _db_suicide_()) #endif #else /* No debugger */ #define DBUG_ENTER(a1) #define DBUG_LEAVE #define DBUG_RETURN(a1) do { return(a1); } while(0) #define DBUG_VOID_RETURN do { return; } while(0) #define DBUG_EXECUTE(keyword,a1) do { } while(0) #define DBUG_EXECUTE_IF(keyword,a1) do { } while(0) #define DBUG_EVALUATE(keyword,a1,a2) (a2) #define DBUG_EVALUATE_IF(keyword,a1,a2) (a2) #define DBUG_PRINT(keyword,arglist) do { } while(0) #define DBUG_PUTS(keyword,arg) do { } while(0) #define DBUG_LOG(keyword,arglist) do { } while(0) #define DBUG_PUSH(a1) do { } while(0) #define DBUG_SET(a1) do { } while(0) #define DBUG_SET_INITIAL(a1) do { } while(0) #define DBUG_POP() do { } while(0) #define DBUG_PROCESS(a1) do { } while(0) #define DBUG_SETJMP(a1) setjmp(a1) #define DBUG_LONGJMP(a1) longjmp(a1) #define DBUG_DUMP(keyword,a1,a2) do { } while(0) #define DBUG_END() do { } while(0) #define DBUG_ASSERT(A) do { } while(0) #define DBUG_LOCK_FILE do { } while(0) #define DBUG_FILE (stderr) #define DBUG_UNLOCK_FILE do { } while(0) #define DBUG_EXPLAIN(buf,len) #define DBUG_EXPLAIN_INITIAL(buf,len) #define DEBUGGER_OFF do { } while(0) #define DEBUGGER_ON do { } while(0) #define DBUG_ABORT() do { } while(0) #define DBUG_CRASH_ENTER(func) #define DBUG_CRASH_RETURN(val) do { return(val); } while(0) #define DBUG_CRASH_VOID_RETURN do { return; } while(0) #define DBUG_SUICIDE() do { } while(0) #endif #ifdef EXTRA_DEBUG /** Sync points allow us to force the server to reach a certain line of code and block there until the client tells the server it is ok to go on. The client tells the server to block with SELECT GET_LOCK() and unblocks it with SELECT RELEASE_LOCK(). Used for debugging difficult concurrency problems */ #define DBUG_SYNC_POINT(lock_name,lock_timeout) \ debug_sync_point(lock_name,lock_timeout) void debug_sync_point(const char* lock_name, uint lock_timeout); #else #define DBUG_SYNC_POINT(lock_name,lock_timeout) #endif /* EXTRA_DEBUG */ #ifdef __cplusplus } #endif #ifdef __cplusplus #if !defined(DBUG_OFF) #include /* A C++ interface to the DBUG_PUTS macro. The DBUG_LOG macro also takes two arguments. The first argument is the keyword, as that of the DBUG_PRINT. The 2nd argument 'v' will be passed to a C++ output stream. This enables the use of C++ style output stream operator. In the code, it will be used as follows: DBUG_LOG("blob", "space: " << space_id); Note: DBUG_PRINT() has a limitation of 1024 bytes for a single print out. This limitation is not there for DBUG_PUTS and DBUG_LOG macros. */ #define DBUG_LOG(keyword, v) do { \ std::ostringstream sout; \ sout << v; \ DBUG_PUTS(keyword, sout.str().c_str()); \ } while(0) #endif /* DBUG_OFF */ #endif /* __cplusplus */ #endif /* MY_DBUG_INCLUDED */ PKp= SSL_MODE_VERIFY_CA) mysql_ssl_set(mysql, opt_ssl_key, opt_ssl_cert, opt_ssl_ca, opt_ssl_capath, opt_ssl_cipher); else mysql_ssl_set(mysql, opt_ssl_key, opt_ssl_cert, NULL, NULL, opt_ssl_cipher); mysql_options(mysql, MYSQL_OPT_SSL_CRL, opt_ssl_crl); mysql_options(mysql, MYSQL_OPT_SSL_CRLPATH, opt_ssl_crlpath); mysql_options(mysql, MYSQL_OPT_TLS_VERSION, opt_tls_version); mysql_options(mysql, MYSQL_OPT_SSL_MODE, &opt_ssl_mode); } #define SSL_SET_OPTIONS(mysql) set_client_ssl_options(mysql); #else #define SSL_SET_OPTIONS(mysql) do { } while(0) #endif #endif /* SSLOPT_VARS_INCLUDED */ PKp #endif #ifndef ETIME #define ETIME ETIMEDOUT /* For FreeBSD */ #endif #ifndef ETIMEDOUT #define ETIMEDOUT 145 /* Win32 doesn't have this */ #endif /* MySQL can survive with 32K, but some glibc libraries require > 128K stack To resolve hostnames. Also recursive stored procedures needs stack. */ #if defined(__sparc) && (defined(__SUNPRO_CC) || defined(__SUNPRO_C)) #define STACK_MULTIPLIER 2UL #else #define STACK_MULTIPLIER 1UL #endif #if SIZEOF_CHARP > 4 #define DEFAULT_THREAD_STACK (STACK_MULTIPLIER * 256UL * 1024UL) #else #define DEFAULT_THREAD_STACK (STACK_MULTIPLIER * 192UL * 1024UL) #endif #ifdef __cplusplus #define EXTERNC extern "C" #else #define EXTERNC #endif C_MODE_START #ifdef _WIN32 typedef volatile LONG my_thread_once_t; typedef DWORD my_thread_t; typedef struct thread_attr { DWORD dwStackSize; int detachstate; } my_thread_attr_t; #define MY_THREAD_CREATE_JOINABLE 0 #define MY_THREAD_CREATE_DETACHED 1 typedef void * (__cdecl *my_start_routine)(void *); #define MY_THREAD_ONCE_INIT 0 #define MY_THREAD_ONCE_INPROGRESS 1 #define MY_THREAD_ONCE_DONE 2 #else typedef pthread_once_t my_thread_once_t; typedef pthread_t my_thread_t; typedef pthread_attr_t my_thread_attr_t; #define MY_THREAD_CREATE_JOINABLE PTHREAD_CREATE_JOINABLE #define MY_THREAD_CREATE_DETACHED PTHREAD_CREATE_DETACHED typedef void *(* my_start_routine)(void *); #define MY_THREAD_ONCE_INIT PTHREAD_ONCE_INIT #endif typedef struct st_my_thread_handle { my_thread_t thread; #ifdef _WIN32 HANDLE handle; #endif } my_thread_handle; int my_thread_once(my_thread_once_t *once_control, void (*init_routine)(void)); static inline my_thread_t my_thread_self() { #ifdef _WIN32 return GetCurrentThreadId(); #else return pthread_self(); #endif } static inline int my_thread_equal(my_thread_t t1, my_thread_t t2) { #ifdef _WIN32 return t1 == t2; #else return pthread_equal(t1, t2); #endif } static inline int my_thread_attr_init(my_thread_attr_t *attr) { #ifdef _WIN32 attr->dwStackSize= 0; /* Set to joinable by default to match Linux */ attr->detachstate= MY_THREAD_CREATE_JOINABLE; return 0; #else return pthread_attr_init(attr); #endif } static inline int my_thread_attr_destroy(my_thread_attr_t *attr) { #ifdef _WIN32 attr->dwStackSize= 0; /* Set to joinable by default to match Linux */ attr->detachstate= MY_THREAD_CREATE_JOINABLE; return 0; #else return pthread_attr_destroy(attr); #endif } static inline int my_thread_attr_setstacksize(my_thread_attr_t *attr, size_t stacksize) { #ifdef _WIN32 attr->dwStackSize= (DWORD)stacksize; return 0; #else return pthread_attr_setstacksize(attr, stacksize); #endif } static inline int my_thread_attr_setdetachstate(my_thread_attr_t *attr, int detachstate) { #ifdef _WIN32 attr->detachstate= detachstate; return 0; #else return pthread_attr_setdetachstate(attr, detachstate); #endif } static inline int my_thread_attr_getstacksize(my_thread_attr_t *attr, size_t *stacksize) { #ifdef _WIN32 *stacksize= (size_t)attr->dwStackSize; return 0; #else return pthread_attr_getstacksize(attr, stacksize); #endif } static inline void my_thread_yield() { #ifdef _WIN32 SwitchToThread(); #else sched_yield(); #endif } int my_thread_create(my_thread_handle *thread, const my_thread_attr_t *attr, my_start_routine func, void *arg); int my_thread_join(my_thread_handle *thread, void **value_ptr); int my_thread_cancel(my_thread_handle *thread); void my_thread_exit(void *value_ptr); extern my_bool my_thread_global_init(); extern void my_thread_global_reinit(); extern void my_thread_global_end(); extern my_bool my_thread_init(); extern void my_thread_end(); C_MODE_END #endif /* MY_THREAD_INCLUDED */ PKp #define MYSQL_GROUP_REPLICATION_INTERFACE_VERSION 0x0101 /* Callbacks for get_connection_status_info function. context field can have NULL value, plugin will always pass it through all callbacks, independent of its value. Its value will not be used by plugin. All callbacks are mandatory. */ typedef struct st_group_replication_connection_status_callbacks { void* const context; void (*set_channel_name)(void* const context, const char& value, size_t length); void (*set_group_name)(void* const context, const char& value, size_t length); void (*set_source_uuid)(void* const context, const char& value, size_t length); void (*set_service_state)(void* const context, bool state); } GROUP_REPLICATION_CONNECTION_STATUS_CALLBACKS; /* Callbacks for get_group_members_info function. context field can have NULL value, plugin will always pass it through all callbacks, independent of its value. Its value will not be used by plugin. All callbacks are mandatory. */ typedef struct st_group_replication_group_members_callbacks { void* const context; void (*set_channel_name)(void* const context, const char& value, size_t length); void (*set_member_id)(void* const context, const char& value, size_t length); void (*set_member_host)(void* const context, const char& value, size_t length); void (*set_member_port)(void* const context, unsigned int value); void (*set_member_state)(void* const context, const char& value, size_t length); } GROUP_REPLICATION_GROUP_MEMBERS_CALLBACKS; /* Callbacks for get_group_member_stats_info function. context field can have NULL value, plugin will always pass it through all callbacks, independent of its value. Its value will not be used by plugin. All callbacks are mandatory. */ typedef struct st_group_replication_member_stats_callbacks { void* const context; void (*set_channel_name)(void* const context, const char& value, size_t length); void (*set_view_id)(void* const context, const char& value, size_t length); void (*set_member_id)(void* const context, const char& value, size_t length); void (*set_transactions_committed)(void* const context, const char& value, size_t length); void (*set_last_conflict_free_transaction)(void* const context, const char& value, size_t length); void (*set_transactions_in_queue)(void* const context, unsigned long long int value); void (*set_transactions_certified)(void* const context, unsigned long long int value); void (*set_transactions_conflicts_detected)(void* const context, unsigned long long int value); void (*set_transactions_rows_in_validation)(void* const context, unsigned long long int value); } GROUP_REPLICATION_GROUP_MEMBER_STATS_CALLBACKS; struct st_mysql_group_replication { int interface_version; /* This function is used to start the group replication. */ int (*start)(); /* This function is used to stop the group replication. */ int (*stop)(); /* This function is used to get the current group replication running status. */ bool (*is_running)(); /* This function initializes conflict checking module with info received from group on this member. @param info View_change_log_event with conflict checking info. */ int (*set_retrieved_certification_info)(void* info); /* This function is used to fetch information for group replication kernel stats. @param callbacks The set of callbacks and its context used to set the information on caller. @note The caller is responsible to free memory from the info structure and from all its fields. */ bool (*get_connection_status_info) (const GROUP_REPLICATION_CONNECTION_STATUS_CALLBACKS& callbacks); /* This function is used to fetch information for group replication members. @param callbacks The set of callbacks and its context used to set the information on caller. @note The caller is responsible to free memory from the info structure and from all its fields. */ bool (*get_group_members_info) (unsigned int index, const GROUP_REPLICATION_GROUP_MEMBERS_CALLBACKS& callbacks); /* This function is used to fetch information for group replication members statistics. @param callbacks The set of callbacks and its context used to set the information on caller. @note The caller is responsible to free memory from the info structure and from all its fields. */ bool (*get_group_member_stats_info) (const GROUP_REPLICATION_GROUP_MEMBER_STATS_CALLBACKS& callbacks); /* Get number of group replication members. */ unsigned int (*get_members_number_info)(); }; #endif PKp > sslopt-longopts.hnu[/* Copyright (c) 2000, 2016, 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 */ #if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) #ifdef MYSQL_CLIENT {"ssl-mode", OPT_SSL_MODE, "SSL connection mode.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ssl", OPT_SSL_SSL, "Deprecated. Use --ssl-mode instead.", &opt_use_ssl_arg, &opt_use_ssl_arg, 0, GET_BOOL, OPT_ARG, 1, 0, 0, 0, 0, 0}, {"ssl-verify-server-cert", OPT_SSL_VERIFY_SERVER_CERT, "Deprecated. Use --ssl-mode=VERIFY_IDENTITY instead.", &opt_ssl_verify_server_cert_arg, &opt_ssl_verify_server_cert_arg, 0, GET_BOOL, OPT_ARG, 0, 0, 0, 0, 0, 0}, #else {"ssl", OPT_SSL_SSL, "If set to ON, this option enforces that SSL is established before client " "attempts to authenticate to the server. To disable client SSL capabilities " "use --ssl=OFF.", &opt_use_ssl, &opt_use_ssl, 0, GET_BOOL, OPT_ARG, 1, 0, 0, 0, 0, 0}, #endif {"ssl-ca", OPT_SSL_CA, "CA file in PEM format.", &opt_ssl_ca, &opt_ssl_ca, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ssl-capath", OPT_SSL_CAPATH, "CA directory.", &opt_ssl_capath, &opt_ssl_capath, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ssl-cert", OPT_SSL_CERT, "X509 cert in PEM format.", &opt_ssl_cert, &opt_ssl_cert, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ssl-cipher", OPT_SSL_CIPHER, "SSL cipher to use.", &opt_ssl_cipher, &opt_ssl_cipher, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ssl-key", OPT_SSL_KEY, "X509 key in PEM format.", &opt_ssl_key, &opt_ssl_key, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ssl-crl", OPT_SSL_CRL, "Certificate revocation list.", &opt_ssl_crl, &opt_ssl_crl, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ssl-crlpath", OPT_SSL_CRLPATH, "Certificate revocation list path.", &opt_ssl_crlpath, &opt_ssl_crlpath, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"tls-version", OPT_TLS_VERSION, "TLS version to use, " #ifndef HAVE_YASSL "permitted values are: TLSv1, TLSv1.1, TLSv1.2", #else "permitted values are: TLSv1, TLSv1.1", #endif &opt_tls_version, &opt_tls_version, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #endif /* HAVE_OPENSSL */ PKp /* Data in big-endian format. */ static inline void float4store(uchar *T, float A) { *(T)= ((uchar *) &A)[3]; *((T)+1)=(char) ((uchar *) &A)[2]; *((T)+2)=(char) ((uchar *) &A)[1]; *((T)+3)=(char) ((uchar *) &A)[0]; } static inline void float4get (float *V, const uchar *M) { float def_temp; ((uchar*) &def_temp)[0]=(M)[3]; ((uchar*) &def_temp)[1]=(M)[2]; ((uchar*) &def_temp)[2]=(M)[1]; ((uchar*) &def_temp)[3]=(M)[0]; (*V)=def_temp; } static inline void float8store(uchar *T, double V) { *(T)= ((uchar *) &V)[7]; *((T)+1)=(char) ((uchar *) &V)[6]; *((T)+2)=(char) ((uchar *) &V)[5]; *((T)+3)=(char) ((uchar *) &V)[4]; *((T)+4)=(char) ((uchar *) &V)[3]; *((T)+5)=(char) ((uchar *) &V)[2]; *((T)+6)=(char) ((uchar *) &V)[1]; *((T)+7)=(char) ((uchar *) &V)[0]; } static inline void float8get (double *V, const uchar *M) { double def_temp; ((uchar*) &def_temp)[0]=(M)[7]; ((uchar*) &def_temp)[1]=(M)[6]; ((uchar*) &def_temp)[2]=(M)[5]; ((uchar*) &def_temp)[3]=(M)[4]; ((uchar*) &def_temp)[4]=(M)[3]; ((uchar*) &def_temp)[5]=(M)[2]; ((uchar*) &def_temp)[6]=(M)[1]; ((uchar*) &def_temp)[7]=(M)[0]; (*V) = def_temp; } static inline void ushortget(uint16 *V, const uchar *pM) { *V = (uint16) (((uint16) ((uchar) (pM)[1]))+ ((uint16) ((uint16) (pM)[0]) << 8)); } static inline void shortget (int16 *V, const uchar *pM) { *V = (short) (((short) ((uchar) (pM)[1]))+ ((short) ((short) (pM)[0]) << 8)); } static inline void longget (int32 *V, const uchar *pM) { int32 def_temp; ((uchar*) &def_temp)[0]=(pM)[0]; ((uchar*) &def_temp)[1]=(pM)[1]; ((uchar*) &def_temp)[2]=(pM)[2]; ((uchar*) &def_temp)[3]=(pM)[3]; (*V)=def_temp; } static inline void ulongget (uint32 *V, const uchar *pM) { uint32 def_temp; ((uchar*) &def_temp)[0]=(pM)[0]; ((uchar*) &def_temp)[1]=(pM)[1]; ((uchar*) &def_temp)[2]=(pM)[2]; ((uchar*) &def_temp)[3]=(pM)[3]; (*V)=def_temp; } static inline void shortstore(uchar *T, int16 A) { uint def_temp=(uint) (A) ; *(((char*)T)+1)=(char)(def_temp); *(((char*)T)+0)=(char)(def_temp >> 8); } static inline void longstore (uchar *T, int32 A) { *(((char*)T)+3)=((A)); *(((char*)T)+2)=(((A) >> 8)); *(((char*)T)+1)=(((A) >> 16)); *(((char*)T)+0)=(((A) >> 24)); } static inline void floatget(float *V, const uchar *M) { memcpy(V, (M), sizeof(float)); } static inline void floatstore(uchar *T, float V) { memcpy((T), (&V), sizeof(float)); } static inline void doubleget(double *V, const uchar *M) { memcpy(V, (M), sizeof(double)); } static inline void doublestore(uchar *T, double V) { memcpy((T), &V, sizeof(double)); } static inline void longlongget(longlong *V, const uchar *M) { memcpy(V, (M), sizeof(ulonglong)); } static inline void longlongstore(uchar *T, longlong V) { memcpy((T), &V, sizeof(ulonglong)); } PKp0 Must be present <0 Must not be present 0 Neither; the word is optional but its presence increases the relevance With the default settings of the ft_boolean_syntax system variable, >0 corresponds to the '+' operator, <0 corrresponds to the '-' operator, and 0 means neither operator was used. weight_adjust: A weighting factor that determines how much a match for the word counts. Positive values increase, negative - decrease the relative word's importance in the query. wasign: The sign of the word's weight in the query. If it's non-negative the match for the word will increase document relevance, if it's negative - decrease (the word becomes a "noise word", the less of it the better). trunc: Corresponds to the '*' operator in the default setting of the ft_boolean_syntax system variable. position: Start position in bytes of the word in the document, used by InnoDB FTS. */ typedef struct st_mysql_ftparser_boolean_info { enum enum_ft_token_type type; int yesno; int weight_adjust; char wasign; char trunc; int position; /* These are parser state and must be removed. */ char prev; char *quot; } MYSQL_FTPARSER_BOOLEAN_INFO; /* The following flag means that buffer with a string (document, word) may be overwritten by the caller before the end of the parsing (that is before st_mysql_ftparser::deinit() call). If one needs the string to survive between two successive calls of the parsing function, she needs to save a copy of it. The flag may be set by MySQL before calling st_mysql_ftparser::parse(), or it may be set by a plugin before calling st_mysql_ftparser_param::mysql_parse() or st_mysql_ftparser_param::mysql_add_word(). */ #define MYSQL_FTFLAGS_NEED_COPY 1 /* An argument of the full-text parser plugin. This structure is filled in by MySQL server and passed to the parsing function of the plugin as an in/out parameter. mysql_parse: A pointer to the built-in parser implementation of the server. It's set by the server and can be used by the parser plugin to invoke the MySQL default parser. If plugin's role is to extract textual data from .doc, .pdf or .xml content, it might extract plaintext from the content, and then pass the text to the default MySQL parser to be parsed. mysql_add_word: A server callback to add a new word. When parsing a document, the server sets this to point at a function that adds the word to MySQL full-text index. When parsing a search query, this function will add the new word to the list of words to search for. The boolean_info argument can be NULL for all cases except when mode is MYSQL_FTPARSER_FULL_BOOLEAN_INFO. ftparser_state: A generic pointer. The plugin can set it to point to information to be used internally for its own purposes. mysql_ftparam: This is set by the server. It is used by MySQL functions called via mysql_parse() and mysql_add_word() callback. The plugin should not modify it. cs: Information about the character set of the document or query string. doc: A pointer to the document or query string to be parsed. length: Length of the document or query string, in bytes. flags: See MYSQL_FTFLAGS_* constants above. mode: The parsing mode. With boolean operators, with stopwords, or nothing. See enum_ftparser_mode above. */ typedef struct st_mysql_ftparser_param { int (*mysql_parse)(struct st_mysql_ftparser_param *, char *doc, int doc_len); int (*mysql_add_word)(struct st_mysql_ftparser_param *, char *word, int word_len, MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info); void *ftparser_state; void *mysql_ftparam; const struct charset_info_st *cs; char *doc; int length; int flags; enum enum_ftparser_mode mode; } MYSQL_FTPARSER_PARAM; /* Full-text parser descriptor. interface_version is, e.g., MYSQL_FTPARSER_INTERFACE_VERSION. The parsing, initialization, and deinitialization functions are invoked per SQL statement for which the parser is used. */ struct st_mysql_ftparser { int interface_version; int (*parse)(MYSQL_FTPARSER_PARAM *param); int (*init)(MYSQL_FTPARSER_PARAM *param); int (*deinit)(MYSQL_FTPARSER_PARAM *param); }; #endif PKp #define bfill please_use_memset_rather_than_bfill #define bzero please_use_memset_rather_than_bzero #define bmove please_use_memmove_rather_than_bmove #define strmov please_use_my_stpcpy_or_my_stpmov_rather_than_strmov #define strnmov please_use_my_stpncpy_or_my_stpnmov_rather_than_strnmov #include "mysql/service_my_snprintf.h" #if defined(__cplusplus) extern "C" { #endif /* my_str_malloc(), my_str_realloc() and my_str_free() are assigned to implementations in strings/alloc.c, but can be overridden in the calling program. */ extern void *(*my_str_malloc)(size_t); extern void *(*my_str_realloc)(void *, size_t); extern void (*my_str_free)(void *); /* Declared in int2str() */ extern char _dig_vec_upper[]; extern char _dig_vec_lower[]; /* Prototypes for string functions */ extern void bchange(uchar *dst,size_t old_len,const uchar *src, size_t new_len,size_t tot_len); extern void strappend(char *s,size_t len,pchar fill); extern char *strend(const char *s); extern char *strcend(const char *, pchar); extern char *strfill(char * s,size_t len,pchar fill); extern char *strmake(char *dst,const char *src,size_t length); extern char *my_stpmov(char *dst,const char *src); extern char *my_stpnmov(char *dst, const char *src, size_t n); extern char *strcont(const char *src, const char *set); extern char *strxmov(char *dst, const char *src, ...); extern char *strxnmov(char *dst, size_t len, const char *src, ...); /** Copy a string from src to dst until (and including) terminating null byte. @param dst Destination @param src Source @note src and dst cannot overlap. Use my_stpmov() if src and dst overlaps. @note Unsafe, consider using my_stpnpy() instead. @return pointer to terminating null byte. */ static inline char *my_stpcpy(char *dst, const char *src) { #if defined(HAVE_BUILTIN_STPCPY) return __builtin_stpcpy(dst, src); #elif defined(HAVE_STPCPY) return stpcpy(dst, src); #else /* Fallback to implementation supporting overlap. */ return my_stpmov(dst, src); #endif } /** Copy fixed-size string from src to dst. @param dst Destination @param src Source @param n Maximum number of characters to copy. @note src and dst cannot overlap Use my_stpnmov() if src and dst overlaps. @return pointer to terminating null byte. */ static inline char *my_stpncpy(char *dst, const char *src, size_t n) { #if defined(HAVE_STPNCPY) return stpncpy(dst, src, n); #else /* Fallback to implementation supporting overlap. */ return my_stpnmov(dst, src, n); #endif } static inline longlong my_strtoll(const char *nptr, char **endptr, int base) { #if defined _WIN32 return _strtoi64(nptr, endptr, base); #else return strtoll(nptr, endptr, base); #endif } static inline ulonglong my_strtoull(const char *nptr, char **endptr, int base) { #if defined _WIN32 return _strtoui64(nptr, endptr, base); #else return strtoull(nptr, endptr, base); #endif } static inline char *my_strtok_r(char *str, const char *delim, char **saveptr) { #if defined _WIN32 return strtok_s(str, delim, saveptr); #else return strtok_r(str, delim, saveptr); #endif } /* native_ rather than my_ since my_strcasecmp already exists */ static inline int native_strcasecmp(const char *s1, const char *s2) { #if defined _WIN32 return _stricmp(s1, s2); #else return strcasecmp(s1, s2); #endif } /* native_ rather than my_ for consistency with native_strcasecmp */ static inline int native_strncasecmp(const char *s1, const char *s2, size_t n) { #if defined _WIN32 return _strnicmp(s1, s2, n); #else return strncasecmp(s1, s2, n); #endif } /* Prototypes of normal stringfunctions (with may ours) */ #ifndef HAVE_STRNLEN extern size_t strnlen(const char *s, size_t n); #endif extern int is_prefix(const char *, const char *); /* Conversion routines */ typedef enum { MY_GCVT_ARG_FLOAT, MY_GCVT_ARG_DOUBLE } my_gcvt_arg_type; double my_strtod(const char *str, char **end, int *error); double my_atof(const char *nptr); size_t my_fcvt(double x, int precision, char *to, my_bool *error); size_t my_gcvt(double x, my_gcvt_arg_type type, int width, char *to, my_bool *error); #define NOT_FIXED_DEC 31 /* The longest string my_fcvt can return is 311 + "precision" bytes. Here we assume that we never cal my_fcvt() with precision >= NOT_FIXED_DEC (+ 1 byte for the terminating '\0'). */ #define FLOATING_POINT_BUFFER (311 + NOT_FIXED_DEC) /* We want to use the 'e' format in some cases even if we have enough space for the 'f' one just to mimic sprintf("%.15g") behavior for large integers, and to improve it for numbers < 10^(-4). That is, for |x| < 1 we require |x| >= 10^(-15), and for |x| > 1 we require it to be integer and be <= 10^DBL_DIG for the 'f' format to be used. We don't lose precision, but make cases like "1e200" or "0.00001" look nicer. */ #define MAX_DECPT_FOR_F_FORMAT DBL_DIG /* The maximum possible field width for my_gcvt() conversion. (DBL_DIG + 2) significant digits + sign + "." + ("e-NNN" or MAX_DECPT_FOR_F_FORMAT zeros for cases when |x|<1 and the 'f' format is used). */ #define MY_GCVT_MAX_FIELD_WIDTH (DBL_DIG + 4 + MY_MAX(5, MAX_DECPT_FOR_F_FORMAT)) \ extern char *llstr(longlong value,char *buff); extern char *ullstr(longlong value,char *buff); extern char *int2str(long val, char *dst, int radix, int upcase); extern char *int10_to_str(long val,char *dst,int radix); extern char *str2int(const char *src,int radix,long lower,long upper, long *val); longlong my_strtoll10(const char *nptr, char **endptr, int *error); #if SIZEOF_LONG == SIZEOF_LONG_LONG #define ll2str(A,B,C,D) int2str((A),(B),(C),(D)) #define longlong10_to_str(A,B,C) int10_to_str((A),(B),(C)) #undef strtoll #define strtoll(A,B,C) strtol((A),(B),(C)) #define strtoull(A,B,C) strtoul((A),(B),(C)) #else extern char *ll2str(longlong val,char *dst,int radix, int upcase); extern char *longlong10_to_str(longlong val,char *dst,int radix); #endif #define longlong2str(A,B,C) ll2str((A),(B),(C),1) #if defined(__cplusplus) } #endif /* LEX_STRING -- a pair of a C-string and its length. (it's part of the plugin API as a MYSQL_LEX_STRING) Ditto LEX_CSTRING/MYSQL_LEX_CSTRING. */ #include typedef struct st_mysql_lex_string LEX_STRING; typedef struct st_mysql_const_lex_string LEX_CSTRING; #define STRING_WITH_LEN(X) (X), ((sizeof(X) - 1)) #define USTRING_WITH_LEN(X) ((uchar*) X), ((sizeof(X) - 1)) #define C_STRING_WITH_LEN(X) ((char *) (X)), ((sizeof(X) - 1)) /** Skip trailing space. On most systems reading memory in larger chunks (ideally equal to the size of the chunks that the machine physically reads from memory) causes fewer memory access loops and hence increased performance. This is why the 'int' type is used : it's closest to that (according to how it's defined in C). So when we determine the amount of whitespace at the end of a string we do the following : 1. We divide the string into 3 zones : a) from the start of the string (__start) to the first multiple of sizeof(int) (__start_words) b) from the end of the string (__end) to the last multiple of sizeof(int) (__end_words) c) a zone that is aligned to sizeof(int) and can be safely accessed through an int * 2. We start comparing backwards from (c) char-by-char. If all we find is space then we continue 3. If there are elements in zone (b) we compare them as unsigned ints to a int mask (SPACE_INT) consisting of all spaces 4. Finally we compare the remaining part (a) of the string char by char. This covers for the last non-space unsigned int from 3. (if any) This algorithm works well for relatively larger strings, but it will slow the things down for smaller strings (because of the additional calculations and checks compared to the naive method). Thus the barrier of length 20 is added. @param ptr pointer to the input string @param len the length of the string @return the last non-space character */ #if defined(__sparc) || defined(__sparcv9) static inline const uchar *skip_trailing_space(const uchar *ptr,size_t len) { /* SPACE_INT is a word that contains only spaces */ #if SIZEOF_INT == 4 const unsigned SPACE_INT= 0x20202020U; #elif SIZEOF_INT == 8 const unsigned SPACE_INT= 0x2020202020202020ULL; #else #error define the appropriate constant for a word full of spaces #endif const uchar *end= ptr + len; if (len > 20) { const uchar *end_words= (const uchar *)(intptr) (((ulonglong)(intptr)end) / SIZEOF_INT * SIZEOF_INT); const uchar *start_words= (const uchar *)(intptr) ((((ulonglong)(intptr)ptr) + SIZEOF_INT - 1) / SIZEOF_INT * SIZEOF_INT); DBUG_ASSERT(end_words > ptr); while (end > end_words && end[-1] == 0x20) end--; if (end[-1] == 0x20 && start_words < end_words) while (end > start_words && ((unsigned *)end)[-1] == SPACE_INT) end -= SIZEOF_INT; } while (end > ptr && end[-1] == 0x20) end--; return (end); } #else /* Reads 8 bytes at a time, ignoring alignment. We use uint8korr, which is fast (it simply reads a *ulonglong) on all platforms, except sparc. */ static inline const uchar *skip_trailing_space(const uchar *ptr, size_t len) { const uchar *end= ptr + len; while (end - ptr >= 8) { if (uint8korr(end-8) != 0x2020202020202020ULL) break; end-= 8; } while (end > ptr && end[-1] == 0x20) end--; return (end); } #endif static inline void lex_string_set(LEX_STRING *lex_str, const char *c_str) { lex_str->str= (char *) c_str; lex_str->length= strlen(c_str); } static inline void lex_cstring_set(LEX_CSTRING *lex_str, const char *c_str) { lex_str->str= c_str; lex_str->length= strlen(c_str); } #endif PKp #include "mysql_version.h" /* MYSQL_VERSION_ID */ #endif /* On Windows, exports from DLL need to be declared. Also, plugin needs to be declared as extern "C" because MSVC unlike other compilers, uses C++ mangling for variables not only for functions. */ #if defined(_MSC_VER) #if defined(MYSQL_DYNAMIC_PLUGIN) #ifdef __cplusplus #define MYSQL_PLUGIN_EXPORT extern "C" __declspec(dllexport) #else #define MYSQL_PLUGIN_EXPORT __declspec(dllexport) #endif #else /* MYSQL_DYNAMIC_PLUGIN */ #ifdef __cplusplus #define MYSQL_PLUGIN_EXPORT extern "C" #else #define MYSQL_PLUGIN_EXPORT #endif #endif /*MYSQL_DYNAMIC_PLUGIN */ #else /*_MSC_VER */ #define MYSQL_PLUGIN_EXPORT #endif #ifdef __cplusplus class THD; class Item; #define MYSQL_THD THD* #else #define MYSQL_THD void* #endif typedef void * MYSQL_PLUGIN; #ifndef MYSQL_ABI_CHECK #include #ifndef __WIN__ #ifndef __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS /* Enable C99 printf format macros */ #endif /* !__STDC_FORMAT_MACROS */ #include #endif /* !__WIN__ */ #endif /* !MYSQL_ABI_CHECK */ #define MYSQL_XIDDATASIZE 128 /** struct st_mysql_xid is binary compatible with the XID structure as in the X/Open CAE Specification, Distributed Transaction Processing: The XA Specification, X/Open Company Ltd., 1991. http://www.opengroup.org/bookstore/catalog/c193.htm @see XID in sql/handler.h */ struct st_mysql_xid { long formatID; long gtrid_length; long bqual_length; char data[MYSQL_XIDDATASIZE]; /* Not \0-terminated */ }; typedef struct st_mysql_xid MYSQL_XID; /************************************************************************* Plugin API. Common for all plugin types. */ #define MYSQL_PLUGIN_INTERFACE_VERSION 0x0107 /* The allowable types of plugins */ #define MYSQL_UDF_PLUGIN 0 /* User-defined function */ #define MYSQL_STORAGE_ENGINE_PLUGIN 1 /* Storage Engine */ #define MYSQL_FTPARSER_PLUGIN 2 /* Full-text parser plugin */ #define MYSQL_DAEMON_PLUGIN 3 /* The daemon/raw plugin type */ #define MYSQL_INFORMATION_SCHEMA_PLUGIN 4 /* The I_S plugin type */ #define MYSQL_AUDIT_PLUGIN 5 /* The Audit plugin type */ #define MYSQL_REPLICATION_PLUGIN 6 /* The replication plugin type */ #define MYSQL_AUTHENTICATION_PLUGIN 7 /* The authentication plugin type */ #define MYSQL_VALIDATE_PASSWORD_PLUGIN 8 /* validate password plugin type */ #define MYSQL_GROUP_REPLICATION_PLUGIN 9 /* The Group Replication plugin */ #define MYSQL_KEYRING_PLUGIN 10 /* The Keyring plugin type */ #define MYSQL_MAX_PLUGIN_TYPE_NUM 11 /* The number of plugin types */ /* We use the following strings to define licenses for plugins */ #define PLUGIN_LICENSE_PROPRIETARY 0 #define PLUGIN_LICENSE_GPL 1 #define PLUGIN_LICENSE_BSD 2 #define PLUGIN_LICENSE_PROPRIETARY_STRING "PROPRIETARY" #define PLUGIN_LICENSE_GPL_STRING "GPL" #define PLUGIN_LICENSE_BSD_STRING "BSD" /* Macros for beginning and ending plugin declarations. Between mysql_declare_plugin and mysql_declare_plugin_end there should be a st_mysql_plugin struct for each plugin to be declared. */ #ifndef MYSQL_DYNAMIC_PLUGIN #define __MYSQL_DECLARE_PLUGIN(NAME, VERSION, PSIZE, DECLS) \ MYSQL_PLUGIN_EXPORT int VERSION= MYSQL_PLUGIN_INTERFACE_VERSION; \ MYSQL_PLUGIN_EXPORT int PSIZE= sizeof(struct st_mysql_plugin); \ MYSQL_PLUGIN_EXPORT struct st_mysql_plugin DECLS[]= { #else #define __MYSQL_DECLARE_PLUGIN(NAME, VERSION, PSIZE, DECLS) \ MYSQL_PLUGIN_EXPORT int _mysql_plugin_interface_version_= MYSQL_PLUGIN_INTERFACE_VERSION; \ MYSQL_PLUGIN_EXPORT int _mysql_sizeof_struct_st_plugin_= sizeof(struct st_mysql_plugin); \ MYSQL_PLUGIN_EXPORT struct st_mysql_plugin _mysql_plugin_declarations_[]= { #endif #define mysql_declare_plugin(NAME) \ __MYSQL_DECLARE_PLUGIN(NAME, \ builtin_ ## NAME ## _plugin_interface_version, \ builtin_ ## NAME ## _sizeof_struct_st_plugin, \ builtin_ ## NAME ## _plugin) #define mysql_declare_plugin_end ,{0,0,0,0,0,0,0,0,0,0,0,0,0}} /** Declarations for SHOW STATUS support in plugins */ enum enum_mysql_show_type { SHOW_UNDEF, SHOW_BOOL, SHOW_INT, ///< shown as _unsigned_ int SHOW_LONG, ///< shown as _unsigned_ long SHOW_LONGLONG, ///< shown as _unsigned_ longlong SHOW_SIGNED_INT, SHOW_SIGNED_LONG, SHOW_SIGNED_LONGLONG, SHOW_CHAR, SHOW_CHAR_PTR, SHOW_ARRAY, SHOW_FUNC, SHOW_DOUBLE #ifdef MYSQL_SERVER /* This include defines server-only values of the enum. Using them in plugins is not supported. */ #include "sql_plugin_enum.h" #endif }; /** Status variable scope. Only GLOBAL status variable scope is available in plugins. */ enum enum_mysql_show_scope { SHOW_SCOPE_UNDEF, SHOW_SCOPE_GLOBAL #ifdef MYSQL_SERVER /* Server-only values. Not supported in plugins. */ , SHOW_SCOPE_SESSION, SHOW_SCOPE_ALL #endif }; /** SHOW STATUS Server status variable */ struct st_mysql_show_var { const char *name; char *value; enum enum_mysql_show_type type; enum enum_mysql_show_scope scope; }; #define SHOW_VAR_MAX_NAME_LEN 64 #define SHOW_VAR_FUNC_BUFF_SIZE 1024 typedef int (*mysql_show_var_func)(MYSQL_THD, struct st_mysql_show_var*, char *); /* Constants for plugin flags. */ #define PLUGIN_OPT_NO_INSTALL 1UL /* Not dynamically loadable */ #define PLUGIN_OPT_NO_UNINSTALL 2UL /* Not dynamically unloadable */ /* declarations for server variables and command line options */ #define PLUGIN_VAR_BOOL 0x0001 #define PLUGIN_VAR_INT 0x0002 #define PLUGIN_VAR_LONG 0x0003 #define PLUGIN_VAR_LONGLONG 0x0004 #define PLUGIN_VAR_STR 0x0005 #define PLUGIN_VAR_ENUM 0x0006 #define PLUGIN_VAR_SET 0x0007 #define PLUGIN_VAR_DOUBLE 0x0008 #define PLUGIN_VAR_UNSIGNED 0x0080 #define PLUGIN_VAR_THDLOCAL 0x0100 /* Variable is per-connection */ #define PLUGIN_VAR_READONLY 0x0200 /* Server variable is read only */ #define PLUGIN_VAR_NOSYSVAR 0x0400 /* Not a server variable */ #define PLUGIN_VAR_NOCMDOPT 0x0800 /* Not a command line option */ #define PLUGIN_VAR_NOCMDARG 0x1000 /* No argument for cmd line */ #define PLUGIN_VAR_RQCMDARG 0x0000 /* Argument required for cmd line */ #define PLUGIN_VAR_OPCMDARG 0x2000 /* Argument optional for cmd line */ #define PLUGIN_VAR_NODEFAULT 0x4000 /* SET DEFAULT is prohibited */ #define PLUGIN_VAR_MEMALLOC 0x8000 /* String needs memory allocated */ struct st_mysql_sys_var; struct st_mysql_value; /* SYNOPSIS (*mysql_var_check_func)() thd thread handle var dynamic variable being altered save pointer to temporary storage value user provided value RETURN 0 user provided value is OK and the update func may be called. any other value indicates error. This function should parse the user provided value and store in the provided temporary storage any data as required by the update func. There is sufficient space in the temporary storage to store a double. Note that the update func may not be called if any other error occurs so any memory allocated should be thread-local so that it may be freed automatically at the end of the statement. */ typedef int (*mysql_var_check_func)(MYSQL_THD thd, struct st_mysql_sys_var *var, void *save, struct st_mysql_value *value); /* SYNOPSIS (*mysql_var_update_func)() thd thread handle var dynamic variable being altered var_ptr pointer to dynamic variable save pointer to temporary storage RETURN NONE This function should use the validated value stored in the temporary store and persist it in the provided pointer to the dynamic variable. For example, strings may require memory to be allocated. */ typedef void (*mysql_var_update_func)(MYSQL_THD thd, struct st_mysql_sys_var *var, void *var_ptr, const void *save); /* the following declarations are for internal use only */ #define PLUGIN_VAR_MASK \ (PLUGIN_VAR_READONLY | PLUGIN_VAR_NOSYSVAR | \ PLUGIN_VAR_NOCMDOPT | PLUGIN_VAR_NOCMDARG | \ PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_MEMALLOC | \ PLUGIN_VAR_NODEFAULT) #define MYSQL_PLUGIN_VAR_HEADER \ int flags; \ const char *name; \ const char *comment; \ mysql_var_check_func check; \ mysql_var_update_func update #define MYSQL_SYSVAR_NAME(name) mysql_sysvar_ ## name #define MYSQL_SYSVAR(name) \ ((struct st_mysql_sys_var *)&(MYSQL_SYSVAR_NAME(name))) /* for global variables, the value pointer is the first element after the header, the default value is the second. for thread variables, the value offset is the first element after the header, the default value is the second. */ #define DECLARE_MYSQL_SYSVAR_BASIC(name, type) struct { \ MYSQL_PLUGIN_VAR_HEADER; \ type *value; \ const type def_val; \ } MYSQL_SYSVAR_NAME(name) #define DECLARE_MYSQL_SYSVAR_SIMPLE(name, type) struct { \ MYSQL_PLUGIN_VAR_HEADER; \ type *value; type def_val; \ type min_val; type max_val; \ type blk_sz; \ } MYSQL_SYSVAR_NAME(name) #define DECLARE_MYSQL_SYSVAR_TYPELIB(name, type) struct { \ MYSQL_PLUGIN_VAR_HEADER; \ type *value; type def_val; \ TYPELIB *typelib; \ } MYSQL_SYSVAR_NAME(name) #define DECLARE_THDVAR_FUNC(type) \ type *(*resolve)(MYSQL_THD thd, int offset) #define DECLARE_MYSQL_THDVAR_BASIC(name, type) struct { \ MYSQL_PLUGIN_VAR_HEADER; \ int offset; \ const type def_val; \ DECLARE_THDVAR_FUNC(type); \ } MYSQL_SYSVAR_NAME(name) #define DECLARE_MYSQL_THDVAR_SIMPLE(name, type) struct { \ MYSQL_PLUGIN_VAR_HEADER; \ int offset; \ type def_val; type min_val; \ type max_val; type blk_sz; \ DECLARE_THDVAR_FUNC(type); \ } MYSQL_SYSVAR_NAME(name) #define DECLARE_MYSQL_THDVAR_TYPELIB(name, type) struct { \ MYSQL_PLUGIN_VAR_HEADER; \ int offset; \ type def_val; \ DECLARE_THDVAR_FUNC(type); \ TYPELIB *typelib; \ } MYSQL_SYSVAR_NAME(name) /* the following declarations are for use by plugin implementors */ #define MYSQL_SYSVAR_BOOL(name, varname, opt, comment, check, update, def) \ DECLARE_MYSQL_SYSVAR_BASIC(name, char) = { \ PLUGIN_VAR_BOOL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def} #define MYSQL_SYSVAR_STR(name, varname, opt, comment, check, update, def) \ DECLARE_MYSQL_SYSVAR_BASIC(name, char *) = { \ PLUGIN_VAR_STR | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def} #define MYSQL_SYSVAR_INT(name, varname, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_SYSVAR_SIMPLE(name, int) = { \ PLUGIN_VAR_INT | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, min, max, blk } #define MYSQL_SYSVAR_UINT(name, varname, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_SYSVAR_SIMPLE(name, unsigned int) = { \ PLUGIN_VAR_INT | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, min, max, blk } #define MYSQL_SYSVAR_LONG(name, varname, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_SYSVAR_SIMPLE(name, long) = { \ PLUGIN_VAR_LONG | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, min, max, blk } #define MYSQL_SYSVAR_ULONG(name, varname, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_SYSVAR_SIMPLE(name, unsigned long) = { \ PLUGIN_VAR_LONG | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, min, max, blk } #define MYSQL_SYSVAR_LONGLONG(name, varname, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_SYSVAR_SIMPLE(name, long long) = { \ PLUGIN_VAR_LONGLONG | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, min, max, blk } #define MYSQL_SYSVAR_ULONGLONG(name, varname, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_SYSVAR_SIMPLE(name, unsigned long long) = { \ PLUGIN_VAR_LONGLONG | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, min, max, blk } #define MYSQL_SYSVAR_ENUM(name, varname, opt, comment, check, update, def, typelib) \ DECLARE_MYSQL_SYSVAR_TYPELIB(name, unsigned long) = { \ PLUGIN_VAR_ENUM | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, typelib } #define MYSQL_SYSVAR_SET(name, varname, opt, comment, check, update, def, typelib) \ DECLARE_MYSQL_SYSVAR_TYPELIB(name, unsigned long long) = { \ PLUGIN_VAR_SET | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, typelib } #define MYSQL_SYSVAR_DOUBLE(name, varname, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_SYSVAR_SIMPLE(name, double) = { \ PLUGIN_VAR_DOUBLE | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, &varname, def, min, max, blk } #define MYSQL_THDVAR_BOOL(name, opt, comment, check, update, def) \ DECLARE_MYSQL_THDVAR_BASIC(name, char) = { \ PLUGIN_VAR_BOOL | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, NULL} #define MYSQL_THDVAR_STR(name, opt, comment, check, update, def) \ DECLARE_MYSQL_THDVAR_BASIC(name, char *) = { \ PLUGIN_VAR_STR | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, NULL} #define MYSQL_THDVAR_INT(name, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_THDVAR_SIMPLE(name, int) = { \ PLUGIN_VAR_INT | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, min, max, blk, NULL } #define MYSQL_THDVAR_UINT(name, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_THDVAR_SIMPLE(name, unsigned int) = { \ PLUGIN_VAR_INT | PLUGIN_VAR_THDLOCAL | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, min, max, blk, NULL } #define MYSQL_THDVAR_LONG(name, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_THDVAR_SIMPLE(name, long) = { \ PLUGIN_VAR_LONG | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, min, max, blk, NULL } #define MYSQL_THDVAR_ULONG(name, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_THDVAR_SIMPLE(name, unsigned long) = { \ PLUGIN_VAR_LONG | PLUGIN_VAR_THDLOCAL | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, min, max, blk, NULL } #define MYSQL_THDVAR_LONGLONG(name, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_THDVAR_SIMPLE(name, long long) = { \ PLUGIN_VAR_LONGLONG | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, min, max, blk, NULL } #define MYSQL_THDVAR_ULONGLONG(name, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_THDVAR_SIMPLE(name, unsigned long long) = { \ PLUGIN_VAR_LONGLONG | PLUGIN_VAR_THDLOCAL | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, min, max, blk, NULL } #define MYSQL_THDVAR_ENUM(name, opt, comment, check, update, def, typelib) \ DECLARE_MYSQL_THDVAR_TYPELIB(name, unsigned long) = { \ PLUGIN_VAR_ENUM | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, NULL, typelib } #define MYSQL_THDVAR_SET(name, opt, comment, check, update, def, typelib) \ DECLARE_MYSQL_THDVAR_TYPELIB(name, unsigned long long) = { \ PLUGIN_VAR_SET | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, NULL, typelib } #define MYSQL_THDVAR_DOUBLE(name, opt, comment, check, update, def, min, max, blk) \ DECLARE_MYSQL_THDVAR_SIMPLE(name, double) = { \ PLUGIN_VAR_DOUBLE | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ #name, comment, check, update, -1, def, min, max, blk, NULL } /* accessor macros */ #define SYSVAR(name) \ (*(MYSQL_SYSVAR_NAME(name).value)) /* when thd == null, result points to global value */ #define THDVAR(thd, name) \ (*(MYSQL_SYSVAR_NAME(name).resolve(thd, MYSQL_SYSVAR_NAME(name).offset))) #define THDVAR_SET(thd, name, value) \ plugin_thdvar_safe_update(thd, MYSQL_SYSVAR(name), \ (char **) &THDVAR(thd, name), \ (const char *) value); /* Plugin description structure. */ struct st_mysql_plugin { int type; /* the plugin type (a MYSQL_XXX_PLUGIN value) */ void *info; /* pointer to type-specific plugin descriptor */ const char *name; /* plugin name */ const char *author; /* plugin author (for I_S.PLUGINS) */ const char *descr; /* general descriptive text (for I_S.PLUGINS) */ int license; /* the plugin license (PLUGIN_LICENSE_XXX) */ int (*init)(MYSQL_PLUGIN); /* the function to invoke when plugin is loaded */ int (*deinit)(MYSQL_PLUGIN);/* the function to invoke when plugin is unloaded */ unsigned int version; /* plugin version (for I_S.PLUGINS) */ struct st_mysql_show_var *status_vars; struct st_mysql_sys_var **system_vars; void * __reserved1; /* reserved for dependency checking */ unsigned long flags; /* flags for plugin */ }; /************************************************************************* API for Full-text parser plugin. (MYSQL_FTPARSER_PLUGIN) */ #define MYSQL_FTPARSER_INTERFACE_VERSION 0x0101 /************************************************************************* API for Query Rewrite plugin. (MYSQL_QUERY_REWRITE_PLUGIN) */ #define MYSQL_REWRITE_PRE_PARSE_INTERFACE_VERSION 0x0010 #define MYSQL_REWRITE_POST_PARSE_INTERFACE_VERSION 0x0010 /************************************************************************* API for Storage Engine plugin. (MYSQL_DAEMON_PLUGIN) */ /* handlertons of different MySQL releases are incompatible */ #define MYSQL_DAEMON_INTERFACE_VERSION (MYSQL_VERSION_ID << 8) /* Here we define only the descriptor structure, that is referred from st_mysql_plugin. */ struct st_mysql_daemon { int interface_version; }; /************************************************************************* API for I_S plugin. (MYSQL_INFORMATION_SCHEMA_PLUGIN) */ /* handlertons of different MySQL releases are incompatible */ #define MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION (MYSQL_VERSION_ID << 8) /* Here we define only the descriptor structure, that is referred from st_mysql_plugin. */ struct st_mysql_information_schema { int interface_version; }; /************************************************************************* API for Storage Engine plugin. (MYSQL_STORAGE_ENGINE_PLUGIN) */ /* handlertons of different MySQL releases are incompatible */ #define MYSQL_HANDLERTON_INTERFACE_VERSION (MYSQL_VERSION_ID << 8) /* The real API is in the sql/handler.h Here we define only the descriptor structure, that is referred from st_mysql_plugin. */ struct st_mysql_storage_engine { int interface_version; }; struct handlerton; /* API for Replication plugin. (MYSQL_REPLICATION_PLUGIN) */ #define MYSQL_REPLICATION_INTERFACE_VERSION 0x0400 /** Replication plugin descriptor */ struct Mysql_replication { int interface_version; }; /************************************************************************* st_mysql_value struct for reading values from mysqld. Used by server variables framework to parse user-provided values. Will be used for arguments when implementing UDFs. Note that val_str() returns a string in temporary memory that will be freed at the end of statement. Copy the string if you need it to persist. */ #define MYSQL_VALUE_TYPE_STRING 0 #define MYSQL_VALUE_TYPE_REAL 1 #define MYSQL_VALUE_TYPE_INT 2 struct st_mysql_value { int (*value_type)(struct st_mysql_value *); const char *(*val_str)(struct st_mysql_value *, char *buffer, int *length); int (*val_real)(struct st_mysql_value *, double *realbuf); int (*val_int)(struct st_mysql_value *, long long *intbuf); int (*is_unsigned)(struct st_mysql_value *); }; /************************************************************************* Miscellaneous functions for plugin implementors */ #ifdef __cplusplus extern "C" { #endif int thd_in_lock_tables(const MYSQL_THD thd); int thd_tablespace_op(const MYSQL_THD thd); long long thd_test_options(const MYSQL_THD thd, long long test_options); int thd_sql_command(const MYSQL_THD thd); const char *set_thd_proc_info(MYSQL_THD thd, const char *info, const char *calling_func, const char *calling_file, const unsigned int calling_line); void **thd_ha_data(const MYSQL_THD thd, const struct handlerton *hton); void thd_storage_lock_wait(MYSQL_THD thd, long long value); int thd_tx_isolation(const MYSQL_THD thd); int thd_tx_is_read_only(const MYSQL_THD thd); MYSQL_THD thd_tx_arbitrate(MYSQL_THD requestor, MYSQL_THD holder); int thd_tx_priority(const MYSQL_THD thd); int thd_tx_is_dd_trx(const MYSQL_THD thd); char *thd_security_context(MYSQL_THD thd, char *buffer, size_t length, size_t max_query_len); /* Increments the row counter, see THD::row_count */ void thd_inc_row_count(MYSQL_THD thd); int thd_allow_batch(MYSQL_THD thd); /** Mark transaction to rollback and mark error as fatal to a sub-statement if in sub statement mode. @param thd user thread connection handle @param all if all != 0, rollback the main transaction */ void thd_mark_transaction_to_rollback(MYSQL_THD thd, int all); /** Types of statistics that can be passed to thd_report_innodb_stat */ enum mysql_trx_stat_type { /** Volume of I/O read requests in bytes */ MYSQL_TRX_STAT_IO_READ_BYTES, /** Time in microseconds spent waiting for I/O reads to complete */ MYSQL_TRX_STAT_IO_READ_WAIT_USECS, /** Time in microseconds spent waiting for row locks */ MYSQL_TRX_STAT_LOCK_WAIT_USECS, /** Time in microseconds spent waiting to enter InnoDB */ MYSQL_TRX_STAT_INNODB_QUEUE_WAIT_USECS, /** A logical data page accessed */ MYSQL_TRX_STAT_ACCESS_PAGE_ID }; /** Report various InnoDB statistics for the slow query log extensions @param[in] thd user thread connection handle @param[in] trx_id InnoDB tranaction ID @param[in] type type of statistics being reported @param[in] value the value of statistics */ void thd_report_innodb_stat(MYSQL_THD thd, unsigned long long trx_id, enum mysql_trx_stat_type type, unsigned long long value); unsigned long thd_log_slow_verbosity(const MYSQL_THD thd); int thd_opt_slow_log(); /** Check whether given connection handle is associated with a background thread. @param thd connection handle @retval non-zero the connection handle belongs to a background thread @retval 0 the connection handle belongs to a different thread type */ int thd_is_background_thread(const MYSQL_THD thd); /** Create a temporary file. @details The temporary file is created in a location specified by the mysql server configuration (--tmpdir option). The caller does not need to delete the file, it will be deleted automatically. @param prefix prefix for temporary file name @retval -1 error @retval >= 0 a file handle that can be passed to dup or my_close */ int mysql_tmpfile(const char *prefix); /** Check the killed state of a connection @details In MySQL support for the KILL statement is cooperative. The KILL statement only sets a "killed" flag. This function returns the value of that flag. A thread should check it often, especially inside time-consuming loops, and gracefully abort the operation if it is non-zero. @param thd user thread connection handle @retval 0 the connection is active @retval 1 the connection has been killed */ int thd_killed(const MYSQL_THD thd); /** Set the killed status of the current statement. @param thd user thread connection handle */ void thd_set_kill_status(const MYSQL_THD thd); /** Get binary log position for latest written entry. @note The file variable will be set to a buffer holding the name of the file name currently, but this can change if a rotation occur. Copy the string if you want to retain it. @param thd Use thread connection handle @param file_var Pointer to variable that will hold the file name. @param pos_var Pointer to variable that will hold the file position. */ void thd_binlog_pos(const MYSQL_THD thd, const char **file_var, unsigned long long *pos_var); /** Return the thread id of a user thread @param thd user thread connection handle @return thread id */ unsigned long thd_get_thread_id(const MYSQL_THD thd); /** Return the query id of a thread @param thd user thread @return query id */ int64_t thd_get_query_id(const MYSQL_THD thd); /** Get the XID for this connection's transaction @param thd user thread connection handle @param xid location where identifier is stored */ void thd_get_xid(const MYSQL_THD thd, MYSQL_XID *xid); /** Invalidate the query cache for a given table. @param thd user thread connection handle @param key databasename/tablename in the canonical format. @param key_length length of key in bytes, including the PATH separator @param using_trx flag: TRUE if using transactions, FALSE otherwise */ void mysql_query_cache_invalidate4(MYSQL_THD thd, const char *key, unsigned int key_length, int using_trx); /** Provide a handler data getter to simplify coding */ void *thd_get_ha_data(const MYSQL_THD thd, const struct handlerton *hton); /** Provide a handler data setter to simplify coding @details Set ha_data pointer (storage engine per-connection information). To avoid unclean deactivation (uninstall) of storage engine plugin in the middle of transaction, additional storage engine plugin lock is acquired. If ha_data is not null and storage engine plugin was not locked by thd_set_ha_data() in this connection before, storage engine plugin gets locked. If ha_data is null and storage engine plugin was locked by thd_set_ha_data() in this connection before, storage engine plugin lock gets released. If handlerton::close_connection() didn't reset ha_data, server does it immediately after calling handlerton::close_connection(). */ void thd_set_ha_data(MYSQL_THD thd, const struct handlerton *hton, const void *ha_data); int thd_command(const MYSQL_THD thd); long long thd_start_time(const MYSQL_THD thd); void thd_kill(unsigned long id); /** Check whether ft_query_extra_word_chars server variable is enabled for the current session @return ft_query_extra_word_chars value */ int thd_get_ft_query_extra_word_chars(void); #ifdef __cplusplus } #endif #endif /* _my_plugin_h */ PKp #define MYSQL_VALIDATE_PASSWORD_INTERFACE_VERSION 0x0100 /* The descriptor structure for the plugin, that is referred from st_mysql_plugin. */ typedef void* mysql_string_handle; struct st_mysql_validate_password { int interface_version; /* This function retuns TRUE for passwords which satisfy the password policy (as choosen by plugin variable) and FALSE for all other password */ int (*validate_password)(mysql_string_handle password); /* This function returns the password strength (0-100) depending upon the policies */ int (*get_password_strength)(mysql_string_handle password); }; #endif PKp #endif typedef char my_bool; #if !defined(_WIN32) #define STDCALL #else #define STDCALL __stdcall #endif #ifndef my_socket_defined #ifdef _WIN32 #include #ifdef WIN32_LEAN_AND_MEAN #include #endif #define my_socket SOCKET #else typedef int my_socket; #endif /* _WIN32 */ #endif /* my_socket_defined */ #endif /* MY_GLOBAL_INCLUDED */ #include "mysql_version.h" #include "mysql_com.h" #include "mysql_time.h" #include "my_list.h" /* for LISTs used in 'MYSQL' and 'MYSQL_STMT' */ /* Include declarations of plug-in API */ #include "mysql/client_plugin.h" extern unsigned int mysql_port; extern char *mysql_unix_port; #define CLIENT_NET_READ_TIMEOUT 365*24*3600 /* Timeout on read */ #define CLIENT_NET_WRITE_TIMEOUT 365*24*3600 /* Timeout on write */ #define IS_PRI_KEY(n) ((n) & PRI_KEY_FLAG) #define IS_NOT_NULL(n) ((n) & NOT_NULL_FLAG) #define IS_BLOB(n) ((n) & BLOB_FLAG) /** Returns true if the value is a number which does not need quotes for the sql_lex.cc parser to parse correctly. */ #define IS_NUM(t) (((t) <= MYSQL_TYPE_INT24 && (t) != MYSQL_TYPE_TIMESTAMP) || (t) == MYSQL_TYPE_YEAR || (t) == MYSQL_TYPE_NEWDECIMAL) #define IS_LONGDATA(t) ((t) >= MYSQL_TYPE_TINY_BLOB && (t) <= MYSQL_TYPE_STRING) typedef struct st_mysql_field { char *name; /* Name of column */ char *org_name; /* Original column name, if an alias */ char *table; /* Table of column if column was a field */ char *org_table; /* Org table name, if table was an alias */ char *db; /* Database for table */ char *catalog; /* Catalog for table */ char *def; /* Default value (set by mysql_list_fields) */ unsigned long length; /* Width of column (create length) */ unsigned long max_length; /* Max width for selected set */ unsigned int name_length; unsigned int org_name_length; unsigned int table_length; unsigned int org_table_length; unsigned int db_length; unsigned int catalog_length; unsigned int def_length; unsigned int flags; /* Div flags */ unsigned int decimals; /* Number of decimals in field */ unsigned int charsetnr; /* Character set */ enum enum_field_types type; /* Type of field. See mysql_com.h for types */ void *extension; } MYSQL_FIELD; typedef char **MYSQL_ROW; /* return data as array of strings */ typedef unsigned int MYSQL_FIELD_OFFSET; /* offset to current field */ #ifndef MY_GLOBAL_INCLUDED #if defined (_WIN32) typedef unsigned __int64 my_ulonglong; #else typedef unsigned long long my_ulonglong; #endif #endif #include "typelib.h" #define MYSQL_COUNT_ERROR (~(my_ulonglong) 0) /* backward compatibility define - to be removed eventually */ #define ER_WARN_DATA_TRUNCATED WARN_DATA_TRUNCATED typedef struct st_mysql_rows { struct st_mysql_rows *next; /* list of rows */ MYSQL_ROW data; unsigned long length; } MYSQL_ROWS; typedef MYSQL_ROWS *MYSQL_ROW_OFFSET; /* offset to current row */ #include "my_alloc.h" typedef struct embedded_query_result EMBEDDED_QUERY_RESULT; typedef struct st_mysql_data { MYSQL_ROWS *data; struct embedded_query_result *embedded_info; MEM_ROOT alloc; my_ulonglong rows; unsigned int fields; /* extra info for embedded library */ void *extension; } MYSQL_DATA; enum mysql_option { MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, MYSQL_OPT_NAMED_PIPE, MYSQL_INIT_COMMAND, MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP, MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_OPT_LOCAL_INFILE, MYSQL_OPT_PROTOCOL, MYSQL_SHARED_MEMORY_BASE_NAME, MYSQL_OPT_READ_TIMEOUT, MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT, MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION, MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH, MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, MYSQL_PLUGIN_DIR, MYSQL_DEFAULT_AUTH, MYSQL_OPT_BIND, MYSQL_OPT_SSL_KEY, MYSQL_OPT_SSL_CERT, MYSQL_OPT_SSL_CA, MYSQL_OPT_SSL_CAPATH, MYSQL_OPT_SSL_CIPHER, MYSQL_OPT_SSL_CRL, MYSQL_OPT_SSL_CRLPATH, MYSQL_OPT_CONNECT_ATTR_RESET, MYSQL_OPT_CONNECT_ATTR_ADD, MYSQL_OPT_CONNECT_ATTR_DELETE, MYSQL_SERVER_PUBLIC_KEY, MYSQL_ENABLE_CLEARTEXT_PLUGIN, MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS, MYSQL_OPT_SSL_ENFORCE, MYSQL_OPT_MAX_ALLOWED_PACKET, MYSQL_OPT_NET_BUFFER_LENGTH, MYSQL_OPT_TLS_VERSION, MYSQL_OPT_SSL_MODE, MYSQL_OPT_GET_SERVER_PUBLIC_KEY }; /** @todo remove the "extension", move st_mysql_options completely out of mysql.h */ struct st_mysql_options_extention; struct st_mysql_options { unsigned int connect_timeout, read_timeout, write_timeout; unsigned int port, protocol; unsigned long client_flag; char *host,*user,*password,*unix_socket,*db; struct st_dynamic_array *init_commands; char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name; char *ssl_key; /* PEM key file */ char *ssl_cert; /* PEM cert file */ char *ssl_ca; /* PEM CA file */ char *ssl_capath; /* PEM directory of CA-s? */ char *ssl_cipher; /* cipher to use */ char *shared_memory_base_name; unsigned long max_allowed_packet; my_bool use_ssl; /* Deprecated ! Former use_ssl */ my_bool compress,named_pipe; my_bool unused1; my_bool unused2; my_bool unused3; my_bool unused4; enum mysql_option methods_to_use; union { /* The ip/hostname to use when authenticating client against embedded server built with grant tables - only used in embedded server */ char *client_ip; /* The local address to bind when connecting to remote server - not used in embedded server */ char *bind_address; } ci; my_bool unused5; /* 0 - never report, 1 - always report (default) */ my_bool report_data_truncation; /* function pointers for local infile support */ int (*local_infile_init)(void **, const char *, void *); int (*local_infile_read)(void *, char *, unsigned int); void (*local_infile_end)(void *); int (*local_infile_error)(void *, char *, unsigned int); void *local_infile_userdata; struct st_mysql_options_extention *extension; }; enum mysql_status { MYSQL_STATUS_READY, MYSQL_STATUS_GET_RESULT, MYSQL_STATUS_USE_RESULT, MYSQL_STATUS_STATEMENT_GET_RESULT }; enum mysql_protocol_type { MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET, MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY }; enum mysql_ssl_mode { SSL_MODE_DISABLED= 1, SSL_MODE_PREFERRED, SSL_MODE_REQUIRED, SSL_MODE_VERIFY_CA, SSL_MODE_VERIFY_IDENTITY }; typedef struct character_set { unsigned int number; /* character set number */ unsigned int state; /* character set state */ const char *csname; /* collation name */ const char *name; /* character set name */ const char *comment; /* comment */ const char *dir; /* character set directory */ unsigned int mbminlen; /* min. length for multibyte strings */ unsigned int mbmaxlen; /* max. length for multibyte strings */ } MY_CHARSET_INFO; struct st_mysql_methods; struct st_mysql_stmt; typedef struct st_mysql { NET net; /* Communication parameters */ unsigned char *connector_fd; /* ConnectorFd for SSL */ char *host,*user,*passwd,*unix_socket,*server_version,*host_info; char *info, *db; struct charset_info_st *charset; MYSQL_FIELD *fields; MEM_ROOT field_alloc; my_ulonglong affected_rows; my_ulonglong insert_id; /* id if insert on table with NEXTNR */ my_ulonglong extra_info; /* Not used */ unsigned long thread_id; /* Id for connection in server */ unsigned long packet_length; unsigned int port; unsigned long client_flag,server_capabilities; unsigned int protocol_version; unsigned int field_count; unsigned int server_status; unsigned int server_language; unsigned int warning_count; struct st_mysql_options options; enum mysql_status status; my_bool free_me; /* If free in mysql_close */ my_bool reconnect; /* set to 1 if automatic reconnect */ /* session-wide random string */ char scramble[SCRAMBLE_LENGTH+1]; my_bool unused1; void *unused2, *unused3, *unused4, *unused5; LIST *stmts; /* list of all statements */ const struct st_mysql_methods *methods; void *thd; /* Points to boolean flag in MYSQL_RES or MYSQL_STMT. We set this flag from mysql_stmt_close if close had to cancel result set of this object. */ my_bool *unbuffered_fetch_owner; /* needed for embedded server - no net buffer to store the 'info' */ char *info_buffer; void *extension; } MYSQL; typedef struct st_mysql_res { my_ulonglong row_count; MYSQL_FIELD *fields; MYSQL_DATA *data; MYSQL_ROWS *data_cursor; unsigned long *lengths; /* column lengths of current row */ MYSQL *handle; /* for unbuffered reads */ const struct st_mysql_methods *methods; MYSQL_ROW row; /* If unbuffered read */ MYSQL_ROW current_row; /* buffer to current row */ MEM_ROOT field_alloc; unsigned int field_count, current_field; my_bool eof; /* Used by mysql_fetch_row */ /* mysql_stmt_close() had to cancel this result */ my_bool unbuffered_fetch_cancelled; void *extension; } MYSQL_RES; #if !defined(MYSQL_SERVER) && !defined(MYSQL_CLIENT) #define MYSQL_CLIENT #endif /* Set up and bring down the server; to ensure that applications will work when linked against either the standard client library or the embedded server library, these functions should be called. */ int STDCALL mysql_server_init(int argc, char **argv, char **groups); void STDCALL mysql_server_end(void); /* mysql_server_init/end need to be called when using libmysqld or libmysqlclient (exactly, mysql_server_init() is called by mysql_init() so you don't need to call it explicitely; but you need to call mysql_server_end() to free memory). The names are a bit misleading (mysql_SERVER* to be used when using libmysqlCLIENT). So we add more general names which suit well whether you're using libmysqld or libmysqlclient. We intend to promote these aliases over the mysql_server* ones. */ #define mysql_library_init mysql_server_init #define mysql_library_end mysql_server_end /* Set up and bring down a thread; these function should be called for each thread in an application which opens at least one MySQL connection. All uses of the connection(s) should be between these function calls. */ my_bool STDCALL mysql_thread_init(void); void STDCALL mysql_thread_end(void); /* Functions to get information from the MYSQL and MYSQL_RES structures Should definitely be used if one uses shared libraries. */ my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res); unsigned int STDCALL mysql_num_fields(MYSQL_RES *res); my_bool STDCALL mysql_eof(MYSQL_RES *res); MYSQL_FIELD *STDCALL mysql_fetch_field_direct(MYSQL_RES *res, unsigned int fieldnr); MYSQL_FIELD * STDCALL mysql_fetch_fields(MYSQL_RES *res); MYSQL_ROW_OFFSET STDCALL mysql_row_tell(MYSQL_RES *res); MYSQL_FIELD_OFFSET STDCALL mysql_field_tell(MYSQL_RES *res); unsigned int STDCALL mysql_field_count(MYSQL *mysql); my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql); my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql); unsigned int STDCALL mysql_errno(MYSQL *mysql); const char * STDCALL mysql_error(MYSQL *mysql); const char *STDCALL mysql_sqlstate(MYSQL *mysql); unsigned int STDCALL mysql_warning_count(MYSQL *mysql); const char * STDCALL mysql_info(MYSQL *mysql); unsigned long STDCALL mysql_thread_id(MYSQL *mysql); const char * STDCALL mysql_character_set_name(MYSQL *mysql); int STDCALL mysql_set_character_set(MYSQL *mysql, const char *csname); MYSQL * STDCALL mysql_init(MYSQL *mysql); my_bool STDCALL mysql_ssl_set(MYSQL *mysql, const char *key, const char *cert, const char *ca, const char *capath, const char *cipher); const char * STDCALL mysql_get_ssl_cipher(MYSQL *mysql); my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user, const char *passwd, const char *db); MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag); int STDCALL mysql_select_db(MYSQL *mysql, const char *db); int STDCALL mysql_query(MYSQL *mysql, const char *q); int STDCALL mysql_send_query(MYSQL *mysql, const char *q, unsigned long length); int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length); MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql); MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql); void STDCALL mysql_get_character_set_info(MYSQL *mysql, MY_CHARSET_INFO *charset); int STDCALL mysql_session_track_get_first(MYSQL *mysql, enum enum_session_state_type type, const char **data, size_t *length); int STDCALL mysql_session_track_get_next(MYSQL *mysql, enum enum_session_state_type type, const char **data, size_t *length); /* local infile support */ #define LOCAL_INFILE_ERROR_LEN 512 void mysql_set_local_infile_handler(MYSQL *mysql, int (*local_infile_init)(void **, const char *, void *), int (*local_infile_read)(void *, char *, unsigned int), void (*local_infile_end)(void *), int (*local_infile_error)(void *, char*, unsigned int), void *); void mysql_set_local_infile_default(MYSQL *mysql); int STDCALL mysql_shutdown(MYSQL *mysql, enum mysql_enum_shutdown_level shutdown_level); int STDCALL mysql_dump_debug_info(MYSQL *mysql); int STDCALL mysql_refresh(MYSQL *mysql, unsigned int refresh_options); int STDCALL mysql_kill(MYSQL *mysql,unsigned long pid); int STDCALL mysql_set_server_option(MYSQL *mysql, enum enum_mysql_set_option option); int STDCALL mysql_ping(MYSQL *mysql); const char * STDCALL mysql_stat(MYSQL *mysql); const char * STDCALL mysql_get_server_info(MYSQL *mysql); const char * STDCALL mysql_get_client_info(void); unsigned long STDCALL mysql_get_client_version(void); const char * STDCALL mysql_get_host_info(MYSQL *mysql); unsigned long STDCALL mysql_get_server_version(MYSQL *mysql); unsigned int STDCALL mysql_get_proto_info(MYSQL *mysql); MYSQL_RES * STDCALL mysql_list_dbs(MYSQL *mysql,const char *wild); MYSQL_RES * STDCALL mysql_list_tables(MYSQL *mysql,const char *wild); MYSQL_RES * STDCALL mysql_list_processes(MYSQL *mysql); int STDCALL mysql_options(MYSQL *mysql,enum mysql_option option, const void *arg); int STDCALL mysql_options4(MYSQL *mysql,enum mysql_option option, const void *arg1, const void *arg2); int STDCALL mysql_get_option(MYSQL *mysql, enum mysql_option option, const void *arg); void STDCALL mysql_free_result(MYSQL_RES *result); void STDCALL mysql_data_seek(MYSQL_RES *result, my_ulonglong offset); MYSQL_ROW_OFFSET STDCALL mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset); MYSQL_FIELD_OFFSET STDCALL mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset); MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result); unsigned long * STDCALL mysql_fetch_lengths(MYSQL_RES *result); MYSQL_FIELD * STDCALL mysql_fetch_field(MYSQL_RES *result); MYSQL_RES * STDCALL mysql_list_fields(MYSQL *mysql, const char *table, const char *wild); unsigned long STDCALL mysql_escape_string(char *to,const char *from, unsigned long from_length); unsigned long STDCALL mysql_hex_string(char *to,const char *from, unsigned long from_length); unsigned long STDCALL mysql_real_escape_string(MYSQL *mysql, char *to,const char *from, unsigned long length); unsigned long STDCALL mysql_real_escape_string_quote(MYSQL *mysql, char *to, const char *from, unsigned long length, char quote); void STDCALL mysql_debug(const char *debug); void STDCALL myodbc_remove_escape(MYSQL *mysql,char *name); unsigned int STDCALL mysql_thread_safe(void); my_bool STDCALL mysql_embedded(void); my_bool STDCALL mysql_read_query_result(MYSQL *mysql); int STDCALL mysql_reset_connection(MYSQL *mysql); /* The following definitions are added for the enhanced client-server protocol */ /* statement state */ enum enum_mysql_stmt_state { MYSQL_STMT_INIT_DONE= 1, MYSQL_STMT_PREPARE_DONE, MYSQL_STMT_EXECUTE_DONE, MYSQL_STMT_FETCH_DONE }; /* This structure is used to define bind information, and internally by the client library. Public members with their descriptions are listed below (conventionally `On input' refers to the binds given to mysql_stmt_bind_param, `On output' refers to the binds given to mysql_stmt_bind_result): buffer_type - One of the MYSQL_* types, used to describe the host language type of buffer. On output: if column type is different from buffer_type, column value is automatically converted to buffer_type before it is stored in the buffer. buffer - On input: points to the buffer with input data. On output: points to the buffer capable to store output data. The type of memory pointed by buffer must correspond to buffer_type. See the correspondence table in the comment to mysql_stmt_bind_param. The two above members are mandatory for any kind of bind. buffer_length - the length of the buffer. You don't have to set it for any fixed length buffer: float, double, int, etc. It must be set however for variable-length types, such as BLOBs or STRINGs. length - On input: in case when lengths of input values are different for each execute, you can set this to point at a variable containining value length. This way the value length can be different in each execute. If length is not NULL, buffer_length is not used. Note, length can even point at buffer_length if you keep bind structures around while fetching: this way you can change buffer_length before each execution, everything will work ok. On output: if length is set, mysql_stmt_fetch will write column length into it. is_null - On input: points to a boolean variable that should be set to TRUE for NULL values. This member is useful only if your data may be NULL in some but not all cases. If your data is never NULL, is_null should be set to 0. If your data is always NULL, set buffer_type to MYSQL_TYPE_NULL, and is_null will not be used. is_unsigned - On input: used to signify that values provided for one of numeric types are unsigned. On output describes signedness of the output buffer. If, taking into account is_unsigned flag, column data is out of range of the output buffer, data for this column is regarded truncated. Note that this has no correspondence to the sign of result set column, if you need to find it out use mysql_stmt_result_metadata. error - where to write a truncation error if it is present. possible error value is: 0 no truncation 1 value is out of range or buffer is too small Please note that MYSQL_BIND also has internals members. */ typedef struct st_mysql_bind { unsigned long *length; /* output length pointer */ my_bool *is_null; /* Pointer to null indicator */ void *buffer; /* buffer to get/put data */ /* set this if you want to track data truncations happened during fetch */ my_bool *error; unsigned char *row_ptr; /* for the current data position */ void (*store_param_func)(NET *net, struct st_mysql_bind *param); void (*fetch_result)(struct st_mysql_bind *, MYSQL_FIELD *, unsigned char **row); void (*skip_result)(struct st_mysql_bind *, MYSQL_FIELD *, unsigned char **row); /* output buffer length, must be set when fetching str/binary */ unsigned long buffer_length; unsigned long offset; /* offset position for char/binary fetch */ unsigned long length_value; /* Used if length is 0 */ unsigned int param_number; /* For null count and error messages */ unsigned int pack_length; /* Internal length for packed data */ enum enum_field_types buffer_type; /* buffer type */ my_bool error_value; /* used if error is 0 */ my_bool is_unsigned; /* set if integer type is unsigned */ my_bool long_data_used; /* If used with mysql_send_long_data */ my_bool is_null_value; /* Used if is_null is 0 */ void *extension; } MYSQL_BIND; struct st_mysql_stmt_extension; /* statement handler */ typedef struct st_mysql_stmt { MEM_ROOT mem_root; /* root allocations */ LIST list; /* list to keep track of all stmts */ MYSQL *mysql; /* connection handle */ MYSQL_BIND *params; /* input parameters */ MYSQL_BIND *bind; /* output parameters */ MYSQL_FIELD *fields; /* result set metadata */ MYSQL_DATA result; /* cached result set */ MYSQL_ROWS *data_cursor; /* current row in cached result */ /* mysql_stmt_fetch() calls this function to fetch one row (it's different for buffered, unbuffered and cursor fetch). */ int (*read_row_func)(struct st_mysql_stmt *stmt, unsigned char **row); /* copy of mysql->affected_rows after statement execution */ my_ulonglong affected_rows; my_ulonglong insert_id; /* copy of mysql->insert_id */ unsigned long stmt_id; /* Id for prepared statement */ unsigned long flags; /* i.e. type of cursor to open */ unsigned long prefetch_rows; /* number of rows per one COM_FETCH */ /* Copied from mysql->server_status after execute/fetch to know server-side cursor status for this statement. */ unsigned int server_status; unsigned int last_errno; /* error code */ unsigned int param_count; /* input parameter count */ unsigned int field_count; /* number of columns in result set */ enum enum_mysql_stmt_state state; /* statement state */ char last_error[MYSQL_ERRMSG_SIZE]; /* error message */ char sqlstate[SQLSTATE_LENGTH+1]; /* Types of input parameters should be sent to server */ my_bool send_types_to_server; my_bool bind_param_done; /* input buffers were supplied */ unsigned char bind_result_done; /* output buffers were supplied */ /* mysql_stmt_close() had to cancel this result */ my_bool unbuffered_fetch_cancelled; /* Is set to true if we need to calculate field->max_length for metadata fields when doing mysql_stmt_store_result. */ my_bool update_max_length; struct st_mysql_stmt_extension *extension; } MYSQL_STMT; enum enum_stmt_attr_type { /* When doing mysql_stmt_store_result calculate max_length attribute of statement metadata. This is to be consistent with the old API, where this was done automatically. In the new API we do that only by request because it slows down mysql_stmt_store_result sufficiently. */ STMT_ATTR_UPDATE_MAX_LENGTH, /* unsigned long with combination of cursor flags (read only, for update, etc) */ STMT_ATTR_CURSOR_TYPE, /* Amount of rows to retrieve from server per one fetch if using cursors. Accepts unsigned long attribute in the range 1 - ulong_max */ STMT_ATTR_PREFETCH_ROWS }; MYSQL_STMT * STDCALL mysql_stmt_init(MYSQL *mysql); int STDCALL mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, unsigned long length); int STDCALL mysql_stmt_execute(MYSQL_STMT *stmt); int STDCALL mysql_stmt_fetch(MYSQL_STMT *stmt); int STDCALL mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind_arg, unsigned int column, unsigned long offset); int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt); unsigned long STDCALL mysql_stmt_param_count(MYSQL_STMT * stmt); my_bool STDCALL mysql_stmt_attr_set(MYSQL_STMT *stmt, enum enum_stmt_attr_type attr_type, const void *attr); my_bool STDCALL mysql_stmt_attr_get(MYSQL_STMT *stmt, enum enum_stmt_attr_type attr_type, void *attr); my_bool STDCALL mysql_stmt_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd); my_bool STDCALL mysql_stmt_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd); my_bool STDCALL mysql_stmt_close(MYSQL_STMT * stmt); my_bool STDCALL mysql_stmt_reset(MYSQL_STMT * stmt); my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt); my_bool STDCALL mysql_stmt_send_long_data(MYSQL_STMT *stmt, unsigned int param_number, const char *data, unsigned long length); MYSQL_RES *STDCALL mysql_stmt_result_metadata(MYSQL_STMT *stmt); MYSQL_RES *STDCALL mysql_stmt_param_metadata(MYSQL_STMT *stmt); unsigned int STDCALL mysql_stmt_errno(MYSQL_STMT * stmt); const char *STDCALL mysql_stmt_error(MYSQL_STMT * stmt); const char *STDCALL mysql_stmt_sqlstate(MYSQL_STMT * stmt); MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_seek(MYSQL_STMT *stmt, MYSQL_ROW_OFFSET offset); MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_tell(MYSQL_STMT *stmt); void STDCALL mysql_stmt_data_seek(MYSQL_STMT *stmt, my_ulonglong offset); my_ulonglong STDCALL mysql_stmt_num_rows(MYSQL_STMT *stmt); my_ulonglong STDCALL mysql_stmt_affected_rows(MYSQL_STMT *stmt); my_ulonglong STDCALL mysql_stmt_insert_id(MYSQL_STMT *stmt); unsigned int STDCALL mysql_stmt_field_count(MYSQL_STMT *stmt); my_bool STDCALL mysql_commit(MYSQL * mysql); my_bool STDCALL mysql_rollback(MYSQL * mysql); my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode); my_bool STDCALL mysql_more_results(MYSQL *mysql); int STDCALL mysql_next_result(MYSQL *mysql); int STDCALL mysql_stmt_next_result(MYSQL_STMT *stmt); void STDCALL mysql_close(MYSQL *sock); /* status return codes */ #define MYSQL_NO_DATA 100 #define MYSQL_DATA_TRUNCATED 101 #define mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT) #define HAVE_MYSQL_REAL_CONNECT #ifdef __cplusplus } #endif #endif /* _mysql_h */ PKpname); ssl_mode_set_explicitly= TRUE; break; case OPT_SSL_SSL: CLIENT_WARN_DEPRECATED("--ssl", "--ssl-mode"); if (!opt_use_ssl_arg) opt_ssl_mode= SSL_MODE_DISABLED; else if (opt_ssl_mode < SSL_MODE_REQUIRED) opt_ssl_mode= SSL_MODE_REQUIRED; break; case OPT_SSL_VERIFY_SERVER_CERT: CLIENT_WARN_DEPRECATED("--ssl-verify-server-cert", "--ssl-mode=VERIFY_IDENTITY"); if (!opt_ssl_verify_server_cert_arg) { if (opt_ssl_mode >= SSL_MODE_VERIFY_IDENTITY) opt_ssl_mode= SSL_MODE_VERIFY_CA; } else opt_ssl_mode= SSL_MODE_VERIFY_IDENTITY; break; case OPT_SSL_CA: case OPT_SSL_CAPATH: /* Don't change ssl-mode if set explicitly. */ if (!ssl_mode_set_explicitly) opt_ssl_mode= SSL_MODE_VERIFY_CA; break; case OPT_SSL_KEY: case OPT_SSL_CERT: case OPT_SSL_CIPHER: case OPT_SSL_CRL: case OPT_SSL_CRLPATH: case OPT_TLS_VERSION: #ifdef HAVE_YASSL /* crl has no effect in yaSSL. */ opt_ssl_crl= NULL; opt_ssl_crlpath= NULL; #endif /* HAVE_YASSL */ break; #endif /* HAVE_OPENSSL */ PKp no partial MyISAM update) */ SHUTDOWN_WAIT_UPDATES= MYSQL_SHUTDOWN_KILLABLE_UPDATE, /* flush InnoDB buffers and other storage engines' buffers*/ SHUTDOWN_WAIT_ALL_BUFFERS= (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1), /* don't flush InnoDB buffers, flush other storage engines' buffers*/ SHUTDOWN_WAIT_CRITICAL_BUFFERS= (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1) + 1, /* Now the 2 levels of the KILL command */ KILL_QUERY= 254, KILL_CONNECTION= 255 }; enum enum_cursor_type { CURSOR_TYPE_NO_CURSOR= 0, CURSOR_TYPE_READ_ONLY= 1, CURSOR_TYPE_FOR_UPDATE= 2, CURSOR_TYPE_SCROLLABLE= 4 }; /* options for mysql_set_option */ enum enum_mysql_set_option { MYSQL_OPTION_MULTI_STATEMENTS_ON, MYSQL_OPTION_MULTI_STATEMENTS_OFF }; /* Type of state change information that the server can include in the Ok packet. Note : 1) session_state_type shouldn't go past 255 (i.e. 1-byte boundary). 2) Modify the definition of SESSION_TRACK_END when a new member is added. */ enum enum_session_state_type { SESSION_TRACK_SYSTEM_VARIABLES, /* Session system variables */ SESSION_TRACK_SCHEMA, /* Current schema */ SESSION_TRACK_STATE_CHANGE, /* track session state changes */ SESSION_TRACK_GTIDS, SESSION_TRACK_TRANSACTION_CHARACTERISTICS, /* Transaction chistics */ SESSION_TRACK_TRANSACTION_STATE /* Transaction state */ }; #define SESSION_TRACK_BEGIN SESSION_TRACK_SYSTEM_VARIABLES #define SESSION_TRACK_END SESSION_TRACK_TRANSACTION_STATE #define IS_SESSION_STATE_TYPE(T) \ (((int)(T) >= SESSION_TRACK_BEGIN) && ((T) <= SESSION_TRACK_END)) #define net_new_transaction(net) ((net)->pkt_nr=0) #ifdef __cplusplus extern "C" { #endif my_bool my_net_init(NET *net, Vio* vio); void my_net_local_init(NET *net); void net_end(NET *net); void net_clear(NET *net, my_bool check_buffer); void net_claim_memory_ownership(NET *net); my_bool net_realloc(NET *net, size_t length); my_bool net_flush(NET *net); my_bool my_net_write(NET *net,const unsigned char *packet, size_t len); my_bool net_write_command(NET *net,unsigned char command, const unsigned char *header, size_t head_len, const unsigned char *packet, size_t len); my_bool net_write_packet(NET *net, const unsigned char *packet, size_t length); unsigned long my_net_read(NET *net); #ifdef MY_GLOBAL_INCLUDED void my_net_set_write_timeout(NET *net, uint timeout); void my_net_set_read_timeout(NET *net, uint timeout); #endif struct rand_struct { unsigned long seed1,seed2,max_value; double max_value_dbl; }; #ifdef __cplusplus } #endif /* The following is for user defined functions */ enum Item_result {STRING_RESULT=0, REAL_RESULT, INT_RESULT, ROW_RESULT, DECIMAL_RESULT}; typedef struct st_udf_args { unsigned int arg_count; /* Number of arguments */ enum Item_result *arg_type; /* Pointer to item_results */ char **args; /* Pointer to argument */ unsigned long *lengths; /* Length of string arguments */ char *maybe_null; /* Set to 1 for all maybe_null args */ char **attributes; /* Pointer to attribute name */ unsigned long *attribute_lengths; /* Length of attribute arguments */ void *extension; } UDF_ARGS; /* This holds information about the result */ typedef struct st_udf_init { my_bool maybe_null; /* 1 if function can return NULL */ unsigned int decimals; /* for real functions */ unsigned long max_length; /* For string functions */ char *ptr; /* free pointer for function data */ my_bool const_item; /* 1 if function always returns the same value */ void *extension; } UDF_INIT; /* TODO: add a notion for determinism of the UDF. See Item_udf_func::update_used_tables () */ /* Constants when using compression */ #define NET_HEADER_SIZE 4 /* standard header size */ #define COMP_HEADER_SIZE 3 /* compression header extra size */ /* Prototypes to password functions */ #ifdef __cplusplus extern "C" { #endif /* These functions are used for authentication by client and server and implemented in sql/password.c */ void randominit(struct rand_struct *, unsigned long seed1, unsigned long seed2); double my_rnd(struct rand_struct *); void create_random_string(char *to, unsigned int length, struct rand_struct *rand_st); void hash_password(unsigned long *to, const char *password, unsigned int password_len); void make_scrambled_password_323(char *to, const char *password); void scramble_323(char *to, const char *message, const char *password); my_bool check_scramble_323(const unsigned char *reply, const char *message, unsigned long *salt); void get_salt_from_password_323(unsigned long *res, const char *password); void make_password_from_salt_323(char *to, const unsigned long *salt); void make_scrambled_password(char *to, const char *password); void scramble(char *to, const char *message, const char *password); my_bool check_scramble(const unsigned char *reply, const char *message, const unsigned char *hash_stage2); void get_salt_from_password(unsigned char *res, const char *password); void make_password_from_salt(char *to, const unsigned char *hash_stage2); char *octet2hex(char *to, const char *str, unsigned int len); /* end of password.c */ my_bool generate_sha256_scramble(unsigned char *dst, size_t dst_size, const char *src, size_t src_size, const char *rnd, size_t rnd_size); char *get_tty_password(const char *opt_message); const char *mysql_errno_to_sqlstate(unsigned int mysql_errno); /* Some other useful functions */ my_bool my_thread_init(void); void my_thread_end(void); #ifdef MY_GLOBAL_INCLUDED ulong STDCALL net_field_length(uchar **packet); ulong STDCALL net_field_length_checked(uchar **packet, ulong max_length); my_ulonglong net_field_length_ll(uchar **packet); uchar *net_store_length(uchar *pkg, ulonglong length); unsigned int net_length_size(ulonglong num); #endif #ifdef __cplusplus } #endif #define NULL_LENGTH ((unsigned long) ~0) /* For net_store_length */ #define MYSQL_STMT_HEADER 4 #define MYSQL_LONG_DATA_HEADER 6 #define NOT_FIXED_DEC 31 #endif PKptv.i64 - now.i64) / 10000; /* Don't allow the timeout to be negative */ if (millis < 0) return 0; /* Make sure the calculated timeout does not exceed original timeout value which could cause "wait for ever" if system time changes */ if (millis > abstime->max_timeout_msec) millis= abstime->max_timeout_msec; if (millis > UINT_MAX) millis= UINT_MAX; return (DWORD)millis; #else /* Convert timespec to millis and subtract current time. my_getsystime() returns time in 100 ns units. */ ulonglong future= abstime->tv_sec * 1000 + abstime->tv_nsec / 1000000; ulonglong now= my_getsystime() / 10000; /* Don't allow the timeout to be negative. */ if (future < now) return 0; return (DWORD)(future - now); #endif } #endif /* _WIN32 */ static inline int native_cond_init(native_cond_t *cond) { #ifdef _WIN32 InitializeConditionVariable(cond); return 0; #else /* pthread_condattr_t is not used in MySQL */ return pthread_cond_init(cond, NULL); #endif } static inline int native_cond_destroy(native_cond_t *cond) { #ifdef _WIN32 return 0; /* no destroy function */ #else return pthread_cond_destroy(cond); #endif } static inline int native_cond_timedwait(native_cond_t *cond, native_mutex_t *mutex, const struct timespec *abstime) { #ifdef _WIN32 DWORD timeout= get_milliseconds(abstime); if (!SleepConditionVariableCS(cond, mutex, timeout)) return ETIMEDOUT; return 0; #else return pthread_cond_timedwait(cond, mutex, abstime); #endif } static inline int native_cond_wait(native_cond_t *cond, native_mutex_t *mutex) { #ifdef _WIN32 if (!SleepConditionVariableCS(cond, mutex, INFINITE)) return ETIMEDOUT; return 0; #else return pthread_cond_wait(cond, mutex); #endif } static inline int native_cond_signal(native_cond_t *cond) { #ifdef _WIN32 WakeConditionVariable(cond); return 0; #else return pthread_cond_signal(cond); #endif } static inline int native_cond_broadcast(native_cond_t *cond) { #ifdef _WIN32 WakeAllConditionVariable(cond); return 0; #else return pthread_cond_broadcast(cond); #endif } #ifdef SAFE_MUTEX int safe_cond_wait(native_cond_t *cond, my_mutex_t *mp, const char *file, uint line); int safe_cond_timedwait(native_cond_t *cond, my_mutex_t *mp, const struct timespec *abstime, const char *file, uint line); #endif static inline int my_cond_timedwait(native_cond_t *cond, my_mutex_t *mp, const struct timespec *abstime #ifdef SAFE_MUTEX , const char *file, uint line #endif ) { #ifdef SAFE_MUTEX return safe_cond_timedwait(cond, mp, abstime, file, line); #else return native_cond_timedwait(cond, mp, abstime); #endif } static inline int my_cond_wait(native_cond_t *cond, my_mutex_t *mp #ifdef SAFE_MUTEX , const char *file, uint line #endif ) { #ifdef SAFE_MUTEX return safe_cond_wait(cond, mp, file, line); #else return native_cond_wait(cond, mp); #endif } C_MODE_END #endif /* THR_COND_INCLUDED */ PKp /* size_t */ #if defined __GNUC__ /* Convenience macro to test the minimum required GCC version. These should be used with care as Clang also sets __GNUC__ and __GNUC_MINOR__ (currently to 4.2). Prefer using feature specific CMake checks in configure.cmake instead. */ # define MY_GNUC_PREREQ(maj, min) \ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) # define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) #else # define MY_GNUC_PREREQ(maj, min) (0) #endif /* The macros below are borrowed from include/linux/compiler.h in the Linux kernel. Use them to indicate the likelyhood of the truthfulness of a condition. This serves two purposes - newer versions of gcc will be able to optimize for branch predication, which could yield siginficant performance gains in frequently executed sections of the code, and the other reason to use them is for documentation */ #ifdef HAVE_BUILTIN_EXPECT // likely/unlikely are likely to clash with other symbols, do not #define #if defined(__cplusplus) inline bool likely(bool expr) { return __builtin_expect(expr, true); } inline bool unlikely(bool expr) { return __builtin_expect(expr, false); } #else # define likely(x) __builtin_expect((x),1) # define unlikely(x) __builtin_expect((x),0) #endif #else /* HAVE_BUILTIN_EXPECT */ #if defined(__cplusplus) inline bool likely(bool expr) { return expr; } inline bool unlikely(bool expr) { return expr; } #else # define likely(x) (x) # define unlikely(x) (x) #endif #endif /* HAVE_BUILTIN_EXPECT */ /* Comunicate to the compiler the unreachability of the code. */ #ifdef HAVE_BUILTIN_UNREACHABLE # define MY_ASSERT_UNREACHABLE() __builtin_unreachable() #else # define MY_ASSERT_UNREACHABLE() do { assert(0); } while (0) #endif #if defined __GNUC__ || defined __SUNPRO_C || defined __SUNPRO_CC /* Specifies the minimum alignment of a type. */ # define MY_ALIGNOF(type) __alignof__(type) /* Determine the alignment requirement of a type. */ # define MY_ALIGNED(n) __attribute__((__aligned__((n)))) /* Microsoft Visual C++ */ #elif defined _MSC_VER # define MY_ALIGNOF(type) __alignof(type) # define MY_ALIGNED(n) __declspec(align(n)) #else /* Make sure they are defined for other compilers. */ # define MY_ALIGNOF(type) # define MY_ALIGNED(size) #endif /* Visual Studio requires '__inline' for C code */ #if !defined(__cplusplus) && defined(_MSC_VER) # define inline __inline #endif /* Provide __func__ macro definition for Visual Studio. */ #if defined(_MSC_VER) # define __func__ __FUNCTION__ #endif /** C++ Type Traits */ #ifdef __cplusplus /** Opaque storage with a particular alignment. Partial specialization used due to MSVC++. */ template struct my_alignment_imp; template<> struct MY_ALIGNED(1) my_alignment_imp<1> {}; template<> struct MY_ALIGNED(2) my_alignment_imp<2> {}; template<> struct MY_ALIGNED(4) my_alignment_imp<4> {}; template<> struct MY_ALIGNED(8) my_alignment_imp<8> {}; template<> struct MY_ALIGNED(16) my_alignment_imp<16> {}; /** A POD type with a given size and alignment. @remark If the compiler does not support a alignment attribute (MY_ALIGN macro), the default alignment of a double is used instead. @tparam size The minimum size. @tparam alignment The desired alignment: 1, 2, 4, 8 or 16. */ template struct my_aligned_storage { union { char data[size]; my_alignment_imp align; }; }; #if __cpp_attributes && defined(__has_cpp_attribute) #if __has_cpp_attribute(nodiscard) #define MY_NODISCARD [[nodiscard]] #elif __has_cpp_attribute(gnu::warn_unused_result) #define MY_NODISCARD [[gnu::warn_unused_result]] #endif /* __has_cpp_attribute(gnu::warn_unused_result) */ #endif /* __cpp_attributes && defined(__has_cpp_attribute) */ #endif /* __cplusplus */ /* Disable MY_ATTRIBUTE for Sun Studio and Visual Studio. Note that Sun Studio supports some __attribute__ variants, but not format or unused which we use quite a lot. */ #ifndef MY_ATTRIBUTE #if defined(__GNUC__) # define MY_ATTRIBUTE(A) __attribute__(A) #else # define MY_ATTRIBUTE(A) #endif #endif #ifndef __has_attribute # define __has_attribute(x) 0 #endif #ifndef MY_NODISCARD #define MY_NODISCARD MY_ATTRIBUTE((warn_unused_result)) #endif /* MY_NODISCARD */ #if __has_attribute(no_sanitize_undefined) # define SUPPRESS_UBSAN __attribute__((no_sanitize_undefined)) #else # define SUPPRESS_UBSAN #endif #endif /* MY_COMPILER_INCLUDED */ PKp> 8); } static inline void int4store(uchar *T, uint32 A) { *(T)= (uchar) (A); *(T+1)=(uchar) (A >> 8); *(T+2)=(uchar) (A >> 16); *(T+3)=(uchar) (A >> 24); } static inline void int8store(uchar *T, ulonglong A) { uint def_temp= (uint) A, def_temp2= (uint) (A >> 32); int4store(T, def_temp); int4store(T+4,def_temp2); } PKpCS conversion tables for some character sets using Big-endian order, to copy two bytes at onces. This gives some performance improvement. */ #ifdef __i386__ #define MB2(x) (((x) >> 8) + (((x) & 0xFF) << 8)) #define MY_PUT_MB2(s, code) { *((uint16*)(s))= (code); } #else #define MB2(x) (x) #define MY_PUT_MB2(s, code) { (s)[0]= code >> 8; (s)[1]= code & 0xFF; } #endif typedef struct unicase_info_char_st { uint32 toupper; uint32 tolower; uint32 sort; } MY_UNICASE_CHARACTER; typedef struct unicase_info_st { my_wc_t maxchar; const MY_UNICASE_CHARACTER **page; } MY_UNICASE_INFO; extern MY_UNICASE_INFO my_unicase_default; extern MY_UNICASE_INFO my_unicase_turkish; extern MY_UNICASE_INFO my_unicase_mysql500; extern MY_UNICASE_INFO my_unicase_unicode520; #define MY_UCA_MAX_CONTRACTION 6 #define MY_UCA_MAX_WEIGHT_SIZE 8 #define MY_UCA_WEIGHT_LEVELS 1 typedef struct my_contraction_t { my_wc_t ch[MY_UCA_MAX_CONTRACTION]; /* Character sequence */ uint16 weight[MY_UCA_MAX_WEIGHT_SIZE];/* Its weight string, 0-terminated */ my_bool with_context; } MY_CONTRACTION; typedef struct my_contraction_list_t { size_t nitems; /* Number of items in the list */ MY_CONTRACTION *item; /* List of contractions */ char *flags; /* Character flags, e.g. "is contraction head") */ } MY_CONTRACTIONS; my_bool my_uca_can_be_contraction_head(const MY_CONTRACTIONS *c, my_wc_t wc); my_bool my_uca_can_be_contraction_tail(const MY_CONTRACTIONS *c, my_wc_t wc); uint16 *my_uca_contraction2_weight(const MY_CONTRACTIONS *c, my_wc_t wc1, my_wc_t wc2); /* Collation weights on a single level (e.g. primary, secondary, tertiarty) */ typedef struct my_uca_level_info_st { my_wc_t maxchar; uchar *lengths; uint16 **weights; MY_CONTRACTIONS contractions; } MY_UCA_WEIGHT_LEVEL; typedef struct uca_info_st { MY_UCA_WEIGHT_LEVEL level[MY_UCA_WEIGHT_LEVELS]; /* Logical positions */ my_wc_t first_non_ignorable; my_wc_t last_non_ignorable; my_wc_t first_primary_ignorable; my_wc_t last_primary_ignorable; my_wc_t first_secondary_ignorable; my_wc_t last_secondary_ignorable; my_wc_t first_tertiary_ignorable; my_wc_t last_tertiary_ignorable; my_wc_t first_trailing; my_wc_t last_trailing; my_wc_t first_variable; my_wc_t last_variable; } MY_UCA_INFO; extern MY_UCA_INFO my_uca_v400; typedef struct uni_ctype_st { uchar pctype; uchar *ctype; } MY_UNI_CTYPE; extern MY_UNI_CTYPE my_uni_ctype[256]; /* wm_wc and wc_mb return codes */ #define MY_CS_ILSEQ 0 /* Wrong by sequence: wb_wc */ #define MY_CS_ILUNI 0 /* Cannot encode Unicode to charset: wc_mb */ #define MY_CS_TOOSMALL -101 /* Need at least one byte: wc_mb and mb_wc */ #define MY_CS_TOOSMALL2 -102 /* Need at least two bytes: wc_mb and mb_wc */ #define MY_CS_TOOSMALL3 -103 /* Need at least three bytes: wc_mb and mb_wc */ /* These following three are currently not really used */ #define MY_CS_TOOSMALL4 -104 /* Need at least 4 bytes: wc_mb and mb_wc */ #define MY_CS_TOOSMALL5 -105 /* Need at least 5 bytes: wc_mb and mb_wc */ #define MY_CS_TOOSMALL6 -106 /* Need at least 6 bytes: wc_mb and mb_wc */ /* A helper macros for "need at least n bytes" */ #define MY_CS_TOOSMALLN(n) (-100-(n)) #define MY_SEQ_INTTAIL 1 #define MY_SEQ_SPACES 2 /* My charsets_list flags */ #define MY_CS_COMPILED 1 /* compiled-in sets */ #define MY_CS_CONFIG 2 /* sets that have a *.conf file */ #define MY_CS_INDEX 4 /* sets listed in the Index file */ #define MY_CS_LOADED 8 /* sets that are currently loaded */ #define MY_CS_BINSORT 16 /* if binary sort order */ #define MY_CS_PRIMARY 32 /* if primary collation */ #define MY_CS_STRNXFRM 64 /* if strnxfrm is used for sort */ #define MY_CS_UNICODE 128 /* is a charset is BMP Unicode */ #define MY_CS_READY 256 /* if a charset is initialized */ #define MY_CS_AVAILABLE 512 /* If either compiled-in or loaded*/ #define MY_CS_CSSORT 1024 /* if case sensitive sort order */ #define MY_CS_HIDDEN 2048 /* don't display in SHOW */ #define MY_CS_PUREASCII 4096 /* if a charset is pure ascii */ #define MY_CS_NONASCII 8192 /* if not ASCII-compatible */ #define MY_CS_UNICODE_SUPPLEMENT 16384 /* Non-BMP Unicode characters */ #define MY_CS_LOWER_SORT 32768 /* If use lower case as weight */ #define MY_CHARSET_UNDEFINED 0 /* Character repertoire flags */ #define MY_REPERTOIRE_ASCII 1 /* Pure ASCII U+0000..U+007F */ #define MY_REPERTOIRE_EXTENDED 2 /* Extended characters: U+0080..U+FFFF */ #define MY_REPERTOIRE_UNICODE30 3 /* ASCII | EXTENDED: U+0000..U+FFFF */ /* Flags for strxfrm */ #define MY_STRXFRM_LEVEL1 0x00000001 /* for primary weights */ #define MY_STRXFRM_LEVEL2 0x00000002 /* for secondary weights */ #define MY_STRXFRM_LEVEL3 0x00000004 /* for tertiary weights */ #define MY_STRXFRM_LEVEL4 0x00000008 /* fourth level weights */ #define MY_STRXFRM_LEVEL5 0x00000010 /* fifth level weights */ #define MY_STRXFRM_LEVEL6 0x00000020 /* sixth level weights */ #define MY_STRXFRM_LEVEL_ALL 0x0000003F /* Bit OR for the above six */ #define MY_STRXFRM_NLEVELS 6 /* Number of possible levels*/ #define MY_STRXFRM_PAD_WITH_SPACE 0x00000040 /* if pad result with spaces */ #define MY_STRXFRM_PAD_TO_MAXLEN 0x00000080 /* if pad tail(for filesort) */ #define MY_STRXFRM_DESC_LEVEL1 0x00000100 /* if desc order for level1 */ #define MY_STRXFRM_DESC_LEVEL2 0x00000200 /* if desc order for level2 */ #define MY_STRXFRM_DESC_LEVEL3 0x00000300 /* if desc order for level3 */ #define MY_STRXFRM_DESC_LEVEL4 0x00000800 /* if desc order for level4 */ #define MY_STRXFRM_DESC_LEVEL5 0x00001000 /* if desc order for level5 */ #define MY_STRXFRM_DESC_LEVEL6 0x00002000 /* if desc order for level6 */ #define MY_STRXFRM_DESC_SHIFT 8 #define MY_STRXFRM_UNUSED_00004000 0x00004000 /* for future extensions */ #define MY_STRXFRM_UNUSED_00008000 0x00008000 /* for future extensions */ #define MY_STRXFRM_REVERSE_LEVEL1 0x00010000 /* if reverse order for level1 */ #define MY_STRXFRM_REVERSE_LEVEL2 0x00020000 /* if reverse order for level2 */ #define MY_STRXFRM_REVERSE_LEVEL3 0x00040000 /* if reverse order for level3 */ #define MY_STRXFRM_REVERSE_LEVEL4 0x00080000 /* if reverse order for level4 */ #define MY_STRXFRM_REVERSE_LEVEL5 0x00100000 /* if reverse order for level5 */ #define MY_STRXFRM_REVERSE_LEVEL6 0x00200000 /* if reverse order for level6 */ #define MY_STRXFRM_REVERSE_SHIFT 16 typedef struct my_uni_idx_st { uint16 from; uint16 to; const uchar *tab; } MY_UNI_IDX; typedef struct { uint beg; uint end; uint mb_len; } my_match_t; struct charset_info_st; typedef struct my_charset_loader_st { char error[128]; void *(*once_alloc)(size_t); void *(*mem_malloc)(size_t); void *(*mem_realloc)(void *, size_t); void (*mem_free)(void *); void (*reporter)(enum loglevel, const char *format, ...); int (*add_collation)(struct charset_info_st *cs); } MY_CHARSET_LOADER; extern int (*my_string_stack_guard)(int); /* See strings/CHARSET_INFO.txt for information about this structure */ typedef struct my_collation_handler_st { my_bool (*init)(struct charset_info_st *, MY_CHARSET_LOADER *); /* Collation routines */ int (*strnncoll)(const struct charset_info_st *, const uchar *, size_t, const uchar *, size_t, my_bool); int (*strnncollsp)(const struct charset_info_st *, const uchar *, size_t, const uchar *, size_t, my_bool diff_if_only_endspace_difference); size_t (*strnxfrm)(const struct charset_info_st *, uchar *dst, size_t dstlen, uint nweights, const uchar *src, size_t srclen, uint flags); size_t (*strnxfrmlen)(const struct charset_info_st *, size_t); my_bool (*like_range)(const struct charset_info_st *, const char *s, size_t s_length, pchar w_prefix, pchar w_one, pchar w_many, size_t res_length, char *min_str, char *max_str, size_t *min_len, size_t *max_len); int (*wildcmp)(const struct charset_info_st *, const char *str,const char *str_end, const char *wildstr,const char *wildend, int escape,int w_one, int w_many); int (*strcasecmp)(const struct charset_info_st *, const char *, const char *); uint (*instr)(const struct charset_info_st *, const char *b, size_t b_length, const char *s, size_t s_length, my_match_t *match, uint nmatch); /* Hash calculation */ void (*hash_sort)(const struct charset_info_st *cs, const uchar *key, size_t len, ulong *nr1, ulong *nr2); my_bool (*propagate)(const struct charset_info_st *cs, const uchar *str, size_t len); } MY_COLLATION_HANDLER; extern MY_COLLATION_HANDLER my_collation_mb_bin_handler; extern MY_COLLATION_HANDLER my_collation_8bit_bin_handler; extern MY_COLLATION_HANDLER my_collation_8bit_simple_ci_handler; extern MY_COLLATION_HANDLER my_collation_ucs2_uca_handler; /* Some typedef to make it easy for C++ to make function pointers */ typedef int (*my_charset_conv_mb_wc)(const struct charset_info_st *, my_wc_t *, const uchar *, const uchar *); typedef int (*my_charset_conv_wc_mb)(const struct charset_info_st *, my_wc_t, uchar *, uchar *); typedef size_t (*my_charset_conv_case)(const struct charset_info_st *, char *, size_t, char *, size_t); /* See strings/CHARSET_INFO.txt about information on this structure */ typedef struct my_charset_handler_st { my_bool (*init)(struct charset_info_st *, MY_CHARSET_LOADER *loader); /* Multibyte routines */ uint (*ismbchar)(const struct charset_info_st *, const char *, const char *); uint (*mbcharlen)(const struct charset_info_st *, uint c); size_t (*numchars)(const struct charset_info_st *, const char *b, const char *e); size_t (*charpos)(const struct charset_info_st *, const char *b, const char *e, size_t pos); size_t (*well_formed_len)(const struct charset_info_st *, const char *b,const char *e, size_t nchars, int *error); size_t (*lengthsp)(const struct charset_info_st *, const char *ptr, size_t length); size_t (*numcells)(const struct charset_info_st *, const char *b, const char *e); /* Unicode conversion */ my_charset_conv_mb_wc mb_wc; my_charset_conv_wc_mb wc_mb; /* CTYPE scanner */ int (*ctype)(const struct charset_info_st *cs, int *ctype, const uchar *s, const uchar *e); /* Functions for case and sort conversion */ size_t (*caseup_str)(const struct charset_info_st *, char *); size_t (*casedn_str)(const struct charset_info_st *, char *); my_charset_conv_case caseup; my_charset_conv_case casedn; /* Charset dependant snprintf() */ size_t (*snprintf)(const struct charset_info_st *, char *to, size_t n, const char *fmt, ...) MY_ATTRIBUTE((format(printf, 4, 5))); size_t (*long10_to_str)(const struct charset_info_st *, char *to, size_t n, int radix, long int val); size_t (*longlong10_to_str)(const struct charset_info_st *, char *to, size_t n, int radix, longlong val); void (*fill)(const struct charset_info_st *, char *to, size_t len, int fill); /* String-to-number conversion routines */ long (*strntol)(const struct charset_info_st *, const char *s, size_t l, int base, char **e, int *err); ulong (*strntoul)(const struct charset_info_st *, const char *s, size_t l, int base, char **e, int *err); longlong (*strntoll)(const struct charset_info_st *, const char *s, size_t l, int base, char **e, int *err); ulonglong (*strntoull)(const struct charset_info_st *, const char *s, size_t l, int base, char **e, int *err); double (*strntod)(const struct charset_info_st *, char *s, size_t l, char **e, int *err); longlong (*strtoll10)(const struct charset_info_st *cs, const char *nptr, char **endptr, int *error); ulonglong (*strntoull10rnd)(const struct charset_info_st *cs, const char *str, size_t length, int unsigned_fl, char **endptr, int *error); size_t (*scan)(const struct charset_info_st *, const char *b, const char *e, int sq); } MY_CHARSET_HANDLER; extern MY_CHARSET_HANDLER my_charset_8bit_handler; extern MY_CHARSET_HANDLER my_charset_ascii_handler; extern MY_CHARSET_HANDLER my_charset_ucs2_handler; /* We define this CHARSET_INFO_DEFINED here to prevent a repeat of the typedef in hash.c, which will cause a compiler error. */ #define CHARSET_INFO_DEFINED /* See strings/CHARSET_INFO.txt about information on this structure */ typedef struct charset_info_st { uint number; uint primary_number; uint binary_number; uint state; const char *csname; const char *name; const char *comment; const char *tailoring; const uchar *ctype; const uchar *to_lower; const uchar *to_upper; const uchar *sort_order; MY_UCA_INFO *uca; /* This can be changed in apply_one_rule() */ const uint16 *tab_to_uni; const MY_UNI_IDX *tab_from_uni; const MY_UNICASE_INFO *caseinfo; const struct lex_state_maps_st *state_maps; /* parser internal data */ const uchar *ident_map; /* parser internal data */ uint strxfrm_multiply; uchar caseup_multiply; uchar casedn_multiply; uint mbminlen; uint mbmaxlen; uint mbmaxlenlen; my_wc_t min_sort_char; my_wc_t max_sort_char; /* For LIKE optimization */ uchar pad_char; my_bool escape_with_backslash_is_dangerous; uchar levels_for_compare; uchar levels_for_order; MY_CHARSET_HANDLER *cset; MY_COLLATION_HANDLER *coll; } CHARSET_INFO; #define ILLEGAL_CHARSET_INFO_NUMBER (~0U) extern MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_bin; extern MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_latin1; extern MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_filename; extern CHARSET_INFO my_charset_big5_chinese_ci; extern CHARSET_INFO my_charset_big5_bin; extern CHARSET_INFO my_charset_cp932_japanese_ci; extern CHARSET_INFO my_charset_cp932_bin; extern CHARSET_INFO my_charset_cp1250_czech_ci; extern CHARSET_INFO my_charset_eucjpms_japanese_ci; extern CHARSET_INFO my_charset_eucjpms_bin; extern CHARSET_INFO my_charset_euckr_korean_ci; extern CHARSET_INFO my_charset_euckr_bin; extern CHARSET_INFO my_charset_gb2312_chinese_ci; extern CHARSET_INFO my_charset_gb2312_bin; extern CHARSET_INFO my_charset_gbk_chinese_ci; extern CHARSET_INFO my_charset_gbk_bin; extern CHARSET_INFO my_charset_gb18030_chinese_ci; extern CHARSET_INFO my_charset_gb18030_bin; extern CHARSET_INFO my_charset_latin1_german2_ci; extern CHARSET_INFO my_charset_latin1_bin; extern CHARSET_INFO my_charset_latin2_czech_ci; extern CHARSET_INFO my_charset_sjis_japanese_ci; extern CHARSET_INFO my_charset_sjis_bin; extern CHARSET_INFO my_charset_tis620_thai_ci; extern CHARSET_INFO my_charset_tis620_bin; extern CHARSET_INFO my_charset_ucs2_general_ci; extern CHARSET_INFO my_charset_ucs2_bin; extern CHARSET_INFO my_charset_ucs2_unicode_ci; extern CHARSET_INFO my_charset_ucs2_general_mysql500_ci; extern CHARSET_INFO my_charset_ujis_japanese_ci; extern CHARSET_INFO my_charset_ujis_bin; extern CHARSET_INFO my_charset_utf16_bin; extern CHARSET_INFO my_charset_utf16_general_ci; extern CHARSET_INFO my_charset_utf16_unicode_ci; extern CHARSET_INFO my_charset_utf16le_bin; extern CHARSET_INFO my_charset_utf16le_general_ci; extern CHARSET_INFO my_charset_utf32_bin; extern CHARSET_INFO my_charset_utf32_general_ci; extern CHARSET_INFO my_charset_utf32_unicode_ci; extern MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_utf8_general_ci; extern CHARSET_INFO my_charset_utf8_tolower_ci; extern CHARSET_INFO my_charset_utf8_unicode_ci; extern CHARSET_INFO my_charset_utf8_bin; extern CHARSET_INFO my_charset_utf8_general_mysql500_ci; extern CHARSET_INFO my_charset_utf8mb4_bin; extern MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_utf8mb4_general_ci; extern CHARSET_INFO my_charset_utf8mb4_unicode_ci; #define MY_UTF8MB3 "utf8" #define MY_UTF8MB4 "utf8mb4" /* declarations for simple charsets */ extern size_t my_strnxfrm_simple(const CHARSET_INFO *, uchar *dst, size_t dstlen, uint nweights, const uchar *src, size_t srclen, uint flags); size_t my_strnxfrmlen_simple(const CHARSET_INFO *, size_t); extern int my_strnncoll_simple(const CHARSET_INFO *, const uchar *, size_t, const uchar *, size_t, my_bool); extern int my_strnncollsp_simple(const CHARSET_INFO *, const uchar *, size_t, const uchar *, size_t, my_bool diff_if_only_endspace_difference); extern void my_hash_sort_simple(const CHARSET_INFO *cs, const uchar *key, size_t len, ulong *nr1, ulong *nr2); extern size_t my_lengthsp_8bit(const CHARSET_INFO *cs, const char *ptr, size_t length); extern uint my_instr_simple(const struct charset_info_st *, const char *b, size_t b_length, const char *s, size_t s_length, my_match_t *match, uint nmatch); /* Functions for 8bit */ extern size_t my_caseup_str_8bit(const CHARSET_INFO *, char *); extern size_t my_casedn_str_8bit(const CHARSET_INFO *, char *); extern size_t my_caseup_8bit(const CHARSET_INFO *, char *src, size_t srclen, char *dst, size_t dstlen); extern size_t my_casedn_8bit(const CHARSET_INFO *, char *src, size_t srclen, char *dst, size_t dstlen); extern int my_strcasecmp_8bit(const CHARSET_INFO * cs, const char *, const char *); int my_mb_wc_8bit(const CHARSET_INFO *cs,my_wc_t *wc, const uchar *s, const uchar *e); int my_wc_mb_8bit(const CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e); int my_mb_ctype_8bit(const CHARSET_INFO *,int *, const uchar *,const uchar *); int my_mb_ctype_mb(const CHARSET_INFO *,int *, const uchar *,const uchar *); size_t my_scan_8bit(const CHARSET_INFO *cs, const char *b, const char *e, int sq); size_t my_snprintf_8bit(const struct charset_info_st *, char *to, size_t n, const char *fmt, ...) MY_ATTRIBUTE((format(printf, 4, 5))); long my_strntol_8bit(const CHARSET_INFO *, const char *s, size_t l, int base, char **e, int *err); ulong my_strntoul_8bit(const CHARSET_INFO *, const char *s, size_t l, int base, char **e, int *err); longlong my_strntoll_8bit(const CHARSET_INFO *, const char *s, size_t l, int base, char **e, int *err); ulonglong my_strntoull_8bit(const CHARSET_INFO *, const char *s, size_t l, int base, char **e, int *err); double my_strntod_8bit(const CHARSET_INFO *, char *s, size_t l, char **e, int *err); size_t my_long10_to_str_8bit(const CHARSET_INFO *, char *to, size_t l, int radix, long int val); size_t my_longlong10_to_str_8bit(const CHARSET_INFO *, char *to, size_t l, int radix, longlong val); longlong my_strtoll10_8bit(const CHARSET_INFO *cs, const char *nptr, char **endptr, int *error); longlong my_strtoll10_ucs2(const CHARSET_INFO *cs, const char *nptr, char **endptr, int *error); ulonglong my_strntoull10rnd_8bit(const CHARSET_INFO *cs, const char *str, size_t length, int unsigned_fl, char **endptr, int *error); ulonglong my_strntoull10rnd_ucs2(const CHARSET_INFO *cs, const char *str, size_t length, int unsigned_fl, char **endptr, int *error); void my_fill_8bit(const CHARSET_INFO *cs, char* to, size_t l, int fill); /* For 8-bit character set */ my_bool my_like_range_simple(const CHARSET_INFO *cs, const char *ptr, size_t ptr_length, pbool escape, pbool w_one, pbool w_many, size_t res_length, char *min_str, char *max_str, size_t *min_length, size_t *max_length); /* For ASCII-based multi-byte character sets with mbminlen=1 */ my_bool my_like_range_mb(const CHARSET_INFO *cs, const char *ptr, size_t ptr_length, pbool escape, pbool w_one, pbool w_many, size_t res_length, char *min_str, char *max_str, size_t *min_length, size_t *max_length); /* For other character sets, with arbitrary mbminlen and mbmaxlen numbers */ my_bool my_like_range_generic(const CHARSET_INFO *cs, const char *ptr, size_t ptr_length, pbool escape, pbool w_one, pbool w_many, size_t res_length, char *min_str, char *max_str, size_t *min_length, size_t *max_length); int my_wildcmp_8bit(const CHARSET_INFO *, const char *str,const char *str_end, const char *wildstr,const char *wildend, int escape, int w_one, int w_many); int my_wildcmp_bin(const CHARSET_INFO *, const char *str,const char *str_end, const char *wildstr,const char *wildend, int escape, int w_one, int w_many); size_t my_numchars_8bit(const CHARSET_INFO *, const char *b, const char *e); size_t my_numcells_8bit(const CHARSET_INFO *, const char *b, const char *e); size_t my_charpos_8bit(const CHARSET_INFO *, const char *b, const char *e, size_t pos); size_t my_well_formed_len_8bit(const CHARSET_INFO *, const char *b, const char *e, size_t pos, int *error); uint my_mbcharlen_8bit(const CHARSET_INFO *, uint c); /* Functions for multibyte charsets */ extern size_t my_caseup_str_mb(const CHARSET_INFO *, char *); extern size_t my_casedn_str_mb(const CHARSET_INFO *, char *); extern size_t my_caseup_mb(const CHARSET_INFO *, char *src, size_t srclen, char *dst, size_t dstlen); extern size_t my_casedn_mb(const CHARSET_INFO *, char *src, size_t srclen, char *dst, size_t dstlen); extern size_t my_caseup_mb_varlen(const CHARSET_INFO *, char *src, size_t srclen, char *dst, size_t dstlen); extern size_t my_casedn_mb_varlen(const CHARSET_INFO *, char *src, size_t srclen, char *dst, size_t dstlen); extern size_t my_caseup_ujis(const CHARSET_INFO *, char *src, size_t srclen, char *dst, size_t dstlen); extern size_t my_casedn_ujis(const CHARSET_INFO *, char *src, size_t srclen, char *dst, size_t dstlen); extern int my_strcasecmp_mb(const CHARSET_INFO * cs,const char *, const char *); int my_wildcmp_mb(const CHARSET_INFO *, const char *str,const char *str_end, const char *wildstr,const char *wildend, int escape, int w_one, int w_many); size_t my_numchars_mb(const CHARSET_INFO *, const char *b, const char *e); size_t my_numcells_mb(const CHARSET_INFO *, const char *b, const char *e); size_t my_charpos_mb(const CHARSET_INFO *, const char *b, const char *e, size_t pos); size_t my_well_formed_len_mb(const CHARSET_INFO *, const char *b, const char *e, size_t pos, int *error); uint my_instr_mb(const struct charset_info_st *, const char *b, size_t b_length, const char *s, size_t s_length, my_match_t *match, uint nmatch); int my_strnncoll_mb_bin(const CHARSET_INFO * cs, const uchar *s, size_t slen, const uchar *t, size_t tlen, my_bool t_is_prefix); int my_strnncollsp_mb_bin(const CHARSET_INFO *cs, const uchar *a, size_t a_length, const uchar *b, size_t b_length, my_bool diff_if_only_endspace_difference); int my_wildcmp_mb_bin(const CHARSET_INFO *cs, const char *str,const char *str_end, const char *wildstr,const char *wildend, int escape, int w_one, int w_many); int my_strcasecmp_mb_bin(const CHARSET_INFO * cs MY_ATTRIBUTE((unused)), const char *s, const char *t); void my_hash_sort_mb_bin(const CHARSET_INFO *cs MY_ATTRIBUTE((unused)), const uchar *key, size_t len,ulong *nr1, ulong *nr2); size_t my_strnxfrm_mb(const CHARSET_INFO *, uchar *dst, size_t dstlen, uint nweights, const uchar *src, size_t srclen, uint flags); size_t my_strnxfrm_unicode(const CHARSET_INFO *, uchar *dst, size_t dstlen, uint nweights, const uchar *src, size_t srclen, uint flags); size_t my_strnxfrm_unicode_full_bin(const CHARSET_INFO *, uchar *dst, size_t dstlen, uint nweights, const uchar *src, size_t srclen, uint flags); size_t my_strnxfrmlen_unicode_full_bin(const CHARSET_INFO *, size_t); int my_wildcmp_unicode(const CHARSET_INFO *cs, const char *str, const char *str_end, const char *wildstr, const char *wildend, int escape, int w_one, int w_many, const MY_UNICASE_INFO *weights); extern my_bool my_parse_charset_xml(MY_CHARSET_LOADER *loader, const char *buf, size_t buflen); extern char *my_strchr(const CHARSET_INFO *cs, const char *str, const char *end, pchar c); extern size_t my_strcspn(const CHARSET_INFO *cs, const char *str, const char *end, const char *reject, size_t reject_length); my_bool my_propagate_simple(const CHARSET_INFO *cs, const uchar *str, size_t len); my_bool my_propagate_complex(const CHARSET_INFO *cs, const uchar *str, size_t len); uint my_string_repertoire(const CHARSET_INFO *cs, const char *str, size_t len); my_bool my_charset_is_ascii_based(const CHARSET_INFO *cs); my_bool my_charset_is_8bit_pure_ascii(const CHARSET_INFO *cs); uint my_charset_repertoire(const CHARSET_INFO *cs); uint my_strxfrm_flag_normalize(uint flags, uint nlevels); void my_strxfrm_desc_and_reverse(uchar *str, uchar *strend, uint flags, uint level); size_t my_strxfrm_pad_desc_and_reverse(const CHARSET_INFO *cs, uchar *str, uchar *frmend, uchar *strend, uint nweights, uint flags, uint level); my_bool my_charset_is_ascii_compatible(const CHARSET_INFO *cs); const MY_CONTRACTIONS *my_charset_get_contractions(const CHARSET_INFO *cs, int level); extern size_t my_vsnprintf_ex(const CHARSET_INFO *cs, char *to, size_t n, const char* fmt, va_list ap); size_t my_convert(char *to, size_t to_length, const CHARSET_INFO *to_cs, const char *from, size_t from_length, const CHARSET_INFO *from_cs, uint *errors); uint my_mbcharlen_ptr(const CHARSET_INFO *cs, const char *s, const char *e); #define _MY_U 01 /* Upper case */ #define _MY_L 02 /* Lower case */ #define _MY_NMR 04 /* Numeral (digit) */ #define _MY_SPC 010 /* Spacing character */ #define _MY_PNT 020 /* Punctuation */ #define _MY_CTR 040 /* Control character */ #define _MY_B 0100 /* Blank */ #define _MY_X 0200 /* heXadecimal digit */ #define my_isascii(c) (!((c) & ~0177)) #define my_toascii(c) ((c) & 0177) #define my_tocntrl(c) ((c) & 31) #define my_toprint(c) ((c) | 64) #define my_toupper(s,c) (char) ((s)->to_upper[(uchar) (c)]) #define my_tolower(s,c) (char) ((s)->to_lower[(uchar) (c)]) #define my_isalpha(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_U | _MY_L)) #define my_isupper(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_U) #define my_islower(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_L) #define my_isdigit(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_NMR) #define my_isxdigit(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_X) #define my_isalnum(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_U | _MY_L | _MY_NMR)) #define my_isspace(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_SPC) #define my_ispunct(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_PNT) #define my_isprint(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_PNT | _MY_U | _MY_L | _MY_NMR | _MY_B)) #define my_isgraph(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_PNT | _MY_U | _MY_L | _MY_NMR)) #define my_iscntrl(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_CTR) /* Some macros that should be cleaned up a little */ #define my_isvar(s,c) (my_isalnum(s,c) || (c) == '_') #define my_isvar_start(s,c) (my_isalpha(s,c) || (c) == '_') #define my_binary_compare(s) ((s)->state & MY_CS_BINSORT) #define use_strnxfrm(s) ((s)->state & MY_CS_STRNXFRM) #define my_strnxfrm(cs, d, dl, s, sl) \ ((cs)->coll->strnxfrm((cs), (d), (dl), (dl), (s), (sl), MY_STRXFRM_PAD_WITH_SPACE)) #define my_strnncoll(s, a, b, c, d) ((s)->coll->strnncoll((s), (a), (b), (c), (d), 0)) #define my_like_range(s, a, b, c, d, e, f, g, h, i, j) \ ((s)->coll->like_range((s), (a), (b), (c), (d), (e), (f), (g), (h), (i), (j))) #define my_wildcmp(cs,s,se,w,we,e,o,m) ((cs)->coll->wildcmp((cs),(s),(se),(w),(we),(e),(o),(m))) #define my_strcasecmp(s, a, b) ((s)->coll->strcasecmp((s), (a), (b))) #define my_charpos(cs, b, e, num) (cs)->cset->charpos((cs), (const char*) (b), (const char *)(e), (num)) #define use_mb(s) ((s)->cset->ismbchar != NULL) #define my_ismbchar(s, a, b) ((s)->cset->ismbchar((s), (a), (b))) #define my_mbcharlen(s, a) ((s)->cset->mbcharlen((s),(a))) /** Get the length of gb18030 code by the given two leading bytes @param[in] s charset_info @param[in] a first byte of gb18030 code @param[in] b second byte of gb18030 code @return the length of gb18030 code starting with given two bytes, the length would be 2 or 4 for valid gb18030 code, or 0 for invalid gb18030 code */ #define my_mbcharlen_2(s, a, b) ((s)->cset->mbcharlen((s),((((a) & 0xFF) << 8) + ((b) & 0xFF)))) /** Get the maximum length of leading bytes needed to determine the length of a multi-byte gb18030 code @param[in] s charset_info @return number of leading bytes we need, would be 2 for gb18030 and 1 for all other charsets */ #define my_mbmaxlenlen(s) ((s)->mbmaxlenlen) /** Judge if the given byte is a possible leading byte for a charset. For gb18030 whose mbmaxlenlen is 2, we can't determine the length of a multi-byte character by looking at the first byte only @param[in] s charset_info @param[in] i possible leading byte @return true if it is, otherwise false */ #define my_ismb1st(s, i) \ (my_mbcharlen((s), (i)) > 1 || \ (my_mbmaxlenlen((s)) == 2 && my_mbcharlen((s), (i)) == 0)) #define my_caseup_str(s, a) ((s)->cset->caseup_str((s), (a))) #define my_casedn_str(s, a) ((s)->cset->casedn_str((s), (a))) #define my_strntol(s, a, b, c, d, e) ((s)->cset->strntol((s),(a),(b),(c),(d),(e))) #define my_strntoul(s, a, b, c, d, e) ((s)->cset->strntoul((s),(a),(b),(c),(d),(e))) #define my_strntoll(s, a, b, c, d, e) ((s)->cset->strntoll((s),(a),(b),(c),(d),(e))) #define my_strntoull(s, a, b, c,d, e) ((s)->cset->strntoull((s),(a),(b),(c),(d),(e))) #define my_strntod(s, a, b, c, d) ((s)->cset->strntod((s),(a),(b),(c),(d))) #ifdef __cplusplus } #endif #endif /* _m_ctype_h */ PKpmysql/service_srv_session_info.hnu[PKp > A\ sslopt-longopts.hnu[PKp