53
58
return ha_blackhole_exts;
56
int ha_blackhole::open(const char *name, int mode __attribute__((unused)),
57
uint32_t test_if_locked __attribute__((unused)))
61
int ha_blackhole::open(const char *name, int mode, uint test_if_locked)
63
DBUG_ENTER("ha_blackhole::open");
59
65
if (!(share= get_share(name)))
60
return(HA_ERR_OUT_OF_MEM);
66
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
62
68
thr_lock_data_init(&share->lock, &lock, NULL);
66
72
int ha_blackhole::close(void)
74
DBUG_ENTER("ha_blackhole::close");
72
int ha_blackhole::create(const char *name __attribute__((unused)),
73
Table *table_arg __attribute__((unused)),
74
HA_CREATE_INFO *create_info __attribute__((unused)))
79
const char *ha_blackhole::index_type(uint32_t key_number __attribute__((unused)))
84
int ha_blackhole::write_row(unsigned char * buf __attribute__((unused)))
86
return(table->next_number_field ? update_auto_increment() : 0);
89
int ha_blackhole::rnd_init(bool scan __attribute__((unused)))
95
int ha_blackhole::rnd_next(unsigned char *buf __attribute__((unused)))
97
return(HA_ERR_END_OF_FILE);
101
int ha_blackhole::rnd_pos(unsigned char * buf __attribute__((unused)),
102
unsigned char *pos __attribute__((unused)))
109
void ha_blackhole::position(const unsigned char *record __attribute__((unused)))
116
int ha_blackhole::info(uint32_t flag)
118
memset(&stats, 0, sizeof(stats));
79
int ha_blackhole::create(const char *name, TABLE *table_arg,
80
HA_CREATE_INFO *create_info)
82
DBUG_ENTER("ha_blackhole::create");
86
const char *ha_blackhole::index_type(uint key_number)
88
DBUG_ENTER("ha_blackhole::index_type");
89
DBUG_RETURN((table_share->key_info[key_number].flags & HA_FULLTEXT) ?
91
(table_share->key_info[key_number].flags & HA_SPATIAL) ?
93
(table_share->key_info[key_number].algorithm ==
94
HA_KEY_ALG_RTREE) ? "RTREE" : "BTREE");
97
int ha_blackhole::write_row(uchar * buf)
99
DBUG_ENTER("ha_blackhole::write_row");
100
DBUG_RETURN(table->next_number_field ? update_auto_increment() : 0);
103
int ha_blackhole::rnd_init(bool scan)
105
DBUG_ENTER("ha_blackhole::rnd_init");
110
int ha_blackhole::rnd_next(uchar *buf)
112
DBUG_ENTER("ha_blackhole::rnd_next");
113
DBUG_RETURN(HA_ERR_END_OF_FILE);
117
int ha_blackhole::rnd_pos(uchar * buf, uchar *pos)
119
DBUG_ENTER("ha_blackhole::rnd_pos");
125
void ha_blackhole::position(const uchar *record)
127
DBUG_ENTER("ha_blackhole::position");
133
int ha_blackhole::info(uint flag)
135
DBUG_ENTER("ha_blackhole::info");
137
bzero((char*) &stats, sizeof(stats));
119
138
if (flag & HA_STATUS_AUTO)
120
139
stats.auto_increment_value= 1;
124
int ha_blackhole::external_lock(THD *thd __attribute__((unused)),
125
int lock_type __attribute__((unused)))
143
int ha_blackhole::external_lock(THD *thd, int lock_type)
145
DBUG_ENTER("ha_blackhole::external_lock");
160
180
lock.type= lock_type;
167
int ha_blackhole::index_read_map(unsigned char * buf __attribute__((unused)),
168
const unsigned char * key __attribute__((unused)),
169
key_part_map keypart_map __attribute__((unused)),
170
enum ha_rkey_function find_flag __attribute__((unused)))
172
return(HA_ERR_END_OF_FILE);
176
int ha_blackhole::index_read_idx_map(unsigned char * buf __attribute__((unused)),
177
uint32_t idx __attribute__((unused)),
178
const unsigned char * key __attribute__((unused)),
179
key_part_map keypart_map __attribute__((unused)),
180
enum ha_rkey_function find_flag __attribute__((unused)))
182
return(HA_ERR_END_OF_FILE);
186
int ha_blackhole::index_read_last_map(unsigned char * buf __attribute__((unused)),
187
const unsigned char * key __attribute__((unused)),
188
key_part_map keypart_map __attribute__((unused)))
190
return(HA_ERR_END_OF_FILE);
194
int ha_blackhole::index_next(unsigned char * buf __attribute__((unused)))
196
return(HA_ERR_END_OF_FILE);
200
int ha_blackhole::index_prev(unsigned char * buf __attribute__((unused)))
202
return(HA_ERR_END_OF_FILE);
206
int ha_blackhole::index_first(unsigned char * buf __attribute__((unused)))
208
return(HA_ERR_END_OF_FILE);
212
int ha_blackhole::index_last(unsigned char * buf __attribute__((unused)))
214
return(HA_ERR_END_OF_FILE);
187
int ha_blackhole::index_read_map(uchar * buf, const uchar * key,
188
key_part_map keypart_map,
189
enum ha_rkey_function find_flag)
191
DBUG_ENTER("ha_blackhole::index_read");
192
DBUG_RETURN(HA_ERR_END_OF_FILE);
196
int ha_blackhole::index_read_idx_map(uchar * buf, uint idx, const uchar * key,
197
key_part_map keypart_map,
198
enum ha_rkey_function find_flag)
200
DBUG_ENTER("ha_blackhole::index_read_idx");
201
DBUG_RETURN(HA_ERR_END_OF_FILE);
205
int ha_blackhole::index_read_last_map(uchar * buf, const uchar * key,
206
key_part_map keypart_map)
208
DBUG_ENTER("ha_blackhole::index_read_last");
209
DBUG_RETURN(HA_ERR_END_OF_FILE);
213
int ha_blackhole::index_next(uchar * buf)
215
DBUG_ENTER("ha_blackhole::index_next");
216
DBUG_RETURN(HA_ERR_END_OF_FILE);
220
int ha_blackhole::index_prev(uchar * buf)
222
DBUG_ENTER("ha_blackhole::index_prev");
223
DBUG_RETURN(HA_ERR_END_OF_FILE);
227
int ha_blackhole::index_first(uchar * buf)
229
DBUG_ENTER("ha_blackhole::index_first");
230
DBUG_RETURN(HA_ERR_END_OF_FILE);
234
int ha_blackhole::index_last(uchar * buf)
236
DBUG_ENTER("ha_blackhole::index_last");
237
DBUG_RETURN(HA_ERR_END_OF_FILE);
218
241
static st_blackhole_share *get_share(const char *table_name)
220
243
st_blackhole_share *share;
223
246
length= (uint) strlen(table_name);
224
247
pthread_mutex_lock(&blackhole_mutex);
226
249
if (!(share= (st_blackhole_share*) hash_search(&blackhole_open_tables,
227
(unsigned char*) table_name, length)))
250
(uchar*) table_name, length)))
229
252
if (!(share= (st_blackhole_share*) my_malloc(sizeof(st_blackhole_share) +
255
278
pthread_mutex_lock(&blackhole_mutex);
256
279
if (!--share->use_count)
257
hash_delete(&blackhole_open_tables, (unsigned char*) share);
280
hash_delete(&blackhole_open_tables, (uchar*) share);
258
281
pthread_mutex_unlock(&blackhole_mutex);
261
284
static void blackhole_free_key(st_blackhole_share *share)
263
286
thr_lock_delete(&share->lock);
264
free((unsigned char*) share);
287
my_free((uchar*) share, MYF(0));
267
static unsigned char* blackhole_get_key(st_blackhole_share *share, size_t *length,
268
bool not_used __attribute__((unused)))
290
static uchar* blackhole_get_key(st_blackhole_share *share, size_t *length,
291
my_bool not_used __attribute__((unused)))
270
293
*length= share->table_name_length;
271
return (unsigned char*) share->table_name;
294
return (uchar*) share->table_name;
274
297
static int blackhole_init(void *p)
276
299
handlerton *blackhole_hton;
277
300
blackhole_hton= (handlerton *)p;
278
301
blackhole_hton->state= SHOW_OPTION_YES;
302
blackhole_hton->db_type= DB_TYPE_BLACKHOLE_DB;
279
303
blackhole_hton->create= blackhole_create_handler;
280
304
blackhole_hton->flags= HTON_CAN_RECREATE;
282
pthread_mutex_init(&blackhole_mutex, MY_MUTEX_INIT_FAST);
306
VOID(pthread_mutex_init(&blackhole_mutex, MY_MUTEX_INIT_FAST));
283
307
(void) hash_init(&blackhole_open_tables, system_charset_info,32,0,0,
284
308
(hash_get_key) blackhole_get_key,
285
309
(hash_free_key) blackhole_free_key, 0);
322
struct st_mysql_storage_engine blackhole_storage_engine=
323
{ MYSQL_HANDLERTON_INTERFACE_VERSION };
298
325
mysql_declare_plugin(blackhole)
300
DRIZZLE_STORAGE_ENGINE_PLUGIN,
327
MYSQL_STORAGE_ENGINE_PLUGIN,
328
&blackhole_storage_engine,
304
331
"/dev/null storage engine (anything you write to it disappears)",
305
332
PLUGIN_LICENSE_GPL,
306
333
blackhole_init, /* Plugin Init */
307
334
blackhole_fini, /* Plugin Deinit */
308
336
NULL, /* status variables */
309
337
NULL, /* system variables */
310
338
NULL /* config options */