diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 18:00:34 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 18:00:34 +0000 |
commit | 3f619478f796eddbba6e39502fe941b285dd97b1 (patch) | |
tree | e2c7b5777f728320e5b5542b6213fd3591ba51e2 /storage/csv/transparent_file.cc | |
parent | Initial commit. (diff) | |
download | mariadb-upstream.tar.xz mariadb-upstream.zip |
Adding upstream version 1:10.11.6.upstream/1%10.11.6upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | storage/csv/transparent_file.cc | 109 |
1 files changed, 109 insertions, 0 deletions
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 <my_global.h> +#include "sql_priv.h" +#include <mysql/psi/mysql_file.h> +#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]; +} |