As far as I know, the patch looks good :) You should however update the
falcon_options* tests before pushing. They assume no default value for
falcon_serial_log_dir
On Wed, 2008-08-13 at 21:41 +0200, Vladislav Vaintroub wrote:
> #At file:///C:/bzr/mysql-6.0-falcon-team/
>
> 2778 Vladislav Vaintroub 2008-08-13
> Bug #38770: falcon disregards datadir option and always creates files in
> current
> directory.
>
> This is fixed in this patch. For all file operations that accept name as
> parameter
> (create, open, delete, stat), relative paths are translated to absolute
> using
> mysql_real_data_home as base directory.
>
> Also, falcon_serial_log_dir default value is now mysql_real_data_home.
> modified:
> storage/falcon/IO.cpp
> storage/falcon/IOx.h
> storage/falcon/StorageHandler.cpp
> storage/falcon/StorageHandler.h
> storage/falcon/ha_falcon.cpp
>
> per-file messages:
> storage/falcon/IO.cpp
> Normalize path (taking base directory into account), when doing
> open/create/delete
> storage/falcon/IOx.h
> new function setBaseDirectory()
> storage/falcon/StorageHandler.cpp
> new function setDataDir
> storage/falcon/StorageHandler.h
> new function setDataDir()
> storage/falcon/ha_falcon.cpp
> Set data directory for falcon tablespaces and log files
> === modified file 'storage/falcon/IO.cpp'
> --- a/storage/falcon/IO.cpp 2008-07-24 08:45:03 +0000
> +++ b/storage/falcon/IO.cpp 2008-08-13 19:40:46 +0000
> @@ -113,6 +113,7 @@ static int simulateDiskFull = SIMULATE_D
> #endif
>
> static FILE *traceFile;
> +static JString baseDir;
>
> #ifdef _DEBUG
> #undef THIS_FILE
> @@ -142,9 +143,35 @@ IO::~IO()
> closeFile();
> }
>
> +static bool isAbsolutePath(const char *name)
> +{
> +#ifdef _WIN32
> + size_t len = strlen(name);
> + if(len < 2)
> + return false;
> + return (name[0]=='\\' || name[1]==':');
> +#else
> + return (name[0]=='/');
> +#endif
> +}
> +
> +void IO::setBaseDirectory(const char *directory)
> +{
> + baseDir = directory;
> + if (baseDir[baseDir.length()-1] != SEPARATOR)
> + baseDir += SEPARATOR;
> +}
> +
> +static JString getPath(const char *filename)
> +{
> + if(!baseDir || isAbsolutePath(filename))
> + return JString(filename);
> + return baseDir + filename;
> +}
> +
> bool IO::openFile(const char * name, bool readOnly)
> {
> - fileName = name;
> + fileName = getPath(name);
>
> for (int attempt = 0; attempt < 3; ++attempt)
> {
> @@ -189,7 +216,7 @@ bool IO::createFile(const char *name)
> {
> Log::debug("IO::createFile: creating file \"%s\"\n", name);
>
> - fileName = name;
> + fileName = getPath(name);
>
> for (int attempt = 0; attempt < 3; ++attempt)
> {
> @@ -380,10 +407,11 @@ void IO::declareFatalError()
> void IO::createPath(const char *fileName)
> {
> // First, better make sure directories exists
> + JString fname = getPath(fileName);
>
> char directory [256], *q = directory;
>
> - for (const char *p = fileName; *p;)
> + for (const char *p = fname.getString(); *p;)
> {
> char c = *p++;
>
> @@ -393,7 +421,8 @@ void IO::createPath(const char *fileName
>
> if (q > directory && q [-1] != ':')
> if (MKDIR (directory) && errno != EEXIST)
> - throw SQLError (IO_ERROR, "can't create directory \"%s\"\n", directory);
> + throw SQLError (IO_ERROR,
> + "can't create directory \"%s\"\n", directory);
> }
> *q++ = c;
> }
> @@ -408,7 +437,10 @@ const char* IO::baseName(const char *pat
> void IO::expandFileName(const char *fileName, int length, char *buffer, const char
> **baseFileName)
> {
> char expandedName[PATH_MAX+1];
> - const char *path;
> + char *path;
> + JString fname = getPath(fileName);
> + fileName = fname.getString();
> +
> #ifdef _WIN32
> char *base;
>
> @@ -465,7 +497,8 @@ bool IO::doesFileExist(const char *fileN
> int IO::fileStat(const char *fileName, struct stat *fileStats, int *errnum)
> {
> struct stat stats;
> - int retCode = stat(fileName, &stats);
> + JString path = getPath(fileName);
> + int retCode = stat(path.getString(), &stats);
>
> if (fileStats)
> *fileStats = stats;
> @@ -621,7 +654,8 @@ void IO::sync(void)
>
> void IO::deleteFile(const char* fileName)
> {
> - unlink(fileName);
> + JString path = getPath(fileName);
> + unlink(path.getString());
> }
>
> void IO::tracePage(Bdb* bdb)
> @@ -753,4 +787,3 @@ uint16 IO::computeChecksum(Page *page, s
> return (uint16) sum;
>
> }
> -
>
> === modified file 'storage/falcon/IOx.h'
> --- a/storage/falcon/IOx.h 2008-07-18 08:15:54 +0000
> +++ b/storage/falcon/IOx.h 2008-08-13 19:40:46 +0000
> @@ -64,6 +64,7 @@ public:
> void writePages(int32 pageNumber, int length, const UCHAR* data, int type);
> void readPage (Bdb *page);
> bool createFile (const char *name);
> + static void setBaseDirectory(const char *path);
> bool openFile (const char *name, bool readOnly);
> void longSeek(int64 offset);
> void read(int64 offset, int length, UCHAR* buffer);
>
> === modified file 'storage/falcon/StorageHandler.cpp'
> --- a/storage/falcon/StorageHandler.cpp 2008-08-07 21:11:55 +0000
> +++ b/storage/falcon/StorageHandler.cpp 2008-08-13 19:40:46 +0000
> @@ -37,6 +37,7 @@
> #include "Dbb.h"
> #include "Database.h"
> #include "TableSpaceManager.h"
> +#include "IOx.h"
>
> #define DICTIONARY_ACCOUNT "mysql"
> #define DICTIONARY_PW "mysql"
> @@ -112,6 +113,10 @@ StorageHandler* getFalconStorageHandler(
> return storageHandler;
> }
>
> +void StorageHandler::setDataDirectory(const char *directory)
> +{
> + IO::setBaseDirectory(directory);
> +}
>
> StorageHandler::StorageHandler(int lockSize)
> {
>
> === modified file 'storage/falcon/StorageHandler.h'
> --- a/storage/falcon/StorageHandler.h 2008-07-29 10:45:39 +0000
> +++ b/storage/falcon/StorageHandler.h 2008-08-13 19:40:46 +0000
> @@ -141,6 +141,7 @@ public:
> Connection *dictionaryConnection;
> int mySqlLockSize;
> bool initialized;
> + static void setDataDirectory(const char *directory);
> };
>
> #endif
>
> === modified file 'storage/falcon/ha_falcon.cpp'
> --- a/storage/falcon/ha_falcon.cpp 2008-08-12 14:10:28 +0000
> +++ b/storage/falcon/ha_falcon.cpp 2008-08-13 19:40:46 +0000
> @@ -162,9 +162,11 @@ int StorageInterface::falcon_init(void *
> falcon_hton = (handlerton *)p;
> my_bool error = false;
>
> + StorageHandler::setDataDirectory(mysql_real_data_home);
> +
> if (!storageHandler)
> storageHandler = getFalconStorageHandler(sizeof(THR_LOCK));
> -
> +
> falcon_hton->state = SHOW_OPTION_YES;
> falcon_hton->db_type = DB_TYPE_FALCON;
> falcon_hton->savepoint_offset = sizeof(void*);
> @@ -177,6 +179,8 @@ int StorageInterface::falcon_init(void *
> falcon_hton->create = falcon_create_handler;
> falcon_hton->drop_database = StorageInterface::dropDatabase;
> falcon_hton->panic = StorageInterface::panic;
> +
> +
> #if 0
> falcon_hton->alter_table_flags = StorageInterface::alter_table_flags;
> #endif
> @@ -3525,7 +3529,7 @@ void StorageInterface::unmapFields(void)
> static MYSQL_SYSVAR_STR(serial_log_dir, falcon_serial_log_dir,
> PLUGIN_VAR_RQCMDARG| PLUGIN_VAR_READONLY | PLUGIN_VAR_MEMALLOC,
> "Falcon serial log file directory.",
> - NULL, NULL, NULL);
> + NULL, NULL, mysql_real_data_home);
>
> static MYSQL_SYSVAR_STR(checkpoint_schedule, falcon_checkpoint_schedule,
> PLUGIN_VAR_RQCMDARG| PLUGIN_VAR_READONLY | PLUGIN_VAR_MEMALLOC,
>
>