Merge mysql.com:/home/mydev/mysql-4.1-bug5964
into mysql.com:/home/mydev/mysql-4.1-4100
This commit is contained in:
commit
8ccbea47e8
@ -609,6 +609,7 @@ extern uint dirname_part(my_string to,const char *name);
|
|||||||
extern uint dirname_length(const char *name);
|
extern uint dirname_length(const char *name);
|
||||||
#define base_name(A) (A+dirname_length(A))
|
#define base_name(A) (A+dirname_length(A))
|
||||||
extern int test_if_hard_path(const char *dir_name);
|
extern int test_if_hard_path(const char *dir_name);
|
||||||
|
extern my_bool has_path(const char *name);
|
||||||
extern char *convert_dirname(char *to, const char *from, const char *from_end);
|
extern char *convert_dirname(char *to, const char *from, const char *from_end);
|
||||||
extern void to_unix_path(my_string name);
|
extern void to_unix_path(my_string name);
|
||||||
extern my_string fn_ext(const char *name);
|
extern my_string fn_ext(const char *name);
|
||||||
|
@ -80,7 +80,7 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
|
|||||||
continue; /* Skip comments */
|
continue; /* Skip comments */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!test_if_hard_path(buff))
|
if (!has_path(buff))
|
||||||
{
|
{
|
||||||
VOID(strmake(name_buff+dir_length,buff,
|
VOID(strmake(name_buff+dir_length,buff,
|
||||||
sizeof(name_buff)-1-dir_length));
|
sizeof(name_buff)-1-dir_length));
|
||||||
|
@ -192,3 +192,25 @@ int test_if_hard_path(register const char *dir_name)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
#endif
|
#endif
|
||||||
} /* test_if_hard_path */
|
} /* test_if_hard_path */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Test if a name contains an (absolute or relative) path.
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
has_path()
|
||||||
|
name The name to test.
|
||||||
|
|
||||||
|
RETURN
|
||||||
|
TRUE name contains a path.
|
||||||
|
FALSE name does not contain a path.
|
||||||
|
*/
|
||||||
|
|
||||||
|
my_bool has_path(const char *name)
|
||||||
|
{
|
||||||
|
return test(strchr(name, FN_LIBCHAR))
|
||||||
|
#ifdef FN_DEVCHAR
|
||||||
|
|| test(strchr(name, FN_DEVCHAR))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
}
|
||||||
|
@ -381,6 +381,7 @@ int ha_myisammrg::create(const char *name, register TABLE *form,
|
|||||||
char buff[FN_REFLEN],**table_names,**pos;
|
char buff[FN_REFLEN],**table_names,**pos;
|
||||||
TABLE_LIST *tables= (TABLE_LIST*) create_info->merge_list.first;
|
TABLE_LIST *tables= (TABLE_LIST*) create_info->merge_list.first;
|
||||||
THD *thd= current_thd;
|
THD *thd= current_thd;
|
||||||
|
uint dirlgt= dirname_length(name);
|
||||||
DBUG_ENTER("ha_myisammrg::create");
|
DBUG_ENTER("ha_myisammrg::create");
|
||||||
|
|
||||||
if (!(table_names= (char**) thd->alloc((create_info->merge_list.elements+1)*
|
if (!(table_names= (char**) thd->alloc((create_info->merge_list.elements+1)*
|
||||||
@ -394,10 +395,29 @@ int ha_myisammrg::create(const char *name, register TABLE *form,
|
|||||||
tbl= find_temporary_table(thd, tables->db, tables->real_name);
|
tbl= find_temporary_table(thd, tables->db, tables->real_name);
|
||||||
if (!tbl)
|
if (!tbl)
|
||||||
{
|
{
|
||||||
uint length= my_snprintf(buff,FN_REFLEN,"%s%s/%s",
|
/*
|
||||||
mysql_real_data_home,
|
Construct the path to the MyISAM table. Try to meet two conditions:
|
||||||
|
1.) Allow to include MyISAM tables from different databases, and
|
||||||
|
2.) allow for moving DATADIR around in the file system.
|
||||||
|
The first means that we need paths in the .MRG file. The second
|
||||||
|
means that we should not have absolute paths in the .MRG file.
|
||||||
|
The best, we can do, is to use 'mysql_data_home', which is '.'
|
||||||
|
in mysqld and may be an absolute path in an embedded server.
|
||||||
|
This means that it might not be possible to move the DATADIR of
|
||||||
|
an embedded server without changing the paths in the .MRG file.
|
||||||
|
*/
|
||||||
|
uint length= my_snprintf(buff, FN_REFLEN, "%s/%s/%s", mysql_data_home,
|
||||||
tables->db, tables->real_name);
|
tables->db, tables->real_name);
|
||||||
if (!(table_name= thd->strmake(buff, length)))
|
/*
|
||||||
|
If a MyISAM table is in the same directory as the MERGE table,
|
||||||
|
we use the table name without a path. This means that the
|
||||||
|
DATADIR can easily be moved even for an embedded server as long
|
||||||
|
as the MyISAM tables are from the same database as the MERGE table.
|
||||||
|
*/
|
||||||
|
if ((dirname_length(buff) == dirlgt) && ! memcmp(buff, name, dirlgt))
|
||||||
|
table_name= tables->real_name;
|
||||||
|
else
|
||||||
|
if (! (table_name= thd->strmake(buff, length)))
|
||||||
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
Loading…
x
Reference in New Issue
Block a user