mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
f252f9248a
The following type conversions was done: - Changed byte to uchar - Changed gptr to uchar* - Change my_string to char * - Change my_size_t to size_t - Change size_s to size_t Removed declaration of byte, gptr, my_string, my_size_t and size_s. Following function parameter changes was done: - All string functions in mysys/strings was changed to use size_t instead of uint for string lengths. - All read()/write() functions changed to use size_t (including vio). - All protocoll functions changed to use size_t instead of uint - Functions that used a pointer to a string length was changed to use size_t* - Changed malloc(), free() and related functions from using gptr to use void * as this requires fewer casts in the code and is more in line with how the standard functions work. - Added extra length argument to dirname_part() to return the length of the created string. - Changed (at least) following functions to take uchar* as argument: - db_dump() - my_net_write() - net_write_command() - net_store_data() - DBUG_DUMP() - decimal2bin() & bin2decimal() - Changed my_compress() and my_uncompress() to use size_t. Changed one argument to my_uncompress() from a pointer to a value as we only return one value (makes function easier to use). - Changed type of 'pack_data' argument to packfrm() to avoid casts. - Changed in readfrm() and writefrom(), ha_discover and handler::discover() the type for argument 'frmdata' to uchar** to avoid casts. - Changed most Field functions to use uchar* instead of char* (reduced a lot of casts). - Changed field->val_xxx(xxx, new_ptr) to take const pointers. Other changes: - Removed a lot of not needed casts - Added a few new cast required by other changes - Added some cast to my_multi_malloc() arguments for safety (as string lengths needs to be uint, not size_t). - Fixed all calls to hash-get-key functions to use size_t*. (Needed to be done explicitely as this conflict was often hided by casting the function to hash_get_key). - Changed some buffers to memory regions to uchar* to avoid casts. - Changed some string lengths from uint to size_t. - Changed field->ptr to be uchar* instead of char*. This allowed us to get rid of a lot of casts. - Some changes from true -> TRUE, false -> FALSE, unsigned char -> uchar - Include zlib.h in some files as we needed declaration of crc32() - Changed MY_FILE_ERROR to be (size_t) -1. - Changed many variables to hold the result of my_read() / my_write() to be size_t. This was needed to properly detect errors (which are returned as (size_t) -1). - Removed some very old VMS code - Changed packfrm()/unpackfrm() to not be depending on uint size (portability fix) - Removed windows specific code to restore cursor position as this causes slowdown on windows and we should not mix read() and pread() calls anyway as this is not thread safe. Updated function comment to reflect this. Changed function that depended on original behavior of my_pwrite() to itself restore the cursor position (one such case). - Added some missing checking of return value of malloc(). - Changed definition of MOD_PAD_CHAR_TO_FULL_LENGTH to avoid 'long' overflow. - Changed type of table_def::m_size from my_size_t to ulong to reflect that m_size is the number of elements in the array, not a string/memory length. - Moved THD::max_row_length() to table.cc (as it's not depending on THD). Inlined max_row_length_blob() into this function. - More function comments - Fixed some compiler warnings when compiled without partitions. - Removed setting of LEX_STRING() arguments in declaration (portability fix). - Some trivial indentation/variable name changes. - Some trivial code simplifications: - Replaced some calls to alloc_root + memcpy to use strmake_root()/strdup_root(). - Changed some calls from memdup() to strmake() (Safety fix) - Simpler loops in client-simple.c BitKeeper/etc/ignore: added libmysqld/ha_ndbcluster_cond.cc --- added debian/defs.mk debian/control client/completion_hash.cc: Remove not needed casts client/my_readline.h: Remove some old types client/mysql.cc: Simplify types client/mysql_upgrade.c: Remove some old types Update call to dirname_part client/mysqladmin.cc: Remove some old types client/mysqlbinlog.cc: Remove some old types Change some buffers to be uchar to avoid casts client/mysqlcheck.c: Remove some old types client/mysqldump.c: Remove some old types Remove some not needed casts Change some string lengths to size_t client/mysqlimport.c: Remove some old types client/mysqlshow.c: Remove some old types client/mysqlslap.c: Remove some old types Remove some not needed casts client/mysqltest.c: Removed some old types Removed some not needed casts Updated hash-get-key function arguments Updated parameters to dirname_part() client/readline.cc: Removed some old types Removed some not needed casts Changed some string lengths to use size_t client/sql_string.cc: Removed some old types dbug/dbug.c: Removed some old types Changed some string lengths to use size_t Changed some prototypes to avoid casts extra/comp_err.c: Removed some old types extra/innochecksum.c: Removed some old types extra/my_print_defaults.c: Removed some old types extra/mysql_waitpid.c: Removed some old types extra/perror.c: Removed some old types extra/replace.c: Removed some old types Updated parameters to dirname_part() extra/resolve_stack_dump.c: Removed some old types extra/resolveip.c: Removed some old types include/config-win.h: Removed some old types include/decimal.h: Changed binary strings to be uchar* instead of char* include/ft_global.h: Removed some old types include/hash.h: Removed some old types include/heap.h: Removed some old types Changed records_under_level to be 'ulong' instead of 'uint' to clarify usage of variable include/keycache.h: Removed some old types include/m_ctype.h: Removed some old types Changed some string lengths to use size_t Changed character length functions to return uint unsigned char -> uchar include/m_string.h: Removed some old types Changed some string lengths to use size_t include/my_alloc.h: Changed some string lengths to use size_t include/my_base.h: Removed some old types include/my_dbug.h: Removed some old types Changed some string lengths to use size_t Changed db_dump() to take uchar * as argument for memory to reduce number of casts in usage include/my_getopt.h: Removed some old types include/my_global.h: Removed old types: my_size_t -> size_t byte -> uchar gptr -> uchar * include/my_list.h: Removed some old types include/my_nosys.h: Removed some old types include/my_pthread.h: Removed some old types include/my_sys.h: Removed some old types Changed MY_FILE_ERROR to be in line with new definitions of my_write()/my_read() Changed some string lengths to use size_t my_malloc() / my_free() now uses void * Updated parameters to dirname_part() & my_uncompress() include/my_tree.h: Removed some old types include/my_trie.h: Removed some old types include/my_user.h: Changed some string lengths to use size_t include/my_vle.h: Removed some old types include/my_xml.h: Removed some old types Changed some string lengths to use size_t include/myisam.h: Removed some old types include/myisammrg.h: Removed some old types include/mysql.h: Removed some old types Changed byte streams to use uchar* instead of char* include/mysql_com.h: Removed some old types Changed some string lengths to use size_t Changed some buffers to be uchar* to avoid casts include/queues.h: Removed some old types include/sql_common.h: Removed some old types include/sslopt-longopts.h: Removed some old types include/violite.h: Removed some old types Changed some string lengths to use size_t libmysql/client_settings.h: Removed some old types libmysql/libmysql.c: Removed some old types libmysql/manager.c: Removed some old types libmysqld/emb_qcache.cc: Removed some old types libmysqld/emb_qcache.h: Removed some old types libmysqld/lib_sql.cc: Removed some old types Removed some not needed casts Changed some buffers to be uchar* to avoid casts true -> TRUE, false -> FALSE mysys/array.c: Removed some old types mysys/charset.c: Changed some string lengths to use size_t mysys/checksum.c: Include zlib to get definition for crc32 Removed some old types mysys/default.c: Removed some old types Changed some string lengths to use size_t mysys/default_modify.c: Changed some string lengths to use size_t Removed some not needed casts mysys/hash.c: Removed some old types Changed some string lengths to use size_t Note: Prototype of hash_key() has changed which may cause problems if client uses hash_init() with a cast for the hash-get-key function. hash_element now takes 'ulong' as the index type (cleanup) mysys/list.c: Removed some old types mysys/mf_cache.c: Changed some string lengths to use size_t mysys/mf_dirname.c: Removed some old types Changed some string lengths to use size_t Added argument to dirname_part() to avoid calculation of length for 'to' mysys/mf_fn_ext.c: Removed some old types Updated parameters to dirname_part() mysys/mf_format.c: Removed some old types Changed some string lengths to use size_t mysys/mf_getdate.c: Removed some old types mysys/mf_iocache.c: Removed some old types Changed some string lengths to use size_t Changed calculation of 'max_length' to be done the same way in all functions mysys/mf_iocache2.c: Removed some old types Changed some string lengths to use size_t Clean up comments Removed not needed indentation mysys/mf_keycache.c: Removed some old types mysys/mf_keycaches.c: Removed some old types mysys/mf_loadpath.c: Removed some old types mysys/mf_pack.c: Removed some old types Changed some string lengths to use size_t Removed some not needed casts Removed very old VMS code Updated parameters to dirname_part() Use result of dirnam_part() to remove call to strcat() mysys/mf_path.c: Removed some old types mysys/mf_radix.c: Removed some old types mysys/mf_same.c: Removed some old types mysys/mf_sort.c: Removed some old types mysys/mf_soundex.c: Removed some old types mysys/mf_strip.c: Removed some old types mysys/mf_tempdir.c: Removed some old types mysys/mf_unixpath.c: Removed some old types mysys/mf_wfile.c: Removed some old types mysys/mulalloc.c: Removed some old types mysys/my_alloc.c: Removed some old types Changed some string lengths to use size_t Use void* as type for allocated memory area Removed some not needed casts Changed argument 'Size' to 'length' according coding guidelines mysys/my_chsize.c: Changed some buffers to be uchar* to avoid casts mysys/my_compress.c: More comments Removed some old types Changed string lengths to use size_t Changed arguments to my_uncompress() to make them easier to understand Changed packfrm()/unpackfrm() to not be depending on uint size (portability fix) Changed type of 'pack_data' argument to packfrm() to avoid casts. mysys/my_conio.c: Changed some string lengths to use size_t mysys/my_create.c: Removed some old types mysys/my_div.c: Removed some old types mysys/my_error.c: Removed some old types mysys/my_fopen.c: Removed some old types mysys/my_fstream.c: Removed some old types Changed some string lengths to use size_t writen -> written mysys/my_getopt.c: Removed some old types mysys/my_getwd.c: Removed some old types More comments mysys/my_init.c: Removed some old types mysys/my_largepage.c: Removed some old types Changed some string lengths to use size_t mysys/my_lib.c: Removed some old types mysys/my_lockmem.c: Removed some old types mysys/my_malloc.c: Removed some old types Changed malloc(), free() and related functions to use void * Changed all functions to use size_t mysys/my_memmem.c: Indentation cleanup mysys/my_once.c: Removed some old types Changed malloc(), free() and related functions to use void * mysys/my_open.c: Removed some old types mysys/my_pread.c: Removed some old types Changed all functions to use size_t Added comment for how my_pread() / my_pwrite() are supposed to work. Removed windows specific code to restore cursor position as this causes slowdown on windows and we should not mix read() and pread() calls anyway as this is not thread safe. (If we ever would really need this, it should be enabled only with a flag argument) mysys/my_quick.c: Removed some old types Changed all functions to use size_t mysys/my_read.c: Removed some old types Changed all functions to use size_t mysys/my_realloc.c: Removed some old types Use void* as type for allocated memory area Changed all functions to use size_t mysys/my_static.c: Removed some old types mysys/my_static.h: Removed some old types mysys/my_vle.c: Removed some old types mysys/my_wincond.c: Removed some old types mysys/my_windac.c: Removed some old types mysys/my_write.c: Removed some old types Changed all functions to use size_t mysys/ptr_cmp.c: Removed some old types Changed all functions to use size_t mysys/queues.c: Removed some old types mysys/safemalloc.c: Removed some old types Changed malloc(), free() and related functions to use void * Changed all functions to use size_t mysys/string.c: Removed some old types Changed all functions to use size_t mysys/testhash.c: Removed some old types mysys/thr_alarm.c: Removed some old types mysys/thr_lock.c: Removed some old types mysys/tree.c: Removed some old types mysys/trie.c: Removed some old types mysys/typelib.c: Removed some old types plugin/daemon_example/daemon_example.cc: Removed some old types regex/reginit.c: Removed some old types server-tools/instance-manager/buffer.cc: Changed some string lengths to use size_t Changed buffer to be of type uchar* server-tools/instance-manager/buffer.h: Changed some string lengths to use size_t Changed buffer to be of type uchar* server-tools/instance-manager/commands.cc: Removed some old types Changed some string lengths to use size_t Changed buffer to be of type uchar* server-tools/instance-manager/instance_map.cc: Removed some old types Changed some string lengths to use size_t Changed buffer to be of type uchar* server-tools/instance-manager/instance_options.cc: Changed buffer to be of type uchar* Replaced alloc_root + strcpy() with strdup_root() server-tools/instance-manager/mysql_connection.cc: Changed buffer to be of type uchar* server-tools/instance-manager/options.cc: Removed some old types server-tools/instance-manager/parse.cc: Changed some string lengths to use size_t server-tools/instance-manager/parse.h: Removed some old types Changed some string lengths to use size_t server-tools/instance-manager/protocol.cc: Changed some buffers to be uchar* to avoid casts Changed some string lengths to use size_t server-tools/instance-manager/protocol.h: Changed some string lengths to use size_t server-tools/instance-manager/user_map.cc: Removed some old types Changed some string lengths to use size_t sql/derror.cc: Removed some old types Changed some buffers to be uchar* to avoid casts Changed some string lengths to use size_t sql/discover.cc: Changed in readfrm() and writefrom() the type for argument 'frmdata' to uchar** to avoid casts Changed some string lengths to use size_t Changed some buffers to be uchar* to avoid casts sql/event_data_objects.cc: Removed some old types Added missing casts for alloc() and sprintf() sql/event_db_repository.cc: Changed some buffers to be uchar* to avoid casts Added missing casts for sprintf() sql/event_queue.cc: Removed some old types sql/field.cc: Removed some old types Changed memory buffers to be uchar* Changed some string lengths to use size_t Removed a lot of casts Safety fix in Field_blob::val_decimal() to not access zero pointer sql/field.h: Removed some old types Changed memory buffers to be uchar* (except of store() as this would have caused too many other changes). Changed some string lengths to use size_t Removed some not needed casts Changed val_xxx(xxx, new_ptr) to take const pointers sql/field_conv.cc: Removed some old types Added casts required because memory area pointers are now uchar* sql/filesort.cc: Initalize variable that was used unitialized in error conditions sql/gen_lex_hash.cc: Removed some old types Changed memory buffers to be uchar* Changed some string lengths to use size_t Removed a lot of casts Safety fix in Field_blob::val_decimal() to not access zero pointer sql/gstream.h: Added required cast sql/ha_ndbcluster.cc: Removed some old types Updated hash-get-key function arguments Changed some buffers to be uchar* to avoid casts Added required casts Removed some not needed casts sql/ha_ndbcluster.h: Removed some old types sql/ha_ndbcluster_binlog.cc: Removed some old types Changed some buffers to be uchar* to avoid casts Replaced sql_alloc() + memcpy() + set end 0 with sql_strmake() Changed some string lengths to use size_t Added missing casts for alloc() and sprintf() sql/ha_ndbcluster_binlog.h: Removed some old types sql/ha_ndbcluster_cond.cc: Removed some old types Removed some not needed casts sql/ha_ndbcluster_cond.h: Removed some old types sql/ha_partition.cc: Removed some old types Changed prototype for change_partition() to avoid casts sql/ha_partition.h: Removed some old types sql/handler.cc: Removed some old types Changed some string lengths to use size_t sql/handler.h: Removed some old types Changed some string lengths to use size_t Changed type for 'frmblob' parameter for discover() and ha_discover() to get fewer casts sql/hash_filo.h: Removed some old types Changed all functions to use size_t sql/hostname.cc: Removed some old types sql/item.cc: Removed some old types Changed some string lengths to use size_t Use strmake() instead of memdup() to create a null terminated string. Updated calls to new Field() sql/item.h: Removed some old types Changed malloc(), free() and related functions to use void * Changed some buffers to be uchar* to avoid casts sql/item_cmpfunc.cc: Removed some old types Changed some buffers to be uchar* to avoid casts sql/item_cmpfunc.h: Removed some old types sql/item_create.cc: Removed some old types sql/item_func.cc: Removed some old types Changed some buffers to be uchar* to avoid casts Removed some not needed casts Added test for failing alloc() in init_result_field() Remove old confusing comment Fixed compiler warning sql/item_func.h: Removed some old types sql/item_row.cc: Removed some old types sql/item_row.h: Removed some old types sql/item_strfunc.cc: Include zlib (needed becasue we call crc32) Removed some old types sql/item_strfunc.h: Removed some old types Changed some types to match new function prototypes sql/item_subselect.cc: Removed some old types sql/item_subselect.h: Removed some old types sql/item_sum.cc: Removed some old types Changed some buffers to be uchar* to avoid casts Removed some not needed casts sql/item_sum.h: Removed some old types sql/item_timefunc.cc: Removed some old types Changed some string lengths to use size_t sql/item_timefunc.h: Removed some old types sql/item_xmlfunc.cc: Changed some string lengths to use size_t sql/item_xmlfunc.h: Removed some old types sql/key.cc: Removed some old types Removed some not needed casts sql/lock.cc: Removed some old types Added some cast to my_multi_malloc() arguments for safety sql/log.cc: Removed some old types Changed some string lengths to use size_t Changed some buffers to be uchar* to avoid casts Changed usage of pwrite() to not assume it holds the cursor position for the file Made usage of my_read() safer sql/log_event.cc: Removed some old types Added checking of return value of malloc() in pack_info() Changed some buffers to be uchar* to avoid casts Removed some 'const' to avoid casts Added missing casts for alloc() and sprintf() Added required casts Removed some not needed casts Added some cast to my_multi_malloc() arguments for safety sql/log_event.h: Removed some old types Changed some buffers to be uchar* to avoid casts sql/log_event_old.cc: Changed some buffers to be uchar* to avoid casts Removed some not needed casts sql/log_event_old.h: Changed some buffers to be uchar* to avoid casts sql/mf_iocache.cc: Removed some old types sql/my_decimal.cc: Changed memory area to use uchar* sql/my_decimal.h: Changed memory area to use uchar* sql/mysql_priv.h: Removed some old types Changed malloc(), free() and related functions to use void * Changed some string lengths to use size_t Changed definition of MOD_PAD_CHAR_TO_FULL_LENGTH to avoid long overflow Changed some buffers to be uchar* to avoid casts sql/mysqld.cc: Removed some old types sql/net_serv.cc: Removed some old types Changed some string lengths to use size_t Changed some buffers to be uchar* to avoid casts Ensure that vio_read()/vio_write() return values are stored in a size_t variable Removed some not needed casts sql/opt_range.cc: Removed some old types Changed some buffers to be uchar* to avoid casts Removed some not needed casts sql/opt_range.h: Removed some old types Changed some buffers to be uchar* to avoid casts sql/opt_sum.cc: Removed some old types Removed some not needed casts sql/parse_file.cc: Removed some old types Changed some string lengths to use size_t Changed alloc_root + memcpy + set end 0 -> strmake_root() sql/parse_file.h: Removed some old types sql/partition_info.cc: Removed some old types Added missing casts for alloc() Changed some buffers to be uchar* to avoid casts sql/partition_info.h: Changed some buffers to be uchar* to avoid casts sql/protocol.cc: Removed some old types Changed some buffers to be uchar* to avoid casts Removed some not needed casts sql/protocol.h: Removed some old types Changed some buffers to be uchar* to avoid casts Changed some string lengths to use size_t sql/records.cc: Removed some old types sql/repl_failsafe.cc: Removed some old types Changed some string lengths to use size_t Added required casts sql/rpl_filter.cc: Removed some old types Updated hash-get-key function arguments Changed some string lengths to use size_t sql/rpl_filter.h: Changed some string lengths to use size_t sql/rpl_injector.h: Removed some old types sql/rpl_record.cc: Removed some old types Removed some not needed casts Changed some buffers to be uchar* to avoid casts sql/rpl_record.h: Removed some old types Changed some buffers to be uchar* to avoid casts sql/rpl_record_old.cc: Removed some old types Changed some buffers to be uchar* to avoid casts Removed some not needed casts sql/rpl_record_old.h: Removed some old types Changed some buffers to be uchar* to avoid cast sql/rpl_rli.cc: Removed some old types sql/rpl_tblmap.cc: Removed some old types sql/rpl_tblmap.h: Removed some old types sql/rpl_utility.cc: Removed some old types sql/rpl_utility.h: Removed some old types Changed type of m_size from my_size_t to ulong to reflect that m_size is the number of elements in the array, not a string/memory length sql/set_var.cc: Removed some old types Updated parameters to dirname_part() sql/set_var.h: Removed some old types sql/slave.cc: Removed some old types Changed some string lengths to use size_t sql/slave.h: Removed some old types sql/sp.cc: Removed some old types Added missing casts for printf() sql/sp.h: Removed some old types Updated hash-get-key function arguments sql/sp_cache.cc: Removed some old types Added missing casts for printf() Updated hash-get-key function arguments sql/sp_head.cc: Removed some old types Added missing casts for alloc() and printf() Added required casts Updated hash-get-key function arguments sql/sp_head.h: Removed some old types sql/sp_pcontext.cc: Removed some old types sql/sp_pcontext.h: Removed some old types sql/sql_acl.cc: Removed some old types Changed some string lengths to use size_t Changed some buffers to be uchar* to avoid casts Removed some not needed casts Added required casts sql/sql_analyse.cc: Changed some buffers to be uchar* to avoid casts sql/sql_analyse.h: Changed some buffers to be uchar* to avoid casts sql/sql_array.h: Removed some old types sql/sql_base.cc: Removed some old types Updated hash-get-key function arguments sql/sql_binlog.cc: Removed some old types Added missing casts for printf() sql/sql_cache.cc: Removed some old types Updated hash-get-key function arguments Removed some not needed casts Changed some string lengths to use size_t sql/sql_cache.h: Removed some old types Removed reference to not existing function cache_key() Updated hash-get-key function arguments sql/sql_class.cc: Removed some old types Updated hash-get-key function arguments Added missing casts for alloc() Updated hash-get-key function arguments Moved THD::max_row_length() to table.cc (as it's not depending on THD) Removed some not needed casts sql/sql_class.h: Removed some old types Changed malloc(), free() and related functions to use void * Removed some not needed casts Changed some string lengths to use size_t Moved max_row_length and max_row_length_blob() to table.cc, as they are not depending on THD sql/sql_connect.cc: Removed some old types Added required casts sql/sql_db.cc: Removed some old types Removed some not needed casts Added some cast to my_multi_malloc() arguments for safety Added missing casts for alloc() sql/sql_delete.cc: Removed some old types sql/sql_handler.cc: Removed some old types Updated hash-get-key function arguments Added some cast to my_multi_malloc() arguments for safety sql/sql_help.cc: Removed some old types Changed some buffers to be uchar* to avoid casts Removed some not needed casts sql/sql_insert.cc: Removed some old types Added missing casts for alloc() and printf() sql/sql_lex.cc: Removed some old types sql/sql_lex.h: Removed some old types Removed some not needed casts sql/sql_list.h: Removed some old types Removed some not needed casts sql/sql_load.cc: Removed some old types Removed compiler warning sql/sql_manager.cc: Removed some old types sql/sql_map.cc: Removed some old types sql/sql_map.h: Removed some old types sql/sql_olap.cc: Removed some old types sql/sql_parse.cc: Removed some old types Trivial move of code lines to make things more readable Changed some string lengths to use size_t Added missing casts for alloc() sql/sql_partition.cc: Removed some old types Removed compiler warnings about not used functions Changed some buffers to be uchar* to avoid casts Removed some not needed casts sql/sql_partition.h: Removed some old types Changed some buffers to be uchar* to avoid casts sql/sql_plugin.cc: Removed some old types Added missing casts for alloc() Updated hash-get-key function arguments sql/sql_prepare.cc: Removed some old types Changed some buffers to be uchar* to avoid casts Added missing casts for alloc() and printf() sql-common/client.c: Removed some old types Changed some memory areas to use uchar* sql-common/my_user.c: Changed some string lengths to use size_t sql-common/pack.c: Changed some buffers to be uchar* to avoid casts sql/sql_repl.cc: Added required casts Changed some buffers to be uchar* to avoid casts Changed some string lengths to use size_t sql/sql_select.cc: Removed some old types Changed some buffers to be uchar* to avoid casts Removed some old types sql/sql_select.h: Removed some old types Changed some buffers to be uchar* to avoid casts sql/sql_servers.cc: Removed some old types Updated hash-get-key function arguments sql/sql_show.cc: Removed some old types Added missing casts for alloc() Removed some not needed casts sql/sql_string.cc: Removed some old types Added required casts sql/sql_table.cc: Removed some old types Removed compiler warning about not used variable Changed some buffers to be uchar* to avoid casts Removed some not needed casts sql/sql_test.cc: Removed some old types sql/sql_trigger.cc: Removed some old types Added missing casts for alloc() sql/sql_udf.cc: Removed some old types Updated hash-get-key function arguments sql/sql_union.cc: Removed some old types sql/sql_update.cc: Removed some old types Removed some not needed casts sql/sql_view.cc: Removed some old types sql/sql_yacc.yy: Removed some old types Changed some string lengths to use size_t Added missing casts for alloc() sql/stacktrace.c: Removed some old types sql/stacktrace.h: Removed some old types sql/structs.h: Removed some old types sql/table.cc: Removed some old types Updated hash-get-key function arguments Changed some buffers to be uchar* to avoid casts Removed setting of LEX_STRING() arguments in declaration Added required casts More function comments Moved max_row_length() here from sql_class.cc/sql_class.h sql/table.h: Removed some old types Changed some string lengths to use size_t sql/thr_malloc.cc: Use void* as type for allocated memory area Changed all functions to use size_t sql/tzfile.h: Changed some buffers to be uchar* to avoid casts sql/tztime.cc: Changed some buffers to be uchar* to avoid casts Updated hash-get-key function arguments Added missing casts for alloc() Removed some not needed casts sql/uniques.cc: Removed some old types Removed some not needed casts sql/unireg.cc: Removed some old types Changed some buffers to be uchar* to avoid casts Removed some not needed casts Added missing casts for alloc() storage/archive/archive_reader.c: Removed some old types storage/archive/azio.c: Removed some old types Removed some not needed casts storage/archive/ha_archive.cc: Removed some old types Changed type for 'frmblob' in archive_discover() to match handler Updated hash-get-key function arguments Removed some not needed casts storage/archive/ha_archive.h: Removed some old types storage/blackhole/ha_blackhole.cc: Removed some old types storage/blackhole/ha_blackhole.h: Removed some old types storage/csv/ha_tina.cc: Removed some old types Updated hash-get-key function arguments Changed some buffers to be uchar* to avoid casts storage/csv/ha_tina.h: Removed some old types Removed some not needed casts storage/csv/transparent_file.cc: Removed some old types Changed type of 'bytes_read' to be able to detect read errors Fixed indentation storage/csv/transparent_file.h: Removed some old types storage/example/ha_example.cc: Removed some old types Updated hash-get-key function arguments storage/example/ha_example.h: Removed some old types storage/federated/ha_federated.cc: Removed some old types Updated hash-get-key function arguments Removed some not needed casts storage/federated/ha_federated.h: Removed some old types storage/heap/_check.c: Changed some buffers to be uchar* to avoid casts storage/heap/_rectest.c: Removed some old types storage/heap/ha_heap.cc: Removed some old types storage/heap/ha_heap.h: Removed some old types storage/heap/heapdef.h: Removed some old types storage/heap/hp_block.c: Removed some old types Changed some string lengths to use size_t storage/heap/hp_clear.c: Removed some old types storage/heap/hp_close.c: Removed some old types storage/heap/hp_create.c: Removed some old types storage/heap/hp_delete.c: Removed some old types storage/heap/hp_hash.c: Removed some old types storage/heap/hp_info.c: Removed some old types storage/heap/hp_open.c: Removed some old types storage/heap/hp_rfirst.c: Removed some old types storage/heap/hp_rkey.c: Removed some old types storage/heap/hp_rlast.c: Removed some old types storage/heap/hp_rnext.c: Removed some old types storage/heap/hp_rprev.c: Removed some old types storage/heap/hp_rrnd.c: Removed some old types storage/heap/hp_rsame.c: Removed some old types storage/heap/hp_scan.c: Removed some old types storage/heap/hp_test1.c: Removed some old types storage/heap/hp_test2.c: Removed some old types storage/heap/hp_update.c: Removed some old types storage/heap/hp_write.c: Removed some old types Changed some string lengths to use size_t storage/innobase/handler/ha_innodb.cc: Removed some old types Updated hash-get-key function arguments Added missing casts for alloc() and printf() Removed some not needed casts storage/innobase/handler/ha_innodb.h: Removed some old types storage/myisam/ft_boolean_search.c: Removed some old types storage/myisam/ft_nlq_search.c: Removed some old types storage/myisam/ft_parser.c: Removed some old types Changed some buffers to be uchar* to avoid casts storage/myisam/ft_static.c: Removed some old types storage/myisam/ft_stopwords.c: Removed some old types storage/myisam/ft_update.c: Removed some old types Changed some buffers to be uchar* to avoid casts storage/myisam/ftdefs.h: Removed some old types Changed some buffers to be uchar* to avoid casts storage/myisam/fulltext.h: Removed some old types storage/myisam/ha_myisam.cc: Removed some old types storage/myisam/ha_myisam.h: Removed some old types storage/myisam/mi_cache.c: Removed some old types Changed some buffers to be uchar* to avoid casts storage/myisam/mi_check.c: Removed some old types storage/myisam/mi_checksum.c: Removed some old types storage/myisam/mi_close.c: Removed some old types storage/myisam/mi_create.c: Removed some old types storage/myisam/mi_delete.c: Removed some old types storage/myisam/mi_delete_all.c: Removed some old types storage/myisam/mi_dynrec.c: Removed some old types storage/myisam/mi_extra.c: Removed some old types storage/myisam/mi_key.c: Removed some old types storage/myisam/mi_locking.c: Removed some old types storage/myisam/mi_log.c: Removed some old types storage/myisam/mi_open.c: Removed some old types Removed some not needed casts Check argument of my_write()/my_pwrite() in functions returning int Added casting of string lengths to size_t storage/myisam/mi_packrec.c: Removed some old types Changed some buffers to be uchar* to avoid casts storage/myisam/mi_page.c: Removed some old types storage/myisam/mi_preload.c: Removed some old types storage/myisam/mi_range.c: Removed some old types storage/myisam/mi_rfirst.c: Removed some old types storage/myisam/mi_rkey.c: Removed some old types storage/myisam/mi_rlast.c: Removed some old types storage/myisam/mi_rnext.c: Removed some old types storage/myisam/mi_rnext_same.c: Removed some old types storage/myisam/mi_rprev.c: Removed some old types storage/myisam/mi_rrnd.c: Removed some old types storage/myisam/mi_rsame.c: Removed some old types storage/myisam/mi_rsamepos.c: Removed some old types storage/myisam/mi_scan.c: Removed some old types storage/myisam/mi_search.c: Removed some old types storage/myisam/mi_static.c: Removed some old types storage/myisam/mi_statrec.c: Removed some old types storage/myisam/mi_test1.c: Removed some old types storage/myisam/mi_test2.c: Removed some old types storage/myisam/mi_test3.c: Removed some old types storage/myisam/mi_unique.c: Removed some old types storage/myisam/mi_update.c: Removed some old types storage/myisam/mi_write.c: Removed some old types storage/myisam/myisam_ftdump.c: Removed some old types storage/myisam/myisamchk.c: Removed some old types storage/myisam/myisamdef.h: Removed some old types storage/myisam/myisamlog.c: Removed some old types Indentation fix storage/myisam/myisampack.c: Removed some old types storage/myisam/rt_index.c: Removed some old types storage/myisam/rt_split.c: Removed some old types storage/myisam/sort.c: Removed some old types storage/myisam/sp_defs.h: Removed some old types storage/myisam/sp_key.c: Removed some old types storage/myisammrg/ha_myisammrg.cc: Removed some old types storage/myisammrg/ha_myisammrg.h: Removed some old types storage/myisammrg/myrg_close.c: Removed some old types storage/myisammrg/myrg_def.h: Removed some old types storage/myisammrg/myrg_delete.c: Removed some old types storage/myisammrg/myrg_open.c: Removed some old types Updated parameters to dirname_part() storage/myisammrg/myrg_queue.c: Removed some old types storage/myisammrg/myrg_rfirst.c: Removed some old types storage/myisammrg/myrg_rkey.c: Removed some old types storage/myisammrg/myrg_rlast.c: Removed some old types storage/myisammrg/myrg_rnext.c: Removed some old types storage/myisammrg/myrg_rnext_same.c: Removed some old types storage/myisammrg/myrg_rprev.c: Removed some old types storage/myisammrg/myrg_rrnd.c: Removed some old types storage/myisammrg/myrg_rsame.c: Removed some old types storage/myisammrg/myrg_update.c: Removed some old types storage/myisammrg/myrg_write.c: Removed some old types storage/ndb/include/util/ndb_opts.h: Removed some old types storage/ndb/src/cw/cpcd/main.cpp: Removed some old types storage/ndb/src/kernel/vm/Configuration.cpp: Removed some old types storage/ndb/src/mgmclient/main.cpp: Removed some old types storage/ndb/src/mgmsrv/InitConfigFileParser.cpp: Removed some old types Removed old disabled code storage/ndb/src/mgmsrv/main.cpp: Removed some old types storage/ndb/src/ndbapi/NdbBlob.cpp: Removed some old types storage/ndb/src/ndbapi/NdbOperationDefine.cpp: Removed not used variable storage/ndb/src/ndbapi/NdbOperationInt.cpp: Added required casts storage/ndb/src/ndbapi/NdbScanOperation.cpp: Added required casts storage/ndb/tools/delete_all.cpp: Removed some old types storage/ndb/tools/desc.cpp: Removed some old types storage/ndb/tools/drop_index.cpp: Removed some old types storage/ndb/tools/drop_tab.cpp: Removed some old types storage/ndb/tools/listTables.cpp: Removed some old types storage/ndb/tools/ndb_config.cpp: Removed some old types storage/ndb/tools/restore/consumer_restore.cpp: Changed some buffers to be uchar* to avoid casts with new defintion of packfrm() storage/ndb/tools/restore/restore_main.cpp: Removed some old types storage/ndb/tools/select_all.cpp: Removed some old types storage/ndb/tools/select_count.cpp: Removed some old types storage/ndb/tools/waiter.cpp: Removed some old types strings/bchange.c: Changed function to use uchar * and size_t strings/bcmp.c: Changed function to use uchar * and size_t strings/bmove512.c: Changed function to use uchar * and size_t strings/bmove_upp.c: Changed function to use uchar * and size_t strings/ctype-big5.c: Changed functions to use size_t Changed character length functions to return uint strings/ctype-bin.c: Changed functions to use size_t strings/ctype-cp932.c: Changed functions to use size_t Changed character length functions to return uint strings/ctype-czech.c: Fixed indentation Changed functions to use size_t strings/ctype-euc_kr.c: Changed functions to use size_t Changed character length functions to return uint strings/ctype-eucjpms.c: Changed functions to use size_t Changed character length functions to return uint unsigned char -> uchar strings/ctype-gb2312.c: Changed functions to use size_t Changed character length functions to return uint strings/ctype-gbk.c: Changed functions to use size_t Changed character length functions to return uint strings/ctype-latin1.c: Changed functions to use size_t Changed character length functions to return uint unsigned char -> uchar strings/ctype-mb.c: Changed functions to use size_t Changed character length functions to return uint strings/ctype-simple.c: Changed functions to use size_t Simpler loops for caseup/casedown unsigned int -> uint unsigned char -> uchar strings/ctype-sjis.c: Changed functions to use size_t Changed character length functions to return uint strings/ctype-tis620.c: Changed functions to use size_t Changed character length functions to return uint unsigned char -> uchar strings/ctype-uca.c: Changed functions to use size_t unsigned char -> uchar strings/ctype-ucs2.c: Moved inclusion of stdarg.h to other includes usigned char -> uchar Changed functions to use size_t Changed character length functions to return uint strings/ctype-ujis.c: Changed functions to use size_t Changed character length functions to return uint unsigned char -> uchar strings/ctype-utf8.c: Changed functions to use size_t unsigned char -> uchar Indentation fixes strings/ctype-win1250ch.c: Indentation fixes Changed functions to use size_t strings/ctype.c: Changed functions to use size_t strings/decimal.c: Changed type for memory argument to uchar * strings/do_ctype.c: Indentation fixes strings/my_strtoll10.c: unsigned char -> uchar strings/my_vsnprintf.c: Changed functions to use size_t strings/r_strinstr.c: Removed some old types Changed functions to use size_t strings/str_test.c: Removed some old types strings/strappend.c: Changed functions to use size_t strings/strcont.c: Removed some old types strings/strfill.c: Removed some old types strings/strinstr.c: Changed functions to use size_t strings/strlen.c: Changed functions to use size_t strings/strmake.c: Changed functions to use size_t strings/strnlen.c: Changed functions to use size_t strings/strnmov.c: Changed functions to use size_t strings/strto.c: unsigned char -> uchar strings/strtod.c: Changed functions to use size_t strings/strxnmov.c: Changed functions to use size_t strings/xml.c: Changed functions to use size_t Indentation fixes tests/mysql_client_test.c: Removed some old types tests/thread_test.c: Removed some old types vio/test-ssl.c: Removed some old types vio/test-sslclient.c: Removed some old types vio/test-sslserver.c: Removed some old types vio/vio.c: Removed some old types vio/vio_priv.h: Removed some old types Changed vio_read()/vio_write() to work with size_t vio/viosocket.c: Changed vio_read()/vio_write() to work with size_t Indentation fixes vio/viossl.c: Changed vio_read()/vio_write() to work with size_t Indentation fixes vio/viosslfactories.c: Removed some old types vio/viotest-ssl.c: Removed some old types win/README: More explanations
1352 lines
37 KiB
C++
1352 lines
37 KiB
C++
/* Copyright (C) 2000-2006 MySQL 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; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
/* maintaince of mysql databases */
|
|
|
|
#include "client_priv.h"
|
|
#include <signal.h>
|
|
#ifdef THREAD
|
|
#include <my_pthread.h> /* because of signal() */
|
|
#endif
|
|
#include <sys/stat.h>
|
|
#include <mysql.h>
|
|
|
|
#ifdef LATER_HAVE_NDBCLUSTER_DB
|
|
#include "../ndb/src/mgmclient/ndb_mgmclient.h"
|
|
#endif
|
|
|
|
#define ADMIN_VERSION "8.42"
|
|
#define MAX_MYSQL_VAR 256
|
|
#define SHUTDOWN_DEF_TIMEOUT 3600 /* Wait for shutdown */
|
|
#define MAX_TRUNC_LENGTH 3
|
|
|
|
char *host= NULL, *user= 0, *opt_password= 0,
|
|
*default_charset= NULL;
|
|
char truncated_var_names[MAX_MYSQL_VAR][MAX_TRUNC_LENGTH];
|
|
char ex_var_names[MAX_MYSQL_VAR][FN_REFLEN];
|
|
ulonglong last_values[MAX_MYSQL_VAR];
|
|
static int interval=0;
|
|
static my_bool option_force=0,interrupted=0,new_line=0,
|
|
opt_compress=0, opt_relative=0, opt_verbose=0, opt_vertical=0,
|
|
tty_password= 0, info_flag= 0, opt_nobeep;
|
|
static uint tcp_port = 0, option_wait = 0, option_silent=0, nr_iterations,
|
|
opt_count_iterations= 0;
|
|
static ulong opt_connect_timeout, opt_shutdown_timeout;
|
|
static char * unix_port=0;
|
|
#ifdef LATER_HAVE_NDBCLUSTER_DB
|
|
static my_bool opt_ndbcluster=0;
|
|
static char *opt_ndb_connectstring=0;
|
|
#endif
|
|
|
|
#ifdef HAVE_SMEM
|
|
static char *shared_memory_base_name=0;
|
|
#endif
|
|
static uint opt_protocol=0;
|
|
static myf error_flags; /* flags to pass to my_printf_error, like ME_BELL */
|
|
|
|
/*
|
|
When using extended-status relatively, ex_val_max_len is the estimated
|
|
maximum length for any relative value printed by extended-status. The
|
|
idea is to try to keep the length of output as short as possible.
|
|
*/
|
|
|
|
static uint ex_val_max_len[MAX_MYSQL_VAR];
|
|
static my_bool ex_status_printed = 0; /* First output is not relative. */
|
|
static uint ex_var_count, max_var_length, max_val_length;
|
|
|
|
#include <sslopt-vars.h>
|
|
|
|
static void print_version(void);
|
|
static void usage(void);
|
|
static my_bool sql_connect(MYSQL *mysql, uint wait);
|
|
static int execute_commands(MYSQL *mysql,int argc, char **argv);
|
|
static int drop_db(MYSQL *mysql,const char *db);
|
|
static sig_handler endprog(int signal_number);
|
|
static void nice_time(ulong sec,char *buff);
|
|
static void print_header(MYSQL_RES *result);
|
|
static void print_top(MYSQL_RES *result);
|
|
static void print_row(MYSQL_RES *result,MYSQL_ROW cur, uint row);
|
|
static void print_relative_row(MYSQL_RES *result, MYSQL_ROW cur, uint row);
|
|
static void print_relative_row_vert(MYSQL_RES *result, MYSQL_ROW cur, uint row);
|
|
static void print_relative_header();
|
|
static void print_relative_line();
|
|
static void truncate_names();
|
|
static my_bool get_pidfile(MYSQL *mysql, char *pidfile);
|
|
static my_bool wait_pidfile(char *pidfile, time_t last_modified,
|
|
struct stat *pidfile_status);
|
|
static void store_values(MYSQL_RES *result);
|
|
|
|
/*
|
|
The order of commands must be the same as command_names,
|
|
except ADMIN_ERROR
|
|
*/
|
|
enum commands {
|
|
ADMIN_ERROR,
|
|
ADMIN_CREATE, ADMIN_DROP, ADMIN_SHUTDOWN,
|
|
ADMIN_RELOAD, ADMIN_REFRESH, ADMIN_VER,
|
|
ADMIN_PROCESSLIST, ADMIN_STATUS, ADMIN_KILL,
|
|
ADMIN_DEBUG, ADMIN_VARIABLES, ADMIN_FLUSH_LOGS,
|
|
ADMIN_FLUSH_HOSTS, ADMIN_FLUSH_TABLES, ADMIN_PASSWORD,
|
|
ADMIN_PING, ADMIN_EXTENDED_STATUS, ADMIN_FLUSH_STATUS,
|
|
ADMIN_FLUSH_PRIVILEGES, ADMIN_START_SLAVE, ADMIN_STOP_SLAVE,
|
|
ADMIN_FLUSH_THREADS, ADMIN_OLD_PASSWORD
|
|
#ifdef LATER_HAVE_NDBCLUSTER_DB
|
|
,ADMIN_NDB_MGM
|
|
#endif
|
|
};
|
|
static const char *command_names[]= {
|
|
"create", "drop", "shutdown",
|
|
"reload", "refresh", "version",
|
|
"processlist", "status", "kill",
|
|
"debug", "variables", "flush-logs",
|
|
"flush-hosts", "flush-tables", "password",
|
|
"ping", "extended-status", "flush-status",
|
|
"flush-privileges", "start-slave", "stop-slave",
|
|
"flush-threads","old-password",
|
|
#ifdef LATER_HAVE_NDBCLUSTER_DB
|
|
"ndb-mgm",
|
|
#endif
|
|
NullS
|
|
};
|
|
|
|
static TYPELIB command_typelib=
|
|
{ array_elements(command_names)-1,"commands", command_names, NULL};
|
|
|
|
static struct my_option my_long_options[] =
|
|
{
|
|
#ifdef __NETWARE__
|
|
{"autoclose", OPT_AUTO_CLOSE, "Auto close the screen on exit for Netware.",
|
|
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
|
#endif
|
|
{"count", 'c',
|
|
"Number of iterations to make. This works with -i (--sleep) only.",
|
|
(uchar**) &nr_iterations, (uchar**) &nr_iterations, 0, GET_UINT,
|
|
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.",
|
|
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.", (uchar**) &info_flag,
|
|
(uchar**) &info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"force", 'f',
|
|
"Don't ask for confirmation on drop database; with multiple commands, continue even if an error occurs.",
|
|
(uchar**) &option_force, (uchar**) &option_force, 0, GET_BOOL, NO_ARG, 0, 0,
|
|
0, 0, 0, 0},
|
|
{"compress", 'C', "Use compression in server/client protocol.",
|
|
(uchar**) &opt_compress, (uchar**) &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
|
|
0, 0, 0},
|
|
{"character-sets-dir", OPT_CHARSETS_DIR,
|
|
"Directory where character sets are.", (uchar**) &charsets_dir,
|
|
(uchar**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"default-character-set", OPT_DEFAULT_CHARSET,
|
|
"Set the default character set.", (uchar**) &default_charset,
|
|
(uchar**) &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"help", '?', "Display this help and exit.", 0, 0, 0, GET_NO_ARG,
|
|
NO_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"host", 'h', "Connect to host.", (uchar**) &host, (uchar**) &host, 0, GET_STR,
|
|
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"no-beep", 'b', "Turn off beep on error.", (uchar**) &opt_nobeep,
|
|
(uchar**) &opt_nobeep, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"password", 'p',
|
|
"Password to use when connecting to server. If password is not given it's asked from the tty.",
|
|
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
|
#ifdef __WIN__
|
|
{"pipe", 'W', "Use named pipes to connect to server.", 0, 0, 0, GET_NO_ARG,
|
|
NO_ARG, 0, 0, 0, 0, 0, 0},
|
|
#endif
|
|
{"port", 'P', "Port number to use for connection.", (uchar**) &tcp_port,
|
|
(uchar**) &tcp_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol of connection (tcp,socket,pipe,memory).",
|
|
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"relative", 'r',
|
|
"Show difference between current and previous values when used with -i. Currently works only with extended-status.",
|
|
(uchar**) &opt_relative, (uchar**) &opt_relative, 0, GET_BOOL, NO_ARG, 0, 0, 0,
|
|
0, 0, 0},
|
|
{"set-variable", 'O',
|
|
"Change the value of a variable. Please note that this option is deprecated; you can set variables directly with --variable-name=value.",
|
|
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
|
#ifdef HAVE_SMEM
|
|
{"shared-memory-base-name", OPT_SHARED_MEMORY_BASE_NAME,
|
|
"Base name of shared memory.", (uchar**) &shared_memory_base_name, (uchar**) &shared_memory_base_name,
|
|
0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
|
#endif
|
|
{"silent", 's', "Silently exit if one can't connect to server.",
|
|
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"socket", 'S', "Socket file to use for connection.",
|
|
(uchar**) &unix_port, (uchar**) &unix_port, 0, GET_STR, REQUIRED_ARG, 0, 0, 0,
|
|
0, 0, 0},
|
|
{"sleep", 'i', "Execute commands again and again with a sleep between.",
|
|
(uchar**) &interval, (uchar**) &interval, 0, GET_INT, REQUIRED_ARG, 0, 0, 0, 0,
|
|
0, 0},
|
|
#include <sslopt-longopts.h>
|
|
#ifndef DONT_ALLOW_USER_CHANGE
|
|
{"user", 'u', "User for login if not current user.", (uchar**) &user,
|
|
(uchar**) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
|
#endif
|
|
{"verbose", 'v', "Write more information.", (uchar**) &opt_verbose,
|
|
(uchar**) &opt_verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG,
|
|
NO_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"vertical", 'E',
|
|
"Print output vertically. Is similar to --relative, but prints output vertically.",
|
|
(uchar**) &opt_vertical, (uchar**) &opt_vertical, 0, GET_BOOL, NO_ARG, 0, 0, 0,
|
|
0, 0, 0},
|
|
{"wait", 'w', "Wait and retry if connection is down.", 0, 0, 0, GET_UINT,
|
|
OPT_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"connect_timeout", OPT_CONNECT_TIMEOUT, "", (uchar**) &opt_connect_timeout,
|
|
(uchar**) &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, 3600*12, 0,
|
|
3600*12, 0, 1, 0},
|
|
{"shutdown_timeout", OPT_SHUTDOWN_TIMEOUT, "", (uchar**) &opt_shutdown_timeout,
|
|
(uchar**) &opt_shutdown_timeout, 0, GET_ULONG, REQUIRED_ARG,
|
|
SHUTDOWN_DEF_TIMEOUT, 0, 3600*12, 0, 1, 0},
|
|
#ifdef LATER_HAVE_NDBCLUSTER_DB
|
|
{"ndbcluster", OPT_NDBCLUSTER, ""
|
|
"", (uchar**) &opt_ndbcluster,
|
|
(uchar**) &opt_ndbcluster, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"ndb-connectstring", OPT_NDB_CONNECTSTRING, ""
|
|
"", (uchar**) &opt_ndb_connectstring,
|
|
(uchar**) &opt_ndb_connectstring, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
|
#endif
|
|
{ 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
|
|
};
|
|
|
|
|
|
static const char *load_default_groups[]= { "mysqladmin","client",0 };
|
|
|
|
static my_bool
|
|
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|
char *argument)
|
|
{
|
|
int error = 0;
|
|
|
|
switch(optid) {
|
|
#ifdef __NETWARE__
|
|
case OPT_AUTO_CLOSE:
|
|
setscreenmode(SCR_AUTOCLOSE_ON_EXIT);
|
|
break;
|
|
#endif
|
|
case 'c':
|
|
opt_count_iterations= 1;
|
|
break;
|
|
case 'p':
|
|
if (argument)
|
|
{
|
|
char *start=argument;
|
|
my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
|
|
opt_password=my_strdup(argument,MYF(MY_FAE));
|
|
while (*argument) *argument++= 'x'; /* Destroy argument */
|
|
if (*start)
|
|
start[1]=0; /* Cut length of argument */
|
|
tty_password= 0;
|
|
}
|
|
else
|
|
tty_password=1;
|
|
break;
|
|
case 's':
|
|
option_silent++;
|
|
break;
|
|
case 'W':
|
|
#ifdef __WIN__
|
|
opt_protocol = MYSQL_PROTOCOL_PIPE;
|
|
#endif
|
|
break;
|
|
case '#':
|
|
DBUG_PUSH(argument ? argument : "d:t:o,/tmp/mysqladmin.trace");
|
|
break;
|
|
#include <sslopt-case.h>
|
|
case 'V':
|
|
print_version();
|
|
exit(0);
|
|
break;
|
|
case 'w':
|
|
if (argument)
|
|
{
|
|
if ((option_wait=atoi(argument)) <= 0)
|
|
option_wait=1;
|
|
}
|
|
else
|
|
option_wait= ~(uint)0;
|
|
break;
|
|
case '?':
|
|
case 'I': /* Info */
|
|
error++;
|
|
break;
|
|
case OPT_CHARSETS_DIR:
|
|
#if MYSQL_VERSION_ID > 32300
|
|
charsets_dir = argument;
|
|
#endif
|
|
break;
|
|
case OPT_MYSQL_PROTOCOL:
|
|
opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib,
|
|
opt->name);
|
|
break;
|
|
}
|
|
if (error)
|
|
{
|
|
usage();
|
|
exit(1);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
int main(int argc,char *argv[])
|
|
{
|
|
int error= 0, ho_error;
|
|
MYSQL mysql;
|
|
char **commands, **save_argv;
|
|
|
|
MY_INIT(argv[0]);
|
|
mysql_init(&mysql);
|
|
load_defaults("my",load_default_groups,&argc,&argv);
|
|
save_argv = argv; /* Save for free_defaults */
|
|
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
|
|
{
|
|
free_defaults(save_argv);
|
|
exit(ho_error);
|
|
}
|
|
|
|
if (argc == 0)
|
|
{
|
|
usage();
|
|
exit(1);
|
|
}
|
|
commands = argv;
|
|
if (tty_password)
|
|
opt_password = get_tty_password(NullS);
|
|
|
|
VOID(signal(SIGINT,endprog)); /* Here if abort */
|
|
VOID(signal(SIGTERM,endprog)); /* Here if abort */
|
|
|
|
if (opt_compress)
|
|
mysql_options(&mysql,MYSQL_OPT_COMPRESS,NullS);
|
|
if (opt_connect_timeout)
|
|
{
|
|
uint tmp=opt_connect_timeout;
|
|
mysql_options(&mysql,MYSQL_OPT_CONNECT_TIMEOUT, (char*) &tmp);
|
|
}
|
|
#ifdef HAVE_OPENSSL
|
|
if (opt_use_ssl)
|
|
mysql_ssl_set(&mysql, opt_ssl_key, opt_ssl_cert, opt_ssl_ca,
|
|
opt_ssl_capath, opt_ssl_cipher);
|
|
mysql_options(&mysql,MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
|
|
(char*)&opt_ssl_verify_server_cert);
|
|
#endif
|
|
if (opt_protocol)
|
|
mysql_options(&mysql,MYSQL_OPT_PROTOCOL,(char*)&opt_protocol);
|
|
#ifdef HAVE_SMEM
|
|
if (shared_memory_base_name)
|
|
mysql_options(&mysql,MYSQL_SHARED_MEMORY_BASE_NAME,shared_memory_base_name);
|
|
#endif
|
|
if (default_charset)
|
|
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, default_charset);
|
|
error_flags= (myf)(opt_nobeep ? 0 : ME_BELL);
|
|
|
|
if (sql_connect(&mysql, option_wait))
|
|
{
|
|
unsigned int err= mysql_errno(&mysql);
|
|
if (err >= CR_MIN_ERROR && err <= CR_MAX_ERROR)
|
|
error= 1;
|
|
else
|
|
{
|
|
/* Return 0 if all commands are PING */
|
|
for (; argc > 0; argv++, argc--)
|
|
{
|
|
if (find_type(argv[0], &command_typelib, 2) != ADMIN_PING)
|
|
{
|
|
error= 1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
while (!interrupted && (!opt_count_iterations || nr_iterations))
|
|
{
|
|
new_line = 0;
|
|
if ((error=execute_commands(&mysql,argc,commands)))
|
|
{
|
|
if (error > 0)
|
|
break; /* Wrong command error */
|
|
if (!option_force)
|
|
{
|
|
if (option_wait && !interrupted)
|
|
{
|
|
mysql_close(&mysql);
|
|
if (!sql_connect(&mysql, option_wait))
|
|
{
|
|
sleep(1); /* Don't retry too rapidly */
|
|
continue; /* Retry */
|
|
}
|
|
}
|
|
error=1;
|
|
break;
|
|
}
|
|
}
|
|
if (interval)
|
|
{
|
|
sleep(interval);
|
|
if (new_line)
|
|
puts("");
|
|
if (opt_count_iterations)
|
|
nr_iterations--;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
mysql_close(&mysql);
|
|
}
|
|
my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
|
|
my_free(user,MYF(MY_ALLOW_ZERO_PTR));
|
|
#ifdef HAVE_SMEM
|
|
my_free(shared_memory_base_name,MYF(MY_ALLOW_ZERO_PTR));
|
|
#endif
|
|
free_defaults(save_argv);
|
|
my_end(info_flag ? MY_CHECK_ERROR : 0);
|
|
exit(error ? 1 : 0);
|
|
return 0;
|
|
}
|
|
|
|
|
|
static sig_handler endprog(int signal_number __attribute__((unused)))
|
|
{
|
|
interrupted=1;
|
|
}
|
|
|
|
|
|
static my_bool sql_connect(MYSQL *mysql, uint wait)
|
|
{
|
|
my_bool info=0;
|
|
|
|
for (;;)
|
|
{
|
|
if (mysql_real_connect(mysql,host,user,opt_password,NullS,tcp_port,
|
|
unix_port, 0))
|
|
{
|
|
mysql->reconnect= 1;
|
|
if (info)
|
|
{
|
|
fputs("\n",stderr);
|
|
(void) fflush(stderr);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
if (!wait)
|
|
{
|
|
if (!option_silent)
|
|
{
|
|
if (!host)
|
|
host= (char*) LOCAL_HOST;
|
|
my_printf_error(0,"connect to server at '%s' failed\nerror: '%s'",
|
|
error_flags, host, mysql_error(mysql));
|
|
if (mysql_errno(mysql) == CR_CONNECTION_ERROR)
|
|
{
|
|
fprintf(stderr,
|
|
"Check that mysqld is running and that the socket: '%s' exists!\n",
|
|
unix_port ? unix_port : mysql_unix_port);
|
|
}
|
|
else if (mysql_errno(mysql) == CR_CONN_HOST_ERROR ||
|
|
mysql_errno(mysql) == CR_UNKNOWN_HOST)
|
|
{
|
|
fprintf(stderr,"Check that mysqld is running on %s",host);
|
|
fprintf(stderr," and that the port is %d.\n",
|
|
tcp_port ? tcp_port: mysql_port);
|
|
fprintf(stderr,"You can check this by doing 'telnet %s %d'\n",
|
|
host, tcp_port ? tcp_port: mysql_port);
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
if (wait != (uint) ~0)
|
|
wait--; /* One less retry */
|
|
if ((mysql_errno(mysql) != CR_CONN_HOST_ERROR) &&
|
|
(mysql_errno(mysql) != CR_CONNECTION_ERROR))
|
|
{
|
|
fprintf(stderr,"Got error: %s\n", mysql_error(mysql));
|
|
if (!option_force)
|
|
return 1;
|
|
}
|
|
else if (!option_silent)
|
|
{
|
|
if (!info)
|
|
{
|
|
info=1;
|
|
fputs("Waiting for MySQL server to answer",stderr);
|
|
(void) fflush(stderr);
|
|
}
|
|
else
|
|
{
|
|
putc('.',stderr);
|
|
(void) fflush(stderr);
|
|
}
|
|
}
|
|
sleep(5);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
Execute a command.
|
|
Return 0 on ok
|
|
-1 on retryable error
|
|
1 on fatal error
|
|
*/
|
|
|
|
static int execute_commands(MYSQL *mysql,int argc, char **argv)
|
|
{
|
|
const char *status;
|
|
/*
|
|
MySQL documentation relies on the fact that mysqladmin will
|
|
execute commands in the order specified, e.g.
|
|
mysqladmin -u root flush-privileges password "newpassword"
|
|
to reset a lost root password.
|
|
If this behaviour is ever changed, Docs should be notified.
|
|
*/
|
|
|
|
struct rand_struct rand_st;
|
|
|
|
for (; argc > 0 ; argv++,argc--)
|
|
{
|
|
switch (find_type(argv[0],&command_typelib,2)) {
|
|
case ADMIN_CREATE:
|
|
{
|
|
char buff[FN_REFLEN+20];
|
|
if (argc < 2)
|
|
{
|
|
my_printf_error(0, "Too few arguments to create", error_flags);
|
|
return 1;
|
|
}
|
|
sprintf(buff,"create database `%.*s`",FN_REFLEN,argv[1]);
|
|
if (mysql_query(mysql,buff))
|
|
{
|
|
my_printf_error(0,"CREATE DATABASE failed; error: '%-.200s'",
|
|
error_flags, mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
argc--; argv++;
|
|
break;
|
|
}
|
|
case ADMIN_DROP:
|
|
{
|
|
if (argc < 2)
|
|
{
|
|
my_printf_error(0, "Too few arguments to drop", error_flags);
|
|
return 1;
|
|
}
|
|
if (drop_db(mysql,argv[1]))
|
|
return -1;
|
|
argc--; argv++;
|
|
break;
|
|
}
|
|
case ADMIN_SHUTDOWN:
|
|
{
|
|
char pidfile[FN_REFLEN];
|
|
my_bool got_pidfile= 0;
|
|
time_t last_modified= 0;
|
|
struct stat pidfile_status;
|
|
|
|
/*
|
|
Only wait for pidfile on local connections
|
|
If pidfile doesn't exist, continue without pid file checking
|
|
*/
|
|
if (mysql->unix_socket && (got_pidfile= !get_pidfile(mysql, pidfile)) &&
|
|
!stat(pidfile, &pidfile_status))
|
|
last_modified= pidfile_status.st_mtime;
|
|
|
|
if (mysql_shutdown(mysql, SHUTDOWN_DEFAULT))
|
|
{
|
|
my_printf_error(0, "shutdown failed; error: '%s'", error_flags,
|
|
mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
mysql_close(mysql); /* Close connection to avoid error messages */
|
|
argc=1; /* force SHUTDOWN to be the last command */
|
|
if (got_pidfile)
|
|
{
|
|
if (opt_verbose)
|
|
printf("Shutdown signal sent to server; Waiting for pid file to disappear\n");
|
|
|
|
/* Wait until pid file is gone */
|
|
if (wait_pidfile(pidfile, last_modified, &pidfile_status))
|
|
return -1;
|
|
}
|
|
break;
|
|
}
|
|
case ADMIN_FLUSH_PRIVILEGES:
|
|
case ADMIN_RELOAD:
|
|
if (mysql_query(mysql,"flush privileges"))
|
|
{
|
|
my_printf_error(0, "reload failed; error: '%s'", error_flags,
|
|
mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
break;
|
|
case ADMIN_REFRESH:
|
|
if (mysql_refresh(mysql,
|
|
(uint) ~(REFRESH_GRANT | REFRESH_STATUS |
|
|
REFRESH_READ_LOCK | REFRESH_SLAVE |
|
|
REFRESH_MASTER)))
|
|
{
|
|
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
|
|
mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
break;
|
|
case ADMIN_FLUSH_THREADS:
|
|
if (mysql_refresh(mysql,(uint) REFRESH_THREADS))
|
|
{
|
|
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
|
|
mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
break;
|
|
case ADMIN_VER:
|
|
new_line=1;
|
|
print_version();
|
|
puts("Copyright (C) 2000-2006 MySQL AB");
|
|
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n");
|
|
printf("Server version\t\t%s\n", mysql_get_server_info(mysql));
|
|
printf("Protocol version\t%d\n", mysql_get_proto_info(mysql));
|
|
printf("Connection\t\t%s\n",mysql_get_host_info(mysql));
|
|
if (mysql->unix_socket)
|
|
printf("UNIX socket\t\t%s\n", mysql->unix_socket);
|
|
else
|
|
printf("TCP port\t\t%d\n", mysql->port);
|
|
status=mysql_stat(mysql);
|
|
{
|
|
char *pos,buff[40];
|
|
ulong sec;
|
|
pos= (char*) strchr(status,' ');
|
|
*pos++=0;
|
|
printf("%s\t\t\t",status); /* print label */
|
|
if ((status=str2int(pos,10,0,LONG_MAX,(long*) &sec)))
|
|
{
|
|
nice_time(sec,buff);
|
|
puts(buff); /* print nice time */
|
|
while (*status == ' ') status++; /* to next info */
|
|
}
|
|
}
|
|
putc('\n',stdout);
|
|
if (status)
|
|
puts(status);
|
|
break;
|
|
case ADMIN_PROCESSLIST:
|
|
{
|
|
MYSQL_RES *result;
|
|
MYSQL_ROW row;
|
|
|
|
if (mysql_query(mysql, (opt_verbose ? "show full processlist" :
|
|
"show processlist")) ||
|
|
!(result = mysql_store_result(mysql)))
|
|
{
|
|
my_printf_error(0, "process list failed; error: '%s'", error_flags,
|
|
mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
print_header(result);
|
|
while ((row=mysql_fetch_row(result)))
|
|
print_row(result,row,0);
|
|
print_top(result);
|
|
mysql_free_result(result);
|
|
new_line=1;
|
|
break;
|
|
}
|
|
case ADMIN_STATUS:
|
|
status=mysql_stat(mysql);
|
|
if (status)
|
|
puts(status);
|
|
break;
|
|
case ADMIN_KILL:
|
|
{
|
|
uint error=0;
|
|
char *pos;
|
|
if (argc < 2)
|
|
{
|
|
my_printf_error(0, "Too few arguments to 'kill'", error_flags);
|
|
return 1;
|
|
}
|
|
pos=argv[1];
|
|
for (;;)
|
|
{
|
|
if (mysql_kill(mysql,(ulong) atol(pos)))
|
|
{
|
|
my_printf_error(0, "kill failed on %ld; error: '%s'", error_flags,
|
|
atol(pos), mysql_error(mysql));
|
|
error=1;
|
|
}
|
|
if (!(pos=strchr(pos,',')))
|
|
break;
|
|
pos++;
|
|
}
|
|
argc--; argv++;
|
|
if (error)
|
|
return -1;
|
|
break;
|
|
}
|
|
case ADMIN_DEBUG:
|
|
if (mysql_dump_debug_info(mysql))
|
|
{
|
|
my_printf_error(0, "debug failed; error: '%s'", error_flags,
|
|
mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
break;
|
|
case ADMIN_VARIABLES:
|
|
{
|
|
MYSQL_RES *res;
|
|
MYSQL_ROW row;
|
|
|
|
new_line=1;
|
|
if (mysql_query(mysql,"show /*!40003 GLOBAL */ variables") ||
|
|
!(res=mysql_store_result(mysql)))
|
|
{
|
|
my_printf_error(0, "unable to show variables; error: '%s'", error_flags,
|
|
mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
print_header(res);
|
|
while ((row=mysql_fetch_row(res)))
|
|
print_row(res,row,0);
|
|
print_top(res);
|
|
mysql_free_result(res);
|
|
break;
|
|
}
|
|
case ADMIN_EXTENDED_STATUS:
|
|
{
|
|
MYSQL_RES *res;
|
|
MYSQL_ROW row;
|
|
uint rownr = 0;
|
|
void (*func) (MYSQL_RES*, MYSQL_ROW, uint);
|
|
|
|
new_line = 1;
|
|
if (mysql_query(mysql, "show /*!50002 GLOBAL */ status") ||
|
|
!(res = mysql_store_result(mysql)))
|
|
{
|
|
my_printf_error(0, "unable to show status; error: '%s'", error_flags,
|
|
mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
if (!opt_vertical)
|
|
print_header(res);
|
|
else
|
|
{
|
|
if (!ex_status_printed)
|
|
{
|
|
store_values(res);
|
|
truncate_names(); /* Does some printing also */
|
|
}
|
|
else
|
|
{
|
|
print_relative_line();
|
|
print_relative_header();
|
|
print_relative_line();
|
|
}
|
|
}
|
|
|
|
/* void (*func) (MYSQL_RES*, MYSQL_ROW, uint); */
|
|
if (opt_relative && !opt_vertical)
|
|
func = print_relative_row;
|
|
else if (opt_vertical)
|
|
func = print_relative_row_vert;
|
|
else
|
|
func = print_row;
|
|
|
|
while ((row = mysql_fetch_row(res)))
|
|
(*func)(res, row, rownr++);
|
|
if (opt_vertical)
|
|
{
|
|
if (ex_status_printed)
|
|
{
|
|
putchar('\n');
|
|
print_relative_line();
|
|
}
|
|
}
|
|
else
|
|
print_top(res);
|
|
|
|
ex_status_printed = 1; /* From now on the output will be relative */
|
|
mysql_free_result(res);
|
|
break;
|
|
}
|
|
case ADMIN_FLUSH_LOGS:
|
|
{
|
|
if (mysql_refresh(mysql,REFRESH_LOG))
|
|
{
|
|
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
|
|
mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
break;
|
|
}
|
|
case ADMIN_FLUSH_HOSTS:
|
|
{
|
|
if (mysql_query(mysql,"flush hosts"))
|
|
{
|
|
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
|
|
mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
break;
|
|
}
|
|
case ADMIN_FLUSH_TABLES:
|
|
{
|
|
if (mysql_query(mysql,"flush tables"))
|
|
{
|
|
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
|
|
mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
break;
|
|
}
|
|
case ADMIN_FLUSH_STATUS:
|
|
{
|
|
if (mysql_query(mysql,"flush status"))
|
|
{
|
|
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
|
|
mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
break;
|
|
}
|
|
case ADMIN_OLD_PASSWORD:
|
|
case ADMIN_PASSWORD:
|
|
{
|
|
char buff[128],crypted_pw[64];
|
|
time_t start_time;
|
|
/* Do initialization the same way as we do in mysqld */
|
|
start_time=time((time_t*) 0);
|
|
randominit(&rand_st,(ulong) start_time,(ulong) start_time/2);
|
|
|
|
if (argc < 2)
|
|
{
|
|
my_printf_error(0, "Too few arguments to change password", error_flags);
|
|
return 1;
|
|
}
|
|
if (argv[1][0])
|
|
{
|
|
char *pw= argv[1];
|
|
bool old= (find_type(argv[0], &command_typelib, 2) ==
|
|
ADMIN_OLD_PASSWORD);
|
|
#ifdef __WIN__
|
|
uint pw_len= strlen(pw);
|
|
if (pw_len > 1 && pw[0] == '\'' && pw[pw_len-1] == '\'')
|
|
printf("Warning: single quotes were not trimmed from the password by"
|
|
" your command\nline client, as you might have expected.\n");
|
|
#endif
|
|
/*
|
|
If we don't already know to use an old-style password, see what
|
|
the server is using
|
|
*/
|
|
if (!old)
|
|
{
|
|
if (mysql_query(mysql, "SHOW VARIABLES LIKE 'old_passwords'"))
|
|
{
|
|
my_printf_error(0, "Could not determine old_passwords setting from server; error: '%s'",
|
|
error_flags, mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
else
|
|
{
|
|
MYSQL_RES *res= mysql_store_result(mysql);
|
|
if (!res)
|
|
{
|
|
my_printf_error(0,
|
|
"Could not get old_passwords setting from "
|
|
"server; error: '%s'",
|
|
error_flags, mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
if (!mysql_num_rows(res))
|
|
old= 1;
|
|
else
|
|
{
|
|
MYSQL_ROW row= mysql_fetch_row(res);
|
|
old= !strncmp(row[1], "ON", 2);
|
|
}
|
|
mysql_free_result(res);
|
|
}
|
|
}
|
|
if (old)
|
|
make_scrambled_password_323(crypted_pw, pw);
|
|
else
|
|
make_scrambled_password(crypted_pw, pw);
|
|
}
|
|
else
|
|
crypted_pw[0]=0; /* No password */
|
|
sprintf(buff,"set password='%s',sql_log_off=0",crypted_pw);
|
|
|
|
if (mysql_query(mysql,"set sql_log_off=1"))
|
|
{
|
|
my_printf_error(0, "Can't turn off logging; error: '%s'",
|
|
error_flags, mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
if (mysql_query(mysql,buff))
|
|
{
|
|
if (mysql_errno(mysql)!=1290)
|
|
{
|
|
my_printf_error(0,"unable to change password; error: '%s'",
|
|
error_flags, mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
else
|
|
{
|
|
/*
|
|
We don't try to execute 'update mysql.user set..'
|
|
because we can't perfectly find out the host
|
|
*/
|
|
my_printf_error(0,"\n"
|
|
"You cannot use 'password' command as mysqld runs\n"
|
|
" with grant tables disabled (was started with"
|
|
" --skip-grant-tables).\n"
|
|
"Use: \"mysqladmin flush-privileges password '*'\""
|
|
" instead", error_flags);
|
|
return -1;
|
|
}
|
|
}
|
|
argc--; argv++;
|
|
break;
|
|
}
|
|
|
|
case ADMIN_START_SLAVE:
|
|
if (mysql_query(mysql, "START SLAVE"))
|
|
{
|
|
my_printf_error(0, "Error starting slave: %s", error_flags,
|
|
mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
else
|
|
puts("Slave started");
|
|
break;
|
|
case ADMIN_STOP_SLAVE:
|
|
if (mysql_query(mysql, "STOP SLAVE"))
|
|
{
|
|
my_printf_error(0, "Error stopping slave: %s", error_flags,
|
|
mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
else
|
|
puts("Slave stopped");
|
|
break;
|
|
|
|
case ADMIN_PING:
|
|
mysql->reconnect=0; /* We want to know of reconnects */
|
|
if (!mysql_ping(mysql))
|
|
{
|
|
if (option_silent < 2)
|
|
puts("mysqld is alive");
|
|
}
|
|
else
|
|
{
|
|
if (mysql_errno(mysql) == CR_SERVER_GONE_ERROR)
|
|
{
|
|
mysql->reconnect=1;
|
|
if (!mysql_ping(mysql))
|
|
puts("connection was down, but mysqld is now alive");
|
|
}
|
|
else
|
|
{
|
|
my_printf_error(0,"mysqld doesn't answer to ping, error: '%s'",
|
|
error_flags, mysql_error(mysql));
|
|
return -1;
|
|
}
|
|
}
|
|
mysql->reconnect=1; /* Automatic reconnect is default */
|
|
break;
|
|
#ifdef LATER_HAVE_NDBCLUSTER_DB
|
|
case ADMIN_NDB_MGM:
|
|
{
|
|
if (argc < 2)
|
|
{
|
|
my_printf_error(0, "Too few arguments to ndb-mgm", error_flags);
|
|
return 1;
|
|
}
|
|
{
|
|
Ndb_mgmclient_handle cmd=
|
|
ndb_mgmclient_handle_create(opt_ndb_connectstring);
|
|
ndb_mgmclient_execute(cmd, --argc, ++argv);
|
|
ndb_mgmclient_handle_destroy(cmd);
|
|
}
|
|
argc= 0;
|
|
}
|
|
break;
|
|
#endif
|
|
default:
|
|
my_printf_error(0, "Unknown command: '%-.60s'", error_flags, argv[0]);
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
#include <help_start.h>
|
|
|
|
static void print_version(void)
|
|
{
|
|
printf("%s Ver %s Distrib %s, for %s on %s\n",my_progname,ADMIN_VERSION,
|
|
MYSQL_SERVER_VERSION,SYSTEM_TYPE,MACHINE_TYPE);
|
|
NETWARE_SET_SCREEN_MODE(1);
|
|
}
|
|
|
|
|
|
static void usage(void)
|
|
{
|
|
print_version();
|
|
puts("Copyright (C) 2000-2006 MySQL AB");
|
|
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n");
|
|
puts("Administration program for the mysqld daemon.");
|
|
printf("Usage: %s [OPTIONS] command command....\n", my_progname);
|
|
my_print_help(my_long_options);
|
|
my_print_variables(my_long_options);
|
|
print_defaults("my",load_default_groups);
|
|
puts("\nWhere command is a one or more of: (Commands may be shortened)\n\
|
|
create databasename Create a new database\n\
|
|
debug Instruct server to write debug information to log\n\
|
|
drop databasename Delete a database and all its tables\n\
|
|
extended-status Gives an extended status message from the server\n\
|
|
flush-hosts Flush all cached hosts\n\
|
|
flush-logs Flush all logs\n\
|
|
flush-status Clear status variables\n\
|
|
flush-tables Flush all tables\n\
|
|
flush-threads Flush the thread cache\n\
|
|
flush-privileges Reload grant tables (same as reload)\n\
|
|
kill id,id,... Kill mysql threads");
|
|
#if MYSQL_VERSION_ID >= 32200
|
|
puts("\
|
|
password new-password Change old password to new-password, MySQL 4.1 hashing.\n\
|
|
old-password new-password Change old password to new-password in old format.\n");
|
|
#endif
|
|
puts("\
|
|
ping Check if mysqld is alive\n\
|
|
processlist Show list of active threads in server\n\
|
|
reload Reload grant tables\n\
|
|
refresh Flush all tables and close and open logfiles\n\
|
|
shutdown Take server down\n\
|
|
status Gives a short status message from the server\n\
|
|
start-slave Start slave\n\
|
|
stop-slave Stop slave\n\
|
|
variables Prints variables available\n\
|
|
version Get version info from server");
|
|
}
|
|
|
|
#include <help_end.h>
|
|
|
|
static int drop_db(MYSQL *mysql, const char *db)
|
|
{
|
|
char name_buff[FN_REFLEN+20], buf[10];
|
|
if (!option_force)
|
|
{
|
|
puts("Dropping the database is potentially a very bad thing to do.");
|
|
puts("Any data stored in the database will be destroyed.\n");
|
|
printf("Do you really want to drop the '%s' database [y/N] ",db);
|
|
fflush(stdout);
|
|
VOID(fgets(buf,sizeof(buf)-1,stdin));
|
|
if ((*buf != 'y') && (*buf != 'Y'))
|
|
{
|
|
puts("\nOK, aborting database drop!");
|
|
return -1;
|
|
}
|
|
}
|
|
sprintf(name_buff,"drop database `%.*s`",FN_REFLEN,db);
|
|
if (mysql_query(mysql,name_buff))
|
|
{
|
|
my_printf_error(0, "DROP DATABASE %s failed;\nerror: '%s'", error_flags,
|
|
db,mysql_error(mysql));
|
|
return 1;
|
|
}
|
|
printf("Database \"%s\" dropped\n",db);
|
|
return 0;
|
|
}
|
|
|
|
|
|
static void nice_time(ulong sec,char *buff)
|
|
{
|
|
ulong tmp;
|
|
|
|
if (sec >= 3600L*24)
|
|
{
|
|
tmp=sec/(3600L*24);
|
|
sec-=3600L*24*tmp;
|
|
buff=int10_to_str(tmp, buff, 10);
|
|
buff=strmov(buff,tmp > 1 ? " days " : " day ");
|
|
}
|
|
if (sec >= 3600L)
|
|
{
|
|
tmp=sec/3600L;
|
|
sec-=3600L*tmp;
|
|
buff=int10_to_str(tmp, buff, 10);
|
|
buff=strmov(buff,tmp > 1 ? " hours " : " hour ");
|
|
}
|
|
if (sec >= 60)
|
|
{
|
|
tmp=sec/60;
|
|
sec-=60*tmp;
|
|
buff=int10_to_str(tmp, buff, 10);
|
|
buff=strmov(buff," min ");
|
|
}
|
|
strmov(int10_to_str(sec, buff, 10)," sec");
|
|
}
|
|
|
|
|
|
static void print_header(MYSQL_RES *result)
|
|
{
|
|
MYSQL_FIELD *field;
|
|
|
|
print_top(result);
|
|
mysql_field_seek(result,0);
|
|
putchar('|');
|
|
while ((field = mysql_fetch_field(result)))
|
|
{
|
|
printf(" %-*s|",(int) field->max_length+1,field->name);
|
|
}
|
|
putchar('\n');
|
|
print_top(result);
|
|
}
|
|
|
|
|
|
static void print_top(MYSQL_RES *result)
|
|
{
|
|
uint i,length;
|
|
MYSQL_FIELD *field;
|
|
|
|
putchar('+');
|
|
mysql_field_seek(result,0);
|
|
while((field = mysql_fetch_field(result)))
|
|
{
|
|
if ((length=(uint) strlen(field->name)) > field->max_length)
|
|
field->max_length=length;
|
|
else
|
|
length=field->max_length;
|
|
for (i=length+2 ; i--> 0 ; )
|
|
putchar('-');
|
|
putchar('+');
|
|
}
|
|
putchar('\n');
|
|
}
|
|
|
|
|
|
/* 3.rd argument, uint row, is not in use. Don't remove! */
|
|
static void print_row(MYSQL_RES *result, MYSQL_ROW cur,
|
|
uint row __attribute__((unused)))
|
|
{
|
|
uint i,length;
|
|
MYSQL_FIELD *field;
|
|
|
|
putchar('|');
|
|
mysql_field_seek(result,0);
|
|
for (i=0 ; i < mysql_num_fields(result); i++)
|
|
{
|
|
field = mysql_fetch_field(result);
|
|
length=field->max_length;
|
|
printf(" %-*s|",length+1,cur[i] ? (char*) cur[i] : "");
|
|
}
|
|
putchar('\n');
|
|
}
|
|
|
|
|
|
static void print_relative_row(MYSQL_RES *result, MYSQL_ROW cur, uint row)
|
|
{
|
|
ulonglong tmp;
|
|
char buff[22];
|
|
MYSQL_FIELD *field;
|
|
|
|
mysql_field_seek(result, 0);
|
|
field = mysql_fetch_field(result);
|
|
printf("| %-*s|", (int) field->max_length + 1, cur[0]);
|
|
|
|
field = mysql_fetch_field(result);
|
|
tmp = cur[1] ? strtoull(cur[1], NULL, 10) : (ulonglong) 0;
|
|
printf(" %-*s|\n", (int) field->max_length + 1,
|
|
llstr((tmp - last_values[row]), buff));
|
|
last_values[row] = tmp;
|
|
}
|
|
|
|
|
|
static void print_relative_row_vert(MYSQL_RES *result __attribute__((unused)),
|
|
MYSQL_ROW cur,
|
|
uint row __attribute__((unused)))
|
|
{
|
|
uint length;
|
|
ulonglong tmp;
|
|
char buff[22];
|
|
|
|
if (!row)
|
|
putchar('|');
|
|
|
|
tmp = cur[1] ? strtoull(cur[1], NULL, 10) : (ulonglong) 0;
|
|
printf(" %-*s|", ex_val_max_len[row] + 1,
|
|
llstr((tmp - last_values[row]), buff));
|
|
|
|
/* Find the minimum row length needed to output the relative value */
|
|
if ((length=(uint) strlen(buff) > ex_val_max_len[row]) && ex_status_printed)
|
|
ex_val_max_len[row] = length;
|
|
last_values[row] = tmp;
|
|
}
|
|
|
|
|
|
static void store_values(MYSQL_RES *result)
|
|
{
|
|
uint i;
|
|
MYSQL_ROW row;
|
|
MYSQL_FIELD *field;
|
|
|
|
field = mysql_fetch_field(result);
|
|
max_var_length = field->max_length;
|
|
field = mysql_fetch_field(result);
|
|
max_val_length = field->max_length;
|
|
|
|
for (i = 0; (row = mysql_fetch_row(result)); i++)
|
|
{
|
|
strmov(ex_var_names[i], row[0]);
|
|
last_values[i]=strtoull(row[1],NULL,10);
|
|
ex_val_max_len[i]=2; /* Default print width for values */
|
|
}
|
|
ex_var_count = i;
|
|
return;
|
|
}
|
|
|
|
|
|
static void print_relative_header()
|
|
{
|
|
uint i;
|
|
|
|
putchar('|');
|
|
for (i = 0; i < ex_var_count; i++)
|
|
printf(" %-*s|", ex_val_max_len[i] + 1, truncated_var_names[i]);
|
|
putchar('\n');
|
|
}
|
|
|
|
|
|
static void print_relative_line()
|
|
{
|
|
uint i;
|
|
|
|
putchar('+');
|
|
for (i = 0; i < ex_var_count; i++)
|
|
{
|
|
uint j;
|
|
for (j = 0; j < ex_val_max_len[i] + 2; j++)
|
|
putchar('-');
|
|
putchar('+');
|
|
}
|
|
putchar('\n');
|
|
}
|
|
|
|
|
|
static void truncate_names()
|
|
{
|
|
uint i;
|
|
char *ptr,top_line[MAX_TRUNC_LENGTH+4+NAME_LEN+22+1],buff[22];
|
|
|
|
ptr=top_line;
|
|
*ptr++='+';
|
|
ptr=strfill(ptr,max_var_length+2,'-');
|
|
*ptr++='+';
|
|
ptr=strfill(ptr,MAX_TRUNC_LENGTH+2,'-');
|
|
*ptr++='+';
|
|
ptr=strfill(ptr,max_val_length+2,'-');
|
|
*ptr++='+';
|
|
*ptr=0;
|
|
puts(top_line);
|
|
|
|
for (i = 0 ; i < ex_var_count; i++)
|
|
{
|
|
uint sfx=1,j;
|
|
printf("| %-*s|", max_var_length + 1, ex_var_names[i]);
|
|
ptr = ex_var_names[i];
|
|
/* Make sure no two same truncated names will become */
|
|
for (j = 0; j < i; j++)
|
|
if (*truncated_var_names[j] == *ptr)
|
|
sfx++;
|
|
|
|
truncated_var_names[i][0]= *ptr; /* Copy first var char */
|
|
int10_to_str(sfx, truncated_var_names[i]+1,10);
|
|
printf(" %-*s|", MAX_TRUNC_LENGTH + 1, truncated_var_names[i]);
|
|
printf(" %-*s|\n", max_val_length + 1, llstr(last_values[i],buff));
|
|
}
|
|
puts(top_line);
|
|
return;
|
|
}
|
|
|
|
|
|
static my_bool get_pidfile(MYSQL *mysql, char *pidfile)
|
|
{
|
|
MYSQL_RES* result;
|
|
|
|
if (mysql_query(mysql, "SHOW VARIABLES LIKE 'pid_file'"))
|
|
{
|
|
my_printf_error(0, "query failed; error: '%s'", error_flags,
|
|
mysql_error(mysql));
|
|
}
|
|
result = mysql_store_result(mysql);
|
|
if (result)
|
|
{
|
|
MYSQL_ROW row=mysql_fetch_row(result);
|
|
if (row)
|
|
strmov(pidfile, row[1]);
|
|
mysql_free_result(result);
|
|
return row == 0; /* Error if row = 0 */
|
|
}
|
|
return 1; /* Error */
|
|
}
|
|
|
|
/*
|
|
Return 1 if pid file didn't disappear or change
|
|
*/
|
|
|
|
static my_bool wait_pidfile(char *pidfile, time_t last_modified,
|
|
struct stat *pidfile_status)
|
|
{
|
|
char buff[FN_REFLEN];
|
|
int error= 1;
|
|
uint count= 0;
|
|
DBUG_ENTER("wait_pidfile");
|
|
|
|
system_filename(buff, pidfile);
|
|
do
|
|
{
|
|
int fd;
|
|
if ((fd= my_open(buff, O_RDONLY, MYF(0))) < 0)
|
|
{
|
|
error= 0;
|
|
break;
|
|
}
|
|
(void) my_close(fd,MYF(0));
|
|
if (last_modified && !stat(pidfile, pidfile_status))
|
|
{
|
|
if (last_modified != pidfile_status->st_mtime)
|
|
{
|
|
/* File changed; Let's assume that mysqld did restart */
|
|
if (opt_verbose)
|
|
printf("pid file '%s' changed while waiting for it to disappear!\nmysqld did probably restart\n",
|
|
buff);
|
|
error= 0;
|
|
break;
|
|
}
|
|
}
|
|
if (count++ == opt_shutdown_timeout)
|
|
break;
|
|
sleep(1);
|
|
} while (!interrupted);
|
|
|
|
if (error)
|
|
{
|
|
DBUG_PRINT("warning",("Pid file didn't disappear"));
|
|
fprintf(stderr,
|
|
"Warning; Aborted waiting on pid file: '%s' after %d seconds\n",
|
|
buff, count-1);
|
|
}
|
|
DBUG_RETURN(error);
|
|
}
|