38
39
class BlackholeEngine : public drizzled::plugin::StorageEngine
41
typedef map<string, BlackholeShare*> BlackholeMap;
42
BlackholeMap blackhole_open_tables;
41
45
BlackholeEngine(const string &name_arg)
42
46
: drizzled::plugin::StorageEngine(name_arg, HTON_FILE_BASED |
67
72
int doDropTable(Session&, const string table_name);
74
BlackholeShare *findOpenTable(const string table_name);
75
void addOpenTable(const string &table_name, BlackholeShare *);
76
void deleteOpenTable(const string &table_name);
69
78
int doGetTableDefinition(Session& session,
132
BlackholeShare *BlackholeEngine::findOpenTable(const string table_name)
134
BlackholeMap::iterator find_iter=
135
blackhole_open_tables.find(table_name);
137
if (find_iter != blackhole_open_tables.end())
138
return (*find_iter).second;
143
void BlackholeEngine::addOpenTable(const string &table_name, BlackholeShare *share)
145
blackhole_open_tables[table_name]= share;
148
void BlackholeEngine::deleteOpenTable(const string &table_name)
150
blackhole_open_tables.erase(table_name);
122
154
/* Static declarations for shared structures */
124
156
static pthread_mutex_t blackhole_mutex;
125
static HASH blackhole_open_tables;
127
static st_blackhole_share *get_share(const char *table_name);
128
static void free_share(st_blackhole_share *share);
130
159
/*****************************************************************************
131
160
** BLACKHOLE tables
134
163
ha_blackhole::ha_blackhole(drizzled::plugin::StorageEngine &engine_arg,
135
164
TableShare &table_arg)
136
:Cursor(engine_arg, table_arg)
165
:Cursor(engine_arg, table_arg), share(NULL)
139
168
int ha_blackhole::open(const char *name, int, uint32_t)
322
static st_blackhole_share *get_share(const char *table_name)
351
BlackholeShare *ha_blackhole::get_share(const char *table_name)
324
st_blackhole_share *share;
327
length= (uint) strlen(table_name);
328
353
pthread_mutex_lock(&blackhole_mutex);
330
if (!(share= (st_blackhole_share*) hash_search(&blackhole_open_tables,
331
(unsigned char*) table_name, length)))
355
BlackholeEngine *a_engine= static_cast<BlackholeEngine *>(engine);
356
share= a_engine->findOpenTable(table_name);
333
if (!(share= (st_blackhole_share*) malloc(sizeof(st_blackhole_share) +
336
memset(share, 0, sizeof(st_blackhole_share) + length);
338
share->table_name_length= length;
339
strcpy(share->table_name, table_name);
341
if (my_hash_insert(&blackhole_open_tables, (unsigned char*) share))
360
share= new (nothrow) BlackholeShare(table_name);
343
free((unsigned char*) share);
363
pthread_mutex_unlock(&blackhole_mutex);
348
thr_lock_init(&share->lock);
367
a_engine->addOpenTable(share->table_name, share);
350
369
share->use_count++;
353
370
pthread_mutex_unlock(&blackhole_mutex);
357
static void free_share(st_blackhole_share *share)
375
void ha_blackhole::free_share()
359
377
pthread_mutex_lock(&blackhole_mutex);
360
378
if (!--share->use_count)
361
hash_delete(&blackhole_open_tables, (unsigned char*) share);
380
BlackholeEngine *a_engine= static_cast<BlackholeEngine *>(engine);
381
a_engine->deleteOpenTable(share->table_name);
362
384
pthread_mutex_unlock(&blackhole_mutex);
365
static void blackhole_free_key(st_blackhole_share *share)
367
thr_lock_delete(&share->lock);
368
free((unsigned char*) share);
371
static unsigned char* blackhole_get_key(st_blackhole_share *share, size_t *length, bool)
373
*length= share->table_name_length;
374
return (unsigned char*) share->table_name;
387
BlackholeShare::BlackholeShare(const string table_name_arg)
388
: use_count(0), table_name(table_name_arg)
390
thr_lock_init(&lock);
393
BlackholeShare::~BlackholeShare()
395
thr_lock_delete(&lock);
377
399
static drizzled::plugin::StorageEngine *blackhole_engine= NULL;
383
405
registry.add(blackhole_engine);
385
407
pthread_mutex_init(&blackhole_mutex, MY_MUTEX_INIT_FAST);
386
(void) hash_init(&blackhole_open_tables, system_charset_info,32,0,0,
387
(hash_get_key) blackhole_get_key,
388
(hash_free_key) blackhole_free_key, 0);