diff options
author | unknown <mats@romeo.(none)> | 2006-10-02 15:08:40 +0200 |
---|---|---|
committer | unknown <mats@romeo.(none)> | 2006-10-02 15:08:40 +0200 |
commit | d9b292808461af13c9c17a6260475524bc60b728 (patch) | |
tree | e6f4719279eb9ff297c2322aac9b934fc2538c2d | |
parent | 2d4f71882f69d3cf358f18cd5d878917ffcb4cde (diff) | |
download | mariadb-git-d9b292808461af13c9c17a6260475524bc60b728.tar.gz |
BUG#19459 (BINLOG RBR command does not lock tables correctly causing
crash for, e.g., NDB):
Adding new function my_b_copy_to_file() to copy an IO_CACHE to a file.
include/my_sys.h:
Adding new function my_b_copy_to_file() to copy an IO_CACHE to a file.
mysys/mf_iocache2.c:
Adding new function my_b_copy_to_file() to copy an IO_CACHE to a file.
-rw-r--r-- | include/my_sys.h | 1 | ||||
-rw-r--r-- | mysys/mf_iocache2.c | 47 |
2 files changed, 48 insertions, 0 deletions
diff --git a/include/my_sys.h b/include/my_sys.h index 4ea7cecf0a1..b2d7cf1fd37 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -517,6 +517,7 @@ typedef int (*qsort2_cmp)(const void *, const void *, const void *); (uint) (*(info)->current_pos - (info)->request_pos)) /* tell write offset in the SEQ_APPEND cache */ +int my_b_copy_to_file(IO_CACHE *cache, FILE *file); my_off_t my_b_append_tell(IO_CACHE* info); my_off_t my_b_safe_tell(IO_CACHE* info); /* picks the correct tell() */ diff --git a/mysys/mf_iocache2.c b/mysys/mf_iocache2.c index f1ea21c2a47..d76b895aeb0 100644 --- a/mysys/mf_iocache2.c +++ b/mysys/mf_iocache2.c @@ -24,6 +24,53 @@ #include <stdarg.h> #include <m_ctype.h> +/* + Copy contents of an IO_CACHE to a file. + + SYNOPSIS + copy_io_cache_to_file() + cache IO_CACHE to copy from + file File to copy to + + DESCRIPTION + Copy the contents of the cache to the file. The cache will be + re-inited to a read cache and will read from the beginning of the + cache. + + If a failure to write fully occurs, the cache is only copied + partially. + + TODO + Make this function solid by handling partial reads from the cache + in a correct manner: it should be atomic. + + RETURN VALUE + 0 All OK + 1 An error occured +*/ +int +my_b_copy_to_file(IO_CACHE *cache, FILE *file) +{ + byte buf[IO_SIZE]; + DBUG_ENTER("my_b_copy_to_file"); + + /* Reinit the cache to read from the beginning of the cache */ + if (reinit_io_cache(cache, READ_CACHE, 0L, FALSE, FALSE)) + DBUG_RETURN(1); + uint bytes_in_cache= my_b_bytes_in_cache(cache); + while (bytes_in_cache > 0) { + uint const read_bytes= min(bytes_in_cache, sizeof(buf)); + DBUG_PRINT("debug", ("Remaining %u bytes - Reading %u bytes", + bytes_in_cache, read_bytes)); + if (my_b_read(cache, buf, read_bytes)) + DBUG_RETURN(1); + if (my_fwrite(file, buf, read_bytes, MYF(MY_WME | MY_NABP)) == (uint) -1) + DBUG_RETURN(1); + bytes_in_cache -= read_bytes; + } + DBUG_RETURN(0); +} + my_off_t my_b_append_tell(IO_CACHE* info) { /* |