diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/Makefile.am | 17 | ||||
-rw-r--r-- | include/errmsg.h | 8 | ||||
-rw-r--r-- | include/ft_global.h | 37 | ||||
-rw-r--r-- | include/heap.h | 3 | ||||
-rw-r--r-- | include/m_ctype.h | 4 | ||||
-rw-r--r-- | include/md5.h | 78 | ||||
-rw-r--r-- | include/my_base.h | 8 | ||||
-rw-r--r-- | include/my_global.h (renamed from include/global.h) | 28 | ||||
-rw-r--r-- | include/my_net.h | 49 | ||||
-rw-r--r-- | include/my_pthread.h | 1 | ||||
-rw-r--r-- | include/my_sys.h | 44 | ||||
-rw-r--r-- | include/my_tree.h | 21 | ||||
-rw-r--r-- | include/myisam.h | 22 | ||||
-rw-r--r-- | include/myisammrg.h | 15 | ||||
-rw-r--r-- | include/mysql.h | 262 | ||||
-rw-r--r-- | include/mysql_com.h | 50 | ||||
-rw-r--r-- | include/mysql_embed.h | 30 | ||||
-rw-r--r-- | include/mysqld_error.h | 14 | ||||
-rw-r--r-- | include/sslopt-case.h | 6 | ||||
-rw-r--r-- | include/sslopt-longopts.h | 2 | ||||
-rw-r--r-- | include/sslopt-usage.h | 3 | ||||
-rw-r--r-- | include/sslopt-vars.h | 1 | ||||
-rw-r--r-- | include/violite.h | 186 |
23 files changed, 693 insertions, 196 deletions
diff --git a/include/Makefile.am b/include/Makefile.am index f3685b51cd3..54451e9d4f6 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -16,28 +16,28 @@ # MA 02111-1307, USA BUILT_SOURCES = mysql_version.h m_ctype.h my_config.h -pkginclude_HEADERS = dbug.h m_string.h my_sys.h mysql.h mysql_com.h \ - mysqld_error.h my_list.h \ +pkginclude_HEADERS = dbug.h m_string.h my_sys.h my_list.h \ + mysql.h mysql_com.h mysqld_error.h mysql_embed.h \ my_pthread.h my_no_pthread.h raid.h errmsg.h \ my_global.h my_net.h \ sslopt-case.h sslopt-longopts.h sslopt-usage.h \ sslopt-vars.h $(BUILT_SOURCES) -noinst_HEADERS = global.h config-win.h \ +noinst_HEADERS = config-win.h \ nisam.h heap.h merge.h my_bitmap.h\ myisam.h myisampack.h myisammrg.h ft_global.h\ my_dir.h mysys_err.h my_base.h \ my_nosys.h my_alarm.h queues.h \ my_tree.h hash.h thr_alarm.h thr_lock.h \ - getopt.h t_ctype.h violite.h \ + getopt.h t_ctype.h violite.h md5.h \ mysql_version.h.in # mysql_version.h are generated -SUPERCLEANFILES = mysql_version.h my_global.h my_config.h +SUPERCLEANFILES = mysql_version.h my_config.h # Some include files that may be moved and patched by configure DISTCLEANFILES = sched.h -all-local: my_global.h my_config.h +all-local: my_config.h # Since we include my_config.h it better exist from the beginning link_sources: @@ -48,11 +48,6 @@ link_sources: my_config.h: ../config.h $(CP) ../config.h my_config.h -# This should be changed in the source and removed. -my_global.h: global.h - $(RM) -f my_global.h - $(CP) global.h my_global.h - # These files should not be included in distributions since they are # generated by configure from the .h.in files dist-hook: diff --git a/include/errmsg.h b/include/errmsg.h index 8087c526937..ecc9761a391 100644 --- a/include/errmsg.h +++ b/include/errmsg.h @@ -57,3 +57,11 @@ extern const char *client_errors[]; /* Error messages */ #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 + + + diff --git a/include/ft_global.h b/include/ft_global.h index 3937bd87c7f..0dbef652ce2 100644 --- a/include/ft_global.h +++ b/include/ft_global.h @@ -27,29 +27,36 @@ extern "C" { #endif #define FT_QUERY_MAXLEN 1024 +#define HA_FT_MAXLEN 254 -typedef struct ft_doc_rec { - my_off_t dpos; - double weight; -} FT_DOC; +typedef struct st_ft_info FT_INFO; +struct _ft_vft { + int (*read_next)(FT_INFO *, char *); + float (*find_relevance)(FT_INFO *, my_off_t, byte *); + void (*close_search)(FT_INFO *); + float (*get_relevance)(FT_INFO *); + my_off_t (*get_docid)(FT_INFO *); + void (*reinit_search)(FT_INFO *); +}; -typedef struct st_ft_doclist { - int ndocs; - int curdoc; - void *info; /* actually (MI_INFO *) but don't want to include myisam.h */ - FT_DOC doc[1]; -} FT_DOCLIST; +#ifndef FT_CORE +struct st_ft_info { + struct _ft_vft *please; /* INTERCAL style :-) */ +}; +#endif extern const char *ft_precompiled_stopwords[]; +extern uint ft_min_word_len; +extern uint ft_max_word_len; +extern uint ft_max_word_len_for_sort; + int ft_init_stopwords(const char **); void ft_free_stopwords(void); -FT_DOCLIST * ft_init_search(void *, uint, byte *, uint, my_bool); -int ft_read_next(FT_DOCLIST *, char *); -#define ft_close_search(handler) my_free(((gptr)(handler)),MYF(0)) -#define ft_get_relevance(handler) ((handler)->doc[(handler)->curdoc].weight) -#define ft_reinit_search(handler) (((FT_DOCLIST *)(handler))->curdoc=-1) +#define FT_NL 0 +#define FT_BOOL 1 +FT_INFO *ft_init_search(uint,void *, uint, byte *, uint, my_bool); #ifdef __cplusplus } diff --git a/include/heap.h b/include/heap.h index 14698810297..813df2a7ddd 100644 --- a/include/heap.h +++ b/include/heap.h @@ -109,6 +109,7 @@ typedef struct st_heap_share THR_LOCK lock; pthread_mutex_t intern_lock; /* Locking for use with _locking */ #endif + my_bool delete_on_close; LIST open_list; } HP_SHARE; @@ -144,7 +145,7 @@ extern int heap_scan(register HP_INFO *info, byte *record); extern int heap_delete(HP_INFO *info,const byte *buff); extern int heap_info(HP_INFO *info,HEAPINFO *x,int flag); extern int heap_create(const char *name); -extern int heap_delete_all(const char *name); +extern int heap_delete_table(const char *name); extern int heap_extra(HP_INFO *info,enum ha_extra_function function); extern int heap_rename(const char *old_name,const char *new_name); extern int heap_panic(enum ha_panic_function flag); diff --git a/include/m_ctype.h b/include/m_ctype.h index 645c07b79ae..86a67541d73 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -17,7 +17,7 @@ /* A better inplementation of the UNIX ctype(3) library. - Notes: global.h should be included before ctype.h + Notes: my_global.h should be included before ctype.h */ #ifndef _m_ctype_h @@ -57,6 +57,8 @@ extern CHARSET_INFO *default_charset_info; extern CHARSET_INFO *find_compiled_charset(uint cs_number); extern CHARSET_INFO *find_compiled_charset_by_name(const char *name); extern CHARSET_INFO compiled_charsets[]; +extern uint compiled_charset_number(const char *name); +extern const char *compiled_charset_name(uint charset_number); #define MY_CHARSET_UNDEFINED 0 #define MY_CHARSET_CURRENT (default_charset_info->number) diff --git a/include/md5.h b/include/md5.h new file mode 100644 index 00000000000..6fe4e543bb0 --- /dev/null +++ b/include/md5.h @@ -0,0 +1,78 @@ + +/* MD5.H - header file for MD5C.C + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. + */ + +/* GLOBAL.H - RSAREF types and constants + */ + +/* PROTOTYPES should be set to one if and only if the compiler supports + function argument prototyping. +The following makes PROTOTYPES default to 0 if it has not already + been defined with C compiler flags. + */ + +/* egcs 1.1.2 under linux didn't defined it.... :( */ + +#ifndef PROTOTYPES +#define PROTOTYPES 1 /* Assume prototypes */ +#endif + +/* POINTER defines a generic pointer type */ +typedef unsigned char *POINTER; + +/* UINT2 defines a two byte word */ +typedef uint16 UINT2; /* Fix for MySQL / Alpha */ + +/* UINT4 defines a four byte word */ +typedef uint32 UINT4; /* Fix for MySQL / Alpha */ + +/* PROTO_LIST is defined depending on how PROTOTYPES is defined above. +If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it + returns an empty list. + */ +#if PROTOTYPES +#define PROTO_LIST(list) list +#else +#define PROTO_LIST(list) () +#endif +/* MD5 context. */ +typedef struct { + UINT4 state[4]; /* state (ABCD) */ + UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ + unsigned char buffer[64]; /* input buffer */ +} my_MD5_CTX; + +#ifdef __cplusplus +extern "C" { +#endif + void my_MD5Init PROTO_LIST ((my_MD5_CTX *)); + void my_MD5Update PROTO_LIST + ((my_MD5_CTX *, unsigned char *, unsigned int)); + void my_MD5Final PROTO_LIST ((unsigned char [16], my_MD5_CTX *)); + +#ifdef __cplusplus +} +#endif + diff --git a/include/my_base.h b/include/my_base.h index 2e097f26dc1..4fdc2c33a39 100644 --- a/include/my_base.h +++ b/include/my_base.h @@ -24,7 +24,7 @@ #ifndef stdin /* Included first in handler */ #define USES_TYPES /* my_dir with sys/types is included */ #define CHSIZE_USED -#include <global.h> +#include <my_global.h> #include <my_dir.h> /* This includes types */ #include <my_sys.h> #include <m_string.h> @@ -91,7 +91,10 @@ enum ha_extra_function { HA_EXTRA_RESET_STATE, /* Reset positions */ HA_EXTRA_IGNORE_DUP_KEY, /* Dup keys don't rollback everything*/ HA_EXTRA_NO_IGNORE_DUP_KEY, - HA_EXTRA_DONT_USE_CURSOR_TO_UPDATE /* Cursor will not be used for update */ + HA_EXTRA_DONT_USE_CURSOR_TO_UPDATE, /* Cursor will not be used for update */ + HA_EXTRA_BULK_INSERT_BEGIN, + HA_EXTRA_BULK_INSERT_END, + HA_EXTRA_PREPARE_FOR_DELETE }; /* The following is parameter to ha_panic() */ @@ -156,6 +159,7 @@ enum ha_base_keytype { #define HA_BLOB_PART 32 #define HA_SWAP_KEY 64 #define HA_REVERSE_SORT 128 /* Sort key in reverse order */ +#define HA_NO_SORT 256 /* do not bother sorting on this keyseg */ /* optionbits for database */ #define HA_OPTION_PACK_RECORD 1 diff --git a/include/global.h b/include/my_global.h index c7d6952f1c6..6f33e570ba3 100644 --- a/include/global.h +++ b/include/my_global.h @@ -189,7 +189,13 @@ # endif #endif /* TIME_WITH_SYS_TIME */ #ifdef HAVE_UNISTD_H +#ifdef HAVE_OPENSSL +#define crypt dummy +#endif #include <unistd.h> +#ifdef HAVE_OPENSSL +#undef crypt +#endif #endif #if defined(__cplusplus) && defined(NO_CPLUSPLUS_ALLOCA) #undef HAVE_ALLOCA @@ -256,7 +262,7 @@ int __void__; #define LINT_INIT(var) #endif -/* Define som useful general macros */ +/* Define some useful general macros */ #if defined(__cplusplus) && defined(__GNUC__) #define max(a, b) ((a) >? (b)) #define min(a, b) ((a) <? (b)) @@ -270,6 +276,7 @@ typedef unsigned int uint; typedef unsigned short ushort; #endif +#define CMP(a,b) (((a) < (b)) ? -1 : ((a) == (b)) ? 0 : 1) #define sgn(a) (((a) < 0) ? -1 : ((a) > 0) ? 1 : 0) #define swap(t,a,b) { register t dummy; dummy = a; a = b; b = dummy; } #define test(a) ((a) ? 1 : 0) @@ -351,6 +358,7 @@ typedef int pshort; /* Mixed prototypes can't take short int */ typedef double pfloat; /* Mixed prototypes can't take float */ #endif typedef int (*qsort_cmp)(const void *,const void *); +typedef int (*qsort_cmp2)(void*, const void *,const void *); #ifdef HAVE_mit_thread #define qsort_t void #undef QSORT_TYPE_IS_VOID @@ -446,8 +454,6 @@ typedef SOCKET_SIZE_TYPE size_socket; /* Some things that this system doesn't have */ #define ONLY_OWN_DATABASES /* We are using only databases by monty */ -#define NO_PISAM /* Not needed anymore */ -#define NO_MISAM /* Not needed anymore */ #define NO_HASH /* Not needed anymore */ #ifdef __WIN__ #define NO_DIR_LIBRARY /* Not standar dir-library */ @@ -647,6 +653,7 @@ typedef off_t os_off_t; #define socket_errno WSAGetLastError() #define SOCKET_EINTR WSAEINTR #define SOCKET_EAGAIN WSAEINPROGRESS +#define SOCKET_EWOULDBLOCK WSAEINPROGRESS #define SOCKET_ENFILE ENFILE #define SOCKET_EMFILE EMFILE #elif defined(OS2) @@ -808,9 +815,9 @@ typedef union { *((uchar*) (T))= (uchar)(def_temp); \ *((uchar*) (T+1))=(uchar)((def_temp >> 8)); } #define int3store(T,A) { /*lint -save -e734 */\ - *((T))=(char) ((A));\ - *((T)+1)=(char) (((A) >> 8));\ - *((T)+2)=(char) (((A) >> 16)); \ + *((uchar*)(T))=(uchar) ((A));\ + *((uchar*) (T)+1)=(uchar) (((A) >> 8));\ + *((uchar*)(T)+2)=(uchar) (((A) >> 16)); \ /*lint -restore */} #define int4store(T,A) { *(T)=(char) ((A));\ *((T)+1)=(char) (((A) >> 8));\ @@ -958,4 +965,13 @@ typedef union { #define statistic_add(V,C,L) (V)+=(C) #endif +/* 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 + #endif /* _global_h */ diff --git a/include/my_net.h b/include/my_net.h index 6a8e98d685c..de1207bee36 100644 --- a/include/my_net.h +++ b/include/my_net.h @@ -15,14 +15,20 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ -/* thread safe version of some common functions */ +/* + thread safe version of some common functions: + my_inet_ntoa -/* for thread safe my_inet_ntoa */ -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ + This file is also used to make handling of sockets and ioctl() + portable accross systems. -#if !defined(MSDOS) && !defined(__WIN__) && !defined(__BEOS__) +*/ + +#ifndef _my_net_h +#define _my_net_h +C_MODE_START + +#include <errno.h> #ifdef HAVE_SYS_SOCKET_H #include <sys/socket.h> #endif @@ -32,10 +38,35 @@ extern "C" { #ifdef HAVE_ARPA_INET_H #include <arpa/inet.h> #endif -#endif /* !defined(MSDOS) && !defined(__WIN__) */ +#ifdef HAVE_POLL +#include <sys/poll.h> +#endif +#ifdef HAVE_SYS_IOCTL_H +#include <sys/ioctl.h> +#endif + +#if !defined(MSDOS) && !defined(__WIN__) && !defined(HAVE_BROKEN_NETINET_INCLUDES) && !defined(__BEOS__) +#include <netinet/in_systm.h> +#include <netinet/in.h> +#include <netinet/ip.h> +#if !defined(alpha_linux_port) +#include <netinet/tcp.h> +#endif +#endif + +#if defined(__EMX__) +#include <sys/ioctl.h> +#define ioctlsocket(A,B,C) ioctl((A),(B),(void *)(C),sizeof(*(C))) +#undef HAVE_FCNTL +#endif /* defined(__EMX__) */ + +#if defined(MSDOS) || defined(__WIN__) +#define O_NONBLOCK 1 /* For emulation of fcntl() */ +#endif + +/* Thread safe or portable version of some functions */ void my_inet_ntoa(struct in_addr in, char *buf); -#ifdef __cplusplus -} +C_MODE_END #endif diff --git a/include/my_pthread.h b/include/my_pthread.h index cd72bcced83..577d3dea3b2 100644 --- a/include/my_pthread.h +++ b/include/my_pthread.h @@ -623,5 +623,4 @@ extern struct st_my_thread_var *_my_thread_var(void) __attribute__ ((const)); #ifdef __cplusplus } #endif - #endif /* _my_ptread_h */ diff --git a/include/my_sys.h b/include/my_sys.h index 5b45f6a91e5..e6197d896cc 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -59,6 +59,9 @@ extern int NEAR my_errno; /* Last error in mysys */ #define MY_WME 16 /* Write message on error */ #define MY_WAIT_IF_FULL 32 /* Wait and try again if disk full error */ #define MY_RAID 64 /* Support for RAID (not the "Johnson&Johnson"-s one ;) */ +#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 */ @@ -90,6 +93,16 @@ extern int NEAR my_errno; /* Last error in mysys */ #define ME_COLOUR2 ((2 << ME_HIGHBYTE)) #define ME_COLOUR3 ((3 << ME_HIGHBYTE)) + /* 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' */ + /* My seek flags */ #define MY_SEEK_SET 0 #define MY_SEEK_CUR 1 @@ -106,11 +119,13 @@ extern int NEAR my_errno; /* Last error in mysys */ #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 KEYCACHE_BLOCK_SIZE 1024 +#define DEFAULT_KEYCACHE_BLOCK_SIZE 1024 +#define MAX_KEYCACHE_BLOCK_SIZE 16384 /* root_alloc flags */ #define MY_KEEP_PREALLOC 1 - +#define MY_MARK_BLOCKS_FREE 2 /* move used to free list and reuse them */ + /* defines when allocating data */ #ifdef SAFEMALLOC @@ -189,9 +204,10 @@ extern char *get_charsets_dir(char *buf); /* statistics */ extern ulong _my_cache_w_requests,_my_cache_write,_my_cache_r_requests, _my_cache_read; -extern ulong _my_blocks_used,_my_blocks_changed; +extern ulong _my_blocks_used,_my_blocks_changed; +extern uint key_cache_block_size; extern ulong my_file_opened,my_stream_opened, my_tmp_file_created; -extern my_bool key_cache_inited; +extern my_bool key_cache_inited, my_init_done; /* Point to current my_message() */ extern void (*my_sigtstp_cleanup)(void), @@ -246,7 +262,8 @@ typedef struct st_record_cache /* Used when cacheing records */ } RECORD_CACHE; enum file_type { UNOPEN = 0, FILE_BY_OPEN, FILE_BY_CREATE, - STREAM_BY_FOPEN, STREAM_BY_FDOPEN, FILE_BY_MKSTEMP }; + STREAM_BY_FOPEN, STREAM_BY_FDOPEN, FILE_BY_MKSTEMP, + FILE_BY_DUP }; extern struct my_file_info { @@ -270,12 +287,19 @@ typedef struct st_dynamic_string { uint 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 /* Used when cacheing files */ { my_off_t pos_in_file,end_of_file; byte *rc_pos,*rc_end,*buffer,*rc_request_pos; int (*read_function)(struct st_io_cache *,byte *,uint); + /* callbacks when the actual read I/O happens */ + IO_CACHE_CALLBACK pre_read; + IO_CACHE_CALLBACK post_read; + IO_CACHE_CALLBACK pre_close; + void* arg; /* for use by pre/post_read */ char *file_name; /* if used with 'open_cached_file' */ char *dir,*prefix; File file; @@ -380,6 +404,7 @@ extern File my_register_filename(File fd, const char *FileName, extern File my_create(const char *FileName,int CreateFlags, int AccsesFlags, myf MyFlags); extern int my_close(File Filedes,myf MyFlags); +extern File my_dup(File file, 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_realpath(char *to, const char *filename, myf MyFlags); @@ -457,12 +482,12 @@ extern uint dirname_part(my_string to,const char *name); extern uint dirname_length(const char *name); #define base_name(A) (A+dirname_length(A)) extern int test_if_hard_path(const char *dir_name); -extern char *convert_dirname(my_string name); +extern char *convert_dirname(char *to, const char *from, const char *from_end); extern void to_unix_path(my_string name); extern my_string fn_ext(const char *name); extern my_string fn_same(my_string toname,const char *name,int flag); -extern my_string fn_format(my_string to,const char *name,const char *dsk, - const char *form,int flag); +extern my_string fn_format(my_string to,const char *name,const char *dir, + const char *form, uint flag); extern size_s strlength(const char *str); extern void pack_dirname(my_string to,const char *from); extern uint unpack_dirname(my_string to,const char *from); @@ -581,7 +606,9 @@ extern void my_free_lock(byte *ptr,myf flags); void init_alloc_root(MEM_ROOT *mem_root, uint block_size, uint pre_alloc_size); gptr alloc_root(MEM_ROOT *mem_root,unsigned int Size); void free_root(MEM_ROOT *root, myf MyFLAGS); +void set_prealloc_root(MEM_ROOT *root, char *ptr); char *strdup_root(MEM_ROOT *root,const char *str); +char *strmake_root(MEM_ROOT *root,const char *str,uint len); char *memdup_root(MEM_ROOT *root,const char *str,uint len); void load_defaults(const char *conf_file, const char **groups, int *argc, char ***argv); @@ -591,6 +618,7 @@ my_bool my_compress(byte *, ulong *, ulong *); my_bool my_uncompress(byte *, ulong *, ulong *); byte *my_compress_alloc(const byte *packet, ulong *len, ulong *complen); ulong checksum(const byte *mem, uint count); +uint my_bit_log2(ulong value); #if defined(_MSC_VER) && !defined(__WIN__) extern void sleep(int sec); diff --git a/include/my_tree.h b/include/my_tree.h index 0a227ea3944..d3adbe17e6f 100644 --- a/include/my_tree.h +++ b/include/my_tree.h @@ -32,6 +32,9 @@ typedef enum { left_root_right, right_root_left } TREE_WALK; typedef uint32 element_count; typedef int (*tree_walk_action)(void *,element_count,void *); +typedef enum { free_init, free_free, free_end } TREE_FREE; +typedef void (*tree_element_free)(void*, TREE_FREE, void *); + #ifdef MSDOS typedef struct st_tree_element { struct st_tree_element *left,*right; @@ -49,18 +52,22 @@ typedef struct st_tree_element { typedef struct st_tree { TREE_ELEMENT *root,null_element; TREE_ELEMENT **parents[MAX_TREE_HIGHT]; - uint offset_to_key,elements_in_tree,size_of_element; - qsort_cmp compare; + uint offset_to_key,elements_in_tree,size_of_element,memory_limit,allocated; + qsort_cmp2 compare; + void* custom_arg; MEM_ROOT mem_root; my_bool with_delete; - void (*free)(void *); + tree_element_free free; } TREE; - /* Functions on hole tree */ -void init_tree(TREE *tree,uint default_alloc_size, int element_size, - qsort_cmp compare, my_bool with_delete, - void (*free_element)(void*)); + /* Functions on whole tree */ +void init_tree(TREE *tree, uint default_alloc_size, uint memory_limit, + int size, qsort_cmp2 compare, my_bool with_delete, + tree_element_free free_element, void *custom_arg); void delete_tree(TREE*); +void reset_tree(TREE*); + /* similar to delete tree, except we do not my_free() blocks in mem_root + */ #define is_tree_inited(tree) ((tree)->root != 0) /* Functions on leafs */ diff --git a/include/myisam.h b/include/myisam.h index 9ecb5ef4294..36c0de5034f 100644 --- a/include/myisam.h +++ b/include/myisam.h @@ -1,15 +1,15 @@ /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB - + This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + This library 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 Library General Public License for more details. - + You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, @@ -46,6 +46,11 @@ extern "C" { /* Max extra space to use when sorting keys */ #define MI_MAX_TEMP_LENGTH 256*1024L*1024L +/* Possible values for myisam_block_size (must be power of 2) */ +#define MI_KEY_BLOCK_LENGTH 1024 /* default key block length */ +#define MI_MIN_KEY_BLOCK_LENGTH 1024 /* Min key block length */ +#define MI_MAX_KEY_BLOCK_LENGTH 16384 + #define mi_portable_sizeof_char_ptr 8 typedef uint32 ha_checksum; @@ -68,6 +73,7 @@ typedef struct st_mi_isaminfo /* Struct from h_info */ ulong mean_reclength; /* Mean recordlength (if packed) */ ulonglong auto_increment; ulonglong key_map; /* Which keys are used */ + char *data_file_name, *index_file_name; uint keys; /* Number of keys in use */ uint options; /* HA_OPTION_... used */ int errkey, /* With key was dupplicated on err */ @@ -86,6 +92,7 @@ typedef struct st_mi_isaminfo /* Struct from h_info */ typedef struct st_mi_create_info { + char *index_file_name, *data_file_name; /* If using symlinks */ ha_rows max_rows; ha_rows reloc_rows; ulonglong auto_increment; @@ -187,9 +194,10 @@ typedef struct st_columndef /* column information */ extern my_string myisam_log_filename; /* Name of logfile */ extern uint myisam_block_size; -extern my_bool myisam_flush,myisam_delay_key_write; +extern my_bool myisam_flush,myisam_delay_key_write,myisam_single_user; extern my_bool myisam_concurrent_insert; extern my_off_t myisam_max_temp_length,myisam_max_extra_temp_length; +extern ulong myisam_bulk_insert_tree_size; /* Prototypes for myisam-functions */ @@ -219,7 +227,7 @@ extern my_off_t mi_position(struct st_myisam_info *file); extern int mi_status(struct st_myisam_info *info, MI_ISAMINFO *x, uint flag); extern int mi_lock_database(struct st_myisam_info *file,int lock_type); extern int mi_create(const char *name,uint keys,MI_KEYDEF *keydef, - uint columns, MI_COLUMNDEF *columndef, + uint columns, MI_COLUMNDEF *columndef, uint uniques, MI_UNIQUEDEF *uniquedef, MI_CREATE_INFO *create_info, uint flags); extern int mi_delete_table(const char *name); @@ -296,17 +304,17 @@ typedef struct st_sort_info { struct st_mi_check_param *param; enum data_file_type new_data_file_type; SORT_KEY_BLOCKS *key_block,*key_block_end; - uint key,find_length; + uint key,find_length,real_key_length; my_off_t pos,max_pos,filepos,start_recpos,filelength,dupp,buff_length; ha_rows max_records; ulonglong unique[MI_MAX_KEY_SEG+1]; my_bool fix_datafile; char *record,*buff; + void *wordlist, *wordptr; MI_KEYDEF *keyinfo; MI_KEYSEG *keyseg; } SORT_INFO; - typedef struct st_mi_check_param { ulonglong auto_increment_value; diff --git a/include/myisammrg.h b/include/myisammrg.h index a797c954614..1ae825b4b94 100644 --- a/include/myisammrg.h +++ b/include/myisammrg.h @@ -34,6 +34,13 @@ extern "C" { #define MYRG_NAME_EXT ".MRG" +/* In which table to INSERT rows */ +#define MERGE_INSERT_DISABLED 0 +#define MERGE_INSERT_TO_FIRST 1 +#define MERGE_INSERT_TO_LAST 2 + +extern TYPELIB merge_insert_method; + /* Param to/from myrg_info */ typedef struct st_mymerge_info /* Struct from h_info */ @@ -44,7 +51,7 @@ typedef struct st_mymerge_info /* Struct from h_info */ ulonglong data_file_length; uint reclength; /* Recordlength */ int errkey; /* With key was dupplicated on err */ - uint options; /* HA_OPTIONS_... used */ + uint options; /* HA_OPTION_... used */ } MYMERGE_INFO; typedef struct st_myrg_table_info @@ -56,6 +63,7 @@ typedef struct st_myrg_table_info typedef struct st_myrg_info { MYRG_TABLE *open_tables,*current_table,*end_table,*last_used_table; + uint merge_insert_method; ulonglong records; /* records in tables */ ulonglong del; /* Removed records */ ulonglong data_file_length; @@ -81,10 +89,11 @@ extern int myrg_rkey(MYRG_INFO *file,byte *buf,int inx,const byte *key, extern int myrg_rrnd(MYRG_INFO *file,byte *buf,ulonglong pos); extern int myrg_rsame(MYRG_INFO *file,byte *record,int inx); extern int myrg_update(MYRG_INFO *file,const byte *old,byte *new_rec); +extern int myrg_write(MYRG_INFO *info,byte *rec); extern int myrg_status(MYRG_INFO *file,MYMERGE_INFO *x,int flag); extern int myrg_lock_database(MYRG_INFO *file,int lock_type); -extern int myrg_create(const char *name,const char **table_names, - my_bool fix_names); +extern int myrg_create(const char *name, const char **table_names, + uint insert_method, my_bool fix_names); extern int myrg_extra(MYRG_INFO *file,enum ha_extra_function function); extern ha_rows myrg_records_in_range(MYRG_INFO *info,int inx, const byte *start_key,uint start_key_len, diff --git a/include/mysql.h b/include/mysql.h index bd54be0bc22..5158fef6045 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -15,8 +15,6 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ -/* defines for the libmysql library */ - #ifndef _mysql_h #define _mysql_h @@ -28,11 +26,9 @@ #undef __WIN__ #endif -#ifndef MYSQL_SERVER #ifdef __cplusplus extern "C" { #endif -#endif #ifndef _global_h /* If not standard header */ #include <sys/types.h> @@ -50,32 +46,15 @@ typedef char my_bool; #endif typedef char * gptr; -#ifndef ST_USED_MEM_DEFINED -#define ST_USED_MEM_DEFINED -typedef struct st_used_mem { /* struct for once_alloc */ - struct st_used_mem *next; /* Next block in use */ - unsigned int left; /* memory left in block */ - unsigned int size; /* size of block */ -} USED_MEM; -typedef struct st_mem_root { - USED_MEM *free; - USED_MEM *used; - USED_MEM *pre_alloc; - unsigned int min_malloc; - unsigned int block_size; - - void (*error_handler)(void); -} MEM_ROOT; -#endif - #ifndef my_socket_defined #ifdef __WIN__ #define my_socket SOCKET #else typedef int my_socket; -#endif -#endif -#endif +#endif /* __WIN__ */ +#endif /* my_socket_defined */ +#endif /* _global_h */ + #include "mysql_com.h" #include "mysql_version.h" @@ -92,12 +71,14 @@ extern char *mysql_unix_port; typedef struct st_mysql_field { char *name; /* Name of column */ 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 *def; /* Default value (set by mysql_list_fields) */ - enum enum_field_types type; /* Type of field. Se mysql_com.h for types */ - unsigned int length; /* Width of column */ - unsigned int max_length; /* Max width of selected set */ + unsigned long length; /* Width of column */ + unsigned long max_length; /* Max width of selected set */ unsigned int flags; /* Div flags */ unsigned int decimals; /* Number of decimals in field */ + enum enum_field_types type; /* Type of field. Se mysql_com.h for types */ } MYSQL_FIELD; typedef char **MYSQL_ROW; /* return data as array of strings */ @@ -120,6 +101,24 @@ typedef struct st_mysql_rows { typedef MYSQL_ROWS *MYSQL_ROW_OFFSET; /* offset to current row */ +#ifndef ST_USED_MEM_DEFINED +#define ST_USED_MEM_DEFINED +typedef struct st_used_mem { /* struct for once_alloc */ + struct st_used_mem *next; /* Next block in use */ + unsigned int left; /* memory left in block */ + unsigned int size; /* size of block */ +} USED_MEM; +typedef struct st_mem_root { + USED_MEM *free; + USED_MEM *used; + USED_MEM *pre_alloc; + unsigned int min_malloc; + unsigned int block_size; + + void (*error_handler)(void); +} MEM_ROOT; +#endif + typedef struct st_mysql_data { my_ulonglong rows; unsigned int fields; @@ -129,15 +128,31 @@ typedef struct st_mysql_data { struct st_mysql_options { unsigned int connect_timeout,client_flag; - my_bool compress,named_pipe; unsigned int port; char *host,*init_command,*user,*password,*unix_socket,*db; char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name; - my_bool use_ssl; /* if to use SSL or not */ 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 */ + my_bool use_ssl; /* if to use SSL or not */ + my_bool compress,named_pipe; + /* + on connect, find out the replication role of the server, and + establish connections to all the peers + */ + my_bool rpl_probe; + /* + each call to mysql_real_query() will parse it to tell if it is a read + or a write, and direct it to the slave or the master + */ + my_bool rpl_parse; + /* + if set, never read from a master,only from slave, when doing + a read that is replication-aware + */ + my_bool no_master_reads; }; enum mysql_option { MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, @@ -148,46 +163,106 @@ enum mysql_option { MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, enum mysql_status { MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT, MYSQL_STATUS_USE_RESULT}; +/* + There are three types of queries - the ones that have to go to + the master, the ones that go to a slave, and the adminstrative + type which must happen on the pivot connectioin +*/ +enum mysql_rpl_type { MYSQL_RPL_MASTER, MYSQL_RPL_SLAVE, + MYSQL_RPL_ADMIN }; + + typedef struct st_mysql { NET net; /* Communication parameters */ gptr connector_fd; /* ConnectorFd for SSL */ char *host,*user,*passwd,*unix_socket,*server_version,*host_info, *info,*db; - unsigned int port,client_flag,server_capabilities; - unsigned int protocol_version; - unsigned int field_count; - unsigned int server_status; - unsigned long thread_id; /* Id for connection in server */ + 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; /* Used by mysqlshow */ + unsigned long thread_id; /* Id for connection in server */ unsigned long packet_length; + unsigned int port,client_flag,server_capabilities; + unsigned int protocol_version; + unsigned int field_count; + unsigned int server_status; + unsigned int server_language; + struct st_mysql_options options; enum mysql_status status; - MYSQL_FIELD *fields; - MEM_ROOT field_alloc; my_bool free_me; /* If free in mysql_close */ my_bool reconnect; /* set to 1 if automatic reconnect */ - struct st_mysql_options options; char scramble_buff[9]; - struct charset_info_st *charset; - unsigned int server_language; + + /* + Set if this is the original connection, not a master or a slave we have + added though mysql_rpl_probe() or mysql_set_master()/ mysql_add_slave() + */ + my_bool rpl_pivot; + /* pointers to the master, and the next slave + connections, points to itself if lone connection */ + struct st_mysql* master, *next_slave; + + struct st_mysql* last_used_slave; /* needed for round-robin slave pick */ + /* needed for send/read/store/use result to work correctly with replication */ + struct st_mysql* last_used_con; } MYSQL; typedef struct st_mysql_res { my_ulonglong row_count; - unsigned int field_count, current_field; MYSQL_FIELD *fields; MYSQL_DATA *data; MYSQL_ROWS *data_cursor; + unsigned long *lengths; /* column lengths of current row */ + MYSQL *handle; /* for unbuffered reads */ MEM_ROOT field_alloc; + unsigned int field_count, current_field; MYSQL_ROW row; /* If unbuffered read */ MYSQL_ROW current_row; /* buffer to current row */ - unsigned long *lengths; /* column lengths of current row */ - MYSQL *handle; /* for unbuffered reads */ - my_bool eof; /* Used my mysql_fetch_row */ + my_bool eof; /* Used by mysql_fetch_row */ } MYSQL_RES; +#define MAX_MYSQL_MANAGER_ERR 256 +#define MAX_MYSQL_MANAGER_MSG 256 + +#define MANAGER_OK 200 +#define MANAGER_INFO 250 +#define MANAGER_ACCESS 401 +#define MANAGER_CLIENT_ERR 450 +#define MANAGER_INTERNAL_ERR 500 + + + +typedef struct st_mysql_manager +{ + NET net; + char *host,*user,*passwd; + unsigned int port; + my_bool free_me; + my_bool eof; + int cmd_status; + int last_errno; + char* net_buf,*net_buf_pos,*net_data_end; + int net_buf_size; + char last_error[MAX_MYSQL_MANAGER_ERR]; +} MYSQL_MANAGER; + +/* 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 mysql_server_init(int argc, char **argv, char **groups); +void mysql_server_end(void); + +/* 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 mysql_thread_init(void); +void mysql_thread_end(void); + /* Functions to get information from the MYSQL and MYSQL_RES structures */ /* Should definitely be used if one uses shared libraries */ @@ -210,18 +285,12 @@ unsigned long STDCALL mysql_thread_id(MYSQL *mysql); const char * STDCALL mysql_character_set_name(MYSQL *mysql); MYSQL * STDCALL mysql_init(MYSQL *mysql); -#ifdef HAVE_OPENSSL int STDCALL mysql_ssl_set(MYSQL *mysql, const char *key, const char *cert, const char *ca, - const char *capath); -char * STDCALL mysql_ssl_cipher(MYSQL *mysql); + const char *capath, const char *cipher); int STDCALL mysql_ssl_clear(MYSQL *mysql); -#endif /* HAVE_OPENSSL */ -MYSQL * STDCALL mysql_connect(MYSQL *mysql, const char *host, - const char *user, const char *passwd); my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user, const char *passwd, const char *db); -#if MYSQL_VERSION_ID >= 32200 MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, @@ -229,24 +298,55 @@ MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, unsigned int port, const char *unix_socket, unsigned int clientflag); -#else -MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, - const char *user, - const char *passwd, - unsigned int port, - const char *unix_socket, - unsigned int clientflag); -#endif void STDCALL mysql_close(MYSQL *sock); 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 int length); + unsigned long length); int STDCALL mysql_read_query_result(MYSQL *mysql); int STDCALL mysql_real_query(MYSQL *mysql, const char *q, - unsigned int length); -int STDCALL mysql_create_db(MYSQL *mysql, const char *DB); -int STDCALL mysql_drop_db(MYSQL *mysql, const char *DB); + unsigned long length); +/* perform query on master */ +int STDCALL mysql_master_query(MYSQL *mysql, const char *q, + unsigned long length); +int STDCALL mysql_master_send_query(MYSQL *mysql, const char *q, + unsigned long length); +/* perform query on slave */ +int STDCALL mysql_slave_query(MYSQL *mysql, const char *q, + unsigned long length); +int STDCALL mysql_slave_send_query(MYSQL *mysql, const char *q, + unsigned long length); + +/* + enable/disable parsing of all queries to decide if they go on master or + slave +*/ +void STDCALL mysql_enable_rpl_parse(MYSQL* mysql); +void STDCALL mysql_disable_rpl_parse(MYSQL* mysql); +/* get the value of the parse flag */ +int STDCALL mysql_rpl_parse_enabled(MYSQL* mysql); + +/* enable/disable reads from master */ +void STDCALL mysql_enable_reads_from_master(MYSQL* mysql); +void STDCALL mysql_disable_reads_from_master(MYSQL* mysql); +/* get the value of the master read flag */ +int STDCALL mysql_reads_from_master_enabled(MYSQL* mysql); + +enum mysql_rpl_type STDCALL mysql_rpl_query_type(const char* q, int len); + +/* discover the master and its slaves */ +int STDCALL mysql_rpl_probe(MYSQL* mysql); + +/* set the master, close/free the old one, if it is not a pivot */ +int STDCALL mysql_set_master(MYSQL* mysql, const char* host, + unsigned int port, + const char* user, + const char* passwd); +int STDCALL mysql_add_slave(MYSQL* mysql, const char* host, + unsigned int port, + const char* user, + const char* passwd); + int STDCALL mysql_shutdown(MYSQL *mysql); int STDCALL mysql_dump_debug_info(MYSQL *mysql); int STDCALL mysql_refresh(MYSQL *mysql, @@ -294,18 +394,40 @@ char * STDCALL mysql_odbc_escape_string(MYSQL *mysql, unsigned long *length)); void STDCALL myodbc_remove_escape(MYSQL *mysql,char *name); unsigned int STDCALL mysql_thread_safe(void); - - +MYSQL_MANAGER* STDCALL mysql_manager_init(MYSQL_MANAGER* con); +MYSQL_MANAGER* STDCALL mysql_manager_connect(MYSQL_MANAGER* con, + const char* host, + const char* user, + const char* passwd, + unsigned int port); +void STDCALL mysql_manager_close(MYSQL_MANAGER* con); +int STDCALL mysql_manager_command(MYSQL_MANAGER* con, + const char* cmd, int cmd_len); +int STDCALL mysql_manager_fetch_line(MYSQL_MANAGER* con, + char* res_buf, + int res_buf_size); #define mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT) -/* new api functions */ - +#ifdef USE_OLD_FUNCTIONS +MYSQL * STDCALL mysql_connect(MYSQL *mysql, const char *host, + const char *user, const char *passwd); +int STDCALL mysql_create_db(MYSQL *mysql, const char *DB); +int STDCALL mysql_drop_db(MYSQL *mysql, const char *DB); +#define mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT) #define HAVE_MYSQL_REAL_CONNECT +#endif + +/* + The following functions are mainly exported because of mysqlbinlog; + They are not for general usage +*/ + +int simple_command(MYSQL *mysql,enum enum_server_command command, + const char *arg, unsigned long length, my_bool skipp_check); +unsigned long net_safe_read(MYSQL* mysql); -#ifndef MYSQL_SERVER #ifdef __cplusplus } #endif -#endif -#endif +#endif /* _mysql_h */ diff --git a/include/mysql_com.h b/include/mysql_com.h index 2e455c456fa..048b6b98918 100644 --- a/include/mysql_com.h +++ b/include/mysql_com.h @@ -42,7 +42,8 @@ enum enum_server_command {COM_SLEEP,COM_QUIT,COM_INIT_DB,COM_QUERY, COM_PROCESS_INFO,COM_CONNECT,COM_PROCESS_KILL, COM_DEBUG,COM_PING,COM_TIME,COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP, - COM_TABLE_DUMP, COM_CONNECT_OUT}; + COM_TABLE_DUMP, COM_CONNECT_OUT, + COM_REGISTER_SLAVE}; #define NOT_NULL_FLAG 1 /* Field can't be NULL */ #define PRI_KEY_FLAG 2 /* Field is part of a primary key */ @@ -100,36 +101,34 @@ enum enum_server_command {COM_SLEEP,COM_QUIT,COM_INIT_DB,COM_QUERY, #define NET_WRITE_TIMEOUT 60 /* Timeout on write */ #define NET_WAIT_TIMEOUT 8*60*60 /* Wait for new query */ -#ifndef Vio_defined -#define Vio_defined -#ifdef HAVE_VIO -class Vio; /* Fill Vio class in C++ */ -#else struct st_vio; /* Only C */ typedef struct st_vio Vio; -#endif -#endif + +#define MAX_BLOB_WIDTH 8192 // Default width for blob typedef struct st_net { Vio* vio; + unsigned char *buff,*buff_end,*write_pos,*read_pos; my_socket fd; /* For Perl DBI/dbd */ + unsigned long max_packet; int fcntl; - unsigned char *buff,*buff_end,*write_pos,*read_pos; + unsigned int last_errno,timeout,pkt_nr,compress_pkt_nr; char last_error[MYSQL_ERRMSG_SIZE]; - unsigned int last_errno,max_packet,timeout,pkt_nr; unsigned char error; my_bool return_errno,compress; - my_bool no_send_ok; /* needed if we are doing several - queries in one command ( as in LOAD TABLE ... FROM MASTER ), - and do not want to confuse the client with OK at the wrong time - */ + /* + The following variable is set if we are doing several queries in one + command ( as in LOAD TABLE ... FROM MASTER ), + and do not want to confuse the client with OK at the wrong time + */ unsigned long remain_in_buf,length, buf_length, where_b; unsigned int *return_status; unsigned char reading_or_writing; char save_char; + my_bool no_send_ok; } NET; -#define packet_error ((unsigned int) -1) +#define packet_error (~(unsigned long) 0) enum enum_field_types { FIELD_TYPE_DECIMAL, FIELD_TYPE_TINY, FIELD_TYPE_SHORT, FIELD_TYPE_LONG, @@ -152,11 +151,15 @@ enum enum_field_types { FIELD_TYPE_DECIMAL, FIELD_TYPE_TINY, #define FIELD_TYPE_CHAR FIELD_TYPE_TINY /* For compability */ #define FIELD_TYPE_INTERVAL FIELD_TYPE_ENUM /* For compability */ +#define net_new_transaction(net) ((net)->pkt_nr=0) + +#ifdef __cplusplus +extern "C" { +#endif + extern unsigned long max_allowed_packet; extern unsigned long net_buffer_length; -#define net_new_transaction(net) ((net)->pkt_nr=0) - int my_net_init(NET *net, Vio* vio); void net_end(NET *net); void net_clear(NET *net); @@ -165,13 +168,22 @@ int my_net_write(NET *net,const char *packet,unsigned long len); int net_write_command(NET *net,unsigned char command,const char *packet, unsigned long len); int net_real_write(NET *net,const char *packet,unsigned long len); -unsigned int my_net_read(NET *net); +unsigned long my_net_read(NET *net); + +/* The following function is not meant for normal usage */ +struct sockaddr; +int my_connect(my_socket s, const struct sockaddr *name, unsigned int namelen, + unsigned int timeout); 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,REAL_RESULT,INT_RESULT}; @@ -191,7 +203,7 @@ typedef struct st_udf_init { my_bool maybe_null; /* 1 if function can return NULL */ unsigned int decimals; /* for real functions */ - unsigned int max_length; /* For string functions */ + unsigned long max_length; /* For string functions */ char *ptr; /* free pointer for function data */ my_bool const_item; /* 0 if result is independent of arguments */ } UDF_INIT; diff --git a/include/mysql_embed.h b/include/mysql_embed.h new file mode 100644 index 00000000000..d381fa8aefc --- /dev/null +++ b/include/mysql_embed.h @@ -0,0 +1,30 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Defines that are unique to the embedded version of MySQL */ + +#ifdef EMBEDDED_LIBRARY + +/* Things we don't need in the embedded version of MySQL */ + +#undef HAVE_PSTACK /* No stacktrace */ +#undef HAVE_DLOPEN /* No udf functions */ +#undef HAVE_OPENSSL +#undef HAVE_VIO +#undef HAVE_ISAM + +#define DONT_USE_RAID +#endif /* EMBEDDED_LIBRARY */ diff --git a/include/mysqld_error.h b/include/mysqld_error.h index dabd1b869c8..5ac14c1155b 100644 --- a/include/mysqld_error.h +++ b/include/mysqld_error.h @@ -211,8 +211,16 @@ #define ER_DROP_DB_WITH_READ_LOCK 1208 #define ER_CREATE_DB_WITH_READ_LOCK 1209 #define ER_WRONG_ARGUMENTS 1210 -#define ER_NO_PERMISSON_TO_CREATE_USER 1211 +#define ER_NO_PERMISSION_TO_CREATE_USER 1211 #define ER_UNION_TABLES_IN_DIFFERENT_DIR 1212 #define ER_LOCK_DEADLOCK 1213 -#define ER_TABLE_CANT_HANDLE_FULLTEXT 1214 -#define ER_ERROR_MESSAGES 215 +#define ER_CONNECT_TO_MASTER 1214 +#define ER_QUERY_ON_MASTER 1215 +#define ER_ERROR_WHEN_EXECUTING_COMMAND 1216 +#define ER_WRONG_USAGE 1217 +#define ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT 1218 +#define ER_CANT_UPDATE_WITH_READLOCK 1219 +#define ER_MIXING_NOT_ALLOWED 1220 +#define ER_DUP_ARGUMENT 1221 +#define ER_TABLE_CANT_HANDLE_FULLTEXT 1222 +#define ER_ERROR_MESSAGES 223 diff --git a/include/sslopt-case.h b/include/sslopt-case.h index d995e31044e..b5720286778 100644 --- a/include/sslopt-case.h +++ b/include/sslopt-case.h @@ -39,4 +39,10 @@ my_free(opt_ssl_ca, MYF(MY_ALLOW_ZERO_PTR)); opt_ssl_ca = my_strdup(optarg, MYF(0)); break; + case OPT_SSL_CIPHER: + opt_use_ssl = 1; /* true */ + my_free(opt_ssl_cipher, MYF(MY_ALLOW_ZERO_PTR)); + opt_ssl_cipher = my_strdup(optarg, MYF(0)); + break; + #endif diff --git a/include/sslopt-longopts.h b/include/sslopt-longopts.h index 2f58f0e9265..697c2f647bf 100644 --- a/include/sslopt-longopts.h +++ b/include/sslopt-longopts.h @@ -22,10 +22,12 @@ #define OPT_SSL_CERT 202 #define OPT_SSL_CA 203 #define OPT_SSL_CAPATH 204 +#define OPT_SSL_CIPHER 205 {"ssl", no_argument, 0, OPT_SSL_SSL}, {"ssl-key", required_argument, 0, OPT_SSL_KEY}, {"ssl-cert", required_argument, 0, OPT_SSL_CERT}, {"ssl-ca", required_argument, 0, OPT_SSL_CA}, {"ssl-capath", required_argument, 0, OPT_SSL_CAPATH}, + {"ssl-cipher", required_argument, 0, OPT_SSL_CIPHER}, #endif /* HAVE_OPENSSL */ diff --git a/include/sslopt-usage.h b/include/sslopt-usage.h index 5b2b4a88709..cd6a06fb459 100644 --- a/include/sslopt-usage.h +++ b/include/sslopt-usage.h @@ -21,5 +21,6 @@ --ssl-key X509 key in PEM format (implies --ssl)\n\ --ssl-cert X509 cert in PEM format (implies --ssl)\n\ --ssl-ca CA file in PEM format (check OpenSSL docs, implies --ssl)\n\ - --ssl-capath CA directory (check OpenSSL docs, implies --ssl)"); + --ssl-capath CA directory (check OpenSSL docs, implies --ssl)\n\ + --ssl-cipher SSL cipher to use (implies --ssl)"); #endif diff --git a/include/sslopt-vars.h b/include/sslopt-vars.h index 597ab4d9fa6..756a35589aa 100644 --- a/include/sslopt-vars.h +++ b/include/sslopt-vars.h @@ -21,4 +21,5 @@ static char *opt_ssl_key = 0; static char *opt_ssl_cert = 0; static char *opt_ssl_ca = 0; static char *opt_ssl_capath = 0; +static char *opt_ssl_cipher = 0; #endif diff --git a/include/violite.h b/include/violite.h index 49df6994d53..d5f697b26c4 100644 --- a/include/violite.h +++ b/include/violite.h @@ -25,9 +25,6 @@ #include "my_net.h" /* needed because of struct in_addr */ -#ifdef HAVE_VIO -#include <Vio.h> /* Full VIO interface */ -#else /* Simple vio interface in C; The functions are implemented in violite.c */ @@ -35,73 +32,71 @@ extern "C" { #endif /* __cplusplus */ -#ifndef Vio_defined -#define Vio_defined -struct st_vio; /* Only C */ -typedef struct st_vio Vio; -#endif - enum enum_vio_type { VIO_CLOSED, VIO_TYPE_TCPIP, VIO_TYPE_SOCKET, VIO_TYPE_NAMEDPIPE, VIO_TYPE_SSL}; -Vio* vio_new(my_socket sd, - enum enum_vio_type type, - my_bool localhost); +#ifndef __WIN__ +#define HANDLE void * +#endif + +Vio* vio_new(my_socket sd, enum enum_vio_type type, my_bool localhost); #ifdef __WIN__ -Vio* vio_new_win32pipe(HANDLE hPipe); +Vio* vio_new_win32pipe(HANDLE hPipe); +#endif +void vio_delete(Vio* vio); + +#ifdef EMBEDDED_LIBRARY +void vio_reset(Vio *vio); +#else +void vio_reset(Vio* vio, enum enum_vio_type type, + my_socket sd, HANDLE hPipe, my_bool localhost); #endif -void vio_delete(Vio* vio); /* * vio_read and vio_write should have the same semantics * as read(2) and write(2). */ -int vio_read( Vio* vio, - gptr buf, int size); -int vio_write( Vio* vio, - const gptr buf, - int size); +int vio_read(Vio *vio, gptr buf, int size); +int vio_write(Vio *vio, const gptr buf, int size); /* * Whenever the socket is set to blocking mode or not. */ -int vio_blocking( Vio* vio, - my_bool onoff); -my_bool vio_is_blocking( Vio* vio); +int vio_blocking(Vio *vio, my_bool onoff); +my_bool vio_is_blocking(Vio *vio); /* * setsockopt TCP_NODELAY at IPPROTO_TCP level, when possible. */ - int vio_fastsend( Vio* vio); +int vio_fastsend(Vio *vio); /* * setsockopt SO_KEEPALIVE at SOL_SOCKET level, when possible. */ -int vio_keepalive( Vio* vio, - my_bool onoff); +int vio_keepalive(Vio *vio, my_bool onoff); /* * Whenever we should retry the last read/write operation. */ -my_bool vio_should_retry( Vio* vio); +my_bool vio_should_retry(Vio *vio); /* * When the workday is over... */ -int vio_close( Vio* vio); +int vio_close(Vio* vio); /* * Short text description of the socket for those, who are curious.. */ -const char* vio_description( Vio* vio); +const char* vio_description(Vio *vio); /* Return the type of the connection */ - enum enum_vio_type vio_type(Vio* vio); +enum enum_vio_type vio_type(Vio* vio); /* Return last error number */ -int vio_errno(Vio *vio); +int vio_errno(Vio*vio); /* Get socket number */ -my_socket vio_fd(Vio *vio); +my_socket vio_fd(Vio*vio); /* * Remote peer's address and name in text form. */ -my_bool vio_peer_addr(Vio * vio, char *buf); +my_bool vio_peer_addr(Vio* vio, char *buf); /* Remotes in_addr */ @@ -113,5 +108,132 @@ my_bool vio_poll_read(Vio *vio,uint timeout); #ifdef __cplusplus } #endif + +#if defined(HAVE_VIO) && !defined(DONT_MAP_VIO) +#define vio_delete(vio) (vio)->viodelete(vio) +#define vio_errno(vio) (vio)->vioerrno(vio) +#define vio_read(vio, buf, size) (vio)->read(vio,buf,size) +#define vio_write(vio, buf, size) (vio)->write(vio, buf, size) +#define vio_blocking(vio, set_blocking_mode) (vio)->vioblocking(vio, set_blocking_mode) +#define vio_is_blocking(vio) (vio)->is_blocking(vio) +#define vio_fastsend(vio) (vio)->fastsend(vio) +#define vio_keepalive(vio, set_keep_alive) (vio)->viokeepalive(vio, set_keep_alive) +#define vio_should_retry(vio) (vio)->should_retry(vio) +#define vio_close(vio) ((vio)->vioclose)(vio) +#define vio_peer_addr(vio, buf) (vio)->peer_addr(vio, buf) +#define vio_in_addr(vio, in) (vio)->in_addr(vio, in) +#define vio_poll_read(vio,timeout) (vio)->poll_read(vio,timeout) +#endif /* defined(HAVE_VIO) && !defined(DONT_MAP_VIO) */ + +#ifdef HAVE_OPENSSL +#define HEADER_DES_LOCL_H dummy_something +#include <openssl/ssl.h> +#include <openssl/err.h> +#include "my_net.h" /* needed because of struct in_addr */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +void vio_ssl_delete(Vio* vio); + +int vio_ssl_read(Vio* vio,gptr buf, int size); +int vio_ssl_write(Vio* vio,const gptr buf,int size); +int vio_ssl_blocking(Vio* vio,my_bool onoff); +my_bool vio_ssl_is_blocking(Vio* vio); + +/* setsockopt TCP_NODELAY at IPPROTO_TCP level, when possible. */ + int vio_ssl_fastsend(Vio* vio); +/* setsockopt SO_KEEPALIVE at SOL_SOCKET level, when possible. */ +int vio_ssl_keepalive(Vio* vio, my_bool onoff); +/* Whenever we should retry the last read/write operation. */ +my_bool vio_ssl_should_retry(Vio* vio); +/* When the workday is over... */ +int vio_ssl_close(Vio* vio); +/* Return last error number */ +int vio_ssl_errno(Vio *vio); +my_bool vio_ssl_peer_addr(Vio* vio, char *buf); +void vio_ssl_in_addr(Vio *vio, struct in_addr *in); + +/* Return 1 if there is data to be read */ +my_bool vio_ssl_poll_read(Vio *vio,uint timeout); + +/* Single copy for server */ +struct st_VioSSLAcceptorFd +{ + SSL_CTX* ssl_context_; + SSL_METHOD* ssl_method_; + struct st_VioSSLAcceptorFd* session_id_context_; + enum { + state_connect = 1, + state_accept = 2 + }; + + /* function pointers which are only once for SSL server + Vio*(*sslaccept)(struct st_VioSSLAcceptorFd*,Vio*); */ +}; + +/* One copy for client */ +struct st_VioSSLConnectorFd +{ + SSL_CTX* ssl_context_; + SSL_METHOD* ssl_method_; + /* function pointers which are only once for SSL client */ +}; +void sslaccept(struct st_VioSSLAcceptorFd*, Vio*, long timeout); +void sslconnect(struct st_VioSSLConnectorFd*, Vio*, long timeout); + +struct st_VioSSLConnectorFd +*new_VioSSLConnectorFd(const char* key_file, const char* cert_file, + const char* ca_file, const char* ca_path, + const char* cipher); +struct st_VioSSLAcceptorFd +*new_VioSSLAcceptorFd(const char* key_file, const char* cert_file, + const char* ca_file,const char* ca_path, + const char* cipher); +Vio* new_VioSSL(struct st_VioSSLAcceptorFd* fd, Vio* sd,int state); + +#ifdef __cplusplus +} +#endif +#endif /* HAVE_OPENSSL */ + +/* This enumerator is used in parser - should be always visible */ +enum SSL_type {SSL_TYPE_NONE, SSL_TYPE_ANY, SSL_TYPE_X509, SSL_TYPE_SPECIFIED}; + +#ifndef EMBEDDED_LIBRARY +/* This structure is for every connection on both sides */ +struct st_vio +{ + my_socket sd; /* my_socket - real or imaginary */ + HANDLE hPipe; + my_bool localhost; /* Are we from localhost? */ + int fcntl_mode; /* Buffered fcntl(sd,F_GETFL) */ + struct sockaddr_in local; /* Local internet address */ + struct sockaddr_in remote; /* Remote internet address */ + enum enum_vio_type type; /* Type of connection */ + char desc[30]; /* String description */ +#ifdef HAVE_VIO + /* function pointers. They are similar for socket/SSL/whatever */ + void (*viodelete)(Vio*); + int (*vioerrno)(Vio*); + int (*read)(Vio*, gptr, int); + int (*write)(Vio*, gptr, int); + int (*vioblocking)(Vio*, my_bool); + my_bool (*is_blocking)(Vio*); + int (*viokeepalive)(Vio*, my_bool); + int (*fastsend)(Vio*); + my_bool (*peer_addr)(Vio*, gptr); + void (*in_addr)(Vio*, struct in_addr*); + my_bool (*should_retry)(Vio*); + int (*vioclose)(Vio*); + my_bool (*poll_read)(Vio*,uint); + +#ifdef HAVE_OPENSSL + SSL* ssl_; + my_bool open_; +#endif /* HAVE_OPENSSL */ #endif /* HAVE_VIO */ +}; +#endif /* EMBEDDED_LIBRARY */ #endif /* vio_violite_h_ */ |