summaryrefslogtreecommitdiff
path: root/mysys/mf_iocache2.c
diff options
context:
space:
mode:
authorunknown <mats@romeo.(none)>2006-10-02 15:08:40 +0200
committerunknown <mats@romeo.(none)>2006-10-02 15:08:40 +0200
commitd9b292808461af13c9c17a6260475524bc60b728 (patch)
treee6f4719279eb9ff297c2322aac9b934fc2538c2d /mysys/mf_iocache2.c
parent2d4f71882f69d3cf358f18cd5d878917ffcb4cde (diff)
downloadmariadb-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.
Diffstat (limited to 'mysys/mf_iocache2.c')
-rw-r--r--mysys/mf_iocache2.c47
1 files changed, 47 insertions, 0 deletions
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)
{
/*