From 4243b31b52fd461b9a8e0b6672f6601bcef7c6be Mon Sep 17 00:00:00 2001
From: unknown <msvensson@pilot.mysql.com>
Date: Thu, 1 Nov 2007 15:42:19 +0100
Subject: [PATCH] Bug#31004 mysqltest needs a --mkdir command  - Add new
 mysqltest command "mkdir" and "rmdir"

client/CMakeLists.txt:
  Build mysys/my_mkdir.c with mysqltest
client/Makefile.am:
  Build mysys/my_mkdir.c with mysqltest
client/mysqltest.c:
  Add new mysqltest commands "mkdir" and "rmdir"
mysql-test/t/mysqltest.test:
  Add tests for "mkdir" and ""rmdir"
---
 client/CMakeLists.txt       |  3 +-
 client/Makefile.am          |  3 +-
 client/mysqltest.c          | 68 ++++++++++++++++++++++++++++++++++++-
 mysql-test/t/mysqltest.test | 22 ++++++++++++
 4 files changed, 93 insertions(+), 3 deletions(-)

diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt
index 89675138750..a419da5eabf 100755
--- a/client/CMakeLists.txt
+++ b/client/CMakeLists.txt
@@ -32,7 +32,8 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include
 ADD_EXECUTABLE(mysql completion_hash.cc mysql.cc readline.cc sql_string.cc ../mysys/my_conio.c)
 TARGET_LINK_LIBRARIES(mysql mysqlclient_notls wsock32)
 
-ADD_EXECUTABLE(mysqltest mysqltest.c ../mysys/my_getsystime.c ../mysys/my_copy.c)
+ADD_EXECUTABLE(mysqltest mysqltest.c ../mysys/my_getsystime.c
+               ../mysys/my_copy.c ../mysys/my_mkdir.c)
 TARGET_LINK_LIBRARIES(mysqltest mysqlclient_notls regex wsock32)
 
 ADD_EXECUTABLE(mysqlcheck mysqlcheck.c)
diff --git a/client/Makefile.am b/client/Makefile.am
index c7663c7da82..672bb2e0c47 100644
--- a/client/Makefile.am
+++ b/client/Makefile.am
@@ -34,7 +34,8 @@ mysqladmin_SOURCES =		mysqladmin.cc
 mysql_LDADD =			@readline_link@ @TERMCAP_LIB@ $(LDADD) $(CXXLDFLAGS)
 mysqltest_SOURCES=              mysqltest.c \
 				$(top_srcdir)/mysys/my_getsystime.c \
-				$(top_srcdir)/mysys/my_copy.c
+				$(top_srcdir)/mysys/my_copy.c \
+				$(top_srcdir)/mysys/my_mkdir.c
 
 mysqltest_LDADD =		$(top_builddir)/regex/libregex.a $(LDADD)
 mysqlbinlog_SOURCES =   	mysqlbinlog.cc \
diff --git a/client/mysqltest.c b/client/mysqltest.c
index a0674a5edb6..2104f43f6fb 100644
--- a/client/mysqltest.c
+++ b/client/mysqltest.c
@@ -277,7 +277,7 @@ enum enum_commands {
   Q_REPLACE_REGEX, Q_REMOVE_FILE, Q_FILE_EXIST,
   Q_WRITE_FILE, Q_COPY_FILE, Q_PERL, Q_DIE, Q_EXIT, Q_SKIP,
   Q_CHMOD_FILE, Q_APPEND_FILE, Q_CAT_FILE, Q_DIFF_FILES,
-  Q_SEND_QUIT, Q_CHANGE_USER,
+  Q_SEND_QUIT, Q_CHANGE_USER, Q_MKDIR, Q_RMDIR,
 
   Q_UNKNOWN,			       /* Unknown command.   */
   Q_COMMENT,			       /* Comments, ignored. */
@@ -367,6 +367,9 @@ const char *command_names[]=
   "diff_files",
   "send_quit",
   "change_user",
+  "mkdir",
+  "rmdir",
+
   0
 };
 
@@ -2742,6 +2745,67 @@ void do_file_exist(struct st_command *command)
 }
 
 
+/*
+  SYNOPSIS
+  do_mkdir
+  command	called command
+
+  DESCRIPTION
+  mkdir <dir_name>
+  Create the directory <dir_name>
+*/
+
+void do_mkdir(struct st_command *command)
+{
+  int error;
+  static DYNAMIC_STRING ds_dirname;
+  const struct command_arg mkdir_args[] = {
+    "dirname", ARG_STRING, TRUE, &ds_dirname, "Directory to create"
+  };
+  DBUG_ENTER("do_mkdir");
+
+  check_command_args(command, command->first_argument,
+                     mkdir_args, sizeof(mkdir_args)/sizeof(struct command_arg),
+                     ' ');
+
+  DBUG_PRINT("info", ("creating directory: %s", ds_dirname.str));
+  error= my_mkdir(ds_dirname.str, 0777, MYF(0)) != 0;
+  handle_command_error(command, error);
+  dynstr_free(&ds_dirname);
+  DBUG_VOID_RETURN;
+}
+
+/*
+  SYNOPSIS
+  do_rmdir
+  command	called command
+
+  DESCRIPTION
+  rmdir <dir_name>
+  Remove the empty directory <dir_name>
+*/
+
+void do_rmdir(struct st_command *command)
+{
+  int error;
+  static DYNAMIC_STRING ds_dirname;
+  const struct command_arg rmdir_args[] = {
+    "dirname", ARG_STRING, TRUE, &ds_dirname, "Directory to remove"
+  };
+  DBUG_ENTER("do_rmdir");
+
+  check_command_args(command, command->first_argument,
+                     rmdir_args, sizeof(rmdir_args)/sizeof(struct command_arg),
+                     ' ');
+
+  DBUG_PRINT("info", ("removing directory: %s", ds_dirname.str));
+  error= rmdir(ds_dirname.str) != 0;
+  handle_command_error(command, error);
+  dynstr_free(&ds_dirname);
+  DBUG_VOID_RETURN;
+}
+
+
 /*
   Read characters from line buffer or file. This is needed to allow
   my_ungetc() to buffer MAX_DELIMITER_LENGTH characters for a file
@@ -6911,6 +6975,8 @@ int main(int argc, char **argv)
       case Q_ECHO: do_echo(command); command_executed++; break;
       case Q_SYSTEM: do_system(command); break;
       case Q_REMOVE_FILE: do_remove_file(command); break;
+      case Q_MKDIR: do_mkdir(command); break;
+      case Q_RMDIR: do_rmdir(command); break;
       case Q_FILE_EXIST: do_file_exist(command); break;
       case Q_WRITE_FILE: do_write_file(command); break;
       case Q_APPEND_FILE: do_append_file(command); break;
diff --git a/mysql-test/t/mysqltest.test b/mysql-test/t/mysqltest.test
index c5ff9cf924a..5856bfff036 100644
--- a/mysql-test/t/mysqltest.test
+++ b/mysql-test/t/mysqltest.test
@@ -2101,6 +2101,28 @@ drop table t1;
 --change_user root,,
 --change_user root,,test
 
+# ----------------------------------------------------------------------------
+# Test mkdir and rmdir command
+# ----------------------------------------------------------------------------
+
+mkdir $MYSQLTEST_VARDIR/tmp/testdir;
+rmdir $MYSQLTEST_VARDIR/tmp/testdir;
+
+# Directory already exist
+mkdir $MYSQLTEST_VARDIR/tmp/testdir;
+--error 1
+mkdir $MYSQLTEST_VARDIR/tmp/testdir;
+
+# Remove dir with file inside
+write_file $MYSQLTEST_VARDIR/tmp/testdir/file1.txt;
+hello
+EOF
+--error 1
+rmdir $MYSQLTEST_VARDIR/tmp/testdir;
+
+remove_file $MYSQLTEST_VARDIR/tmp/testdir/file1.txt;
+rmdir $MYSQLTEST_VARDIR/tmp/testdir;
+
 
 --echo End of tests
 
-- 
2.30.9