diff options
Diffstat (limited to 'client/readline.cc')
-rw-r--r-- | client/readline.cc | 78 |
1 files changed, 47 insertions, 31 deletions
diff --git a/client/readline.cc b/client/readline.cc index f0310530128..0f3fab7e43d 100644 --- a/client/readline.cc +++ b/client/readline.cc @@ -1,6 +1,5 @@ /* - Copyright (c) 2000-2002, 2004-2006 MySQL AB, 2009 Sun Microsystems, Inc. - Use is subject to license terms. + Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,37 +20,46 @@ #include <my_global.h> #include <my_sys.h> #include <m_string.h> +#include <my_dir.h> #include "my_readline.h" static bool init_line_buffer(LINE_BUFFER *buffer,File file,ulong size, ulong max_size); -static bool init_line_buffer_from_string(LINE_BUFFER *buffer,my_string str); -static uint fill_buffer(LINE_BUFFER *buffer); -static char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length, bool *truncated); +static bool init_line_buffer_from_string(LINE_BUFFER *buffer,char * str); +static size_t fill_buffer(LINE_BUFFER *buffer); +static char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length); LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file) { LINE_BUFFER *line_buff; + MY_STAT input_file_stat; + +#ifndef __WIN__ + if (my_fstat(fileno(file), &input_file_stat, MYF(MY_WME)) || + MY_S_ISDIR(input_file_stat.st_mode) || + MY_S_ISBLK(input_file_stat.st_mode)) + return 0; +#endif + if (!(line_buff=(LINE_BUFFER*) my_malloc(sizeof(*line_buff),MYF(MY_WME | MY_ZEROFILL)))) return 0; if (init_line_buffer(line_buff,fileno(file),IO_SIZE,max_size)) { - my_free((char*) line_buff,MYF(0)); + my_free(line_buff,MYF(0)); return 0; } return line_buff; } -char *batch_readline(LINE_BUFFER *line_buff, bool *truncated) +char *batch_readline(LINE_BUFFER *line_buff) { char *pos; ulong out_length; - DBUG_ASSERT(truncated != NULL); - if (!(pos=intern_read_line(line_buff,&out_length, truncated))) + if (!(pos=intern_read_line(line_buff, &out_length))) return 0; if (out_length && pos[out_length-1] == '\n') if (--out_length && pos[out_length-1] == '\r') /* Remove '\n' */ @@ -66,13 +74,13 @@ void batch_readline_end(LINE_BUFFER *line_buff) { if (line_buff) { - my_free((gptr) line_buff->buffer,MYF(MY_ALLOW_ZERO_PTR)); - my_free((char*) line_buff,MYF(0)); + my_free(line_buff->buffer,MYF(MY_ALLOW_ZERO_PTR)); + my_free(line_buff,MYF(0)); } } -LINE_BUFFER *batch_readline_command(LINE_BUFFER *line_buff, my_string str) +LINE_BUFFER *batch_readline_command(LINE_BUFFER *line_buff, char * str) { if (!line_buff) if (!(line_buff=(LINE_BUFFER*) @@ -80,7 +88,7 @@ LINE_BUFFER *batch_readline_command(LINE_BUFFER *line_buff, my_string str) return 0; if (init_line_buffer_from_string(line_buff,str)) { - my_free((char*) line_buff,MYF(0)); + my_free(line_buff,MYF(0)); return 0; } return line_buff; @@ -110,13 +118,13 @@ init_line_buffer(LINE_BUFFER *buffer,File file,ulong size,ulong max_buffer) several times. the resulting buffer will contain a concatenation of all strings separated by spaces */ -static bool init_line_buffer_from_string(LINE_BUFFER *buffer,my_string str) +static bool init_line_buffer_from_string(LINE_BUFFER *buffer,char * str) { uint old_length=(uint)(buffer->end - buffer->buffer); uint length= (uint) strlen(str); if (!(buffer->buffer= buffer->start_of_line= buffer->end_of_line= - (char*)my_realloc(buffer->buffer, old_length+length+2, - MYF(MY_FAE|MY_ALLOW_ZERO_PTR)))) + (char*) my_realloc((uchar*) buffer->buffer, old_length+length+2, + MYF(MY_FAE|MY_ALLOW_ZERO_PTR)))) return 1; buffer->end= buffer->buffer + old_length; if (old_length) @@ -137,9 +145,9 @@ static bool init_line_buffer_from_string(LINE_BUFFER *buffer,my_string str) bytes read from disk. */ -static uint fill_buffer(LINE_BUFFER *buffer) +static size_t fill_buffer(LINE_BUFFER *buffer) { - uint read_count; + size_t read_count; uint bufbytes= (uint) (buffer->end - buffer->start_of_line); if (buffer->eof) @@ -165,7 +173,10 @@ static uint fill_buffer(LINE_BUFFER *buffer) if (!(buffer->buffer = (char*) my_realloc(buffer->buffer, buffer->bufread+1, MYF(MY_WME | MY_FAE)))) - return (uint) -1; + { + buffer->error= my_errno; + return (size_t) -1; + } buffer->start_of_line=buffer->buffer+start_offset; buffer->end=buffer->buffer+bufbytes; } @@ -178,11 +189,14 @@ static uint fill_buffer(LINE_BUFFER *buffer) } /* Read in new stuff. */ - if ((read_count= my_read(buffer->file, (byte*) buffer->end, read_count, + if ((read_count= my_read(buffer->file, (uchar*) buffer->end, read_count, MYF(MY_WME))) == MY_FILE_ERROR) - return read_count; + { + buffer->error= my_errno; + return (size_t) -1; + } - DBUG_PRINT("fill_buff", ("Got %d bytes", read_count)); + DBUG_PRINT("fill_buff", ("Got %lu bytes", (ulong) read_count)); if (!read_count) { @@ -201,11 +215,10 @@ static uint fill_buffer(LINE_BUFFER *buffer) } - -char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length, bool *truncated) +char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length) { char *pos; - uint length; + size_t length; DBUG_ENTER("intern_read_line"); buffer->start_of_line=buffer->end_of_line; @@ -217,22 +230,25 @@ char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length, bool *truncated) if (pos == buffer->end) { /* - fill_buffer() can return 0 either on EOF in which case we abort - or when the internal buffer has hit the size limit. In the latter case - return what we have read so far and signal string truncation. + fill_buffer() can return NULL on EOF (in which case we abort), + on error, or when the internal buffer has hit the size limit. + In the latter case return what we have read so far and signal + string truncation. */ - if (!(length=fill_buffer(buffer)) || length == (uint) -1) + if (!(length= fill_buffer(buffer))) { if (buffer->eof) DBUG_RETURN(0); } + else if (length == (size_t) -1) + DBUG_RETURN(NULL); else continue; pos--; /* break line here */ - *truncated= 1; + buffer->truncated= 1; } else - *truncated= 0; + buffer->truncated= 0; buffer->end_of_line=pos+1; *out_length=(ulong) (pos + 1 - buffer->eof - buffer->start_of_line); DBUG_RETURN(buffer->start_of_line); |