mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 11:01:52 +01:00
Merge mysql.com:/home/mydev/mysql-5.0
into mysql.com:/home/mydev/mysql-5.0-5000
This commit is contained in:
commit
f9128d95a1
5 changed files with 55 additions and 7 deletions
|
@ -638,6 +638,7 @@ extern uint dirname_part(my_string to,const char *name);
|
|||
extern uint dirname_length(const char *name);
|
||||
#define base_name(A) (A+dirname_length(A))
|
||||
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 void to_unix_path(my_string name);
|
||||
extern my_string fn_ext(const char *name);
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#define __GNU_LIBRARY__ /* Skip warnings in getopt.h */
|
||||
#endif
|
||||
#include <my_getopt.h>
|
||||
#include <assert.h>
|
||||
|
||||
#if INT_MAX > 32767
|
||||
#define BITS_SAVED 32
|
||||
|
@ -1996,7 +1997,9 @@ static void write_bits (register ulong value, register uint bits)
|
|||
{
|
||||
reg3 uint byte_buff;
|
||||
bits= (uint) -file_buffer.bits;
|
||||
byte_buff=file_buffer.current_byte | (uint) (value >> bits);
|
||||
DBUG_ASSERT(bits <= 8 * sizeof(value));
|
||||
byte_buff= (file_buffer.current_byte |
|
||||
((bits != 8 * sizeof(value)) ? (uint) (value >> bits) : 0));
|
||||
#if BITS_SAVED == 32
|
||||
*file_buffer.pos++= (byte) (byte_buff >> 24) ;
|
||||
*file_buffer.pos++= (byte) (byte_buff >> 16) ;
|
||||
|
@ -2004,7 +2007,9 @@ static void write_bits (register ulong value, register uint bits)
|
|||
*file_buffer.pos++= (byte) (byte_buff >> 8) ;
|
||||
*file_buffer.pos++= (byte) byte_buff;
|
||||
|
||||
value&=(1 << bits)-1;
|
||||
DBUG_ASSERT(bits <= 8 * sizeof(ulong));
|
||||
if (bits != 8 * sizeof(value))
|
||||
value&= (((ulong) 1) << bits) - 1;
|
||||
#if BITS_SAVED == 16
|
||||
if (bits >= sizeof(uint))
|
||||
{
|
||||
|
|
|
@ -80,7 +80,7 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
|
|||
continue; /* Skip comments */
|
||||
}
|
||||
|
||||
if (!test_if_hard_path(buff))
|
||||
if (!has_path(buff))
|
||||
{
|
||||
VOID(strmake(name_buff+dir_length,buff,
|
||||
sizeof(name_buff)-1-dir_length));
|
||||
|
|
|
@ -192,3 +192,25 @@ int test_if_hard_path(register const char *dir_name)
|
|||
return FALSE;
|
||||
#endif
|
||||
} /* 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
|
||||
;
|
||||
}
|
||||
|
|
|
@ -400,6 +400,7 @@ int ha_myisammrg::create(const char *name, register TABLE *form,
|
|||
const char **table_names, **pos;
|
||||
TABLE_LIST *tables= (TABLE_LIST*) create_info->merge_list.first;
|
||||
THD *thd= current_thd;
|
||||
uint dirlgt= dirname_length(name);
|
||||
DBUG_ENTER("ha_myisammrg::create");
|
||||
|
||||
if (!(table_names= (const char**)
|
||||
|
@ -413,11 +414,30 @@ int ha_myisammrg::create(const char *name, register TABLE *form,
|
|||
tbl= find_temporary_table(thd, tables->db, tables->table_name);
|
||||
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->table_name);
|
||||
if (!(table_name= thd->strmake(buff, length)))
|
||||
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
||||
/*
|
||||
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);
|
||||
}
|
||||
else
|
||||
table_name= (*tbl)->s->path;
|
||||
|
|
Loading…
Add table
Reference in a new issue