mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 19:11:46 +01:00
Merge mjorgensen@bk-internal.mysql.com:/home/bk/mysql-5.1
into thorsen-consulting.dk:/Users/mmj/bktrees/mysql-5.1-build
This commit is contained in:
commit
4e0e863a4e
11 changed files with 289 additions and 171 deletions
|
@ -5210,16 +5210,32 @@ create table bug22080_3 (id int,string varchar(64)) Engine=CSV;
|
||||||
insert into bug22080_1 values(1,'string');
|
insert into bug22080_1 values(1,'string');
|
||||||
insert into bug22080_1 values(2,'string');
|
insert into bug22080_1 values(2,'string');
|
||||||
insert into bug22080_1 values(3,'string');
|
insert into bug22080_1 values(3,'string');
|
||||||
"1","string"
|
1,"string"
|
||||||
2","string"
|
2","string"
|
||||||
"3","string"
|
3,"string"
|
||||||
check table bug22080_2;
|
check table bug22080_2;
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.bug22080_2 check error Corrupt
|
test.bug22080_2 check error Corrupt
|
||||||
"1","string"
|
1,"string"
|
||||||
"2",string"
|
2,"string"
|
||||||
"3","string"
|
3,"string"
|
||||||
check table bug22080_3;
|
check table bug22080_3;
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.bug22080_3 check error Corrupt
|
test.bug22080_3 check error Corrupt
|
||||||
drop tables bug22080_1,bug22080_2,bug22080_3;
|
drop tables bug22080_1,bug22080_2,bug22080_3;
|
||||||
|
create table float_test (id float,string varchar(64)) Engine=CSV;
|
||||||
|
insert into float_test values(1.0,'string');
|
||||||
|
insert into float_test values(2.23,'serg.g');
|
||||||
|
insert into float_test values(0.03,'string');
|
||||||
|
insert into float_test values(0.19,'string');
|
||||||
|
insert into float_test values(.67,'string');
|
||||||
|
insert into float_test values(9.67,'string');
|
||||||
|
select * from float_test;
|
||||||
|
id string
|
||||||
|
1 string
|
||||||
|
2.23 serg.g
|
||||||
|
0.03 string
|
||||||
|
0.19 string
|
||||||
|
0.67 string
|
||||||
|
9.67 string
|
||||||
|
drop table float_test;
|
||||||
|
|
|
@ -166,10 +166,10 @@ show variables like 'max_error_count';
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
max_error_count 10
|
max_error_count 10
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (id int) engine=NDB;
|
create table t1 (id int) engine=Innodb;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1266 Using storage engine MyISAM for table 't1'
|
Warning 1266 Using storage engine MyISAM for table 't1'
|
||||||
alter table t1 engine=NDB;
|
alter table t1 engine=Innodb;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1266 Using storage engine MyISAM for table 't1'
|
Warning 1266 Using storage engine MyISAM for table 't1'
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
|
@ -1595,7 +1595,7 @@ insert into bug22080_1 values(2,'string');
|
||||||
insert into bug22080_1 values(3,'string');
|
insert into bug22080_1 values(3,'string');
|
||||||
|
|
||||||
# Currupt the file as described in the bug report
|
# Currupt the file as described in the bug report
|
||||||
--exec sed -e 's/"2"/2"/' $MYSQLTEST_VARDIR/master-data/test/bug22080_1.CSV > $MYSQLTEST_VARDIR/master-data/test/bug22080_2.CSV
|
--exec sed -e 's/2/2"/' $MYSQLTEST_VARDIR/master-data/test/bug22080_1.CSV > $MYSQLTEST_VARDIR/master-data/test/bug22080_2.CSV
|
||||||
--exec sed -e 's/2","/2",/' $MYSQLTEST_VARDIR/master-data/test/bug22080_1.CSV > $MYSQLTEST_VARDIR/master-data/test/bug22080_3.CSV
|
--exec sed -e 's/2","/2",/' $MYSQLTEST_VARDIR/master-data/test/bug22080_1.CSV > $MYSQLTEST_VARDIR/master-data/test/bug22080_3.CSV
|
||||||
|
|
||||||
--exec cat $MYSQLTEST_VARDIR/master-data/test/bug22080_2.CSV
|
--exec cat $MYSQLTEST_VARDIR/master-data/test/bug22080_2.CSV
|
||||||
|
@ -1605,3 +1605,17 @@ check table bug22080_2;
|
||||||
check table bug22080_3;
|
check table bug22080_3;
|
||||||
|
|
||||||
drop tables bug22080_1,bug22080_2,bug22080_3;
|
drop tables bug22080_1,bug22080_2,bug22080_3;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Testing float type
|
||||||
|
#
|
||||||
|
create table float_test (id float,string varchar(64)) Engine=CSV;
|
||||||
|
insert into float_test values(1.0,'string');
|
||||||
|
insert into float_test values(2.23,'serg.g');
|
||||||
|
insert into float_test values(0.03,'string');
|
||||||
|
insert into float_test values(0.19,'string');
|
||||||
|
insert into float_test values(.67,'string');
|
||||||
|
insert into float_test values(9.67,'string');
|
||||||
|
select * from float_test;
|
||||||
|
|
||||||
|
drop table float_test;
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
--skip-innodb
|
|
@ -113,8 +113,8 @@ show variables like 'max_error_count';
|
||||||
# Test for handler type
|
# Test for handler type
|
||||||
#
|
#
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (id int) engine=NDB;
|
create table t1 (id int) engine=Innodb;
|
||||||
alter table t1 engine=NDB;
|
alter table t1 engine=Innodb;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -150,8 +150,6 @@ drop table t1;
|
||||||
# Bug#20778: strange characters in warning message 1366 when called in SP
|
# Bug#20778: strange characters in warning message 1366 when called in SP
|
||||||
#
|
#
|
||||||
|
|
||||||
let $engine_type= innodb;
|
|
||||||
|
|
||||||
CREATE TABLE t1( f1 CHAR(20) );
|
CREATE TABLE t1( f1 CHAR(20) );
|
||||||
CREATE TABLE t2( f1 CHAR(20), f2 CHAR(25) );
|
CREATE TABLE t2( f1 CHAR(20), f2 CHAR(25) );
|
||||||
CREATE TABLE t3( f1 CHAR(20), f2 CHAR(25), f3 DATE );
|
CREATE TABLE t3( f1 CHAR(20), f2 CHAR(25), f3 DATE );
|
||||||
|
|
|
@ -19,4 +19,4 @@ SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX")
|
||||||
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/sql
|
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/sql
|
||||||
${CMAKE_SOURCE_DIR}/regex
|
${CMAKE_SOURCE_DIR}/regex
|
||||||
${CMAKE_SOURCE_DIR}/extra/yassl/include)
|
${CMAKE_SOURCE_DIR}/extra/yassl/include)
|
||||||
ADD_LIBRARY(csv ha_tina.cc ha_tina.h)
|
ADD_LIBRARY(csv ha_tina.cc ha_tina.h transparent_file.cc transparent_file.h)
|
||||||
|
|
|
@ -27,18 +27,18 @@ INCLUDES = -I$(top_builddir)/include \
|
||||||
LDADD =
|
LDADD =
|
||||||
|
|
||||||
DEFS = @DEFS@
|
DEFS = @DEFS@
|
||||||
noinst_HEADERS = ha_tina.h
|
noinst_HEADERS = ha_tina.h transparent_file.h
|
||||||
|
|
||||||
EXTRA_LTLIBRARIES = ha_csv.la
|
EXTRA_LTLIBRARIES = ha_csv.la
|
||||||
pkglib_LTLIBRARIES = @plugin_csv_shared_target@
|
pkglib_LTLIBRARIES = @plugin_csv_shared_target@
|
||||||
ha_csv_la_LDFLAGS = -module -rpath $(MYSQLLIBdir)
|
ha_csv_la_LDFLAGS = -module -rpath $(MYSQLLIBdir)
|
||||||
ha_csv_la_CXXFLAGS = $(AM_CFLAGS) -DMYSQL_PLUGIN
|
ha_csv_la_CXXFLAGS = $(AM_CFLAGS) -DMYSQL_PLUGIN
|
||||||
ha_csv_la_SOURCES = ha_tina.cc
|
ha_csv_la_SOURCES = transparent_file.cc ha_tina.cc
|
||||||
|
|
||||||
EXTRA_LIBRARIES = libcsv.a
|
EXTRA_LIBRARIES = libcsv.a
|
||||||
noinst_LIBRARIES = @plugin_csv_static_target@
|
noinst_LIBRARIES = @plugin_csv_static_target@
|
||||||
libcsv_a_CXXFLAGS = $(AM_CFLAGS)
|
libcsv_a_CXXFLAGS = $(AM_CFLAGS)
|
||||||
libcsv_a_SOURCES = ha_tina.cc
|
libcsv_a_SOURCES = transparent_file.cc ha_tina.cc
|
||||||
|
|
||||||
EXTRA_DIST = CMakeLists.txt plug.in
|
EXTRA_DIST = CMakeLists.txt plug.in
|
||||||
# Don't update the files from bitkeeper
|
# Don't update the files from bitkeeper
|
||||||
|
|
|
@ -77,54 +77,6 @@ static handler *tina_create_handler(handlerton *hton,
|
||||||
MEM_ROOT *mem_root);
|
MEM_ROOT *mem_root);
|
||||||
|
|
||||||
|
|
||||||
off_t Transparent_file::read_next()
|
|
||||||
{
|
|
||||||
off_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= my_read(filedes, buff, buff_size, MYF(0))) == MY_FILE_ERROR)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* end of file */
|
|
||||||
if (!bytes_read)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
lower_bound= upper_bound;
|
|
||||||
upper_bound+= bytes_read;
|
|
||||||
|
|
||||||
return lower_bound;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char Transparent_file::get_value(off_t offset)
|
|
||||||
{
|
|
||||||
off_t bytes_read;
|
|
||||||
|
|
||||||
/* check boundaries */
|
|
||||||
if ((lower_bound <= offset) && (offset < upper_bound))
|
|
||||||
return buff[offset - lower_bound];
|
|
||||||
else
|
|
||||||
{
|
|
||||||
VOID(my_seek(filedes, offset, MY_SEEK_SET, MYF(0)));
|
|
||||||
/* read appropriate portion of the file */
|
|
||||||
if ((bytes_read= my_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 == offset)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return buff[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
** TINA tables
|
** TINA tables
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
@ -510,6 +462,7 @@ int ha_tina::encode_quote(byte *buf)
|
||||||
|
|
||||||
my_bitmap_map *org_bitmap= dbug_tmp_use_all_columns(table, table->read_set);
|
my_bitmap_map *org_bitmap= dbug_tmp_use_all_columns(table, table->read_set);
|
||||||
buffer.length(0);
|
buffer.length(0);
|
||||||
|
|
||||||
for (Field **field=table->field ; *field ; field++)
|
for (Field **field=table->field ; *field ; field++)
|
||||||
{
|
{
|
||||||
const char *ptr;
|
const char *ptr;
|
||||||
|
@ -526,12 +479,13 @@ int ha_tina::encode_quote(byte *buf)
|
||||||
buffer.append(STRING_WITH_LEN("\"\","));
|
buffer.append(STRING_WITH_LEN("\"\","));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
(*field)->val_str(&attribute,&attribute);
|
(*field)->val_str(&attribute,&attribute);
|
||||||
|
|
||||||
|
if ((*field)->str_needs_quotes())
|
||||||
|
{
|
||||||
ptr= attribute.ptr();
|
ptr= attribute.ptr();
|
||||||
end_ptr= attribute.length() + ptr;
|
end_ptr= attribute.length() + ptr;
|
||||||
}
|
|
||||||
|
|
||||||
buffer.append('"');
|
buffer.append('"');
|
||||||
|
|
||||||
|
@ -565,11 +519,18 @@ int ha_tina::encode_quote(byte *buf)
|
||||||
buffer.append(*ptr++);
|
buffer.append(*ptr++);
|
||||||
}
|
}
|
||||||
buffer.append('"');
|
buffer.append('"');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buffer.append(attribute);
|
||||||
|
}
|
||||||
|
|
||||||
buffer.append(',');
|
buffer.append(',');
|
||||||
}
|
}
|
||||||
// Remove the comma, add a line feed
|
// Remove the comma, add a line feed
|
||||||
buffer.length(buffer.length() - 1);
|
buffer.length(buffer.length() - 1);
|
||||||
buffer.append('\n');
|
buffer.append('\n');
|
||||||
|
|
||||||
//buffer.replace(buffer.length(), 0, "\n", 1);
|
//buffer.replace(buffer.length(), 0, "\n", 1);
|
||||||
|
|
||||||
dbug_tmp_restore_column_map(table->read_set, org_bitmap);
|
dbug_tmp_restore_column_map(table->read_set, org_bitmap);
|
||||||
|
@ -649,9 +610,9 @@ int ha_tina::find_current_row(byte *buf)
|
||||||
buffer.length(0);
|
buffer.length(0);
|
||||||
if (curr_offset < end_offset &&
|
if (curr_offset < end_offset &&
|
||||||
file_buff->get_value(curr_offset) == '"')
|
file_buff->get_value(curr_offset) == '"')
|
||||||
|
{
|
||||||
curr_offset++; // Incrementpast the first quote
|
curr_offset++; // Incrementpast the first quote
|
||||||
else
|
|
||||||
goto err;
|
|
||||||
for(;curr_offset < end_offset; curr_offset++)
|
for(;curr_offset < end_offset; curr_offset++)
|
||||||
{
|
{
|
||||||
// Need to convert line feeds!
|
// Need to convert line feeds!
|
||||||
|
@ -690,6 +651,31 @@ int ha_tina::find_current_row(byte *buf)
|
||||||
buffer.append(file_buff->get_value(curr_offset));
|
buffer.append(file_buff->get_value(curr_offset));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else if (my_isdigit(system_charset_info,
|
||||||
|
file_buff->get_value(curr_offset)))
|
||||||
|
{
|
||||||
|
for(;curr_offset < end_offset; curr_offset++)
|
||||||
|
{
|
||||||
|
if (file_buff->get_value(curr_offset) == ',')
|
||||||
|
{
|
||||||
|
curr_offset+= 1; // Move past the ,
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (my_isdigit(system_charset_info, file_buff->get_value(curr_offset)))
|
||||||
|
buffer.append(file_buff->get_value(curr_offset));
|
||||||
|
else if (file_buff->get_value(curr_offset) == '.')
|
||||||
|
buffer.append(file_buff->get_value(curr_offset));
|
||||||
|
else
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
if (bitmap_is_set(table->read_set, (*field)->field_index))
|
if (bitmap_is_set(table->read_set, (*field)->field_index))
|
||||||
(*field)->store(buffer.ptr(), buffer.length(), system_charset_info);
|
(*field)->store(buffer.ptr(), buffer.length(), system_charset_info);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <my_dir.h>
|
#include <my_dir.h>
|
||||||
|
#include "transparent_file.h"
|
||||||
|
|
||||||
#define DEFAULT_CHAIN_LENGTH 512
|
#define DEFAULT_CHAIN_LENGTH 512
|
||||||
/*
|
/*
|
||||||
|
@ -55,49 +56,6 @@ struct tina_set {
|
||||||
off_t end;
|
off_t end;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Transparent_file
|
|
||||||
{
|
|
||||||
File filedes;
|
|
||||||
byte *buff; /* in-memory window to the file or mmaped area */
|
|
||||||
/* current window sizes */
|
|
||||||
off_t lower_bound;
|
|
||||||
off_t upper_bound;
|
|
||||||
uint buff_size;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
Transparent_file() : lower_bound(0), buff_size(IO_SIZE)
|
|
||||||
{ buff= (byte *) my_malloc(buff_size*sizeof(byte), MYF(MY_WME)); }
|
|
||||||
|
|
||||||
~Transparent_file()
|
|
||||||
{ my_free((gptr)buff, MYF(MY_ALLOW_ZERO_PTR)); }
|
|
||||||
|
|
||||||
void init_buff(File filedes_arg)
|
|
||||||
{
|
|
||||||
filedes= filedes_arg;
|
|
||||||
/* read the beginning of the file */
|
|
||||||
lower_bound= 0;
|
|
||||||
VOID(my_seek(filedes, 0, MY_SEEK_SET, MYF(0)));
|
|
||||||
if (filedes && buff)
|
|
||||||
upper_bound= my_read(filedes, buff, buff_size, MYF(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
byte *ptr()
|
|
||||||
{ return buff; }
|
|
||||||
|
|
||||||
off_t start()
|
|
||||||
{ return lower_bound; }
|
|
||||||
|
|
||||||
off_t end()
|
|
||||||
{ return upper_bound; }
|
|
||||||
|
|
||||||
/* get a char from the given position in the file */
|
|
||||||
char get_value (off_t offset);
|
|
||||||
/* shift a buffer windows to see the next part of the file */
|
|
||||||
off_t read_next();
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
class ha_tina: public handler
|
class ha_tina: public handler
|
||||||
{
|
{
|
||||||
THR_LOCK_DATA lock; /* MySQL lock */
|
THR_LOCK_DATA lock; /* MySQL lock */
|
||||||
|
|
104
storage/csv/transparent_file.cc
Normal file
104
storage/csv/transparent_file.cc
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
/* Copyright (C) 2003 MySQL AB
|
||||||
|
|
||||||
|
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||||
|
|
||||||
|
#ifdef USE_PRAGMA_IMPLEMENTATION
|
||||||
|
#pragma implementation // gcc: Class implementation
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "mysql_priv.h"
|
||||||
|
#include "transparent_file.h"
|
||||||
|
|
||||||
|
Transparent_file::Transparent_file() : lower_bound(0), buff_size(IO_SIZE)
|
||||||
|
{
|
||||||
|
buff= (byte *) my_malloc(buff_size*sizeof(byte), MYF(MY_WME));
|
||||||
|
}
|
||||||
|
|
||||||
|
Transparent_file::~Transparent_file()
|
||||||
|
{
|
||||||
|
my_free((gptr)buff, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Transparent_file::init_buff(File filedes_arg)
|
||||||
|
{
|
||||||
|
filedes= filedes_arg;
|
||||||
|
/* read the beginning of the file */
|
||||||
|
lower_bound= 0;
|
||||||
|
VOID(my_seek(filedes, 0, MY_SEEK_SET, MYF(0)));
|
||||||
|
if (filedes && buff)
|
||||||
|
upper_bound= my_read(filedes, buff, buff_size, MYF(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
byte *Transparent_file::ptr()
|
||||||
|
{
|
||||||
|
return buff;
|
||||||
|
}
|
||||||
|
|
||||||
|
off_t Transparent_file::start()
|
||||||
|
{
|
||||||
|
return lower_bound;
|
||||||
|
}
|
||||||
|
|
||||||
|
off_t Transparent_file::end()
|
||||||
|
{
|
||||||
|
return upper_bound;
|
||||||
|
}
|
||||||
|
|
||||||
|
off_t Transparent_file::read_next()
|
||||||
|
{
|
||||||
|
off_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= my_read(filedes, buff, buff_size, MYF(0))) == MY_FILE_ERROR)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* end of file */
|
||||||
|
if (!bytes_read)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
lower_bound= upper_bound;
|
||||||
|
upper_bound+= bytes_read;
|
||||||
|
|
||||||
|
return lower_bound;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char Transparent_file::get_value(off_t offset)
|
||||||
|
{
|
||||||
|
off_t bytes_read;
|
||||||
|
|
||||||
|
/* check boundaries */
|
||||||
|
if ((lower_bound <= offset) && (offset < upper_bound))
|
||||||
|
return buff[offset - lower_bound];
|
||||||
|
else
|
||||||
|
{
|
||||||
|
VOID(my_seek(filedes, offset, MY_SEEK_SET, MYF(0)));
|
||||||
|
/* read appropriate portion of the file */
|
||||||
|
if ((bytes_read= my_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 == offset)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return buff[0];
|
||||||
|
}
|
||||||
|
}
|
41
storage/csv/transparent_file.h
Normal file
41
storage/csv/transparent_file.h
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
/* Copyright (C) 2003 MySQL AB
|
||||||
|
|
||||||
|
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <my_dir.h>
|
||||||
|
|
||||||
|
|
||||||
|
class Transparent_file
|
||||||
|
{
|
||||||
|
File filedes;
|
||||||
|
byte *buff; /* in-memory window to the file or mmaped area */
|
||||||
|
/* current window sizes */
|
||||||
|
off_t lower_bound;
|
||||||
|
off_t upper_bound;
|
||||||
|
uint buff_size;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Transparent_file();
|
||||||
|
~Transparent_file();
|
||||||
|
|
||||||
|
void init_buff(File filedes_arg);
|
||||||
|
byte *ptr();
|
||||||
|
off_t start();
|
||||||
|
off_t end();
|
||||||
|
char get_value (off_t offset);
|
||||||
|
off_t read_next();
|
||||||
|
};
|
Loading…
Add table
Reference in a new issue