111
111
#define check_unused()
114
int list_open_tables(THD *thd,List<char> *tables, const char *db,
114
OPEN_TABLE_LIST *list_open_tables(THD *thd, const char *wild)
118
117
uint col_access=thd->col_access;
118
OPEN_TABLE_LIST **start_list, *open_list;
119
119
TABLE_LIST table_list;
120
char name[NAME_LEN*2];
120
121
DBUG_ENTER("list_open_tables");
121
123
VOID(pthread_mutex_lock(&LOCK_open));
122
124
bzero((char*) &table_list,sizeof(table_list));
125
start_list= &open_list;
124
128
for (uint idx=0 ; result == 0 && idx < open_cache.records; idx++)
130
OPEN_TABLE_LIST *table;
126
131
TABLE *entry=(TABLE*) hash_element(&open_cache,idx);
127
if ((!entry->real_name) || strcmp(entry->table_cache_key,db))
129
if (wild && wild[0] && wild_compare(entry->real_name,wild))
131
if (db && !(col_access & TABLE_ACLS))
133
table_list.db= (char*) db;
134
table_list.real_name= entry->real_name;/*real name*/
135
table_list.grant.privilege=col_access;
136
if (check_grant(thd,TABLE_ACLS,&table_list,1))
139
/* need to check if he have't already listed it */
141
List_iterator<char> it(*tables);
144
while (check == 0 && (table_name=it++))
146
if (!strcmp(table_name,entry->real_name))
152
if (tables->push_back(thd->strdup(entry->real_name)))
133
if ((!entry->real_name))
134
continue; // Shouldn't happen
137
strxmov(name,entry->table_cache_key,".",entry->real_name,NullS);
138
if (wild_compare(name,wild))
142
/* Check if user has SELECT privilege for any column in the table */
143
table_list.db= (char*) entry->table_cache_key;
144
table_list.real_name= entry->real_name;
145
table_list.grant.privilege=0;
146
if (check_table_access(thd,SELECT_ACL | EXTRA_ACL,&table_list))
149
/* need to check if we haven't already listed it */
150
for (table= open_list ; table ; table=table->next)
152
if (!strcmp(table->table,entry->real_name) &&
153
!strcmp(table->db,entry->table_cache_key))
157
if (entry->locked_by_name)
164
if (!(*start_list = (OPEN_TABLE_LIST *)
165
sql_alloc(sizeof(OPEN_TABLE_LIST)+entry->key_length)))
167
open_list=0; // Out of memory
170
(*start_list)->table=(strmov((*start_list)->db=(char*) ((*start_list)+1),
171
entry->table_cache_key)+1,
173
(*start_list)->in_use= entry->in_use ? 1 : 0;
174
(*start_list)->locked= entry->locked_by_name ? 1 : 0;
175
start_list= &(*start_list)->next;
158
177
VOID(pthread_mutex_unlock(&LOCK_open));
163
query_table_status(THD *thd,const char *db,const char *table_name)
165
int cached = 0, in_use = 0;
168
for (uint idx=0 ; idx < open_cache.records; idx++)
170
TABLE *entry=(TABLE*) hash_element(&open_cache,idx);
171
if (strcmp(entry->table_cache_key,db) ||
172
strcmp(entry->real_name,table_name))
180
sprintf(info, "cached=%d, in_use=%d", cached, in_use);
181
return thd->strdup(info);
178
DBUG_RETURN(open_list);