diff options
author | unknown <monty@donna.mysql.com> | 2000-11-16 03:58:58 +0200 |
---|---|---|
committer | unknown <monty@donna.mysql.com> | 2000-11-16 03:58:58 +0200 |
commit | 3e6dac34cd5b8ef322d375f3af22137822656c8a (patch) | |
tree | 4b8f3df4d2aef33906b1e7e311b909e12f38539e /mysys | |
parent | c7d2c59ceb4e3548eb74e5d8fba16e0f41ffc7d9 (diff) | |
download | mariadb-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.am | 2 | ||||
-rw-r--r-- | mysys/mf_iocache2.c | 212 |
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); +} |