From a175314c3e5827eb193872241446f2f8f5c9d33c Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 4 May 2024 20:07:14 +0200 Subject: Adding upstream version 1:10.5.12. Signed-off-by: Daniel Baumann --- storage/csv/transparent_file.cc | 109 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 storage/csv/transparent_file.cc (limited to 'storage/csv/transparent_file.cc') diff --git a/storage/csv/transparent_file.cc b/storage/csv/transparent_file.cc new file mode 100644 index 00000000..443e61d0 --- /dev/null +++ b/storage/csv/transparent_file.cc @@ -0,0 +1,109 @@ +/* Copyright (c) 2003, 2010, 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 + the Free Software Foundation; version 2 of the License. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ + +#ifdef USE_PRAGMA_IMPLEMENTATION +#pragma implementation // gcc: Class implementation +#endif + +#include +#include "sql_priv.h" +#include +#include "transparent_file.h" +#include "my_sys.h" // MY_WME, MY_ALLOW_ZERO_PTR, MY_SEEK_SET + +PSI_memory_key csv_key_memory_Transparent_file; + +Transparent_file::Transparent_file() : lower_bound(0), buff_size(IO_SIZE) +{ + buff= (uchar *) my_malloc(csv_key_memory_Transparent_file, + buff_size*sizeof(uchar), MYF(MY_WME)); +} + +Transparent_file::~Transparent_file() +{ + my_free(buff); +} + +void Transparent_file::init_buff(File filedes_arg) +{ + filedes= filedes_arg; + /* read the beginning of the file */ + lower_bound= 0; + mysql_file_seek(filedes, 0, MY_SEEK_SET, MYF(0)); + if (filedes && buff) + upper_bound= mysql_file_read(filedes, buff, buff_size, MYF(0)); +} + +uchar *Transparent_file::ptr() +{ + return buff; +} + +my_off_t Transparent_file::start() +{ + return lower_bound; +} + +my_off_t Transparent_file::end() +{ + return upper_bound; +} + +my_off_t Transparent_file::read_next() +{ + size_t bytes_read; + + /* + No need to seek here, as the file managed by Transparent_file class + always points to upper_bound byte + */ + if ((bytes_read= mysql_file_read(filedes, buff, buff_size, MYF(0))) + == MY_FILE_ERROR) + return (my_off_t) -1; + + /* end of file */ + if (!bytes_read) + return (my_off_t) -1; + + lower_bound= upper_bound; + upper_bound+= bytes_read; + + return lower_bound; +} + + +char Transparent_file::get_value(my_off_t offset) +{ + size_t bytes_read; + + /* check boundaries */ + if ((lower_bound <= offset) && (((my_off_t) offset) < upper_bound)) + return buff[offset - lower_bound]; + + mysql_file_seek(filedes, offset, MY_SEEK_SET, MYF(0)); + /* read appropriate portion of the file */ + if ((bytes_read= mysql_file_read(filedes, buff, buff_size, + MYF(0))) == MY_FILE_ERROR) + return 0; + + lower_bound= offset; + upper_bound= lower_bound + bytes_read; + + /* end of file */ + if (upper_bound == (my_off_t) offset) + return 0; + + return buff[0]; +} -- cgit v1.2.3