1 /* Copyright (c) 2000, 2013, Oracle and/or its affiliates.
2 Copyright (c) 2010, 2022, MariaDB Corporation.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; version 2 of the License.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software
15 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
16
17 #ifndef _my_sys_h
18 #define _my_sys_h
19
20 #include <m_string.h>
21 #include <mysql/psi/mysql_memory.h>
22
23 C_MODE_START
24
25
26 #include <my_valgrind.h>
27 #include <my_pthread.h>
28 #include <m_ctype.h> /* for CHARSET_INFO */
29 #include <stdarg.h>
30 #include <typelib.h>
31 #ifdef _WIN32
32 #include <malloc.h> /*for alloca*/
33 #endif
34 #include <mysql/plugin.h>
35 #include <mysql/service_my_print_error.h>
36
37 #define MY_INIT(name) { my_progname= name; my_init(); }
38
39 /**
40 Max length of an error message generated by mysys utilities.
41 Some mysys functions produce error messages. These mostly go
42 to stderr.
43 This constant defines the size of the buffer used to format
44 the message. It should be kept in sync with MYSQL_ERRMSG_SIZE,
45 since sometimes mysys errors are stored in the server diagnostics
46 area, and we would like to avoid unexpected truncation.
47 */
48 #define MYSYS_ERRMSG_SIZE (512)
49 #define MYSYS_STRERROR_SIZE (128)
50
51 #define MY_FILE_ERROR ((size_t) -1)
52
53 /* General bitmaps for my_func's */
54 #define MY_FFNF 1U /* Fatal if file not found */
55 #define MY_FNABP 2U /* Fatal if not all bytes read/written */
56 #define MY_NABP 4U /* Error if not all bytes read/written */
57 #define MY_FAE 8U /* Fatal if any error */
58 #define MY_WME 16U /* Write message on error */
59 #define MY_WAIT_IF_FULL 32U /* Wait and try again if disk full error */
60 #define MY_IGNORE_BADFD 32U /* my_sync(): ignore 'bad descriptor' errors */
61 #define MY_IGNORE_ENOENT 32U /* my_delete() ignores ENOENT (no such file) */
62 #define MY_ENCRYPT 64U /* Encrypt IO_CACHE temporary files */
63 #define MY_TEMPORARY 64U /* create_temp_file(): delete file at once */
64 #define MY_NOSYMLINKS 512U /* my_open(): don't follow symlinks */
65 #define MY_FULL_IO 512U /* my_read(): loop until I/O is complete */
66 #define MY_DONT_CHECK_FILESIZE 128U /* Option to init_io_cache() */
67 #define MY_LINK_WARNING 32U /* my_redel() gives warning if links */
68 #define MY_COPYTIME 64U /* my_redel() copies time */
69 #define MY_DELETE_OLD 256U /* my_create_with_symlink() */
70 #define MY_RESOLVE_LINK 128U /* my_realpath(); Only resolve links */
71 #define MY_HOLD_ORIGINAL_MODES 128U /* my_copy() holds to file modes */
72 #define MY_REDEL_MAKE_BACKUP 256U
73 #define MY_SEEK_NOT_DONE 32U /* my_lock may have to do a seek */
74 #define MY_SHORT_WAIT 64U /* my_lock() don't wait if can't lock */
75 #define MY_FORCE_LOCK 128U /* use my_lock() even if disable_locking */
76 #define MY_NO_WAIT 256U /* my_lock() don't wait at all */
77 /*
78 init_dynamic_array() has init buffer; Internal flag, not to be used by
79 caller.
80 */
81 #define MY_INIT_BUFFER_USED 256U
82 #define MY_ZEROFILL 32U /* my_malloc(), fill array with zero */
83 #define MY_ALLOW_ZERO_PTR 64U /* my_realloc() ; zero ptr -> malloc */
84 #define MY_FREE_ON_ERROR 128U /* my_realloc() ; Free old ptr on error */
85 #define MY_DONT_OVERWRITE_FILE 2048U /* my_copy: Don't overwrite file */
86 #define MY_THREADSAFE 2048U /* my_seek(): lock fd mutex */
87 #define MY_SYNC 4096U /* my_copy(): sync dst file */
88 #define MY_SYNC_DIR 32768U /* my_create/delete/rename: sync directory */
89 #define MY_SYNC_FILESIZE 65536U /* my_sync(): safe sync when file is extended */
90 #define MY_THREAD_SPECIFIC 0x10000U /* my_malloc(): thread specific */
91 /* Tree that should delete things automatically */
92 #define MY_TREE_WITH_DELETE 0x40000U
93
94 #define MY_CHECK_ERROR 1U /* Params to my_end; Check open-close */
95 #define MY_GIVE_INFO 2U /* Give time info about process*/
96 #define MY_DONT_FREE_DBUG 4U /* Do not call DBUG_END() in my_end() */
97
98 #define ME_BELL 4U /* Ring bell then printing message */
99 #define ME_ERROR_LOG 64 /**< write the error message to error log */
100 #define ME_ERROR_LOG_ONLY 128 /**< write the error message to error log only */
101 #define ME_NOTE 1024 /**< not error but just info */
102 #define ME_WARNING 2048 /**< not error but just warning */
103 #define ME_FATAL 4096 /**< fatal statement error */
104
105 /* Bits in last argument to fn_format */
106 #define MY_REPLACE_DIR 1U /* replace dir in name with 'dir' */
107 #define MY_REPLACE_EXT 2U /* replace extension with 'ext' */
108 #define MY_UNPACK_FILENAME 4U /* Unpack name (~ -> home) */
109 #define MY_PACK_FILENAME 8U /* Pack name (home -> ~) */
110 #define MY_RESOLVE_SYMLINKS 16U /* Resolve all symbolic links */
111 #define MY_RETURN_REAL_PATH 32U /* return full path for file */
112 #define MY_SAFE_PATH 64U /* Return NULL if too long path */
113 #define MY_RELATIVE_PATH 128U /* name is relative to 'dir' */
114 #define MY_APPEND_EXT 256U /* add 'ext' as additional extension*/
115
116
117 /* My seek flags */
118 #define MY_SEEK_SET 0
119 #define MY_SEEK_CUR 1
120 #define MY_SEEK_END 2
121
122 /* Some constants */
123 #define MY_WAIT_FOR_USER_TO_FIX_PANIC 60 /* in seconds */
124 #define MY_WAIT_GIVE_USER_A_MESSAGE 10 /* Every 10 times of prev */
125 #define MIN_COMPRESS_LENGTH 50 /* Don't compress small bl. */
126 #define DFLT_INIT_HITS 3
127
128 /* root_alloc flags */
129 #define MY_KEEP_PREALLOC 1U
130 #define MY_MARK_BLOCKS_FREE 2U /* move used to free list and reuse them */
131
132 /* Internal error numbers (for assembler functions) */
133 #define MY_ERRNO_EDOM 33
134 #define MY_ERRNO_ERANGE 34
135
136 /* Bits for get_date timeflag */
137 #define GETDATE_DATE_TIME 1U
138 #define GETDATE_SHORT_DATE 2U
139 #define GETDATE_HHMMSSTIME 4U
140 #define GETDATE_GMT 8U
141 #define GETDATE_FIXEDLENGTH 16U
142
143 /* Extra length needed for filename if one calls my_create_backup_name */
144 #define MY_BACKUP_NAME_EXTRA_LENGTH 17
145
146 char *guess_malloc_library();
147
148 /* If we have our own safemalloc (for debugging) */
149 #if defined(SAFEMALLOC)
150 void sf_report_leaked_memory(my_thread_id id);
151 int sf_sanity();
152 extern my_thread_id (*sf_malloc_dbug_id)(void);
153 #define SAFEMALLOC_REPORT_MEMORY(X) sf_report_leaked_memory(X)
154 #else
155 #define SAFEMALLOC_REPORT_MEMORY(X) do {} while(0)
156 #endif
157
158 typedef void (*MALLOC_SIZE_CB) (long long size, my_bool is_thread_specific);
159 extern void set_malloc_size_cb(MALLOC_SIZE_CB func);
160
161 /* defines when allocating data */
162 extern void *my_malloc(PSI_memory_key key, size_t size, myf MyFlags);
163 extern void *my_multi_malloc(PSI_memory_key key, myf MyFlags, ...);
164 extern void *my_multi_malloc_large(PSI_memory_key key, myf MyFlags, ...);
165 extern void *my_realloc(PSI_memory_key key, void *ptr, size_t size, myf MyFlags);
166 extern void my_free(void *ptr);
167 extern void *my_memdup(PSI_memory_key key, const void *from,size_t length,myf MyFlags);
168 extern char *my_strdup(PSI_memory_key key, const char *from,myf MyFlags);
169 extern char *my_strndup(PSI_memory_key key, const char *from, size_t length, myf MyFlags);
170
171 int my_init_large_pages(my_bool super_large_pages);
172 uchar *my_large_malloc(size_t *size, myf my_flags);
173 void my_large_free(void *ptr, size_t size);
174
175 #ifdef _WIN32
176 extern BOOL my_obtain_privilege(LPCSTR lpPrivilege);
177 #endif
178
179 void my_init_atomic_write(void);
180 #ifdef __linux__
181 my_bool my_test_if_atomic_write(File handle, int pagesize);
182 #else
183 #define my_test_if_atomic_write(A, B) 0
184 #endif /* __linux__ */
185 extern my_bool my_may_have_atomic_write;
186
187 #if defined(HAVE_ALLOCA) && !defined(HAVE_valgrind)
188 #if defined(_AIX) && !defined(__GNUC__) && !defined(_AIX43)
189 #pragma alloca
190 #endif /* _AIX */
191 #if defined(__MWERKS__)
192 #undef alloca
193 #define alloca _alloca
194 #endif /* __MWERKS__ */
195 #if defined(__GNUC__) && !defined(HAVE_ALLOCA_H) && ! defined(alloca)
196 #define alloca __builtin_alloca
197 #endif /* GNUC */
198 #define my_alloca(SZ) alloca((size_t) (SZ))
199 #define my_afree(PTR) ((void)0)
200 #define MAX_ALLOCA_SZ 4096
201 #define my_safe_alloca(size) (((size) <= MAX_ALLOCA_SZ) ? \
202 my_alloca(size) : \
203 my_malloc(PSI_NOT_INSTRUMENTED, (size), MYF(MY_THREAD_SPECIFIC|MY_WME)))
204 #define my_safe_afree(ptr, size) \
205 do { if ((size) > MAX_ALLOCA_SZ) my_free(ptr); } while(0)
206 #else
207 #define my_alloca(SZ) my_malloc(PSI_NOT_INSTRUMENTED, SZ,MYF(MY_FAE))
208 #define my_afree(PTR) my_free(PTR)
209 #define my_safe_alloca(size) my_alloca(size)
210 #define my_safe_afree(ptr, size) my_afree(ptr)
211 #endif /* HAVE_ALLOCA */
212
213 #ifndef errno /* did we already get it? */
214 #ifdef HAVE_ERRNO_AS_DEFINE
215 #include <errno.h> /* errno is a define */
216 #else
217 extern int errno; /* declare errno */
218 #endif
219 #endif /* #ifndef errno */
220 extern char *home_dir; /* Home directory for user */
221 extern MYSQL_PLUGIN_IMPORT char *mysql_data_home;
222 extern const char *my_progname; /* program-name (printed in errors) */
223 extern const char *my_progname_short; /* like above but without directory */
224 extern char curr_dir[]; /* Current directory for user */
225 extern void (*error_handler_hook)(uint my_err, const char *str,myf MyFlags);
226 extern void (*fatal_error_handler_hook)(uint my_err, const char *str,
227 myf MyFlags);
228 extern uint my_file_limit;
229 extern ulonglong my_thread_stack_size;
230 extern int sf_leaking_memory; /* set to 1 to disable memleak detection */
231
232 extern void (*proc_info_hook)(void *, const PSI_stage_info *, PSI_stage_info *,
233 const char *, const char *, const unsigned int);
234
235 /* charsets */
236 #define MY_ALL_CHARSETS_SIZE 2048
237 extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *default_charset_info;
238 extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *all_charsets[MY_ALL_CHARSETS_SIZE];
239 extern struct charset_info_st compiled_charsets[];
240
241 /* Collation properties and use statistics */
242 extern my_bool my_collation_is_known_id(uint id);
243 extern ulonglong my_collation_statistics_get_use_count(uint id);
244 extern const char *my_collation_get_tailoring(uint id);
245
246 /* statistics */
247 extern ulong my_stream_opened, my_tmp_file_created;
248 extern ulong my_file_total_opened;
249 extern ulong my_sync_count;
250 extern uint mysys_usage_id;
251 extern int32 my_file_opened;
252 extern my_bool my_init_done, my_thr_key_mysys_exists;
253 extern my_bool my_assert;
254 extern my_bool my_assert_on_error;
255 extern myf my_global_flags; /* Set to MY_WME for more error messages */
256 /* Point to current my_message() */
257 extern void (*my_sigtstp_cleanup)(void),
258 /* Executed before jump to shell */
259 (*my_sigtstp_restart)(void);
260 /* Executed when coming from shell */
261 extern MYSQL_PLUGIN_IMPORT int my_umask; /* Default creation mask */
262 extern int my_umask_dir,
263 my_recived_signals, /* Signals we have got */
264 my_safe_to_handle_signal, /* Set when allowed to SIGTSTP */
265 my_dont_interrupt; /* call remember_intr when set */
266 extern MYSQL_PLUGIN_IMPORT my_bool my_use_symdir;
267
268 extern ulong my_default_record_cache_size;
269 extern MYSQL_PLUGIN_IMPORT my_bool my_disable_locking;
270 extern my_bool my_disable_async_io,
271 my_disable_flush_key_blocks, my_disable_symlinks;
272 extern my_bool my_disable_sync, my_disable_copystat_in_redel;
273 extern char wild_many,wild_one,wild_prefix;
274 extern const char *charsets_dir;
275
276 enum cache_type
277 {
278 TYPE_NOT_SET= 0, READ_CACHE, WRITE_CACHE,
279 SEQ_READ_APPEND /* sequential read or append */,
280 READ_FIFO, READ_NET};
281
282 enum flush_type
283 {
284 FLUSH_KEEP, /* flush block and keep it in the cache */
285 FLUSH_RELEASE, /* flush block and remove it from the cache */
286 FLUSH_IGNORE_CHANGED, /* remove block from the cache */
287 /*
288 As my_disable_flush_pagecache_blocks is always 0, the following option
289 is strictly equivalent to FLUSH_KEEP
290 */
291 FLUSH_FORCE_WRITE,
292 /**
293 @brief like FLUSH_KEEP but return immediately if file is already being
294 flushed (even partially) by another thread; only for page cache,
295 forbidden for key cache.
296 */
297 FLUSH_KEEP_LAZY
298 };
299
300 typedef struct st_record_cache /* Used when caching records */
301 {
302 File file;
303 int rc_seek,error,inited;
304 uint rc_length,read_length,reclength;
305 my_off_t rc_record_pos,end_of_file;
306 uchar *rc_buff,*rc_buff2,*rc_pos,*rc_end,*rc_request_pos;
307 enum cache_type type;
308 } RECORD_CACHE;
309
310 enum file_type
311 {
312 UNOPEN = 0, FILE_BY_OPEN, FILE_BY_CREATE, STREAM_BY_FOPEN, STREAM_BY_FDOPEN,
313 FILE_BY_O_TMPFILE, FILE_BY_MKSTEMP, FILE_BY_DUP
314 };
315
316 struct st_my_file_info
317 {
318 char *name;
319 #ifdef _WIN32
320 HANDLE fhandle; /* win32 file handle */
321 int oflag; /* open flags, e.g O_APPEND */
322 #endif
323 enum file_type type;
324 };
325
326 extern struct st_my_file_info *my_file_info;
327
328 /* Free function pointer */
329 typedef void (*FREE_FUNC)(void *);
330
331 typedef struct st_dynamic_array
332 {
333 uchar *buffer;
334 uint elements,max_element;
335 uint alloc_increment;
336 uint size_of_element;
337 PSI_memory_key m_psi_key;
338 myf malloc_flags;
339 } DYNAMIC_ARRAY;
340
341 typedef struct st_my_tmpdir
342 {
343 DYNAMIC_ARRAY full_list;
344 char **list;
345 uint cur, max;
346 mysql_mutex_t mutex;
347 } MY_TMPDIR;
348
349 typedef struct st_dynamic_string
350 {
351 char *str;
352 size_t length,max_length,alloc_increment;
353 } DYNAMIC_STRING;
354
355 struct st_io_cache;
356
357 typedef struct st_io_cache_share
358 {
359 mysql_mutex_t mutex; /* To sync on reads into buffer. */
360 mysql_cond_t cond; /* To wait for signals. */
361 mysql_cond_t cond_writer; /* For a synchronized writer. */
362 /* Offset in file corresponding to the first byte of buffer. */
363 my_off_t pos_in_file;
364 /* If a synchronized write cache is the source of the data. */
365 struct st_io_cache *source_cache;
366 uchar *buffer; /* The read buffer. */
367 uchar *read_end; /* Behind last valid byte of buffer. */
368 int running_threads; /* threads not in lock. */
369 int total_threads; /* threads sharing the cache. */
370 int error; /* Last error. */
371 #ifdef NOT_YET_IMPLEMENTED
372 /* whether the structure should be free'd */
373 my_bool alloced;
374 #endif
375 } IO_CACHE_SHARE;
376
377 typedef struct st_io_cache /* Used when caching files */
378 {
379 /* Offset in file corresponding to the first byte of uchar* buffer. */
380 my_off_t pos_in_file;
381 /*
382 The offset of end of file for READ_CACHE and WRITE_CACHE.
383 For SEQ_READ_APPEND it the maximum of the actual end of file and
384 the position represented by read_end.
385 */
386 my_off_t end_of_file;
387 /* Points to current read position in the buffer */
388 uchar *read_pos;
389 /* the non-inclusive boundary in the buffer for the currently valid read */
390 uchar *read_end;
391 uchar *buffer; /* The read buffer */
392 /* Used in ASYNC_IO */
393 uchar *request_pos;
394
395 /* Only used in WRITE caches and in SEQ_READ_APPEND to buffer writes */
396 uchar *write_buffer;
397 /*
398 Only used in SEQ_READ_APPEND, and points to the current read position
399 in the write buffer. Note that reads in SEQ_READ_APPEND caches can
400 happen from both read buffer (uchar* buffer) and write buffer
401 (uchar* write_buffer).
402 */
403 uchar *append_read_pos;
404 /* Points to current write position in the write buffer */
405 uchar *write_pos;
406 /* The non-inclusive boundary of the valid write area */
407 uchar *write_end;
408
409 /*
410 The lock is for append buffer used in SEQ_READ_APPEND cache
411 need mutex copying from append buffer to read buffer.
412 */
413 mysql_mutex_t append_buffer_lock;
414 /*
415 The following is used when several threads are reading the
416 same file in parallel. They are synchronized on disk
417 accesses reading the cached part of the file asynchronously.
418 It should be set to NULL to disable the feature. Only
419 READ_CACHE mode is supported.
420 */
421 IO_CACHE_SHARE *share;
422
423 /*
424 A caller will use my_b_read() macro to read from the cache
425 if the data is already in cache, it will be simply copied with
426 memcpy() and internal variables will be accordinging updated with
427 no functions invoked. However, if the data is not fully in the cache,
428 my_b_read() will call read_function to fetch the data. read_function
429 must never be invoked directly.
430 */
431 int (*read_function)(struct st_io_cache *,uchar *,size_t);
432 /*
433 Same idea as in the case of read_function, except my_b_write() needs to
434 be replaced with my_b_append() for a SEQ_READ_APPEND cache
435 */
436 int (*write_function)(struct st_io_cache *,const uchar *,size_t);
437 /*
438 Specifies the type of the cache. Depending on the type of the cache
439 certain operations might not be available and yield unpredicatable
440 results. Details to be documented later
441 */
442 enum cache_type type;
443 /*
444 Counts the number of times, when we were forced to use disk. We use it to
445 increase the binlog_cache_disk_use and binlog_stmt_cache_disk_use status
446 variables.
447 */
448 ulong disk_writes;
449 char *file_name; /* if used with 'open_cached_file' */
450 const char *dir;
451 char prefix[3];
452 File file; /* file descriptor */
453
454 struct st_io_cache *next_file_user;
455 /*
456 seek_not_done is set by my_b_seek() to inform the upcoming read/write
457 operation that a seek needs to be preformed prior to the actual I/O
458 error is 0 if the cache operation was successful, -1 if there was a
459 "hard" error, and the actual number of I/O-ed bytes if the read/write was
460 partial.
461 */
462 int seek_not_done,error;
463 /* length of the buffer used for storing un-encrypted data */
464 size_t buffer_length;
465 /* read_length is the same as buffer_length except when we use async io */
466 size_t read_length;
467 myf myflags; /* Flags used to my_read/my_write */
468 /*
469 alloced_buffer is set to the size of the buffer allocated for the IO_CACHE.
470 Includes the overhead(storing key to ecnrypt and decrypt) for encryption.
471 Set to 0 if nothing is allocated.
472 Currently READ_NET is the only one that will use a buffer allocated
473 somewhere else
474 */
475 size_t alloced_buffer;
476 } IO_CACHE;
477
478 typedef int (*qsort2_cmp)(const void *, const void *, const void *);
479
480 typedef void (*my_error_reporter)(enum loglevel level, const char *format, ...)
481 ATTRIBUTE_FORMAT_FPTR(printf, 2, 3);
482
483 extern my_error_reporter my_charset_error_reporter;
484
485 extern PSI_file_key key_file_io_cache;
486
487 /* inline functions for mf_iocache */
488
489 extern int my_b_flush_io_cache(IO_CACHE *info, int need_append_buffer_lock);
490 extern int _my_b_get(IO_CACHE *info);
491 extern int _my_b_read(IO_CACHE *info,uchar *Buffer,size_t Count);
492 extern int _my_b_write(IO_CACHE *info,const uchar *Buffer,size_t Count);
493
494 /* Test if buffer is inited */
my_b_clear(IO_CACHE * info)495 static inline void my_b_clear(IO_CACHE *info) { info->buffer= 0; }
my_b_inited(IO_CACHE * info)496 static inline int my_b_inited(IO_CACHE *info) { return MY_TEST(info->buffer); }
497 #define my_b_EOF INT_MIN
498
my_b_read(IO_CACHE * info,uchar * Buffer,size_t Count)499 static inline int my_b_read(IO_CACHE *info, uchar *Buffer, size_t Count)
500 {
501 if (info->read_pos + Count <= info->read_end)
502 {
503 memcpy(Buffer, info->read_pos, Count);
504 info->read_pos+= Count;
505 return 0;
506 }
507 return _my_b_read(info, Buffer, Count);
508 }
509
my_b_write(IO_CACHE * info,const uchar * Buffer,size_t Count)510 static inline int my_b_write(IO_CACHE *info, const uchar *Buffer, size_t Count)
511 {
512 MEM_CHECK_DEFINED(Buffer, Count);
513 if (info->write_pos + Count <= info->write_end)
514 {
515 if (Count)
516 {
517 memcpy(info->write_pos, Buffer, Count);
518 info->write_pos+= Count;
519 }
520 return 0;
521 }
522 return _my_b_write(info, Buffer, Count);
523 }
524
my_b_get(IO_CACHE * info)525 static inline int my_b_get(IO_CACHE *info)
526 {
527 if (info->read_pos != info->read_end)
528 {
529 info->read_pos++;
530 return info->read_pos[-1];
531 }
532 return _my_b_get(info);
533 }
534
my_b_write_byte(IO_CACHE * info,uchar chr)535 static inline my_bool my_b_write_byte(IO_CACHE *info, uchar chr)
536 {
537 MEM_CHECK_DEFINED(&chr, 1);
538 if (info->write_pos >= info->write_end)
539 if (my_b_flush_io_cache(info, 1))
540 return 1;
541 *info->write_pos++= chr;
542 return 0;
543 }
544
545 /**
546 Fill buffer of the cache.
547
548 @note It assumes that you have already used all characters in the CACHE,
549 independent of the read_pos value!
550
551 @returns
552 0 On error or EOF (info->error = -1 on error)
553 # Number of characters
554 */
my_b_fill(IO_CACHE * info)555 static inline size_t my_b_fill(IO_CACHE *info)
556 {
557 info->read_pos= info->read_end;
558 return _my_b_read(info,0,0) ? 0 : (size_t) (info->read_end - info->read_pos);
559 }
560
my_b_tell(const IO_CACHE * info)561 static inline my_off_t my_b_tell(const IO_CACHE *info)
562 {
563 if (info->type == WRITE_CACHE) {
564 return info->pos_in_file + (my_off_t)(info->write_pos - info->request_pos);
565
566 }
567 return info->pos_in_file + (my_off_t) (info->read_pos - info->request_pos);
568 }
569
my_b_write_tell(const IO_CACHE * info)570 static inline my_off_t my_b_write_tell(const IO_CACHE *info)
571 {
572 return info->pos_in_file + (my_off_t) (info->write_pos - info->write_buffer);
573 }
574
my_b_get_buffer_start(const IO_CACHE * info)575 static inline uchar* my_b_get_buffer_start(const IO_CACHE *info)
576 {
577 return info->request_pos;
578 }
579
my_b_get_bytes_in_buffer(const IO_CACHE * info)580 static inline size_t my_b_get_bytes_in_buffer(const IO_CACHE *info)
581 {
582 return (size_t) (info->read_end - info->request_pos);
583 }
584
my_b_get_pos_in_file(const IO_CACHE * info)585 static inline my_off_t my_b_get_pos_in_file(const IO_CACHE *info)
586 {
587 return info->pos_in_file;
588 }
589
my_b_bytes_in_cache(const IO_CACHE * info)590 static inline size_t my_b_bytes_in_cache(const IO_CACHE *info)
591 {
592 if (info->type == WRITE_CACHE) {
593 return (size_t) (info->write_end - info->write_pos);
594 }
595 return (size_t) (info->read_end - info->read_pos);
596 }
597
598 int my_b_copy_to_file (IO_CACHE *cache, FILE *file, size_t count);
599 int my_b_copy_all_to_file(IO_CACHE *cache, FILE *file);
600
601 my_off_t my_b_append_tell(IO_CACHE* info);
602 my_off_t my_b_safe_tell(IO_CACHE* info); /* picks the correct tell() */
603 int my_b_pread(IO_CACHE *info, uchar *Buffer, size_t Count, my_off_t pos);
604
605 typedef uint32 ha_checksum;
606
607 extern int (*mysys_test_invalid_symlink)(const char *filename);
608 #include <my_alloc.h>
609
610 /* Prototypes for mysys and my_func functions */
611
612 extern int my_copy(const char *from,const char *to,myf MyFlags);
613 extern int my_delete(const char *name,myf MyFlags);
614 extern int my_rmtree(const char *name, myf Myflags);
615 extern int my_getwd(char * buf,size_t size,myf MyFlags);
616 extern int my_setwd(const char *dir,myf MyFlags);
617 extern int my_lock(File fd,int op,my_off_t start, my_off_t length,myf MyFlags);
618 extern void *my_once_alloc(size_t Size,myf MyFlags);
619 extern void my_once_free(void);
620 extern char *my_once_strdup(const char *src,myf myflags);
621 extern void *my_once_memdup(const void *src, size_t len, myf myflags);
622 extern File my_open(const char *FileName,int Flags,myf MyFlags);
623 extern File my_register_filename(File fd, const char *FileName,
624 enum file_type type_of_file,
625 uint error_message_number, myf MyFlags);
626 extern File my_create(const char *FileName,int CreateFlags,
627 int AccessFlags, myf MyFlags);
628 extern int my_close(File Filedes,myf MyFlags);
629 extern int my_mkdir(const char *dir, int Flags, myf MyFlags);
630 extern int my_readlink(char *to, const char *filename, myf MyFlags);
631 extern int my_is_symlink(const char *filename);
632 extern int my_realpath(char *to, const char *filename, myf MyFlags);
633 extern File my_create_with_symlink(const char *linkname, const char *filename,
634 int createflags, int access_flags,
635 myf MyFlags);
636 extern int my_rename_with_symlink(const char *from,const char *to,myf MyFlags);
637 extern int my_symlink(const char *content, const char *linkname, myf MyFlags);
638 extern int my_handler_delete_with_symlink(const char *filename, myf sync_dir);
639
640 extern size_t my_read(File Filedes,uchar *Buffer,size_t Count,myf MyFlags);
641 extern size_t my_pread(File Filedes,uchar *Buffer,size_t Count,my_off_t offset,
642 myf MyFlags);
643 extern int my_rename(const char *from,const char *to,myf MyFlags);
644 extern my_off_t my_seek(File fd,my_off_t pos,int whence,myf MyFlags);
645 extern my_off_t my_tell(File fd,myf MyFlags);
646 extern size_t my_write(File Filedes,const uchar *Buffer,size_t Count,
647 myf MyFlags);
648 extern size_t my_pwrite(File Filedes,const uchar *Buffer,size_t Count,
649 my_off_t offset,myf MyFlags);
650 extern size_t my_fread(FILE *stream,uchar *Buffer,size_t Count,myf MyFlags);
651 extern size_t my_fwrite(FILE *stream,const uchar *Buffer,size_t Count,
652 myf MyFlags);
653 extern my_off_t my_fseek(FILE *stream,my_off_t pos,int whence,myf MyFlags);
654 extern my_off_t my_ftell(FILE *stream,myf MyFlags);
655
656 /* implemented in my_memmem.c */
657 extern void *my_memmem(const void *haystack, size_t haystacklen,
658 const void *needle, size_t needlelen);
659
660
661 #ifdef _WIN32
662 extern int my_access(const char *path, int amode);
663 #define my_check_user(A,B) (NULL)
664 #define my_set_user(A,B,C) (0)
665 #else
666 #define my_access access
667 struct passwd *my_check_user(const char *user, myf MyFlags);
668 int my_set_user(const char *user, struct passwd *user_info, myf MyFlags);
669 #endif
670
671 extern int check_if_legal_filename(const char *path);
672 extern int check_if_legal_tablename(const char *path);
673
674 #ifdef _WIN32
675 extern my_bool is_filename_allowed(const char *name, size_t length,
676 my_bool allow_current_dir);
677 #else /* _WIN32 */
678 # define is_filename_allowed(name, length, allow_cwd) (TRUE)
679 #endif /* _WIN32 */
680
681 #ifdef _WIN32
682 /* Windows-only functions (CRT equivalents)*/
683 extern HANDLE my_get_osfhandle(File fd);
684 extern File my_win_handle2File(HANDLE hFile);
685 extern void my_osmaperr(unsigned long last_error);
686 #endif
687
688 extern void init_glob_errs(void);
689 extern const char** get_global_errmsgs(int nr);
690 extern void wait_for_free_space(const char *filename, int errors);
691 extern FILE *my_fopen(const char *FileName,int Flags,myf MyFlags);
692 extern FILE *my_fdopen(File Filedes,const char *name, int Flags,myf MyFlags);
693 extern FILE *my_freopen(const char *path, const char *mode, FILE *stream);
694 extern int my_fclose(FILE *fd,myf MyFlags);
695 extern int my_vfprintf(FILE *stream, const char* format, va_list args);
696 extern const char* my_strerror(char *buf, size_t len, int nr);
697 extern int my_fprintf(FILE *stream, const char* format, ...);
698 extern File my_fileno(FILE *fd);
699 extern int my_chsize(File fd,my_off_t newlength, int filler, myf MyFlags);
700 extern int my_chmod(const char *name, mode_t mode, myf my_flags);
701 extern const char *my_basename(const char *filename);
702 extern void thr_set_sync_wait_callback(void (*before_sync)(void),
703 void (*after_sync)(void));
704 extern int my_sync(File fd, myf my_flags);
705 extern int my_sync_dir(const char *dir_name, myf my_flags);
706 extern int my_sync_dir_by_file(const char *file_name, myf my_flags);
707 extern const char *my_get_err_msg(uint nr);
708 extern int my_error_register(const char** (*get_errmsgs) (int nr),
709 uint first, uint last);
710 extern my_bool my_error_unregister(uint first, uint last);
711 extern void my_message(uint my_err, const char *str,myf MyFlags);
712 extern void my_message_stderr(uint my_err, const char *str, myf MyFlags);
713 extern my_bool my_init(void);
714 extern void my_end(int infoflag);
715 extern int my_redel(const char *from, const char *to, time_t backup_time_stamp,
716 myf MyFlags);
717 void my_create_backup_name(char *to, const char *from,
718 time_t backup_time_stamp);
719 extern int my_copystat(const char *from, const char *to, int MyFlags);
720 extern char * my_filename(File fd);
721
722 extern my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist);
723 extern char *my_tmpdir(MY_TMPDIR *tmpdir);
724 extern void free_tmpdir(MY_TMPDIR *tmpdir);
725
726 extern void my_remember_signal(int signal_number,sig_handler (*func)(int));
727 extern size_t dirname_part(char * to,const char *name, size_t *to_res_length);
728 extern size_t dirname_length(const char *name);
729 #define base_name(A) (A+dirname_length(A))
730 extern int test_if_hard_path(const char *dir_name);
731 extern my_bool has_path(const char *name);
732 extern char *convert_dirname(char *to, const char *from, const char *from_end);
733 extern void to_unix_path(char * name);
734 extern char * fn_ext(const char *name);
735 extern char * fn_ext2(const char *name);
736 extern char * fn_same(char * toname,const char *name,int flag);
737 extern char * fn_format(char * to,const char *name,const char *dir,
738 const char *form, uint flag);
739 extern size_t strlength(const char *str);
740 extern void pack_dirname(char * to,const char *from);
741 extern size_t normalize_dirname(char * to, const char *from);
742 extern size_t unpack_dirname(char * to,const char *from);
743 extern size_t cleanup_dirname(char * to,const char *from);
744 extern size_t system_filename(char * to,const char *from);
745 extern size_t unpack_filename(char * to,const char *from);
746 extern char * intern_filename(char * to,const char *from);
747 extern int pack_filename(char * to, const char *name, size_t max_length);
748 extern char * my_path(char * to,const char *progname,
749 const char *own_pathname_part);
750 extern char * my_load_path(char * to, const char *path,
751 const char *own_path_prefix);
752 extern int wild_compare(const char *str,const char *wildstr,
753 pbool str_is_pattern);
754 extern my_bool array_append_string_unique(const char *str,
755 const char **array, size_t size);
756 extern void get_date(char * to,int timeflag,time_t use_time);
757 extern void soundex(CHARSET_INFO *, char * out_pntr, char * in_pntr,
758 pbool remove_garbage);
759 extern int init_record_cache(RECORD_CACHE *info,size_t cachesize,File file,
760 size_t reclength,enum cache_type type,
761 pbool use_async_io);
762 extern int read_cache_record(RECORD_CACHE *info,uchar *to);
763 extern int end_record_cache(RECORD_CACHE *info);
764 extern int write_cache_record(RECORD_CACHE *info,my_off_t filepos,
765 const uchar *record,size_t length);
766 extern int flush_write_cache(RECORD_CACHE *info);
767 extern void handle_recived_signals(void);
768
769 extern sig_handler my_set_alarm_variable(int signo);
770 extern my_bool radixsort_is_appliccable(uint n_items, size_t size_of_element);
771 extern void my_string_ptr_sort(uchar *base,uint items,size_t size);
772 extern void radixsort_for_str_ptr(uchar* base[], uint number_of_elements,
773 size_t size_of_element,uchar *buffer[]);
774 extern qsort_t my_qsort(void *base_ptr, size_t total_elems, size_t size,
775 qsort_cmp cmp);
776 extern qsort_t my_qsort2(void *base_ptr, size_t total_elems, size_t size,
777 qsort2_cmp cmp, void *cmp_argument);
778 extern qsort2_cmp get_ptr_compare(size_t);
779 void my_store_ptr(uchar *buff, size_t pack_length, my_off_t pos);
780 my_off_t my_get_ptr(uchar *ptr, size_t pack_length);
781 extern int init_io_cache(IO_CACHE *info,File file,size_t cachesize,
782 enum cache_type type,my_off_t seek_offset,
783 my_bool use_async_io, myf cache_myflags);
784 extern int init_io_cache_ext(IO_CACHE *info, File file, size_t cachesize,
785 enum cache_type type, my_off_t seek_offset,
786 pbool use_async_io, myf cache_myflags,
787 PSI_file_key file_key);
788 extern my_bool reinit_io_cache(IO_CACHE *info,enum cache_type type,
789 my_off_t seek_offset, my_bool use_async_io,
790 my_bool clear_cache);
791 extern void init_io_cache_share(IO_CACHE *read_cache, IO_CACHE_SHARE *cshare,
792 IO_CACHE *write_cache, uint num_threads);
793
794 extern int init_slave_io_cache(IO_CACHE *master, IO_CACHE *slave);
795 void end_slave_io_cache(IO_CACHE *cache);
796 void seek_io_cache(IO_CACHE *cache, my_off_t needed_offset);
797
798 extern void remove_io_thread(IO_CACHE *info);
799 extern int my_b_append(IO_CACHE *info,const uchar *Buffer,size_t Count);
800 extern int my_b_safe_write(IO_CACHE *info,const uchar *Buffer,size_t Count);
801
802 extern int my_block_write(IO_CACHE *info, const uchar *Buffer,
803 size_t Count, my_off_t pos);
804
805 #define flush_io_cache(info) my_b_flush_io_cache((info),1)
806
807 extern int end_io_cache(IO_CACHE *info);
808 extern void my_b_seek(IO_CACHE *info,my_off_t pos);
809 extern size_t my_b_gets(IO_CACHE *info, char *to, size_t max_length);
810 extern my_off_t my_b_filelength(IO_CACHE *info);
811 extern my_bool my_b_write_backtick_quote(IO_CACHE *info, const char *str,
812 size_t len);
813 extern my_bool my_b_printf(IO_CACHE *info, const char* fmt, ...);
814 extern size_t my_b_vprintf(IO_CACHE *info, const char* fmt, va_list ap);
815 extern my_bool open_cached_file(IO_CACHE *cache,const char *dir,
816 const char *prefix, size_t cache_size,
817 myf cache_myflags);
818 extern my_bool real_open_cached_file(IO_CACHE *cache);
819 extern void close_cached_file(IO_CACHE *cache);
820 File create_temp_file(char *to, const char *dir, const char *pfx,
821 int mode, myf MyFlags);
822 #define my_init_dynamic_array(A,B,C,D,E,F) init_dynamic_array2(A,B,C,NULL,D,E,F)
823 #define my_init_dynamic_array2(A,B,C,D,E,F,G) init_dynamic_array2(A,B,C,D,E,F,G)
824 extern my_bool init_dynamic_array2(PSI_memory_key psi_key, DYNAMIC_ARRAY *array,
825 uint element_size, void *init_buffer,
826 uint init_alloc, uint alloc_increment,
827 myf my_flags);
828 extern my_bool insert_dynamic(DYNAMIC_ARRAY *array, const void* element);
829 extern void *alloc_dynamic(DYNAMIC_ARRAY *array);
830 extern void *pop_dynamic(DYNAMIC_ARRAY*);
831 extern my_bool set_dynamic(DYNAMIC_ARRAY *array, const void *element,
832 uint array_index);
833 extern my_bool allocate_dynamic(DYNAMIC_ARRAY *array, uint max_elements);
834 extern void get_dynamic(DYNAMIC_ARRAY *array, void *element, uint array_index);
835 extern void delete_dynamic(DYNAMIC_ARRAY *array);
836 extern void delete_dynamic_element(DYNAMIC_ARRAY *array, uint array_index);
837 extern void delete_dynamic_with_callback(DYNAMIC_ARRAY *array, FREE_FUNC f);
838 extern void freeze_size(DYNAMIC_ARRAY *array);
839 extern int get_index_dynamic(DYNAMIC_ARRAY *array, void *element);
840 #define dynamic_array_ptr(array,array_index) ((array)->buffer+(array_index)*(array)->size_of_element)
841 #define dynamic_element(array,array_index,type) ((type)((array)->buffer) +(array_index))
842 #define push_dynamic(A,B) insert_dynamic((A),(B))
843 #define reset_dynamic(array) ((array)->elements= 0)
844 #define sort_dynamic(A,cmp) my_qsort((A)->buffer, (A)->elements, (A)->size_of_element, (cmp))
845
846 extern my_bool init_dynamic_string(DYNAMIC_STRING *str, const char *init_str,
847 size_t init_alloc,size_t alloc_increment);
848 extern my_bool dynstr_append(DYNAMIC_STRING *str, const char *append);
849 my_bool dynstr_append_mem(DYNAMIC_STRING *str, const char *append,
850 size_t length);
851 extern my_bool dynstr_append_os_quoted(DYNAMIC_STRING *str, const char *append,
852 ...);
853 extern my_bool dynstr_append_quoted(DYNAMIC_STRING *str,
854 const char *append, size_t len,
855 char quote);
856 extern my_bool dynstr_set(DYNAMIC_STRING *str, const char *init_str);
857 extern my_bool dynstr_realloc(DYNAMIC_STRING *str, size_t additional_size);
858 extern my_bool dynstr_trunc(DYNAMIC_STRING *str, size_t n);
859 extern void dynstr_free(DYNAMIC_STRING *str);
860 extern uint32 copy_and_convert_extended(char *to, uint32 to_length,
861 CHARSET_INFO *to_cs,
862 const char *from, uint32 from_length,
863 CHARSET_INFO *from_cs, uint *errors);
864 extern void dynstr_reassociate(DYNAMIC_STRING *str, char **res, size_t *length,
865 size_t *alloc_length);
866 extern uint32 copy_and_convert_extended(char *to, uint32 to_length,
867 CHARSET_INFO *to_cs,
868 const char *from, uint32 from_length,
869 CHARSET_INFO *from_cs, uint *errors);
870 #ifdef HAVE_MLOCK
871 extern void *my_malloc_lock(size_t length,myf flags);
872 extern void my_free_lock(void *ptr);
873 #else
874 #define my_malloc_lock(A,B) my_malloc(PSI_INSTRUMENT_ME, (A),(B))
875 #define my_free_lock(A) my_free((A))
876 #endif
877 #define alloc_root_inited(A) ((A)->min_malloc != 0)
878 #define ALLOC_ROOT_MIN_BLOCK_SIZE (MALLOC_OVERHEAD + sizeof(USED_MEM) + 8)
879 #define clear_alloc_root(A) do { (A)->free= (A)->used= (A)->pre_alloc= 0; (A)->min_malloc=0;} while(0)
880 extern void init_alloc_root(PSI_memory_key key, MEM_ROOT *mem_root,
881 size_t block_size, size_t pre_alloc_size,
882 myf my_flags);
883 extern void *alloc_root(MEM_ROOT *mem_root, size_t Size);
884 extern void *multi_alloc_root(MEM_ROOT *mem_root, ...);
885 extern void free_root(MEM_ROOT *root, myf MyFLAGS);
886 extern void set_prealloc_root(MEM_ROOT *root, char *ptr);
887 extern void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size,
888 size_t prealloc_size);
889 extern char *strdup_root(MEM_ROOT *root,const char *str);
safe_strdup_root(MEM_ROOT * root,const char * str)890 static inline char *safe_strdup_root(MEM_ROOT *root, const char *str)
891 {
892 return str ? strdup_root(root, str) : 0;
893 }
894 extern char *strmake_root(MEM_ROOT *root,const char *str,size_t len);
895 extern void *memdup_root(MEM_ROOT *root,const void *str, size_t len);
896 extern LEX_CSTRING safe_lexcstrdup_root(MEM_ROOT *root, const LEX_CSTRING str);
897 extern my_bool my_compress(uchar *, size_t *, size_t *);
898 extern my_bool my_uncompress(uchar *, size_t , size_t *);
899 extern uchar *my_compress_alloc(const uchar *packet, size_t *len,
900 size_t *complen);
901 extern void *my_az_allocator(void *dummy, unsigned int items, unsigned int size);
902 extern void my_az_free(void *dummy, void *address);
903 extern int my_compress_buffer(uchar *dest, size_t *destLen,
904 const uchar *source, size_t sourceLen);
905 extern int packfrm(const uchar *, size_t, uchar **, size_t *);
906 extern int unpackfrm(uchar **, size_t *, const uchar *);
907
908 extern uint32 my_checksum(uint32, const void *, size_t);
909 extern uint32 my_crc32c(uint32, const void *, size_t);
910
911 extern const char *my_crc32c_implementation();
912
913 #ifdef DBUG_ASSERT_EXISTS
914 extern void my_debug_put_break_here(void);
915 #else
916 #define my_debug_put_break_here() do {} while(0)
917 #endif
918
919 extern void my_sleep(ulong m_seconds);
920 extern uint my_set_max_open_files(uint files);
921 void my_free_open_file_info(void);
922
923 extern my_bool my_gethwaddr(uchar *to);
924 extern int my_getncpus(void);
925
926 #define HRTIME_RESOLUTION 1000000ULL /* microseconds */
927 typedef struct {ulonglong val;} my_hrtime_t;
928 void my_time_init(void);
929 extern my_hrtime_t my_hrtime(void);
930
931 #ifdef _WIN32
932 extern my_hrtime_t my_hrtime_coarse();
933 #else
934 #define my_hrtime_coarse() my_hrtime()
935 #endif
936
937 extern ulonglong my_interval_timer(void);
938 extern ulonglong my_getcputime(void);
939
940 #define microsecond_interval_timer() (my_interval_timer()/1000)
941 #define hrtime_to_time(X) ((time_t)((X).val/HRTIME_RESOLUTION))
942 #define hrtime_from_time(X) ((ulonglong)((X)*HRTIME_RESOLUTION))
943 #define hrtime_to_double(X) ((X).val/(double)HRTIME_RESOLUTION)
944 #define hrtime_sec_part(X) ((ulong)((X).val % HRTIME_RESOLUTION))
945 #define my_time(X) hrtime_to_time(my_hrtime_coarse())
946
947 #if STACK_DIRECTION < 0
948 #define available_stack_size(CUR,END) (long) ((char*)(CUR) - (char*)(END))
949 #else
950 #define available_stack_size(CUR,END) (long) ((char*)(END) - (char*)(CUR))
951 #endif
952
953 #ifndef MAP_SYNC
954 #define MAP_SYNC 0x80000
955 #endif
956 #ifndef MAP_SHARED_VALIDATE
957 #define MAP_SHARED_VALIDATE 0x03
958 #endif
959
960 #ifdef HAVE_SYS_MMAN_H
961 #ifndef MAP_NOSYNC
962 #define MAP_NOSYNC 0
963 #endif
964 #ifndef MAP_NORESERVE
965 #define MAP_NORESERVE 0 /* For irix and AIX */
966 #endif
967
968 #ifdef HAVE_MMAP64
969 #define my_mmap(a,b,c,d,e,f) mmap64(a,b,c,d,e,f)
970 #else
971 #define my_mmap(a,b,c,d,e,f) mmap(a,b,c,d,e,f)
972 #endif
973 #define my_munmap(a,b) munmap((a),(b))
974
975 #else
976 /* not a complete set of mmap() flags, but only those that nesessary */
977 #define PROT_READ 1
978 #define PROT_WRITE 2
979 #define MAP_NORESERVE 0
980 #define MAP_SHARED 0x0001
981 #define MAP_PRIVATE 0x0002
982 #define MAP_NOSYNC 0x0800
983 #define MAP_FAILED ((void *)-1)
984 #define MS_SYNC 0x0000
985
986 #define HAVE_MMAP
987 void *my_mmap(void *, size_t, int, int, int, my_off_t);
988 int my_munmap(void *, size_t);
989 #endif
990
991 #ifdef _WIN32
992 extern FILE* my_win_popen(const char*, const char*);
993 extern int my_win_pclose(FILE*);
994 #define my_popen(A,B) my_win_popen(A,B)
995 #define my_pclose(A) my_win_pclose(A)
996 #else
997 #define my_popen(A,B) popen(A,B)
998 #define my_pclose(A) pclose(A)
999 #endif
1000
1001 /* my_getpagesize */
1002 #ifdef HAVE_GETPAGESIZE
1003 #define my_getpagesize() getpagesize()
1004 #else
1005 int my_getpagesize(void);
1006 #endif
1007
1008 int my_msync(int, void *, size_t, int);
1009
1010 #define MY_UUID_SIZE 16
1011 #define MY_UUID_STRING_LENGTH (8+1+4+1+4+1+4+1+12)
1012
1013 void my_uuid_init(ulong seed1, ulong seed2);
1014 void my_uuid(uchar *guid);
1015 void my_uuid2str(const uchar *guid, char *s);
1016 void my_uuid_end(void);
1017
1018 const char *my_dlerror(const char *dlpath);
1019
1020 /* character sets */
1021 extern void my_charset_loader_init_mysys(MY_CHARSET_LOADER *loader);
1022 extern uint get_charset_number(const char *cs_name, uint cs_flags);
1023 extern uint get_collation_number(const char *name);
1024 extern const char *get_charset_name(uint cs_number);
1025
1026 extern CHARSET_INFO *get_charset(uint cs_number, myf flags);
1027 extern CHARSET_INFO *get_charset_by_name(const char *cs_name, myf flags);
1028 extern CHARSET_INFO *my_collation_get_by_name(MY_CHARSET_LOADER *loader,
1029 const char *name, myf flags);
1030 extern CHARSET_INFO *get_charset_by_csname(const char *cs_name,
1031 uint cs_flags, myf my_flags);
1032 extern CHARSET_INFO *my_charset_get_by_name(MY_CHARSET_LOADER *loader,
1033 const char *name,
1034 uint cs_flags, myf my_flags);
1035 extern my_bool resolve_charset(const char *cs_name,
1036 CHARSET_INFO *default_cs,
1037 CHARSET_INFO **cs);
1038 extern my_bool resolve_collation(const char *cl_name,
1039 CHARSET_INFO *default_cl,
1040 CHARSET_INFO **cl);
1041 extern void free_charsets(void);
1042 extern char *get_charsets_dir(char *buf);
my_charset_same(CHARSET_INFO * cs1,CHARSET_INFO * cs2)1043 static inline my_bool my_charset_same(CHARSET_INFO *cs1, CHARSET_INFO *cs2)
1044 {
1045 return (cs1->csname == cs2->csname);
1046 }
1047 extern my_bool init_compiled_charsets(myf flags);
1048 extern void add_compiled_collation(struct charset_info_st *cs);
1049 extern void add_compiled_extra_collation(struct charset_info_st *cs);
1050 extern size_t escape_string_for_mysql(CHARSET_INFO *charset_info,
1051 char *to, size_t to_length,
1052 const char *from, size_t length);
1053 extern char *get_tty_password(const char *opt_message);
1054 #ifdef _WIN32
1055 #define BACKSLASH_MBTAIL
1056 /* File system character set */
1057 extern CHARSET_INFO *fs_character_set(void);
1058 #endif
1059 extern const char *my_default_csname(void);
1060 extern size_t escape_quotes_for_mysql(CHARSET_INFO *charset_info,
1061 char *to, size_t to_length,
1062 const char *from, size_t length);
1063
1064 extern void thd_increment_bytes_sent(void *thd, size_t length);
1065 extern void thd_increment_bytes_received(void *thd, size_t length);
1066 extern void thd_increment_net_big_packet_count(void *thd, size_t length);
1067
1068 #ifdef _WIN32
1069
1070 /* implemented in my_conio.c */
1071 char* my_cgets(char *string, size_t clen, size_t* plen);
1072
1073 #endif
1074
1075 #include <mysql/psi/psi.h>
1076
1077 #ifdef HAVE_PSI_INTERFACE
1078 extern MYSQL_PLUGIN_IMPORT struct PSI_bootstrap *PSI_hook;
1079 extern void set_psi_server(PSI *psi);
1080 void my_init_mysys_psi_keys(void);
1081 #endif
1082
1083 struct st_mysql_file;
1084 extern struct st_mysql_file *mysql_stdin;
1085 C_MODE_END
1086 #endif /* _my_sys_h */
1087