1
/* Copyright (C) 2003 MySQL AB
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
16
#ifndef PLUGIN_CSV_HA_TINA_H
17
#define PLUGIN_CSV_HA_TINA_H
19
#include <drizzled/cursor.h>
20
#include <drizzled/thr_lock.h>
22
#include <sys/types.h>
24
#include "transparent_file.h"
27
Version for file format.
28
1 - Initial Version. That is, the version when the metafile was introduced.
31
#define TINA_VERSION 1
36
TinaShare(const TinaShare &);
37
TinaShare& operator=(const TinaShare &);
39
explicit TinaShare(const std::string &name);
42
std::string table_name;
43
std::string data_file_name;
46
Here we save the length of the file for readers. This is updated by
47
inserts, updates and deletes. The var is initialized along with the
50
off_t saved_data_file_length;
51
pthread_mutex_t mutex;
52
bool update_file_opened;
53
bool tina_write_opened;
54
int meta_file; /* Meta file we use */
55
int tina_write_filedes; /* File Cursor for readers */
56
bool crashed; /* Meta file is crashed */
57
drizzled::ha_rows rows_recorded; /* Number of rows in tables */
58
uint32_t data_file_version; /* Version of the data file used */
61
class ha_tina: public drizzled::Cursor
63
drizzled::THR_LOCK_DATA lock; /* MySQL lock */
64
TinaShare *share; /* Shared lock info */
65
off_t current_position; /* Current position in the file during a file scan */
66
off_t next_position; /* Next position in the file scan */
67
off_t local_saved_data_file_length; /* save position for reads */
68
off_t temp_file_length;
69
unsigned char byte_buffer[IO_SIZE];
70
Transparent_file *file_buff;
71
int data_file; /* File Cursor for readers */
73
drizzled::String buffer;
75
The chain contains "holes" in the file, occured because of
76
deletes/updates. It is used in doEndTableScan() to get rid of them
77
in the end of the query.
79
std::vector< std::pair<off_t, off_t> > chain;
80
uint32_t local_data_file_version; /* Saved version of the data file used */
81
bool records_is_known;
82
drizzled::memory::Root blobroot;
84
bool get_write_pos(off_t *end_pos,
85
std::vector< std::pair<off_t, off_t> >::iterator &closest_hole);
86
int open_update_temp_file_if_needed();
87
int init_tina_writer();
91
ha_tina(drizzled::plugin::StorageEngine &engine, drizzled::Table &table_arg);
97
const char *table_type(void) const { return "CSV"; }
98
const char *index_type(uint32_t)
102
Called in test_quick_select to determine if indexes should be used.
104
virtual double scan_time() { return (double) (stats.records+stats.deleted) / 20.0+10; }
106
/* The next method will never be called */
107
virtual bool fast_key_read() { return 1;}
109
@TODO return actual upper bound of number of records in the table.
110
(e.g. save number of records seen on full table scan and/or use file size
113
drizzled::ha_rows estimate_rows_upper_bound() { return HA_POS_ERROR; }
115
int doOpen(const drizzled::identifier::Table &identifier, int mode, uint32_t test_if_locked);
116
int open(const char *, int , uint32_t ) { assert(0); return -1; }
118
int doInsertRecord(unsigned char * buf);
119
int doUpdateRecord(const unsigned char * old_data, unsigned char * new_data);
120
int doDeleteRecord(const unsigned char * buf);
121
int doStartTableScan(bool scan=1);
122
int rnd_next(unsigned char *buf);
123
int rnd_pos(unsigned char * buf, unsigned char *pos);
124
int doEndTableScan();
125
TinaShare *get_share(const std::string &table_name);
127
int repair(drizzled::Session* session, drizzled::HA_CHECK_OPT* check_opt);
128
/* This is required for SQL layer to know that we support autorepair */
129
void position(const unsigned char *record);
131
int delete_all_rows(void);
132
void get_auto_increment(uint64_t, uint64_t,
138
/* The following methods were added just for TINA */
139
int encode_quote(unsigned char *buf);
140
int find_current_row(unsigned char *buf);
144
#endif /* PLUGIN_CSV_HA_TINA_H */