mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
ALTER DATABASE DEFAULT CHARACTER SET latin1;
This commit is contained in:
237
sql/sql_db.cc
237
sql/sql_db.cc
@ -31,6 +31,96 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp,
|
||||
const char *db, const char *path,
|
||||
uint level);
|
||||
|
||||
/*
|
||||
Create database options file:
|
||||
Currently databse default charset is only stored there.
|
||||
*/
|
||||
|
||||
static int write_db_opt(THD *thd, char *db, HA_CREATE_INFO *create, char *fn)
|
||||
{
|
||||
register File file;
|
||||
char buf[256]; // Should be enough
|
||||
int error=0;
|
||||
|
||||
if ((file=my_create(fn,CREATE_MODE,O_RDWR | O_TRUNC,MYF(MY_WME))) >= 0)
|
||||
{
|
||||
sprintf(buf,"default-character-set=%s\n",
|
||||
(create && create->table_charset) ?
|
||||
create->table_charset->name : "DEFAULT");
|
||||
|
||||
if (my_write(file,(byte*)buf,strlen(buf),MYF(MY_NABP+MY_WME)))
|
||||
{
|
||||
// QQ : should we send more suitable error message?
|
||||
my_error(ER_CANT_CREATE_DB,MYF(0),db,my_errno);
|
||||
error = -1;
|
||||
goto exit;
|
||||
}
|
||||
my_close(file,MYF(0));
|
||||
}
|
||||
else
|
||||
{
|
||||
// QQ : should we send more suitable error message?
|
||||
my_error(ER_CANT_CREATE_DB,MYF(0),db,my_errno);
|
||||
error = -1;
|
||||
goto exit;
|
||||
}
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Load database options file:
|
||||
*/
|
||||
static int load_db_opt(THD *thd,char *fn)
|
||||
{
|
||||
register File file;
|
||||
char buf[256]="";
|
||||
|
||||
if ((file=my_open(fn,O_RDWR|O_BINARY,MYF(MY_WME))) >= 0)
|
||||
{
|
||||
int nbytes=my_read(file,(byte*)buf,sizeof(buf)-1,MYF(0));
|
||||
if ( nbytes >= 0 )
|
||||
{
|
||||
char *ln=buf;
|
||||
char *pe=buf+nbytes;
|
||||
|
||||
buf[nbytes]='\0';
|
||||
|
||||
for ( ln=buf; ln<pe; )
|
||||
{
|
||||
char *le,*val;
|
||||
for ( le=ln, val=0 ; le<pe ; le++ )
|
||||
{
|
||||
switch(le[0])
|
||||
{
|
||||
case '=':
|
||||
le[0]='\0';
|
||||
val=le+1;
|
||||
le++;
|
||||
break;
|
||||
case '\r':
|
||||
case '\n':
|
||||
le[0]='\0';
|
||||
le++;
|
||||
for( ; (le[0]=='\r' || le[0]=='\n') ; le++);
|
||||
if (!strcmp(ln,"default-character-set") && val && val[0])
|
||||
{
|
||||
thd->db_charset=get_charset_by_name(val, MYF(0));
|
||||
}
|
||||
goto cnt;
|
||||
break;
|
||||
}
|
||||
}
|
||||
cnt:
|
||||
ln=le;
|
||||
}
|
||||
}
|
||||
my_close(file,MYF(0));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* db-name is already validated when we come here */
|
||||
|
||||
int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent)
|
||||
@ -39,10 +129,10 @@ int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent
|
||||
MY_DIR *dirp;
|
||||
long result=1;
|
||||
int error = 0;
|
||||
DBUG_ENTER("mysql_create_db");
|
||||
register File file;
|
||||
uint create_options = create_info ? create_info->options : 0;
|
||||
|
||||
|
||||
DBUG_ENTER("mysql_create_db");
|
||||
|
||||
VOID(pthread_mutex_lock(&LOCK_mysql_create_db));
|
||||
|
||||
// do not create database if another thread is holding read lock
|
||||
@ -77,37 +167,12 @@ int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Create database options file:
|
||||
Currently databse default charset is only stored there.
|
||||
*/
|
||||
|
||||
strcat(path,"/");
|
||||
unpack_dirname(path,path);
|
||||
strcat(path,MY_DB_OPT_FILE);
|
||||
if ((file=my_create(path,CREATE_MODE,O_RDWR | O_TRUNC,MYF(MY_WME))) >= 0)
|
||||
{
|
||||
sprintf(path,"default-character-set=%s\n",
|
||||
(create_info && create_info->table_charset) ?
|
||||
create_info->table_charset->name : "DEFAULT");
|
||||
|
||||
if (my_write(file,(byte*) path,strlen(path),MYF(MY_NABP+MY_WME)))
|
||||
{
|
||||
// QQ : should we send more suitable error message?
|
||||
my_error(ER_CANT_CREATE_DB,MYF(0),db,my_errno);
|
||||
error = -1;
|
||||
goto exit;
|
||||
}
|
||||
my_close(file,MYF(0));
|
||||
}
|
||||
else
|
||||
{
|
||||
// QQ : should we send more suitable error message?
|
||||
my_error(ER_CANT_CREATE_DB,MYF(0),db,my_errno);
|
||||
error = -1;
|
||||
if ((error=write_db_opt(thd,db,create_info,path)))
|
||||
goto exit;
|
||||
}
|
||||
|
||||
|
||||
if (!silent)
|
||||
{
|
||||
if (!thd->query)
|
||||
@ -139,6 +204,73 @@ exit2:
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
|
||||
/* db-name is already validated when we come here */
|
||||
|
||||
int mysql_alter_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent)
|
||||
{
|
||||
char path[FN_REFLEN+16];
|
||||
MY_DIR *dirp;
|
||||
long result=1;
|
||||
int error = 0;
|
||||
DBUG_ENTER("mysql_create_db");
|
||||
register File file;
|
||||
uint create_options = create_info ? create_info->options : 0;
|
||||
|
||||
printf("alter database\n");
|
||||
|
||||
VOID(pthread_mutex_lock(&LOCK_mysql_create_db));
|
||||
|
||||
// do not alter database if another thread is holding read lock
|
||||
if (wait_if_global_read_lock(thd,0))
|
||||
{
|
||||
error= -1;
|
||||
goto exit2;
|
||||
}
|
||||
|
||||
/* Check directory */
|
||||
(void)sprintf(path,"%s/%s", mysql_data_home, db);
|
||||
strcat(path,"/");
|
||||
unpack_dirname(path,path); // Convert if not unix
|
||||
strcat(path,MY_DB_OPT_FILE);
|
||||
if ((error=write_db_opt(thd,db,create_info,path)))
|
||||
goto exit;
|
||||
|
||||
if (!silent)
|
||||
{
|
||||
if (!thd->query)
|
||||
{
|
||||
thd->query = path;
|
||||
thd->query_length = (uint) (strxmov(path,"alter database ", db, NullS)-
|
||||
path);
|
||||
}
|
||||
{
|
||||
mysql_update_log.write(thd,thd->query, thd->query_length);
|
||||
if (mysql_bin_log.is_open())
|
||||
{
|
||||
Query_log_event qinfo(thd, thd->query);
|
||||
mysql_bin_log.write(&qinfo);
|
||||
}
|
||||
}
|
||||
if (thd->query == path)
|
||||
{
|
||||
thd->query = 0; // just in case
|
||||
thd->query_length = 0;
|
||||
}
|
||||
send_ok(&thd->net, result);
|
||||
}
|
||||
|
||||
exit:
|
||||
start_waiting_global_read_lock(thd);
|
||||
exit2:
|
||||
VOID(pthread_mutex_unlock(&LOCK_mysql_create_db));
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
const char *del_exts[]= {".frm", ".BAK", ".TMD",".opt", NullS};
|
||||
static TYPELIB deletable_extentions=
|
||||
{array_elements(del_exts)-1,"del_exts", del_exts};
|
||||
@ -368,7 +500,6 @@ bool mysql_change_db(THD *thd,const char *name)
|
||||
char path[FN_REFLEN];
|
||||
uint db_access;
|
||||
DBUG_ENTER("mysql_change_db");
|
||||
register File file;
|
||||
|
||||
if (!dbname || !(db_length=strip_sp(dbname)))
|
||||
{
|
||||
@ -419,53 +550,11 @@ bool mysql_change_db(THD *thd,const char *name)
|
||||
thd->db_length=db_length;
|
||||
thd->db_access=db_access;
|
||||
|
||||
/*
|
||||
Load database options file:
|
||||
*/
|
||||
|
||||
strcat(path,"/");
|
||||
unpack_dirname(path,path);
|
||||
strcat(path,MY_DB_OPT_FILE);
|
||||
if ((file=my_open(path,O_RDWR|O_BINARY,MYF(MY_WME))) >= 0)
|
||||
{
|
||||
int nbytes=my_read(file,(byte*) path,sizeof(path),MYF(0));
|
||||
if ( nbytes >= 0 )
|
||||
{
|
||||
char *ln=path;
|
||||
char *pe=path+nbytes;
|
||||
load_db_opt(thd,path);
|
||||
|
||||
path[nbytes]='\0';
|
||||
for ( ln=path; ln<pe; )
|
||||
{
|
||||
char *le,*val;
|
||||
for ( le=ln, val=0 ; le<pe ; le++ )
|
||||
{
|
||||
switch(le[0])
|
||||
{
|
||||
case '=':
|
||||
le[0]='\0';
|
||||
val=le+1;
|
||||
le++;
|
||||
break;
|
||||
case '\r':
|
||||
case '\n':
|
||||
le[0]='\0';
|
||||
le++;
|
||||
for( ; (le[0]=='\r' || le[0]=='\n') ; le++);
|
||||
if (!strcmp(ln,"default-character-set") && val && val[0])
|
||||
{
|
||||
thd->db_charset=get_charset_by_name(val, MYF(0));
|
||||
}
|
||||
goto cnt;
|
||||
break;
|
||||
}
|
||||
}
|
||||
cnt:
|
||||
ln=le;
|
||||
}
|
||||
}
|
||||
my_close(file,MYF(0));
|
||||
}
|
||||
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
Reference in New Issue
Block a user