summaryrefslogtreecommitdiff
path: root/sql/sql_db.cc
diff options
context:
space:
mode:
authorbar@gw.udmsearch.izhnet.ru <>2002-07-02 14:31:54 +0500
committerbar@gw.udmsearch.izhnet.ru <>2002-07-02 14:31:54 +0500
commit189d1dd630676a2e3be004d27770ae820e81b36b (patch)
tree2792c1f44764072fbee667fbe99bbbe883a23bc9 /sql/sql_db.cc
parenta2f2d799e4bda7f6b2074925498179f39ade1127 (diff)
downloadmariadb-git-189d1dd630676a2e3be004d27770ae820e81b36b.tar.gz
SHOW CREATE DATABASE name;
Small fixes in database default charset code
Diffstat (limited to 'sql/sql_db.cc')
-rw-r--r--sql/sql_db.cc91
1 files changed, 90 insertions, 1 deletions
diff --git a/sql/sql_db.cc b/sql/sql_db.cc
index 63edebd4ac7..7e82e1433b9 100644
--- a/sql/sql_db.cc
+++ b/sql/sql_db.cc
@@ -106,7 +106,7 @@ static int load_db_opt(THD *thd,const char *db,HA_CREATE_INFO *create,char *fn)
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));
+ create->table_charset=get_charset_by_name(val, MYF(0));
}
goto cnt;
break;
@@ -568,3 +568,92 @@ bool mysql_change_db(THD *thd,const char *name)
DBUG_RETURN(0);
}
+
+
+int mysqld_show_create_db(THD *thd,const char *name)
+{
+ int length, db_length;
+ char *dbname=my_strdup((char*) name,MYF(MY_WME));
+ char path[FN_REFLEN];
+ uint db_access;
+ HA_CREATE_INFO create;
+ CONVERT *convert=thd->convert_set;
+
+ DBUG_ENTER("mysql_show_create_db");
+
+ if (!dbname || !(db_length=strip_sp(dbname)))
+ {
+ x_free(dbname); /* purecov: inspected */
+ send_error(&thd->net,ER_NO_DB_ERROR); /* purecov: inspected */
+ DBUG_RETURN(1); /* purecov: inspected */
+ }
+
+ if ((db_length > NAME_LEN) || check_db_name(dbname))
+ {
+ net_printf(&thd->net,ER_WRONG_DB_NAME, dbname);
+ x_free(dbname);
+ DBUG_RETURN(1);
+ }
+
+ if (test_all_bits(thd->master_access,DB_ACLS))
+ db_access=DB_ACLS;
+ else
+ db_access= (acl_get(thd->host,thd->ip,(char*) &thd->remote.sin_addr,
+ thd->priv_user,dbname) |
+ thd->master_access);
+ if (!(db_access & DB_ACLS) && (!grant_option || check_grant_db(thd,dbname)))
+ {
+ net_printf(&thd->net,ER_DBACCESS_DENIED_ERROR,
+ thd->priv_user,
+ thd->host_or_ip,
+ dbname);
+ mysql_log.write(thd,COM_INIT_DB,ER(ER_DBACCESS_DENIED_ERROR),
+ thd->priv_user,
+ thd->host_or_ip,
+ dbname);
+ my_free(dbname,MYF(0));
+ DBUG_RETURN(1);
+ }
+
+ (void) sprintf(path,"%s/%s",mysql_data_home,dbname);
+ length=unpack_dirname(path,path); // Convert if not unix
+ if (length && path[length-1] == FN_LIBCHAR)
+ path[length-1]=0; // remove ending '\'
+ if (access(path,F_OK))
+ {
+ net_printf(&thd->net,ER_BAD_DB_ERROR,dbname);
+ my_free(dbname,MYF(0));
+ DBUG_RETURN(1);
+ }
+
+ strcat(path,"/");
+ unpack_dirname(path,path);
+ strcat(path,MY_DB_OPT_FILE);
+ bzero(&create,sizeof(create));
+ load_db_opt(thd,name,&create,path);
+
+ List<Item> field_list;
+ field_list.push_back(new Item_empty_string("Database",NAME_LEN));
+ field_list.push_back(new Item_empty_string("Create Database",1024));
+
+ if (send_fields(thd,field_list,1))
+ DBUG_RETURN(1);
+
+ String *packet = &thd->packet;
+ packet->length(0);
+ net_store_data(packet, convert, name);
+ sprintf(path, "CREATE DATABASE %s", name);
+ if (create.table_charset)
+ {
+ strcat(path," DEFAULT CHARACTER SET ");
+ strcat(path,create.table_charset->name);
+ }
+ net_store_data(packet, convert, path);
+
+ if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length()))
+ DBUG_RETURN(1);
+
+ send_eof(&thd->net);
+
+ DBUG_RETURN(0);
+}