summaryrefslogtreecommitdiff
path: root/mysys
diff options
context:
space:
mode:
authorunknown <monty@donna.mysql.com>2000-11-16 03:58:58 +0200
committerunknown <monty@donna.mysql.com>2000-11-16 03:58:58 +0200
commit3e6dac34cd5b8ef322d375f3af22137822656c8a (patch)
tree4b8f3df4d2aef33906b1e7e311b909e12f38539e /mysys
parentc7d2c59ceb4e3548eb74e5d8fba16e0f41ffc7d9 (diff)
downloadmariadb-git-3e6dac34cd5b8ef322d375f3af22137822656c8a.tar.gz
changed to use IO_CACHE instead of FILE
Docs/manual.texi: Type fixes myisam/mi_create.c: Fixed bug in update from different processes myisam/mi_locking.c: Fixed bug in update from different processes myisam/mi_open.c: Fixed bug in update from different processes myisam/mi_search.c: Fixed bug in update from different processes myisam/myisamdef.h: Fixed bug in update from different processes mysys/Makefile.am: Added mf_iocache2.c sql/log.cc: Changed to use IO_CACHE instead of FILE sql/sql_class.h: Changed to use IO_CACHE instead of FILE sql/sql_repl.cc: Changed to use IO_CACHE instead of FILE BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted
Diffstat (limited to 'mysys')
-rw-r--r--mysys/Makefile.am2
-rw-r--r--mysys/mf_iocache2.c212
2 files changed, 213 insertions, 1 deletions
diff --git a/mysys/Makefile.am b/mysys/Makefile.am
index 3d60716e358..9e9b4f8d9ed 100644
--- a/mysys/Makefile.am
+++ b/mysys/Makefile.am
@@ -27,7 +27,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c\
my_open.c my_create.c my_seek.c my_read.c \
my_pread.c my_write.c \
mf_keycache.c \
- mf_iocache.c mf_cache.c mf_tempfile.c \
+ mf_iocache.c mf_iocache2.c mf_cache.c mf_tempfile.c \
my_lock.c mf_brkhant.c my_alarm.c \
my_malloc.c my_realloc.c my_once.c mulalloc.c \
my_alloc.c safemalloc.c my_fopen.c my_fstream.c \
diff --git a/mysys/mf_iocache2.c b/mysys/mf_iocache2.c
new file mode 100644
index 00000000000..80cea47a80f
--- /dev/null
+++ b/mysys/mf_iocache2.c
@@ -0,0 +1,212 @@
+/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA */
+
+/*
+ More functions to be used with IO_CACHE files
+*/
+
+#define MAP_TO_USE_RAID
+#include "mysys_priv.h"
+#include <m_string.h>
+#include <stdarg.h>
+#include <m_ctype.h>
+
+/*
+** Fix that next read will be made at certain position
+** This only works with READ_CACHE
+*/
+
+void my_b_seek(IO_CACHE *info,my_off_t pos)
+{
+ info->seek_not_done=0;
+ info->pos_in_file=pos;
+ info->rc_pos=info->rc_end=info->buffer;
+}
+
+/*
+** Fill buffer
+** return: 0 on error or EOF (info->error = -1 on error)
+** number of characters
+*/
+
+uint my_b_fill(IO_CACHE *info)
+{
+ my_off_t pos_in_file=info->pos_in_file+(uint) (info->rc_end - info->buffer);
+ my_off_t max_length;
+ uint diff_length,length;
+ if (info->seek_not_done)
+ { /* File touched, do seek */
+ if (my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0)) ==
+ MY_FILEPOS_ERROR)
+ {
+ info->error= 0;
+ return 0;
+ }
+ info->seek_not_done=0;
+ }
+ diff_length=(uint) (pos_in_file & (IO_SIZE-1));
+ max_length= (my_off_t) (info->end_of_file - pos_in_file);
+ if (max_length > (my_off_t) (info->read_length-diff_length))
+ max_length=(my_off_t) (info->read_length-diff_length);
+ if (!max_length)
+ {
+ info->error= 0;
+ return 0; /* EOF */
+ }
+ else if ((length=my_read(info->file,info->buffer,(uint) max_length,
+ info->myflags)) == (uint) -1)
+ {
+ info->error= -1;
+ return 0;
+ }
+ info->rc_pos=info->buffer;
+ info->rc_end=info->buffer+length;
+ info->pos_in_file=pos_in_file;
+ return length;
+}
+
+/*
+** Read a string ended by '\n' into a buffer of 'max_length' size.
+** Returns number of characters read, 0 on error.
+** last byte is set to '\0'
+*/
+
+uint my_b_gets(IO_CACHE *info, char *to, uint max_length)
+{
+ uint length;
+ max_length--; /* Save place for end \0 */
+ /* Calculate number of characters in buffer */
+ if (!(length= (uint) (info->rc_end - info->rc_pos)))
+ if (!(length=my_b_fill(info)))
+ return 0;
+ for (;;)
+ {
+ char *pos,*end;
+ if (length > max_length)
+ length=max_length;
+ for (pos=info->rc_pos,end=pos+length ; pos < end ;)
+ {
+ if ((*to++ = *pos++) == '\n')
+ {
+ length= (uint) (pos-info->rc_pos);
+ info->rc_pos=pos;
+ *to='\0';
+ return length;
+ }
+ }
+ if (!(max_length-=length))
+ {
+ /* Found enough charcters; Return found string */
+ info->rc_pos=pos;
+ *to='\0';
+ return length;
+ }
+ if (!(length=my_b_fill(info)))
+ return 0;
+ }
+}
+
+/*
+ Simple printf version. Supports '%s', '%d', '%u', "%ld" and "%lu"
+ Used for logging in MySQL
+ returns number of written character, or (uint) -1 on error
+*/
+
+uint my_b_printf(IO_CACHE *info, const char* fmt, ...)
+{
+ va_list args;
+ reg1 char *to= info->rc_pos;
+ char *end=info->rc_end;
+ uint out_length=0;
+
+ va_start(args,fmt);
+
+ for (; *fmt ; fmt++)
+ {
+ if (fmt[0] != '%')
+ {
+ /* Copy everything until '%' or end of string */
+ const char *start=fmt;
+ uint length;
+ for (fmt++ ; *fmt && *fmt != '%' ; fmt++ ) ;
+ length= (uint) (fmt - start);
+ out_length+=length;
+ if (my_b_write(info, start, length))
+ goto err;
+ if (!*fmt) /* End of format */
+ {
+ va_end(args);
+ return out_length;
+ }
+ /* Found one '%' */
+ }
+ /* Skipp if max size is used (to be compatible with printf) */
+ while (isdigit(*fmt) || *fmt == '.' || *fmt == '-')
+ fmt++;
+ if (*fmt == 's') /* String parameter */
+ {
+ reg2 char *par = va_arg(args, char *);
+ uint length = (uint) strlen(par);
+ out_length+=length;
+ if (my_b_write(info, par, length))
+ goto err;
+ }
+ else if (*fmt == 'd' || *fmt == 'u') /* Integer parameter */
+ {
+ register int iarg;
+ uint length;
+ char buff[17];
+
+ iarg = va_arg(args, int);
+ if (*fmt == 'd')
+ length= (uint) (int10_to_str((long) iarg,buff, -10) - buff);
+ else
+ length= (uint) (int10_to_str((long) (uint) iarg,buff,10)- buff);
+ out_length+=length;
+ if (my_b_write(info, buff, length))
+ goto err;
+ }
+ else if (*fmt == 'l' && fmt[1] == 'd' || fmt[1] == 'u')/* long parameter */
+ {
+ register long iarg;
+ uint length;
+ char buff[17];
+
+ iarg = va_arg(args, long);
+ if (*++fmt == 'd')
+ length= (uint) (int10_to_str(iarg,buff, -10) - buff);
+ else
+ length= (uint) (int10_to_str(iarg,buff,10)- buff);
+ out_length+=length;
+ if (my_b_write(info, buff, length))
+ goto err;
+ }
+ else
+ {
+ /* %% or unknown code */
+ if (my_b_write(info, "%", 1))
+ goto err;
+ out_length++;
+ }
+ }
+ va_end(args);
+ return out_length;
+
+err:
+ return (uint) -1;
+ va_end(args);
+}