diff options
author | unknown <ingo@mysql.com> | 2005-04-28 19:34:05 +0200 |
---|---|---|
committer | unknown <ingo@mysql.com> | 2005-04-28 19:34:05 +0200 |
commit | 45031a44546e1bf0092c9ddcde6b56d7357f3903 (patch) | |
tree | 4e65f44049751fec4d3ff85e114155f9fe894035 | |
parent | 745d52bb3da3afb018061b4e3ec34420a8475389 (diff) | |
parent | 275c8e77907791f62ed334d9cafaba8d734a4d33 (diff) | |
download | mariadb-git-45031a44546e1bf0092c9ddcde6b56d7357f3903.tar.gz |
Merge mysql.com:/home/mydev/mysql-4.1-4100
into mysql.com:/home/mydev/mysql-5.0-5000
include/my_sys.h:
Auto merged
myisam/myisampack.c:
Auto merged
sql/ha_myisammrg.cc:
Auto merged
-rw-r--r-- | include/my_sys.h | 1 | ||||
-rw-r--r-- | myisam/myisampack.c | 9 | ||||
-rw-r--r-- | myisammrg/myrg_open.c | 2 | ||||
-rw-r--r-- | mysys/my_getwd.c | 22 | ||||
-rw-r--r-- | sql/ha_myisammrg.cc | 28 |
5 files changed, 55 insertions, 7 deletions
diff --git a/include/my_sys.h b/include/my_sys.h index f63743a4c6c..e2f9444c52a 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -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); diff --git a/myisam/myisampack.c b/myisam/myisampack.c index 352c7954d72..74bb541b220 100644 --- a/myisam/myisampack.c +++ b/myisam/myisampack.c @@ -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)) { diff --git a/myisammrg/myrg_open.c b/myisammrg/myrg_open.c index a59ccb7d966..0dc2f4f9768 100644 --- a/myisammrg/myrg_open.c +++ b/myisammrg/myrg_open.c @@ -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)); diff --git a/mysys/my_getwd.c b/mysys/my_getwd.c index d6f647254e8..89f949eca27 100644 --- a/mysys/my_getwd.c +++ b/mysys/my_getwd.c @@ -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 + ; +} diff --git a/sql/ha_myisammrg.cc b/sql/ha_myisammrg.cc index 5add9478bf4..20b5ad44629 100644 --- a/sql/ha_myisammrg.cc +++ b/sql/ha_myisammrg.cc @@ -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; |