21 #include "data_dictionary.h"
23 #include <drizzled/current_session.h>
38 using namespace drizzled;
40 InnodbSysTablesTool::InnodbSysTablesTool() :
41 plugin::TableFunction(
"DATA_DICTIONARY",
"INNODB_SYS_TABLES")
43 add_field(
"TABLE_ID", plugin::TableFunction::NUMBER, 0,
false);
44 add_field(
"NAME", plugin::TableFunction::STRING, NAME_LEN + 1,
false);
45 add_field(
"FLAG", plugin::TableFunction::NUMBER, 0,
false);
46 add_field(
"N_COLS", plugin::TableFunction::NUMBER, 0,
false);
47 add_field(
"SPACE", plugin::TableFunction::NUMBER, 0,
false);
50 InnodbSysTablesTool::Generator::Generator(
Field **arg) :
51 plugin::TableFunction::Generator(arg)
56 bool InnodbSysTablesTool::Generator::populate()
61 mutex_enter(&(dict_sys->
mutex));
64 rec = dict_startscan_system(&pcur, &mtr, SYS_TABLES);
69 mutex_enter(&dict_sys->
mutex);
71 rec = dict_getnext_system(&pcur, &mtr);
77 mutex_exit(&dict_sys->
mutex);
87 err_msg = dict_process_sys_tables_rec(heap, rec, &table_rec,
91 mutex_exit(&dict_sys->
mutex);
95 push(table_rec->
name);
96 push(static_cast<uint64_t>(table_rec->
flags));
97 push(static_cast<uint64_t>(table_rec->
n_cols));
98 push(static_cast<uint64_t>(table_rec->
space));
109 dict_mem_table_free(table_rec);
117 InnodbSysTableStatsTool::InnodbSysTableStatsTool() :
118 plugin::TableFunction(
"DATA_DICTIONARY",
"INNODB_SYS_TABLESTATS")
120 add_field(
"TABLE_ID", plugin::TableFunction::NUMBER, 0,
false);
121 add_field(
"NAME", plugin::TableFunction::STRING, NAME_LEN + 1,
false);
122 add_field(
"STATS_INITIALIZED", plugin::TableFunction::STRING, NAME_LEN + 1,
false);
123 add_field(
"NUM_ROWS", plugin::TableFunction::NUMBER, 0,
false);
124 add_field(
"CLUST_INDEX_SIZE", plugin::TableFunction::NUMBER, 0,
false);
125 add_field(
"OTHER_INDEX_SIZE", plugin::TableFunction::NUMBER, 0,
false);
126 add_field(
"MODIFIED_COUNTER", plugin::TableFunction::NUMBER, 0,
false);
127 add_field(
"AUTOINC", plugin::TableFunction::NUMBER, 0,
false);
128 add_field(
"HANDLES_OPENED", plugin::TableFunction::NUMBER, 0,
false);
131 InnodbSysTableStatsTool::Generator::Generator(
Field **arg) :
132 plugin::TableFunction::Generator(arg)
137 bool InnodbSysTableStatsTool::Generator::populate()
142 mutex_enter(&dict_sys->
mutex);
144 rec = dict_startscan_system(&pcur, &mtr, SYS_TABLES);
149 mutex_enter(&dict_sys->
mutex);
151 rec = dict_getnext_system(&pcur, &mtr);
157 mutex_exit(&dict_sys->
mutex);
167 err_msg = dict_process_sys_tables_rec(heap, rec, &table_rec,
171 mutex_exit(&dict_sys->
mutex);
175 push(table_rec->
name);
179 push(
"Uninitialized");
197 InnodbSysIndexesTool::InnodbSysIndexesTool() :
198 plugin::TableFunction(
"DATA_DICTIONARY",
"INNODB_SYS_INDEXES")
200 add_field(
"INDEX_ID", plugin::TableFunction::NUMBER, 0,
false);
201 add_field(
"NAME", plugin::TableFunction::STRING, NAME_LEN + 1,
false);
202 add_field(
"TABLE_ID", plugin::TableFunction::NUMBER, 0,
false);
203 add_field(
"TYPE", plugin::TableFunction::NUMBER, 0,
false);
204 add_field(
"N_FIELDS", plugin::TableFunction::NUMBER, 0,
false);
205 add_field(
"PAGE_NO", plugin::TableFunction::NUMBER, 0,
false);
206 add_field(
"SPACE", plugin::TableFunction::NUMBER, 0,
false);
209 InnodbSysIndexesTool::Generator::Generator(
Field **arg) :
210 plugin::TableFunction::Generator(arg)
215 bool InnodbSysIndexesTool::Generator::populate()
220 mutex_enter(&dict_sys->
mutex);
224 rec = dict_startscan_system(&pcur, &mtr, SYS_INDEXES);
229 mutex_enter(&dict_sys->
mutex);
231 rec = dict_getnext_system(&pcur, &mtr);
237 mutex_exit(&dict_sys->
mutex);
242 const char* err_msg;;
248 err_msg = dict_process_sys_indexes_rec(heap, rec, &index_rec,
252 mutex_exit(&dict_sys->
mutex);
255 push(index_rec.
name);
256 push(static_cast<uint64_t>(table_id));
257 push(static_cast<uint64_t>(index_rec.
type));
258 push(static_cast<uint64_t>(index_rec.
n_fields));
259 push(static_cast<uint64_t>(index_rec.
page));
260 push(static_cast<uint64_t>(index_rec.
space));
272 mutex_exit(&dict_sys->
mutex);
280 InnodbSysColumnsTool::InnodbSysColumnsTool() :
281 plugin::TableFunction(
"DATA_DICTIONARY",
"INNODB_SYS_COLUMNS")
283 add_field(
"TABLE_ID", plugin::TableFunction::NUMBER, 0,
false);
284 add_field(
"NAME", plugin::TableFunction::STRING, NAME_LEN + 1,
false);
285 add_field(
"POS", plugin::TableFunction::NUMBER, 0,
false);
286 add_field(
"MTYPE", plugin::TableFunction::NUMBER, 0,
false);
287 add_field(
"PRTYPE", plugin::TableFunction::NUMBER, 0,
false);
288 add_field(
"LEN", plugin::TableFunction::NUMBER, 0,
false);
291 InnodbSysColumnsTool::Generator::Generator(
Field **arg) :
292 plugin::TableFunction::Generator(arg)
297 bool InnodbSysColumnsTool::Generator::populate()
302 mutex_enter(&dict_sys->
mutex);
304 rec = dict_startscan_system(&pcur, &mtr, SYS_COLUMNS);
309 mutex_enter(&dict_sys->
mutex);
311 rec = dict_getnext_system(&pcur, &mtr);
317 mutex_exit(&dict_sys->
mutex);
325 const char* col_name;
329 err_msg = dict_process_sys_columns_rec(heap, rec, &column_rec,
330 &table_id, &col_name);
333 mutex_exit(&dict_sys->
mutex);
338 push(static_cast<uint64_t>(column_rec.
ind));
339 push(static_cast<uint64_t>(column_rec.
mtype));
340 push(static_cast<uint64_t>(column_rec.
prtype));
341 push(static_cast<uint64_t>(column_rec.
len));
353 InnodbSysFieldsTool::InnodbSysFieldsTool() :
354 plugin::TableFunction(
"DATA_DICTIONARY",
"INNODB_SYS_FIELDS")
356 add_field(
"INDEX_ID", plugin::TableFunction::NUMBER, 0,
false);
357 add_field(
"NAME", plugin::TableFunction::STRING, NAME_LEN + 1,
false);
358 add_field(
"POS", plugin::TableFunction::NUMBER, 0,
false);
361 InnodbSysFieldsTool::Generator::Generator(
Field **arg) :
362 plugin::TableFunction::Generator(arg)
367 bool InnodbSysFieldsTool::Generator::populate()
372 mutex_enter(&dict_sys->
mutex);
379 rec = dict_startscan_system(&pcur, &mtr, SYS_FIELDS);
384 mutex_enter(&dict_sys->
mutex);
386 rec = dict_getnext_system(&pcur, &mtr);
392 mutex_exit(&dict_sys->
mutex);
405 err_msg = dict_process_sys_fields_rec(heap, rec, &field_rec,
406 &pos, &index_id, last_id);
409 mutex_exit(&dict_sys->
mutex);
413 push(field_rec.
name);
414 push(static_cast<uint64_t>(pos));
428 InnodbSysForeignTool::InnodbSysForeignTool() :
429 plugin::TableFunction(
"DATA_DICTIONARY",
"INNODB_SYS_FOREIGN")
431 add_field(
"ID", plugin::TableFunction::STRING, NAME_LEN + 1,
false);
432 add_field(
"FOR_NAME", plugin::TableFunction::STRING, NAME_LEN + 1,
false);
433 add_field(
"REF_NAME", plugin::TableFunction::STRING, NAME_LEN + 1,
false);
434 add_field(
"N_COLS", plugin::TableFunction::NUMBER, 0,
false);
435 add_field(
"TYPE", plugin::TableFunction::NUMBER, 0,
false);
438 InnodbSysForeignTool::Generator::Generator(
Field **arg) :
439 plugin::TableFunction::Generator(arg)
444 bool InnodbSysForeignTool::Generator::populate()
449 mutex_enter(&dict_sys->
mutex);
452 rec = dict_startscan_system(&pcur, &mtr, SYS_FOREIGN);
458 mutex_enter(&dict_sys->
mutex);
459 rec = dict_getnext_system(&pcur, &mtr);
465 mutex_exit(&dict_sys->
mutex);
475 err_msg = dict_process_sys_foreign_rec(heap, rec, &foreign_rec);
478 mutex_exit(&dict_sys->
mutex);
481 push(foreign_rec.
id);
484 push(static_cast<uint64_t>(foreign_rec.
n_fields));
485 push(static_cast<uint64_t>(foreign_rec.
type));
497 InnodbSysForeignColsTool::InnodbSysForeignColsTool() :
498 plugin::TableFunction(
"DATA_DICTIONARY",
"INNODB_SYS_FOREIGN_COLS")
500 add_field(
"ID", plugin::TableFunction::STRING, NAME_LEN + 1,
false);
501 add_field(
"FOR_COL_NAME", plugin::TableFunction::STRING, NAME_LEN + 1,
false);
502 add_field(
"REF_COL_NAME", plugin::TableFunction::STRING, NAME_LEN + 1,
false);
503 add_field(
"POS", plugin::TableFunction::NUMBER, 0,
false);
506 InnodbSysForeignColsTool::Generator::Generator(
Field **arg) :
507 plugin::TableFunction::Generator(arg)
512 bool InnodbSysForeignColsTool::Generator::populate()
517 mutex_enter(&dict_sys->
mutex);
520 rec = dict_startscan_system(&pcur, &mtr, SYS_FOREIGN_COLS);
525 mutex_enter(&dict_sys->
mutex);
527 rec = dict_getnext_system(&pcur, &mtr);
533 mutex_exit(&dict_sys->
mutex);
541 const char* for_col_name;
542 const char* ref_col_name;
546 err_msg = dict_process_sys_foreign_col_rec(heap, rec, &name, &for_col_name,
547 &ref_col_name, &pos);
550 mutex_exit(&dict_sys->
mutex);
556 push(static_cast<uint64_t>(pos));
573 CmpTool::CmpTool(
bool in_reset) :
574 plugin::TableFunction(
"DATA_DICTIONARY", in_reset ?
"INNODB_CMP_RESET" :
"INNODB_CMP"),
575 outer_reset(in_reset)
577 add_field(
"PAGE_SIZE", plugin::TableFunction::NUMBER, 0,
false);
578 add_field(
"COMPRESS_OPS", plugin::TableFunction::NUMBER, 0,
false);
579 add_field(
"COMPRESS_OPS_OK", plugin::TableFunction::NUMBER, 0,
false);
580 add_field(
"COMPRESS_TIME", plugin::TableFunction::NUMBER, 0,
false);
581 add_field(
"UNCOMPRESS_OPS", plugin::TableFunction::NUMBER, 0,
false);
582 add_field(
"UNCOMPRESS_TIME", plugin::TableFunction::NUMBER, 0,
false);
585 CmpTool::Generator::Generator(
Field **arg,
bool in_reset) :
586 plugin::TableFunction::Generator(arg),
588 inner_reset(in_reset)
592 bool CmpTool::Generator::populate()
609 push(static_cast<uint64_t>(zip_stat->
compressed));
617 memset(zip_stat, 0,
sizeof *zip_stat);
629 CmpmemTool::CmpmemTool(
bool in_reset) :
630 plugin::TableFunction(
"DATA_DICTIONARY", in_reset ?
"INNODB_CMPMEM_RESET" :
"INNODB_CMPMEM"),
631 outer_reset(in_reset)
633 add_field(
"BUF_POOL", plugin::TableFunction::NUMBER, 0,
false);
634 add_field(
"PAGE_SIZE", plugin::TableFunction::NUMBER, 0,
false);
635 add_field(
"PAGES_USED", plugin::TableFunction::NUMBER, 0,
false);
636 add_field(
"PAGES_FREE", plugin::TableFunction::NUMBER, 0,
false);
637 add_field(
"RELOCATION_OPS", plugin::TableFunction::NUMBER, 0,
false);
638 add_field(
"RELOCATION_TIME", plugin::TableFunction::NUMBER, 0,
false);
641 CmpmemTool::Generator::Generator(
Field **arg,
bool in_reset) :
642 plugin::TableFunction::Generator(arg),
644 inner_reset(in_reset)
648 CmpmemTool::Generator::~Generator()
652 bool CmpmemTool::Generator::populate()
669 push(static_cast<uint64_t>(buf_pool_nr));
671 push(static_cast<uint64_t>(buddy_stat->
used));
697 InnodbTrxTool::InnodbTrxTool(
const char* in_table_name) :
698 plugin::TableFunction(
"DATA_DICTIONARY", in_table_name),
699 table_name(in_table_name)
704 add_field(
"TRX_STATE");
705 add_field(
"TRX_STARTED", plugin::TableFunction::NUMBER, 0,
false);
706 add_field(
"TRX_REQUESTED_LOCK_ID");
707 add_field(
"TRX_WAIT_STARTED", plugin::TableFunction::NUMBER, 0,
false);
708 add_field(
"TRX_WEIGHT", plugin::TableFunction::NUMBER, 0,
false);
709 add_field(
"TRX_DRIZZLE_THREAD_ID", plugin::TableFunction::NUMBER, 0,
false);
713 add_field(
"TRX_TABLES_LOCKED", plugin::TableFunction::NUMBER, 0,
false);
714 add_field(
"TRX_LOCK_STRUCTS", plugin::TableFunction::NUMBER, 0,
false);
715 add_field(
"TRX_LOCK_MEMORY_BYTES", plugin::TableFunction::NUMBER, 0,
false);
716 add_field(
"TRX_ROWS_LOCKED", plugin::TableFunction::NUMBER, 0,
false);
717 add_field(
"TRX_ROWS_MODIFIED", plugin::TableFunction::NUMBER, 0,
false);
718 add_field(
"TRX_CONCURRENCY_TICKETS", plugin::TableFunction::NUMBER, 0,
false);
720 add_field(
"TRX_UNIQUE_CHECKS", plugin::TableFunction::NUMBER, 0,
false);
721 add_field(
"TRX_FOREIGN_KEY_CHECKS", plugin::TableFunction::NUMBER, 0,
false);
722 add_field(
"TRX_LAST_FOREIGN_KEY_ERROR", plugin::TableFunction::STRING,
724 add_field(
"TRX_ADAPTIVE_HASH_LATCHED", plugin::TableFunction::NUMBER, 0,
false);
725 add_field(
"TRX_ADAPTIVE_HASH_TIMEOUT", plugin::TableFunction::NUMBER, 0,
false);
729 add_field(
"LOCK_ID");
730 add_field(
"LOCK_TRX_ID");
731 add_field(
"LOCK_MODE");
732 add_field(
"LOCK_TYPE");
733 add_field(
"LOCK_TABLE");
734 add_field(
"LOCK_INDEX");
735 add_field(
"LOCK_SPACE", plugin::TableFunction::NUMBER, 0,
false);
736 add_field(
"LOCK_PAGE", plugin::TableFunction::NUMBER, 0,
false);
737 add_field(
"LOCK_REC", plugin::TableFunction::NUMBER, 0,
false);
738 add_field(
"LOCK_DATA");
742 add_field(
"REQUESTING_TRX_ID");
743 add_field(
"REQUESTED_LOCK_ID");
744 add_field(
"BLOCKING_TRX_ID");
745 add_field(
"BLOCKING_LOCK_ID");
749 InnodbTrxTool::Generator::Generator(
Field **arg,
const char* in_table_name) :
750 plugin::TableFunction::Generator(arg),
751 table_name(in_table_name)
760 errmsg_printf(error::ERROR, _(
"Warning: data in %s truncated due to memory limit of %d bytes\n"),
776 InnodbTrxTool::Generator::~Generator()
781 bool InnodbTrxTool::Generator::populate()
783 if (record_number == number_rows)
790 populate_innodb_trx();
794 populate_innodb_locks();
798 populate_innodb_lock_waits();
809 void InnodbTrxTool::Generator::populate_innodb_locks()
825 char buf[2 * NAME_LEN + 14];
848 &getSession(), TRUE);
856 &getSession(), FALSE);
865 push(static_cast<uint64_t>(row->
lock_page));
866 push(static_cast<uint64_t>(row->
lock_rec));
870 void InnodbTrxTool::Generator::populate_innodb_trx()
891 push(static_cast<uint64_t>(0));
892 push(static_cast<uint64_t>(0));
926 void InnodbTrxTool::Generator::populate_innodb_lock_waits()
940 ut_snprintf(requesting_trx_id,
sizeof(requesting_trx_id),
942 push(requesting_trx_id);
945 sizeof(requested_lock_id)));
947 ut_snprintf(blocking_trx_id,
sizeof(blocking_trx_id),
949 push(blocking_trx_id);
952 sizeof(blocking_lock_id)));