summaryrefslogtreecommitdiff
path: root/plugin/userstat/index_stats.cc
blob: 0528507c50ed6a4fa6236220ad9e3d96ff534313 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
static ST_FIELD_INFO index_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},
  {"INDEX_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Index_name",SKIP_OPEN_TABLE},
  {"ROWS_READ", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, 0, 0, "Rows_read",SKIP_OPEN_TABLE},
  {0, 0, MYSQL_TYPE_STRING, 0, 0, 0,0}
};

static int index_stats_fill(THD *thd, TABLE_LIST *tables, COND *cond)
{
  TABLE *table= tables->table;

  mysql_mutex_lock(&LOCK_global_index_stats);
  for (uint i= 0; i < global_index_stats.records; i++)
  {
    INDEX_STATS *index_stats =
      (INDEX_STATS*) my_hash_element(&global_index_stats, i);
    TABLE_LIST tmp_table;
    const char *index_name;
    size_t index_name_length;

    bzero((char*) &tmp_table,sizeof(tmp_table));
    tmp_table.db.str=    index_stats->index;
    tmp_table.db.length= strlen(index_stats->index);
    tmp_table.table_name.str= index_stats->index + tmp_table.db.length + 1;
    tmp_table.table_name.length= strlen(tmp_table.table_name.str);
    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;

    index_name=         tmp_table.table_name.str + tmp_table.table_name.length + 1;
    index_name_length=  (index_stats->index_name_length - tmp_table.db.length -
                         tmp_table.table_name.length - 3);

    table->field[0]->store(tmp_table.db.str, tmp_table.db.length, system_charset_info);
    table->field[1]->store(tmp_table.table_name.str, tmp_table.table_name.length,
                           system_charset_info);
    table->field[2]->store(index_name, (uint) index_name_length, system_charset_info);
    table->field[3]->store((longlong)index_stats->rows_read, TRUE);

    if (schema_table_store_record(thd, table))
    {
      mysql_mutex_unlock(&LOCK_global_index_stats);
      return 1;
    }
  }
  mysql_mutex_unlock(&LOCK_global_index_stats);
  return 0;
}

static int index_stats_reset()
{
  mysql_mutex_lock(&LOCK_global_index_stats);
  free_global_index_stats();
  init_global_index_stats();
  mysql_mutex_unlock(&LOCK_global_index_stats);
  return 0;
}

static int index_stats_init(void *p)
{
  ST_SCHEMA_TABLE *schema= (ST_SCHEMA_TABLE *)p;
  schema->fields_info= index_stats_fields;
  schema->fill_table= index_stats_fill;
  schema->reset_table= index_stats_reset;
  return 0;
}