New file default_modify.c. Fixed a typo on mysqld.cc
Changed name of function my_correct_default_file to modify_defaults_file. Improved function and fixed some bugs in it.
This commit is contained in:
parent
3b5897e5e9
commit
c63ad3b549
@ -778,15 +778,13 @@ extern void reset_root_defaults(MEM_ROOT *mem_root, uint block_size,
|
|||||||
extern char *strdup_root(MEM_ROOT *root,const char *str);
|
extern char *strdup_root(MEM_ROOT *root,const char *str);
|
||||||
extern char *strmake_root(MEM_ROOT *root,const char *str,uint len);
|
extern char *strmake_root(MEM_ROOT *root,const char *str,uint len);
|
||||||
extern char *memdup_root(MEM_ROOT *root,const char *str,uint len);
|
extern char *memdup_root(MEM_ROOT *root,const char *str,uint len);
|
||||||
extern int my_correct_defaults_file(const char *file_location,
|
|
||||||
const char *option,
|
|
||||||
const char *option_value,
|
|
||||||
const char *section_name,
|
|
||||||
int remove_option);
|
|
||||||
extern void get_defaults_files(int argc, char **argv,
|
extern void get_defaults_files(int argc, char **argv,
|
||||||
char **defaults, char **extra_defaults);
|
char **defaults, char **extra_defaults);
|
||||||
extern int load_defaults(const char *conf_file, const char **groups,
|
extern int load_defaults(const char *conf_file, const char **groups,
|
||||||
int *argc, char ***argv);
|
int *argc, char ***argv);
|
||||||
|
extern uint modify_defaults_file(const char *file_location, const char *option,
|
||||||
|
const char *option_value,
|
||||||
|
const char *section_name, int remove_option);
|
||||||
extern int my_search_option_files(const char *conf_file, int *argc,
|
extern int my_search_option_files(const char *conf_file, int *argc,
|
||||||
char ***argv, uint *args_used,
|
char ***argv, uint *args_used,
|
||||||
Process_option_func func, void *func_ctx);
|
Process_option_func func, void *func_ctx);
|
||||||
|
@ -417,6 +417,9 @@ const char *mysql_errno_to_sqlstate(unsigned int mysql_errno);
|
|||||||
/* Some other useful functions */
|
/* Some other useful functions */
|
||||||
|
|
||||||
my_bool my_init(void);
|
my_bool my_init(void);
|
||||||
|
extern uint modify_defaults_file(const char *file_location, const char *option,
|
||||||
|
const char *option_value,
|
||||||
|
const char *section_name, int remove_option);
|
||||||
int load_defaults(const char *conf_file, const char **groups,
|
int load_defaults(const char *conf_file, const char **groups,
|
||||||
int *argc, char ***argv);
|
int *argc, char ***argv);
|
||||||
my_bool my_thread_init(void);
|
my_bool my_thread_init(void);
|
||||||
|
@ -61,7 +61,8 @@ mysysobjects1 = my_init.lo my_static.lo my_malloc.lo my_realloc.lo \
|
|||||||
mf_format.lo mf_path.lo mf_unixpath.lo my_fopen.lo \
|
mf_format.lo mf_path.lo mf_unixpath.lo my_fopen.lo \
|
||||||
my_symlink.lo my_fstream.lo \
|
my_symlink.lo my_fstream.lo \
|
||||||
mf_loadpath.lo my_pthread.lo my_thr_init.lo \
|
mf_loadpath.lo my_pthread.lo my_thr_init.lo \
|
||||||
thr_mutex.lo mulalloc.lo string.lo default.lo \
|
thr_mutex.lo mulalloc.lo string.lo \
|
||||||
|
default.lo default_modify.lo \
|
||||||
my_compress.lo array.lo my_once.lo list.lo my_net.lo \
|
my_compress.lo array.lo my_once.lo list.lo my_net.lo \
|
||||||
charset.lo charset-def.lo hash.lo mf_iocache.lo \
|
charset.lo charset-def.lo hash.lo mf_iocache.lo \
|
||||||
mf_iocache2.lo my_seek.lo my_sleep.lo \
|
mf_iocache2.lo my_seek.lo my_sleep.lo \
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
LIBRARY LIBMYSQL
|
LIBRARY LIBMYSQL
|
||||||
DESCRIPTION 'MySQL 4.1 Client Library'
|
DESCRIPTION 'MySQL 5.0 Client Library'
|
||||||
VERSION 6.0
|
VERSION 6.0
|
||||||
EXPORTS
|
EXPORTS
|
||||||
_dig_vec_lower
|
_dig_vec_lower
|
||||||
@ -150,3 +150,4 @@ EXPORTS
|
|||||||
mysql_server_end
|
mysql_server_end
|
||||||
mysql_set_character_set
|
mysql_set_character_set
|
||||||
get_defaults_files
|
get_defaults_files
|
||||||
|
modify_defaults_file
|
||||||
|
@ -160,3 +160,4 @@ EXPORTS
|
|||||||
get_defaults_files
|
get_defaults_files
|
||||||
my_charset_bin
|
my_charset_bin
|
||||||
my_charset_same
|
my_charset_same
|
||||||
|
modify_defaults_file
|
||||||
|
@ -48,7 +48,8 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c my_mmap.c \
|
|||||||
my_chsize.c my_lread.c my_lwrite.c my_clock.c \
|
my_chsize.c my_lread.c my_lwrite.c my_clock.c \
|
||||||
my_quick.c my_lockmem.c my_static.c \
|
my_quick.c my_lockmem.c my_static.c \
|
||||||
my_sync.c my_getopt.c my_mkdir.c \
|
my_sync.c my_getopt.c my_mkdir.c \
|
||||||
default.c my_compress.c checksum.c raid.cc \
|
default_modify.c default.c \
|
||||||
|
my_compress.c checksum.c raid.cc \
|
||||||
my_net.c my_semaphore.c my_port.c my_sleep.c \
|
my_net.c my_semaphore.c my_port.c my_sleep.c \
|
||||||
charset.c charset-def.c my_bitmap.c my_bit.c md5.c \
|
charset.c charset-def.c my_bitmap.c my_bit.c md5.c \
|
||||||
my_gethostbyname.c rijndael.c my_aes.c sha1.c \
|
my_gethostbyname.c rijndael.c my_aes.c sha1.c \
|
||||||
|
135
mysys/default.c
135
mysys/default.c
@ -81,141 +81,6 @@ static void init_default_directories();
|
|||||||
|
|
||||||
static char *remove_end_comment(char *ptr);
|
static char *remove_end_comment(char *ptr);
|
||||||
|
|
||||||
/*
|
|
||||||
Add/remove option to the option file section.
|
|
||||||
|
|
||||||
SYNOPSYS
|
|
||||||
my_correct_defaults_file()
|
|
||||||
file_location The location of configuration file to edit
|
|
||||||
option option to look for
|
|
||||||
option_value The value of the option we would like to set
|
|
||||||
section_name the name of the section
|
|
||||||
remove_option This is true if we want to remove the option.
|
|
||||||
False otherwise.
|
|
||||||
IMPLEMENTATION
|
|
||||||
We open the option file first, then read the file line-by-line,
|
|
||||||
looking for the section we need. At the same time we put these lines
|
|
||||||
into a buffer. Then we look for the option within this section and
|
|
||||||
change/remove it. In the end we get a buffer with modified version of the
|
|
||||||
file. Then we write it to the file, truncate it if needed and close it.
|
|
||||||
|
|
||||||
RETURN
|
|
||||||
0 - ok
|
|
||||||
1 - some error has occured. Probably due to the lack of resourses
|
|
||||||
-1 - cannot open the file
|
|
||||||
*/
|
|
||||||
|
|
||||||
int my_correct_defaults_file(const char *file_location, const char *option,
|
|
||||||
const char *option_value,
|
|
||||||
const char *section_name, int remove_option)
|
|
||||||
{
|
|
||||||
FILE *cnf_file;
|
|
||||||
struct stat file_stat;
|
|
||||||
char linebuff[512], *ptr;
|
|
||||||
uint optlen;
|
|
||||||
uint len;
|
|
||||||
char *file_buffer;
|
|
||||||
uint position= 0;
|
|
||||||
int is_found= FALSE;
|
|
||||||
DBUG_ENTER("my_correct_defaults_file");
|
|
||||||
|
|
||||||
optlen= strlen(option);
|
|
||||||
|
|
||||||
if (!(cnf_file= my_fopen(file_location, O_RDWR, MYF(0))))
|
|
||||||
goto err_fopen;
|
|
||||||
|
|
||||||
/* my_fstat doesn't use the flag parameter */
|
|
||||||
if (my_fstat(fileno(cnf_file), &file_stat, MYF(0)))
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
/*
|
|
||||||
Reserve space to read the contents of the file and some more
|
|
||||||
for the option we want ot add.
|
|
||||||
*/
|
|
||||||
file_buffer= (char*) my_malloc(sizeof(char)*
|
|
||||||
(file_stat.st_size + /* current file size */
|
|
||||||
optlen + /* option name len */
|
|
||||||
2 + /* reserve space for newline */
|
|
||||||
1 + /* reserve for '=' char */
|
|
||||||
strlen(option_value)), /* option value len */
|
|
||||||
MYF(MY_WME));
|
|
||||||
|
|
||||||
if (!file_buffer)
|
|
||||||
goto malloc_err;
|
|
||||||
while (fgets(linebuff, sizeof(linebuff), cnf_file))
|
|
||||||
{
|
|
||||||
len= strlen(linebuff);
|
|
||||||
|
|
||||||
/* if the section is found traverse it */
|
|
||||||
if (is_found)
|
|
||||||
{
|
|
||||||
/* skip the old value of the option we are changing */
|
|
||||||
if (strncmp(linebuff, option, optlen))
|
|
||||||
{
|
|
||||||
/* copy all other lines */
|
|
||||||
strmake(file_buffer + position, linebuff, len);
|
|
||||||
position+= len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
strmake(file_buffer + position, linebuff, len);
|
|
||||||
position+= len;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* looking for appropriate section */
|
|
||||||
for (ptr= linebuff ; my_isspace(&my_charset_latin1,*ptr) ; ptr++)
|
|
||||||
{}
|
|
||||||
|
|
||||||
if (*ptr == '[')
|
|
||||||
{
|
|
||||||
/* copy the line to the buffer */
|
|
||||||
if (!strncmp(++ptr, section_name, strlen(section_name)))
|
|
||||||
{
|
|
||||||
is_found= TRUE;
|
|
||||||
/* add option */
|
|
||||||
if (!remove_option)
|
|
||||||
{
|
|
||||||
strmake(file_buffer + position, option, optlen);
|
|
||||||
position+= optlen;
|
|
||||||
if (*option_value)
|
|
||||||
{
|
|
||||||
*(file_buffer + position++)= '=';
|
|
||||||
strmake(file_buffer + position, option_value,
|
|
||||||
strlen(option_value));
|
|
||||||
position+= strlen(option_value);
|
|
||||||
}
|
|
||||||
/* add a newline */
|
|
||||||
strcat(file_buffer + position, NEWLINE);
|
|
||||||
position+= strlen(NEWLINE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
is_found= FALSE; /* mark that this section is of no interest to us */
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (my_chsize(fileno(cnf_file), position, 0, MYF(MY_WME)) ||
|
|
||||||
my_fseek(cnf_file, 0, MY_SEEK_SET, MYF(0)) ||
|
|
||||||
my_fwrite(cnf_file, file_buffer, position, MYF(MY_NABP)) ||
|
|
||||||
my_fclose(cnf_file, MYF(MY_WME)))
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
my_free(file_buffer, MYF(0));
|
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
|
||||||
|
|
||||||
err:
|
|
||||||
my_free(file_buffer, MYF(0));
|
|
||||||
malloc_err:
|
|
||||||
my_fclose(cnf_file, MYF(0));
|
|
||||||
DBUG_RETURN(1); /* out of resources */
|
|
||||||
err_fopen:
|
|
||||||
DBUG_RETURN(-1); /* cannot access the option file */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Process config files in default directories.
|
Process config files in default directories.
|
||||||
|
164
mysys/default_modify.c
Normal file
164
mysys/default_modify.c
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
/*
|
||||||
|
Add/remove option to the option file section.
|
||||||
|
|
||||||
|
SYNOPSYS
|
||||||
|
modify_defaults_file()
|
||||||
|
file_location The location of configuration file to edit
|
||||||
|
option option to look for
|
||||||
|
option value The value of the option we would like to set
|
||||||
|
section_name the name of the section
|
||||||
|
remove_option This is true if we want to remove the option.
|
||||||
|
False otherwise.
|
||||||
|
IMPLEMENTATION
|
||||||
|
We open the option file first, then read the file line-by-line,
|
||||||
|
looking for the section we need. At the same time we put these lines
|
||||||
|
into a buffer. Then we look for the option within this section and
|
||||||
|
change/remove it. In the end we get a buffer with modified version of the
|
||||||
|
file. Then we write it to the file, truncate it if needed and close it.
|
||||||
|
|
||||||
|
RETURN
|
||||||
|
0 - ok
|
||||||
|
1 - some error has occured. Probably due to the lack of resourses
|
||||||
|
2 - cannot open the file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "my_global.h"
|
||||||
|
#include "mysys_priv.h"
|
||||||
|
#include "m_string.h"
|
||||||
|
#include <my_dir.h>
|
||||||
|
|
||||||
|
#define BUFF_SIZE 1024
|
||||||
|
|
||||||
|
#ifdef __WIN__
|
||||||
|
#define NEWLINE "\r\n"
|
||||||
|
#define NEWLINE_LEN 2
|
||||||
|
#else
|
||||||
|
#define NEWLINE "\n"
|
||||||
|
#define NEWLINE_LEN 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
uint modify_defaults_file(const char *file_location, const char *option,
|
||||||
|
const char *option_value,
|
||||||
|
const char *section_name, int remove_option)
|
||||||
|
{
|
||||||
|
FILE *cnf_file;
|
||||||
|
struct stat file_stat;
|
||||||
|
char linebuff[BUFF_SIZE], tmp[BUFF_SIZE], *tmp_ptr, *src_ptr, *dst_ptr,
|
||||||
|
*file_buffer;
|
||||||
|
uint optlen, optval_len, sect_len;
|
||||||
|
my_bool in_section= FALSE;
|
||||||
|
DBUG_ENTER("modify_defaults_file");
|
||||||
|
|
||||||
|
optlen= strlen(option);
|
||||||
|
optval_len= strlen(option_value);
|
||||||
|
sect_len= strlen(section_name);
|
||||||
|
|
||||||
|
if (!(cnf_file= my_fopen(file_location, O_RDWR | O_BINARY, MYF(0))))
|
||||||
|
DBUG_RETURN(2);
|
||||||
|
|
||||||
|
/* my_fstat doesn't use the flag parameter */
|
||||||
|
if (my_fstat(fileno(cnf_file), &file_stat, MYF(0)))
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Reserve space to read the contents of the file and some more
|
||||||
|
for the option we want to add.
|
||||||
|
*/
|
||||||
|
if (!(file_buffer= (char*) my_malloc(sizeof(char)*
|
||||||
|
(file_stat.st_size +
|
||||||
|
/* option name len */
|
||||||
|
optlen +
|
||||||
|
/* reserve space for newline */
|
||||||
|
NEWLINE_LEN +
|
||||||
|
/* reserve for '=' char */
|
||||||
|
1 +
|
||||||
|
/* option value len */
|
||||||
|
optval_len), MYF(MY_WME))))
|
||||||
|
goto malloc_err;
|
||||||
|
|
||||||
|
for (dst_ptr= file_buffer, tmp_ptr= 0;
|
||||||
|
fgets(linebuff, BUFF_SIZE, cnf_file); )
|
||||||
|
{
|
||||||
|
/* Skip over whitespaces */
|
||||||
|
for (src_ptr= linebuff; my_isspace(&my_charset_latin1, *src_ptr);
|
||||||
|
src_ptr++)
|
||||||
|
{}
|
||||||
|
|
||||||
|
if (in_section && !strncmp(src_ptr, option, optlen) &&
|
||||||
|
(*(src_ptr + optlen) == '=' ||
|
||||||
|
my_isspace(&my_charset_latin1, *(src_ptr + optlen)) ||
|
||||||
|
*(src_ptr + optlen) == '\0'))
|
||||||
|
{
|
||||||
|
/* The option under modifying was found in this section. Apply new. */
|
||||||
|
if (!remove_option)
|
||||||
|
dst_ptr= strmov(dst_ptr, tmp);
|
||||||
|
tmp_ptr= 0; /* To mark that we have already applied this */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* If going to new group and we have option to apply, do it now */
|
||||||
|
if (tmp_ptr && *src_ptr == '[')
|
||||||
|
{
|
||||||
|
dst_ptr= strmov(dst_ptr, tmp);
|
||||||
|
tmp_ptr= 0;
|
||||||
|
}
|
||||||
|
dst_ptr= strmov(dst_ptr, linebuff);
|
||||||
|
}
|
||||||
|
/* Look for a section */
|
||||||
|
if (*src_ptr == '[')
|
||||||
|
{
|
||||||
|
/* Copy the line to the buffer */
|
||||||
|
if (!strncmp(++src_ptr, section_name, sect_len))
|
||||||
|
{
|
||||||
|
src_ptr+= sect_len;
|
||||||
|
/* Skip over whitespaces. They are allowed after section name */
|
||||||
|
for (; my_isspace(&my_charset_latin1, *src_ptr); src_ptr++)
|
||||||
|
{}
|
||||||
|
|
||||||
|
if (*src_ptr != ']')
|
||||||
|
continue; /* Missing closing parenthesis. Assume this was no group */
|
||||||
|
|
||||||
|
in_section= TRUE;
|
||||||
|
/* add option */
|
||||||
|
if (!remove_option)
|
||||||
|
{
|
||||||
|
tmp_ptr= strmov(tmp, option);
|
||||||
|
if (*option_value)
|
||||||
|
{
|
||||||
|
*tmp_ptr++= '=';
|
||||||
|
tmp_ptr= strmov(tmp_ptr, option_value);
|
||||||
|
}
|
||||||
|
/* add a newline */
|
||||||
|
strmov(tmp_ptr, NEWLINE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
in_section= FALSE; /* mark that this section is of no interest to us */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* File ended. New option still remains to apply at the end */
|
||||||
|
if (tmp_ptr)
|
||||||
|
{
|
||||||
|
if (*(dst_ptr - 1) != '\n')
|
||||||
|
*dst_ptr++= '\n';
|
||||||
|
dst_ptr= strmov(dst_ptr, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (my_chsize(fileno(cnf_file), (my_off_t) (dst_ptr - file_buffer), 0,
|
||||||
|
MYF(MY_WME)) ||
|
||||||
|
my_fseek(cnf_file, 0, MY_SEEK_SET, MYF(0)) ||
|
||||||
|
my_fwrite(cnf_file, file_buffer, (uint) (dst_ptr - file_buffer),
|
||||||
|
MYF(MY_NABP)) ||
|
||||||
|
my_fclose(cnf_file, MYF(MY_WME)))
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
my_free(file_buffer, MYF(0));
|
||||||
|
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
|
||||||
|
err:
|
||||||
|
my_free(file_buffer, MYF(0));
|
||||||
|
malloc_err:
|
||||||
|
my_fclose(cnf_file, MYF(0));
|
||||||
|
DBUG_RETURN(1); /* out of resources */
|
||||||
|
}
|
@ -689,8 +689,8 @@ int Set_option::correct_file(int skip)
|
|||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
error= my_correct_defaults_file("/etc/my.cnf", option,
|
error= modify_defaults_file("/etc/my.cnf", option,
|
||||||
option_value, instance_name, skip);
|
option_value, instance_name, skip);
|
||||||
if (error > 0)
|
if (error > 0)
|
||||||
return ER_OUT_OF_RESOURCES;
|
return ER_OUT_OF_RESOURCES;
|
||||||
else if (error < 0)
|
else if (error < 0)
|
||||||
|
@ -294,7 +294,7 @@ static I_List<THD> thread_cache;
|
|||||||
|
|
||||||
static pthread_cond_t COND_thread_cache, COND_flush_thread_cache;
|
static pthread_cond_t COND_thread_cache, COND_flush_thread_cache;
|
||||||
|
|
||||||
#ifdef HAVE_BERKLEY_DB
|
#ifdef HAVE_BERKELEY_DB
|
||||||
static my_bool opt_sync_bdb_logs;
|
static my_bool opt_sync_bdb_logs;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user