43
#include <drizzled/server_includes.h>
44
44
#include <drizzled/field.h>
45
45
#include <drizzled/field/blob.h>
46
46
#include <drizzled/field/timestamp.h>
47
47
#include <drizzled/error.h>
48
48
#include <drizzled/table.h>
49
49
#include <drizzled/session.h>
50
#include "drizzled/memory/multi_malloc.h"
50
#include "drizzled/internal/my_sys.h"
52
52
#include "ha_tina.h"
56
59
using namespace std;
58
static const string engine_name("CSV");
61
62
unsigned char + unsigned char + uint64_t + uint64_t + uint64_t + uint64_t + unsigned char
71
72
#define CSM_EXT ".CSM" // Meta file
74
static TINA_SHARE *get_share(const char *table_name, Table *table);
75
static int free_share(TINA_SHARE *share);
76
static int read_meta_file(File meta_file, ha_rows *rows);
77
static int write_meta_file(File meta_file, ha_rows rows, bool dirty);
75
static int read_meta_file(int meta_file, ha_rows *rows);
76
static int write_meta_file(int meta_file, ha_rows rows, bool dirty);
79
78
extern "C" void tina_get_status(void* param, int concurrent_insert);
80
79
extern "C" void tina_update_status(void* param);
120
112
class Tina : public drizzled::plugin::StorageEngine
114
typedef std::map<string, TinaShare*> TinaMap;
115
TinaMap tina_open_tables;
123
117
Tina(const string& name_arg)
124
118
: drizzled::plugin::StorageEngine(name_arg,
125
119
HTON_TEMPORARY_ONLY |
126
120
HTON_NO_AUTO_INCREMENT |
127
121
HTON_HAS_DATA_DICTIONARY |
122
HTON_SKIP_STORE_LOCK |
129
126
virtual Cursor *create(TableShare &table,
127
drizzled::memory::Root *mem_root)
132
129
return new (mem_root) ha_tina(*this, table);
149
146
drizzled::message::Table *table_proto);
151
148
/* Temp only engine, so do not return values. */
152
void doGetTableNames(CachedDirectory &, string& , set<string>&) { };
149
void doGetTableNames(drizzled::CachedDirectory &, string& , set<string>&) { };
154
151
int doDropTable(Session&, const string table_path);
152
TinaShare *findOpenTable(const string table_name);
153
void addOpenTable(const string &table_name, TinaShare *);
154
void deleteOpenTable(const string &table_name);
156
157
uint32_t max_keys() const { return 0; }
157
158
uint32_t max_key_parts() const { return 0; }
194
TinaShare *Tina::findOpenTable(const string table_name)
196
TinaMap::iterator find_iter=
197
tina_open_tables.find(table_name);
199
if (find_iter != tina_open_tables.end())
200
return (*find_iter).second;
205
void Tina::addOpenTable(const string &table_name, TinaShare *share)
207
tina_open_tables[table_name]= share;
210
void Tina::deleteOpenTable(const string &table_name)
212
tina_open_tables.erase(table_name);
193
216
int Tina::doGetTableDefinition(Session&,
194
217
const char* path,
220
243
static int tina_init_func(drizzled::plugin::Registry ®istry)
223
tina_engine= new Tina(engine_name);
246
tina_engine= new Tina("CSV");
224
247
registry.add(tina_engine);
226
249
pthread_mutex_init(&tina_mutex,MY_MUTEX_INIT_FAST);
227
(void) hash_init(&tina_open_tables,system_charset_info,32,0,0,
228
(hash_get_key) tina_get_key,0,0);
234
255
registry.remove(tina_engine);
235
256
delete tina_engine;
237
hash_free(&tina_open_tables);
238
258
pthread_mutex_destroy(&tina_mutex);
264
TinaShare::TinaShare(const char *table_name_arg)
265
: table_name(table_name_arg), use_count(0), saved_data_file_length(0),
266
update_file_opened(false), tina_write_opened(false),
267
crashed(false), rows_recorded(0), data_file_version(0)
269
thr_lock_init(&lock);
270
fn_format(data_file_name, table_name_arg, "", CSV_EXT,
271
MY_REPLACE_EXT|MY_UNPACK_FILENAME);
274
TinaShare::~TinaShare()
276
thr_lock_delete(&lock);
277
pthread_mutex_destroy(&mutex);
245
281
Simple lock controls.
247
static TINA_SHARE *get_share(const char *table_name, Table *)
283
TinaShare *ha_tina::get_share(const char *table_name)
285
pthread_mutex_lock(&tina_mutex);
287
Tina *a_tina= static_cast<Tina *>(engine);
288
share= a_tina->findOpenTable(table_name);
250
290
char meta_file_name[FN_REFLEN];
251
291
struct stat file_stat;
255
pthread_mutex_lock(&tina_mutex);
256
length=(uint) strlen(table_name);
259
294
If share is not present in the hash, create a new share and
260
295
initialize its members.
262
if (!(share=(TINA_SHARE*) hash_search(&tina_open_tables,
263
(unsigned char*) table_name,
266
if (!drizzled::memory::multi_malloc(true,
267
&share, sizeof(*share),
299
share= new TinaShare(table_name);
271
303
pthread_mutex_unlock(&tina_mutex);
276
share->table_name_length= length;
277
share->table_name= tmp_name;
278
share->crashed= false;
279
share->rows_recorded= 0;
280
share->update_file_opened= false;
281
share->tina_write_opened= false;
282
share->data_file_version= 0;
283
strcpy(share->table_name, table_name);
284
fn_format(share->data_file_name, table_name, "", CSV_EXT,
285
MY_REPLACE_EXT|MY_UNPACK_FILENAME);
286
307
fn_format(meta_file_name, table_name, "", CSM_EXT,
287
308
MY_REPLACE_EXT|MY_UNPACK_FILENAME);
289
310
if (stat(share->data_file_name, &file_stat))
312
pthread_mutex_unlock(&tina_mutex);
291
317
share->saved_data_file_length= file_stat.st_size;
293
if (my_hash_insert(&tina_open_tables, (unsigned char*) share))
295
thr_lock_init(&share->lock);
319
a_tina->addOpenTable(share->table_name, share);
296
321
pthread_mutex_init(&share->mutex,MY_MUTEX_INIT_FAST);
467
486
share->tina_write_opened= false;
470
hash_delete(&tina_open_tables, (unsigned char*) share);
471
thr_lock_delete(&share->lock);
472
pthread_mutex_destroy(&share->mutex);
473
free((unsigned char*) share);
489
Tina *a_tina= static_cast<Tina *>(engine);
490
a_tina->deleteOpenTable(share->table_name);
475
493
pthread_mutex_unlock(&tina_mutex);
864
882
this will not be called for every request. Any sort of positions
865
883
that need to be reset should be kept in the ::extra() call.
867
int ha_tina::open(const char *name, int, uint32_t open_options)
885
int ha_tina::open(const char *name, int, uint32_t)
869
if (!(share= get_share(name, table)))
887
if (!(share= get_share(name)))
872
if (share->crashed && !(open_options & HA_OPEN_FOR_REPAIR))
875
893
return(HA_ERR_CRASHED_ON_USAGE);
952
970
if (!share->update_file_opened)
954
972
if ((update_temp_file=
955
my_create(fn_format(updated_fname, share->table_name,
973
my_create(fn_format(updated_fname, share->table_name.c_str(),
957
975
MY_REPLACE_EXT | MY_UNPACK_FILENAME),
958
976
0, O_RDWR | O_TRUNC, MYF(MY_WME))) < 0)
1293
1311
of the old datafile.
1295
1313
if (my_close(data_file, MYF(0)) ||
1296
my_rename(fn_format(updated_fname, share->table_name, "", CSN_EXT,
1314
my_rename(fn_format(updated_fname, share->table_name.c_str(),
1297
1316
MY_REPLACE_EXT | MY_UNPACK_FILENAME),
1298
1317
share->data_file_name, MYF(0)))