73
69
#define CSM_EXT ".CSM" // Meta file
76
static int read_meta_file(int meta_file, ha_rows *rows);
77
static int write_meta_file(int meta_file, ha_rows rows, bool dirty);
72
static TINA_SHARE *get_share(const char *table_name, Table *table);
73
static int free_share(TINA_SHARE *share);
74
static int read_meta_file(File meta_file, ha_rows *rows);
75
static int write_meta_file(File meta_file, ha_rows rows, bool dirty);
79
void tina_get_status(void* param, int concurrent_insert);
80
void tina_update_status(void* param);
81
bool tina_check_status(void* param);
77
extern "C" void tina_get_status(void* param, int concurrent_insert);
78
extern "C" void tina_update_status(void* param);
79
extern "C" bool tina_check_status(void* param);
83
81
/* Stuff for shares */
84
82
pthread_mutex_t tina_mutex;
83
static HASH tina_open_tables;
86
85
/*****************************************************************************
138
135
return ha_tina_exts;
141
int doCreateTable(Session &,
143
drizzled::TableIdentifier &identifier,
138
int doCreateTable(Session *,
139
const char *table_name,
144
141
drizzled::message::Table&);
146
143
int doGetTableDefinition(Session& session,
147
TableIdentifier &identifier,
148
drizzled::message::Table &table_message);
146
const char *table_name,
148
drizzled::message::Table *table_proto);
150
150
/* Temp only engine, so do not return values. */
151
void doGetTableNames(drizzled::CachedDirectory &, SchemaIdentifier&, set<string>&) { };
153
int doDropTable(Session&, TableIdentifier &identifier);
154
TinaShare *findOpenTable(const string table_name);
155
void addOpenTable(const string &table_name, TinaShare *);
156
void deleteOpenTable(const string &table_name);
151
void doGetTableNames(CachedDirectory &, string& , set<string>&) { };
153
int doDropTable(Session&, const string table_path);
159
155
uint32_t max_keys() const { return 0; }
160
156
uint32_t max_key_parts() const { return 0; }
161
157
uint32_t max_key_length() const { return 0; }
162
bool doDoesTableExist(Session& session, TableIdentifier &identifier);
163
int doRenameTable(Session&, TableIdentifier &from, TableIdentifier &to);
165
void doGetTableIdentifiers(drizzled::CachedDirectory &directory,
166
drizzled::SchemaIdentifier &schema_identifier,
167
drizzled::TableIdentifiers &set_of_identifiers);
170
void Tina::doGetTableIdentifiers(drizzled::CachedDirectory&,
171
drizzled::SchemaIdentifier&,
172
drizzled::TableIdentifiers&)
176
int Tina::doRenameTable(Session &session,
177
TableIdentifier &from, TableIdentifier &to)
180
for (const char **ext= bas_ext(); *ext ; ext++)
182
if (rename_file_ext(from.getPath().c_str(), to.getPath().c_str(), *ext))
184
if ((error=errno) != ENOENT)
190
session.renameTableMessage(from, to);
195
bool Tina::doDoesTableExist(Session &session, TableIdentifier &identifier)
197
return session.doesTableMessageExist(identifier);
201
int Tina::doDropTable(Session &session,
202
TableIdentifier &identifier)
160
int Tina::doDropTable(Session&,
161
const string table_path)
205
164
int enoent_or_zero= ENOENT; // Error if no file was deleted
206
165
char buff[FN_REFLEN];
166
ProtoCache::iterator iter;
208
168
for (const char **ext= bas_ext(); *ext ; ext++)
210
internal::fn_format(buff, identifier.getPath().c_str(), "", *ext,
211
MY_UNPACK_FILENAME|MY_APPEND_EXT);
212
if (internal::my_delete_with_symlink(buff, MYF(0)))
170
fn_format(buff, table_path.c_str(), "", *ext,
171
MY_UNPACK_FILENAME|MY_APPEND_EXT);
172
if (my_delete_with_symlink(buff, MYF(0)))
214
if ((error= errno) != ENOENT)
174
if ((error= my_errno) != ENOENT)
219
179
error= enoent_or_zero;
222
session.removeTableMessage(identifier);
227
TinaShare *Tina::findOpenTable(const string table_name)
229
TinaMap::iterator find_iter=
230
tina_open_tables.find(table_name);
232
if (find_iter != tina_open_tables.end())
233
return (*find_iter).second;
238
void Tina::addOpenTable(const string &table_name, TinaShare *share)
240
tina_open_tables[table_name]= share;
243
void Tina::deleteOpenTable(const string &table_name)
245
tina_open_tables.erase(table_name);
249
int Tina::doGetTableDefinition(Session &session,
250
drizzled::TableIdentifier &identifier,
251
drizzled::message::Table &table_message)
253
if (session.getTableMessage(identifier, table_message))
182
pthread_mutex_lock(&proto_cache_mutex);
183
iter= proto_cache.find(table_path.c_str());
185
if (iter!= proto_cache.end())
186
proto_cache.erase(iter);
187
pthread_mutex_unlock(&proto_cache_mutex);
192
int Tina::doGetTableDefinition(Session&,
197
drizzled::message::Table *table_proto)
200
ProtoCache::iterator iter;
202
pthread_mutex_lock(&proto_cache_mutex);
203
iter= proto_cache.find(path);
205
if (iter!= proto_cache.end())
208
table_proto->CopyFrom(((*iter).second));
211
pthread_mutex_unlock(&proto_cache_mutex);
260
217
static Tina *tina_engine= NULL;
262
static int tina_init_func(drizzled::plugin::Context &context)
219
static int tina_init_func(drizzled::plugin::Registry ®istry)
265
222
tina_engine= new Tina("CSV");
266
context.add(tina_engine);
223
registry.add(tina_engine);
268
225
pthread_mutex_init(&tina_mutex,MY_MUTEX_INIT_FAST);
274
TinaShare::TinaShare(const char *table_name_arg)
275
: table_name(table_name_arg), use_count(0), saved_data_file_length(0),
276
update_file_opened(false), tina_write_opened(false),
277
crashed(false), rows_recorded(0), data_file_version(0)
279
thr_lock_init(&lock);
280
internal::fn_format(data_file_name, table_name_arg, "", CSV_EXT,
281
MY_REPLACE_EXT|MY_UNPACK_FILENAME);
284
TinaShare::~TinaShare()
286
thr_lock_delete(&lock);
287
pthread_mutex_destroy(&mutex);
226
(void) hash_init(&tina_open_tables,system_charset_info,32,0,0,
227
(hash_get_key) tina_get_key,0,0);
231
static int tina_done_func(drizzled::plugin::Registry ®istry)
233
registry.remove(tina_engine);
236
hash_free(&tina_open_tables);
237
pthread_mutex_destroy(&tina_mutex);
291
244
Simple lock controls.
293
TinaShare *ha_tina::get_share(const char *table_name)
246
static TINA_SHARE *get_share(const char *table_name, Table *)
295
pthread_mutex_lock(&tina_mutex);
297
Tina *a_tina= static_cast<Tina *>(engine);
298
share= a_tina->findOpenTable(table_name);
300
249
char meta_file_name[FN_REFLEN];
301
250
struct stat file_stat;
254
pthread_mutex_lock(&tina_mutex);
255
length=(uint) strlen(table_name);
304
258
If share is not present in the hash, create a new share and
305
259
initialize its members.
261
if (!(share=(TINA_SHARE*) hash_search(&tina_open_tables,
262
(unsigned char*) table_name,
309
share= new TinaShare(table_name);
265
if (!drizzled::memory::multi_malloc(true,
266
&share, sizeof(*share),
313
270
pthread_mutex_unlock(&tina_mutex);
317
internal::fn_format(meta_file_name, table_name, "", CSM_EXT,
275
share->table_name_length= length;
276
share->table_name= tmp_name;
277
share->crashed= false;
278
share->rows_recorded= 0;
279
share->update_file_opened= false;
280
share->tina_write_opened= false;
281
share->data_file_version= 0;
282
strcpy(share->table_name, table_name);
283
fn_format(share->data_file_name, table_name, "", CSV_EXT,
284
MY_REPLACE_EXT|MY_UNPACK_FILENAME);
285
fn_format(meta_file_name, table_name, "", CSM_EXT,
318
286
MY_REPLACE_EXT|MY_UNPACK_FILENAME);
320
288
if (stat(share->data_file_name, &file_stat))
322
pthread_mutex_unlock(&tina_mutex);
327
290
share->saved_data_file_length= file_stat.st_size;
329
a_tina->addOpenTable(share->table_name, share);
292
if (my_hash_insert(&tina_open_tables, (unsigned char*) share))
294
thr_lock_init(&share->lock);
331
295
pthread_mutex_init(&share->mutex,MY_MUTEX_INIT_FAST);
487
457
/* Write the meta file. Mark it as crashed if needed. */
488
458
(void)write_meta_file(share->meta_file, share->rows_recorded,
489
459
share->crashed ? true :false);
490
if (internal::my_close(share->meta_file, MYF(0)))
460
if (my_close(share->meta_file, MYF(0)))
492
462
if (share->tina_write_opened)
494
if (internal::my_close(share->tina_write_filedes, MYF(0)))
464
if (my_close(share->tina_write_filedes, MYF(0)))
496
466
share->tina_write_opened= false;
499
Tina *a_tina= static_cast<Tina *>(engine);
500
a_tina->deleteOpenTable(share->table_name);
469
hash_delete(&tina_open_tables, (unsigned char*) share);
470
thr_lock_delete(&share->lock);
471
pthread_mutex_destroy(&share->mutex);
472
free((unsigned char*) share);
503
474
pthread_mutex_unlock(&tina_mutex);
1320
1291
Close opened fildes's. Then move updated file in place
1321
1292
of the old datafile.
1323
if (internal::my_close(data_file, MYF(0)) ||
1324
internal::my_rename(internal::fn_format(updated_fname,
1325
share->table_name.c_str(),
1327
MY_REPLACE_EXT | MY_UNPACK_FILENAME),
1328
share->data_file_name, MYF(0)))
1294
if (my_close(data_file, MYF(0)) ||
1295
my_rename(fn_format(updated_fname, share->table_name, "", CSN_EXT,
1296
MY_REPLACE_EXT | MY_UNPACK_FILENAME),
1297
share->data_file_name, MYF(0)))
1331
1300
/* Open the file again */
1332
if (((data_file= internal::my_open(share->data_file_name, O_RDONLY, MYF(0))) == -1))
1301
if (((data_file= my_open(share->data_file_name, O_RDONLY, MYF(0))) == -1))
1335
1304
As we reopened the data file, increase share->data_file_version
1418
if ((create_file= internal::my_create(internal::fn_format(name_buff, identifier.getPath().c_str(), "", CSM_EXT,
1419
MY_REPLACE_EXT|MY_UNPACK_FILENAME), 0,
1420
O_RDWR | O_TRUNC,MYF(MY_WME))) < 0)
1386
if ((create_file= my_create(fn_format(name_buff, table_name, "", CSM_EXT,
1387
MY_REPLACE_EXT|MY_UNPACK_FILENAME), 0,
1388
O_RDWR | O_TRUNC,MYF(MY_WME))) < 0)
1423
1391
write_meta_file(create_file, 0, false);
1424
internal::my_close(create_file, MYF(0));
1392
my_close(create_file, MYF(0));
1426
if ((create_file= internal::my_create(internal::fn_format(name_buff, identifier.getPath().c_str(), "", CSV_EXT,
1427
MY_REPLACE_EXT|MY_UNPACK_FILENAME),0,
1428
O_RDWR | O_TRUNC,MYF(MY_WME))) < 0)
1394
if ((create_file= my_create(fn_format(name_buff, table_name, "", CSV_EXT,
1395
MY_REPLACE_EXT|MY_UNPACK_FILENAME),0,
1396
O_RDWR | O_TRUNC,MYF(MY_WME))) < 0)
1431
internal::my_close(create_file, MYF(0));
1399
my_close(create_file, MYF(0));
1433
session.storeTableMessage(identifier, create_proto);
1401
pthread_mutex_lock(&proto_cache_mutex);
1402
proto_cache.insert(make_pair(table_name, create_proto));
1403
pthread_mutex_unlock(&proto_cache_mutex);