* use Dynamic_array<> instead of List<> for the list of found tables in sql_show.cc
* make find_files static
This commit is contained in:
parent
69ba585a1e
commit
8980e67693
@ -124,6 +124,11 @@ public:
|
|||||||
return (insert_dynamic(&array, (uchar*)&el));
|
return (insert_dynamic(&array, (uchar*)&el));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool append_val(Elem el)
|
||||||
|
{
|
||||||
|
return (insert_dynamic(&array, (uchar*)&el));
|
||||||
|
}
|
||||||
|
|
||||||
int elements()
|
int elements()
|
||||||
{
|
{
|
||||||
return array.elements;
|
return array.elements;
|
||||||
|
@ -687,6 +687,11 @@ db_name_is_in_ignore_db_dirs_list(const char *directory)
|
|||||||
return my_hash_search(&ignore_db_dirs_hash, (uchar *) buff, buff_len)!=NULL;
|
return my_hash_search(&ignore_db_dirs_hash, (uchar *) buff, buff_len)!=NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum find_files_result {
|
||||||
|
FIND_FILES_OK,
|
||||||
|
FIND_FILES_OOM,
|
||||||
|
FIND_FILES_DIR
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
find_files() - find files in a given directory.
|
find_files() - find files in a given directory.
|
||||||
@ -708,8 +713,8 @@ db_name_is_in_ignore_db_dirs_list(const char *directory)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
find_files_result
|
static find_files_result
|
||||||
find_files(THD *thd, List<LEX_STRING> *files, const char *db,
|
find_files(THD *thd, Dynamic_array<LEX_STRING*> *files, const char *db,
|
||||||
const char *path, const char *wild, bool dir)
|
const char *path, const char *wild, bool dir)
|
||||||
{
|
{
|
||||||
uint i;
|
uint i;
|
||||||
@ -739,9 +744,9 @@ find_files(THD *thd, List<LEX_STRING> *files, const char *db,
|
|||||||
MY_THREAD_SPECIFIC))))
|
MY_THREAD_SPECIFIC))))
|
||||||
{
|
{
|
||||||
if (my_errno == ENOENT)
|
if (my_errno == ENOENT)
|
||||||
my_error(ER_BAD_DB_ERROR, MYF(ME_BELL+ME_WAITTANG), db);
|
my_error(ER_BAD_DB_ERROR, MYF(ME_BELL | ME_WAITTANG), db);
|
||||||
else
|
else
|
||||||
my_error(ER_CANT_READ_DIR, MYF(ME_BELL+ME_WAITTANG), path, my_errno);
|
my_error(ER_CANT_READ_DIR, MYF(ME_BELL | ME_WAITTANG), path, my_errno);
|
||||||
DBUG_RETURN(FIND_FILES_DIR);
|
DBUG_RETURN(FIND_FILES_DIR);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -824,13 +829,13 @@ find_files(THD *thd, List<LEX_STRING> *files, const char *db,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!(file_name= thd->make_lex_string(uname, file_name_len)) ||
|
if (!(file_name= thd->make_lex_string(uname, file_name_len)) ||
|
||||||
files->push_back(file_name))
|
files->append(file_name))
|
||||||
{
|
{
|
||||||
my_dirend(dirp);
|
my_dirend(dirp);
|
||||||
DBUG_RETURN(FIND_FILES_OOM);
|
DBUG_RETURN(FIND_FILES_OOM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DBUG_PRINT("info",("found: %d files", files->elements));
|
DBUG_PRINT("info",("found: %d files", files->elements()));
|
||||||
my_dirend(dirp);
|
my_dirend(dirp);
|
||||||
|
|
||||||
DBUG_RETURN(FIND_FILES_OK);
|
DBUG_RETURN(FIND_FILES_OK);
|
||||||
@ -3697,7 +3702,7 @@ enum enum_schema_tables get_schema_table_idx(ST_SCHEMA_TABLE *schema_table)
|
|||||||
non-zero error
|
non-zero error
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int make_db_list(THD *thd, List<LEX_STRING> *files,
|
int make_db_list(THD *thd, Dynamic_array<LEX_STRING*> *files,
|
||||||
LOOKUP_FIELD_VALUES *lookup_field_vals,
|
LOOKUP_FIELD_VALUES *lookup_field_vals,
|
||||||
bool *with_i_schema)
|
bool *with_i_schema)
|
||||||
{
|
{
|
||||||
@ -3718,7 +3723,7 @@ int make_db_list(THD *thd, List<LEX_STRING> *files,
|
|||||||
lookup_field_vals->db_value.str))
|
lookup_field_vals->db_value.str))
|
||||||
{
|
{
|
||||||
*with_i_schema= 1;
|
*with_i_schema= 1;
|
||||||
if (files->push_back(i_s_name_copy))
|
if (files->append(i_s_name_copy))
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return (find_files(thd, files, NullS, mysql_data_home,
|
return (find_files(thd, files, NullS, mysql_data_home,
|
||||||
@ -3739,11 +3744,11 @@ int make_db_list(THD *thd, List<LEX_STRING> *files,
|
|||||||
lookup_field_vals->db_value.length))
|
lookup_field_vals->db_value.length))
|
||||||
{
|
{
|
||||||
*with_i_schema= 1;
|
*with_i_schema= 1;
|
||||||
if (files->push_back(i_s_name_copy))
|
if (files->append(i_s_name_copy))
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (files->push_back(&lookup_field_vals->db_value))
|
if (files->append_val(&lookup_field_vals->db_value))
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -3752,7 +3757,7 @@ int make_db_list(THD *thd, List<LEX_STRING> *files,
|
|||||||
Create list of existing databases. It is used in case
|
Create list of existing databases. It is used in case
|
||||||
of select from information schema table
|
of select from information schema table
|
||||||
*/
|
*/
|
||||||
if (files->push_back(i_s_name_copy))
|
if (files->append(i_s_name_copy))
|
||||||
return 1;
|
return 1;
|
||||||
*with_i_schema= 1;
|
*with_i_schema= 1;
|
||||||
return (find_files(thd, files, NullS,
|
return (find_files(thd, files, NullS,
|
||||||
@ -3762,7 +3767,7 @@ int make_db_list(THD *thd, List<LEX_STRING> *files,
|
|||||||
|
|
||||||
struct st_add_schema_table
|
struct st_add_schema_table
|
||||||
{
|
{
|
||||||
List<LEX_STRING> *files;
|
Dynamic_array<LEX_STRING*> *files;
|
||||||
const char *wild;
|
const char *wild;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -3772,7 +3777,7 @@ static my_bool add_schema_table(THD *thd, plugin_ref plugin,
|
|||||||
{
|
{
|
||||||
LEX_STRING *file_name= 0;
|
LEX_STRING *file_name= 0;
|
||||||
st_add_schema_table *data= (st_add_schema_table *)p_data;
|
st_add_schema_table *data= (st_add_schema_table *)p_data;
|
||||||
List<LEX_STRING> *file_list= data->files;
|
Dynamic_array<LEX_STRING*> *file_list= data->files;
|
||||||
const char *wild= data->wild;
|
const char *wild= data->wild;
|
||||||
ST_SCHEMA_TABLE *schema_table= plugin_data(plugin, ST_SCHEMA_TABLE *);
|
ST_SCHEMA_TABLE *schema_table= plugin_data(plugin, ST_SCHEMA_TABLE *);
|
||||||
DBUG_ENTER("add_schema_table");
|
DBUG_ENTER("add_schema_table");
|
||||||
@ -3794,13 +3799,14 @@ static my_bool add_schema_table(THD *thd, plugin_ref plugin,
|
|||||||
|
|
||||||
if ((file_name= thd->make_lex_string(schema_table->table_name,
|
if ((file_name= thd->make_lex_string(schema_table->table_name,
|
||||||
strlen(schema_table->table_name))) &&
|
strlen(schema_table->table_name))) &&
|
||||||
!file_list->push_back(file_name))
|
!file_list->append(file_name))
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int schema_tables_add(THD *thd, List<LEX_STRING> *files, const char *wild)
|
int schema_tables_add(THD *thd, Dynamic_array<LEX_STRING*> *files,
|
||||||
|
const char *wild)
|
||||||
{
|
{
|
||||||
LEX_STRING *file_name= 0;
|
LEX_STRING *file_name= 0;
|
||||||
ST_SCHEMA_TABLE *tmp_schema_table= schema_tables;
|
ST_SCHEMA_TABLE *tmp_schema_table= schema_tables;
|
||||||
@ -3826,7 +3832,7 @@ int schema_tables_add(THD *thd, List<LEX_STRING> *files, const char *wild)
|
|||||||
if ((file_name=
|
if ((file_name=
|
||||||
thd->make_lex_string(tmp_schema_table->table_name,
|
thd->make_lex_string(tmp_schema_table->table_name,
|
||||||
strlen(tmp_schema_table->table_name))) &&
|
strlen(tmp_schema_table->table_name))) &&
|
||||||
!files->push_back(file_name))
|
!files->append(file_name))
|
||||||
continue;
|
continue;
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
@ -3861,8 +3867,8 @@ int schema_tables_add(THD *thd, List<LEX_STRING> *files, const char *wild)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static int
|
static int
|
||||||
make_table_name_list(THD *thd, List<LEX_STRING> *table_names, LEX *lex,
|
make_table_name_list(THD *thd, Dynamic_array<LEX_STRING*> *table_names,
|
||||||
LOOKUP_FIELD_VALUES *lookup_field_vals,
|
LEX *lex, LOOKUP_FIELD_VALUES *lookup_field_vals,
|
||||||
bool with_i_schema, LEX_STRING *db_name)
|
bool with_i_schema, LEX_STRING *db_name)
|
||||||
{
|
{
|
||||||
char path[FN_REFLEN + 1];
|
char path[FN_REFLEN + 1];
|
||||||
@ -3879,13 +3885,13 @@ make_table_name_list(THD *thd, List<LEX_STRING> *table_names, LEX *lex,
|
|||||||
{
|
{
|
||||||
if (!(name= thd->make_lex_string(schema_table->table_name,
|
if (!(name= thd->make_lex_string(schema_table->table_name,
|
||||||
strlen(schema_table->table_name))) ||
|
strlen(schema_table->table_name))) ||
|
||||||
table_names->push_back(name))
|
table_names->append(name))
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (table_names->push_back(&lookup_field_vals->table_value))
|
if (table_names->append_val(&lookup_field_vals->table_value))
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -4544,11 +4550,10 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||||||
SELECT_LEX *lsel= tables->schema_select_lex;
|
SELECT_LEX *lsel= tables->schema_select_lex;
|
||||||
ST_SCHEMA_TABLE *schema_table= tables->schema_table;
|
ST_SCHEMA_TABLE *schema_table= tables->schema_table;
|
||||||
LOOKUP_FIELD_VALUES lookup_field_vals;
|
LOOKUP_FIELD_VALUES lookup_field_vals;
|
||||||
LEX_STRING *db_name, *table_name;
|
LEX_STRING *db_name;
|
||||||
bool with_i_schema;
|
bool with_i_schema;
|
||||||
enum enum_schema_tables schema_table_idx;
|
enum enum_schema_tables schema_table_idx;
|
||||||
List<LEX_STRING> db_names;
|
Dynamic_array<LEX_STRING*> db_names;
|
||||||
List_iterator_fast<LEX_STRING> it(db_names);
|
|
||||||
COND *partial_cond= 0;
|
COND *partial_cond= 0;
|
||||||
int error= 1;
|
int error= 1;
|
||||||
Open_tables_backup open_tables_state_backup;
|
Open_tables_backup open_tables_state_backup;
|
||||||
@ -4652,9 +4657,9 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||||||
|
|
||||||
if (make_db_list(thd, &db_names, &lookup_field_vals, &with_i_schema))
|
if (make_db_list(thd, &db_names, &lookup_field_vals, &with_i_schema))
|
||||||
goto err;
|
goto err;
|
||||||
it.rewind(); /* To get access to new elements in basis list */
|
for (int i=0; i < db_names.elements(); i++)
|
||||||
while ((db_name= it++))
|
|
||||||
{
|
{
|
||||||
|
db_name= db_names.at(i);
|
||||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||||
if (!(check_access(thd, SELECT_ACL, db_name->str,
|
if (!(check_access(thd, SELECT_ACL, db_name->str,
|
||||||
&thd->col_access, NULL, 0, 1) ||
|
&thd->col_access, NULL, 0, 1) ||
|
||||||
@ -4663,7 +4668,7 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||||||
acl_get(sctx->host, sctx->ip, sctx->priv_user, db_name->str, 0))
|
acl_get(sctx->host, sctx->ip, sctx->priv_user, db_name->str, 0))
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
List<LEX_STRING> table_names;
|
Dynamic_array<LEX_STRING*> table_names;
|
||||||
int res= make_table_name_list(thd, &table_names, lex,
|
int res= make_table_name_list(thd, &table_names, lex,
|
||||||
&lookup_field_vals,
|
&lookup_field_vals,
|
||||||
with_i_schema, db_name);
|
with_i_schema, db_name);
|
||||||
@ -4672,9 +4677,9 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||||||
if (res)
|
if (res)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
List_iterator_fast<LEX_STRING> it_files(table_names);
|
for (int i=0; i < table_names.elements(); i++)
|
||||||
while ((table_name= it_files++))
|
|
||||||
{
|
{
|
||||||
|
LEX_STRING *table_name= table_names.at(i);
|
||||||
restore_record(table, s->default_values);
|
restore_record(table, s->default_values);
|
||||||
table->field[schema_table->idx_field1]->
|
table->field[schema_table->idx_field1]->
|
||||||
store(db_name->str, db_name->length, system_charset_info);
|
store(db_name->str, db_name->length, system_charset_info);
|
||||||
@ -4779,8 +4784,7 @@ int fill_schema_schemata(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
LOOKUP_FIELD_VALUES lookup_field_vals;
|
LOOKUP_FIELD_VALUES lookup_field_vals;
|
||||||
List<LEX_STRING> db_names;
|
Dynamic_array<LEX_STRING*> db_names;
|
||||||
LEX_STRING *db_name;
|
|
||||||
bool with_i_schema;
|
bool with_i_schema;
|
||||||
HA_CREATE_INFO create;
|
HA_CREATE_INFO create;
|
||||||
TABLE *table= tables->table;
|
TABLE *table= tables->table;
|
||||||
@ -4816,9 +4820,9 @@ int fill_schema_schemata(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
List_iterator_fast<LEX_STRING> it(db_names);
|
for (int i=0; i < db_names.elements(); i++)
|
||||||
while ((db_name=it++))
|
|
||||||
{
|
{
|
||||||
|
LEX_STRING *db_name= db_names.at(i);
|
||||||
if (with_i_schema) // information schema name is always first in list
|
if (with_i_schema) // information schema name is always first in list
|
||||||
{
|
{
|
||||||
if (store_schema_shemata(thd, table, db_name,
|
if (store_schema_shemata(thd, table, db_name,
|
||||||
|
@ -34,12 +34,6 @@ typedef struct st_schema_table ST_SCHEMA_TABLE;
|
|||||||
struct TABLE;
|
struct TABLE;
|
||||||
typedef struct system_status_var STATUS_VAR;
|
typedef struct system_status_var STATUS_VAR;
|
||||||
|
|
||||||
enum find_files_result {
|
|
||||||
FIND_FILES_OK,
|
|
||||||
FIND_FILES_OOM,
|
|
||||||
FIND_FILES_DIR
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Used by handlers to store things in schema tables */
|
/* Used by handlers to store things in schema tables */
|
||||||
#define IS_FILES_FILE_ID 0
|
#define IS_FILES_FILE_ID 0
|
||||||
#define IS_FILES_FILE_NAME 1
|
#define IS_FILES_FILE_NAME 1
|
||||||
@ -80,9 +74,6 @@ enum find_files_result {
|
|||||||
#define IS_FILES_STATUS 36
|
#define IS_FILES_STATUS 36
|
||||||
#define IS_FILES_EXTRA 37
|
#define IS_FILES_EXTRA 37
|
||||||
|
|
||||||
find_files_result find_files(THD *thd, List<LEX_STRING> *files, const char *db,
|
|
||||||
const char *path, const char *wild, bool dir);
|
|
||||||
|
|
||||||
int store_create_info(THD *thd, TABLE_LIST *table_list, String *packet,
|
int store_create_info(THD *thd, TABLE_LIST *table_list, String *packet,
|
||||||
HA_CREATE_INFO *create_info_arg, bool show_database);
|
HA_CREATE_INFO *create_info_arg, bool show_database);
|
||||||
int view_store_create_info(THD *thd, TABLE_LIST *table, String *buff);
|
int view_store_create_info(THD *thd, TABLE_LIST *table, String *buff);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user