mariadb/plugin/userstat/table_stats.cc
Monty a7e352b54d Changed database, tablename and alias to be LEX_CSTRING
This was done in, among other things:
- thd->db and thd->db_length
- TABLE_LIST tablename, db, alias and schema_name
- Audit plugin database name
- lex->db
- All db and table names in Alter_table_ctx
- st_select_lex db

Other things:
- Changed a lot of functions to take const LEX_CSTRING* as argument
  for db, table_name and alias. See init_one_table() as an example.
- Changed some function arguments from LEX_CSTRING to const LEX_CSTRING
- Changed some lists from LEX_STRING to LEX_CSTRING
- threads_mysql.result changed because process list_db wasn't always
  correctly updated
- New append_identifier() function that takes LEX_CSTRING* as arguments
- Added new element tmp_buff to Alter_table_ctx to separate temp name
  handling from temporary space
- Ensure we store the length after my_casedn_str() of table/db names
- Removed not used version of rename_table_in_stat_tables()
- Changed Natural_join_column::table_name and db_name() to never return
  NULL (used for print)
- thd->get_db() now returns db as a printable string (thd->db.str or "")
2018-01-30 21:33:55 +02:00

75 lines
2.7 KiB
C++

static ST_FIELD_INFO table_stats_fields[]=
{
{"TABLE_SCHEMA", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Table_schema",SKIP_OPEN_TABLE},
{"TABLE_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Table_name",SKIP_OPEN_TABLE},
{"ROWS_READ", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, 0, 0, "Rows_read",SKIP_OPEN_TABLE},
{"ROWS_CHANGED", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, 0, 0, "Rows_changed",SKIP_OPEN_TABLE},
{"ROWS_CHANGED_X_INDEXES", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, 0, 0, "Rows_changed_x_#indexes",SKIP_OPEN_TABLE},
{0, 0, MYSQL_TYPE_STRING, 0, 0, 0, 0}
};
static int table_stats_fill(THD *thd, TABLE_LIST *tables, COND *cond)
{
TABLE *table= tables->table;
mysql_mutex_lock(&LOCK_global_table_stats);
for (uint i= 0; i < global_table_stats.records; i++)
{
char *end_of_schema;
TABLE_STATS *table_stats=
(TABLE_STATS*)my_hash_element(&global_table_stats, i);
TABLE_LIST tmp_table;
size_t schema_length, table_name_length;
end_of_schema= strend(table_stats->table);
schema_length= (size_t) (end_of_schema - table_stats->table);
table_name_length= strlen(table_stats->table + schema_length + 1);
bzero((char*) &tmp_table,sizeof(tmp_table));
tmp_table.db.str= table_stats->table;
tmp_table.db.length= schema_length;
tmp_table.table_name.str= end_of_schema+1;
tmp_table.table_name.length= table_name_length;
tmp_table.grant.privilege= 0;
if (check_access(thd, SELECT_ACL, tmp_table.db.str,
&tmp_table.grant.privilege, NULL, 0, 1) ||
check_grant(thd, SELECT_ACL, &tmp_table, 1, UINT_MAX,
1))
continue;
table->field[0]->store(table_stats->table, schema_length,
system_charset_info);
table->field[1]->store(table_stats->table + schema_length+1,
table_name_length, system_charset_info);
table->field[2]->store((longlong)table_stats->rows_read, TRUE);
table->field[3]->store((longlong)table_stats->rows_changed, TRUE);
table->field[4]->store((longlong)table_stats->rows_changed_x_indexes,
TRUE);
if (schema_table_store_record(thd, table))
{
mysql_mutex_unlock(&LOCK_global_table_stats);
return 1;
}
}
mysql_mutex_unlock(&LOCK_global_table_stats);
return 0;
}
static int table_stats_reset()
{
mysql_mutex_lock(&LOCK_global_table_stats);
free_global_table_stats();
init_global_table_stats();
mysql_mutex_unlock(&LOCK_global_table_stats);
return 0;
}
static int table_stats_init(void *p)
{
ST_SCHEMA_TABLE *schema= (ST_SCHEMA_TABLE *)p;
schema->fields_info= table_stats_fields;
schema->fill_table= table_stats_fill;
schema->reset_table= table_stats_reset;
return 0;
}