diff options
author | unknown <monty@narttu.mysql.fi> | 2003-09-23 17:06:44 +0300 |
---|---|---|
committer | unknown <monty@narttu.mysql.fi> | 2003-09-23 17:06:44 +0300 |
commit | 792aa09ee17b4ca88c92f297498237e46a4c7cf0 (patch) | |
tree | 3eac2fbc00ec3335470f74d59174520b731a9e75 /client | |
parent | 58ec8f35f7a92005b1a06f8d071b56649ca43857 (diff) | |
download | mariadb-git-792aa09ee17b4ca88c92f297498237e46a4c7cf0.tar.gz |
Code cleanup of new patches
mysys/mf_dirname.c:
Added comments
Diffstat (limited to 'client')
-rw-r--r-- | client/mysqlbinlog.cc | 125 |
1 files changed, 58 insertions, 67 deletions
diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index 6eab790857d..910b42d184d 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -20,8 +20,6 @@ #include <time.h> #include <assert.h> #include "log_event.h" -#include "include/my_sys.h" -#include "unistd.h" #define BIN_LOG_HEADER_SIZE 4 #define PROBE_HEADER_LEN (EVENT_LEN_OFFSET+4) @@ -75,49 +73,7 @@ class Load_log_processor int target_dir_name_len; DYNAMIC_ARRAY file_names; - const char* create_file(Create_file_log_event *ce) - { - const char *bname= ce->fname + ce->fname_len -1; - while (bname>ce->fname && bname[-1]!=FN_LIBCHAR) - bname--; - - uint blen= ce->fname_len - (bname-ce->fname); - uint full_len= target_dir_name_len + blen + 9 + 9 + 1; - char *tmp; - if (!(tmp= my_malloc(full_len,MYF(MY_WME))) || - set_dynamic(&file_names,(gptr)&ce,ce->file_id)) - { - die("Could not construct local filename %s%s",target_dir_name,bname); - return 0; - } - - char *ptr= tmp; - memcpy(ptr,target_dir_name,target_dir_name_len); - ptr+= target_dir_name_len; - memcpy(ptr,bname,blen); - ptr+= blen; - sprintf(ptr,"-%08x",ce->file_id); - ptr+= 9; - - uint version= 0; - for (;;) - { - sprintf(ptr,"-%08x",version); - if (access(tmp,F_OK)) - break; - version++; - if (version>UINT_MAX) - { - die("Could not construct local filename %s%s",target_dir_name,bname); - return 0; - } - } - - ce->set_fname_outside_temp_buf(tmp,full_len); - - return tmp; - } - + const char *create_file(Create_file_log_event *ce); void append_to_file(const char* fname, int flags, gptr data, uint size) { @@ -129,7 +85,6 @@ class Load_log_processor } public: - Load_log_processor() { init_dynamic_array(&file_names,sizeof(Create_file_log_event*), @@ -142,26 +97,10 @@ public: delete_dynamic(&file_names); } - void init_by_dir_name(const char *atarget_dir_name) - { - char *end= strmov(target_dir_name,atarget_dir_name); - if (end[-1]!=FN_LIBCHAR) - *end++= FN_LIBCHAR; - target_dir_name_len= end-target_dir_name; - } - void init_by_file_name(const char *file_name) + void init_by_dir_name(const char *dir) { - int len= strlen(file_name); - const char *end= file_name + len - 1; - while (end>file_name && *end!=FN_LIBCHAR) - end--; - if (*end!=FN_LIBCHAR) - target_dir_name_len= 0; - else - { - target_dir_name_len= end - file_name + 1; - memmove(target_dir_name,file_name,target_dir_name_len); - } + target_dir_name_len= (convert_dirname(target_dir_name, dir, NullS) - + target_dir_name); } void init_by_cur_dir() { @@ -196,7 +135,8 @@ public: void process(Create_file_log_event *ce) { const char *fname= create_file(ce); - append_to_file(fname,O_CREAT|O_EXCL|O_BINARY|O_WRONLY,ce->block,ce->block_len); + append_to_file(fname,O_CREAT|O_EXCL|O_BINARY|O_WRONLY,ce->block, + ce->block_len); } void process(Append_block_log_event *ae) { @@ -204,8 +144,10 @@ public: *((Create_file_log_event**)file_names.buffer + ae->file_id) : 0; if (ce) - append_to_file(ce->fname,O_APPEND|O_BINARY|O_WRONLY,ae->block,ae->block_len); + append_to_file(ce->fname,O_APPEND|O_BINARY|O_WRONLY, ae->block, + ae->block_len); else + { /* There is no Create_file event (a bad binlog or a big --position). Assuming it's a big --position, we just do nothing and @@ -213,9 +155,58 @@ public: */ fprintf(stderr,"Warning: ignoring Append_block as there is no \ Create_file event for file_id: %u\n",ae->file_id); + } } }; + +const char *Load_log_processor::create_file(Create_file_log_event *ce) +{ + const char *bname= ce->fname+dirname_length(ce->fname); + uint blen= ce->fname_len - (bname-ce->fname); + uint full_len= target_dir_name_len + blen + 9 + 9 + 1; + uint version= 0; + char *tmp, *ptr; + + if (!(tmp= my_malloc(full_len,MYF(MY_WME))) || + set_dynamic(&file_names,(gptr)&ce,ce->file_id)) + { + die("Could not construct local filename %s%s",target_dir_name,bname); + return 0; + } + + memcpy(tmp, target_dir_name, target_dir_name_len); + ptr= tmp+ target_dir_name_len; + memcpy(ptr,bname,blen); + ptr+= blen; + ptr+= my_sprintf(ptr,(ptr,"-%x",ce->file_id)); + + /* + Note that this code has a possible race condition if there was was + many simultaneous clients running which tried to create files at the same + time. Fortunately this should never be the case. + + A better way to do this would be to use 'create_tmp_file() and avoid this + race condition altogether on the expense of getting more cryptic file + names. + */ + for (;;) + { + sprintf(ptr,"-%x",version); + if (access(tmp,F_OK)) + break; + /* If we have to try more than 1000 times, something is seriously wrong */ + if (version++ > 1000) + { + die("Could not construct local filename %s%s",target_dir_name,bname); + return 0; + } + } + ce->set_fname_outside_temp_buf(tmp,full_len); + return tmp; +} + + Load_log_processor load_processor; static struct my_option my_long_options[] = |