List:Internals« Previous MessageNext Message »
From:Petr Chardin Date:May 15 2005 11:54pm
Subject:bk commit into 5.0 tree (petr:1.1864)
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of cps. When cps does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.1864 05/05/16 01:54:02 petr@stripped +24 -0
  post-review fixes

  server-tools/instance-manager/protocol.h
    1.5 05/05/16 01:53:56 petr@stripped +3 -0
    added enum to be used in protocol.cc instead of the constants

  server-tools/instance-manager/protocol.cc
    1.8 05/05/16 01:53:56 petr@stripped +5 -4
    cleanup

  server-tools/instance-manager/parse.h
    1.4 05/05/16 01:53:56 petr@stripped +0 -3
    removed prototype

  server-tools/instance-manager/parse.cc
    1.7 05/05/16 01:53:56 petr@stripped +0 -43
    removed unused function

  server-tools/instance-manager/options.cc
    1.14 05/05/16 01:53:56 petr@stripped +1 -1
    cleanup

  server-tools/instance-manager/mysqlmanager.cc
    1.11 05/05/16 01:53:56 petr@stripped +2 -1
    clenup

  server-tools/instance-manager/mysql_manager_error.h
    1.3 05/05/16 01:53:56 petr@stripped +2 -0
    new error codes added

  server-tools/instance-manager/mysql_connection.cc
    1.9 05/05/16 01:53:56 petr@stripped +6 -10
    cleanup

  server-tools/instance-manager/messages.cc
    1.5 05/05/16 01:53:56 petr@stripped +4 -0
    new errors added

  server-tools/instance-manager/manager.cc
    1.21 05/05/16 01:53:56 petr@stripped +1 -2
    cleanup

  server-tools/instance-manager/log.cc
    1.5 05/05/16 01:53:56 petr@stripped +4 -4
    cleanup

  server-tools/instance-manager/listener.cc
    1.11 05/05/16 01:53:56 petr@stripped +11 -14
    cleanup

  server-tools/instance-manager/instance_options.h
    1.12 05/05/16 01:53:56 petr@stripped +4 -5
    cleanup

  server-tools/instance-manager/instance_options.cc
    1.16 05/05/16 01:53:56 petr@stripped +61 -50
    cleanup

  server-tools/instance-manager/instance_map.cc
    1.17 05/05/16 01:53:56 petr@stripped +1 -1
    cleanup

  server-tools/instance-manager/instance.cc
    1.17 05/05/16 01:53:56 petr@stripped +5 -6
    cleanup

  server-tools/instance-manager/guardian.cc
    1.13 05/05/16 01:53:56 petr@stripped +1 -1
    cleanup

  server-tools/instance-manager/commands.h
    1.7 05/05/16 01:53:56 petr@stripped +11 -13
    cleanup

  server-tools/instance-manager/commands.cc
    1.18 05/05/16 01:53:56 petr@stripped +196 -278
    refactoring: removed do_command method from most of the classes

  server-tools/instance-manager/buffer.cc
    1.9 05/05/16 01:53:56 petr@stripped +2 -2
    cleanup

  mysys/my_chsize.c
    1.17 05/05/16 01:53:56 petr@stripped +3 -1
    comment added

  mysys/default.c
    1.61 05/05/16 01:53:56 petr@stripped +138 -0
    New defaults function added we use it to correct defaults file. Currently the function
doesn't lock defaults
    file. This is because of the linking and backwards-compatibility issues. This needs to
be fixed later.

  libmysql/Makefile.shared
    1.61 05/05/16 01:53:56 petr@stripped +1 -1
    my_chsize added to libmysql to let my_correct_defaults_file be used from libmysql

  include/my_sys.h
    1.149 05/05/16 01:53:55 petr@stripped +5 -0
    added prototype for the defaults correction function

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	petr
# Host:	owlet.
# Root:	/home/cps/mysql/devel/im-fix-review

--- 1.148/include/my_sys.h	2005-04-05 15:17:39 +04:00
+++ 1.149/include/my_sys.h	2005-05-16 01:53:55 +04:00
@@ -773,6 +773,11 @@
 extern char *strdup_root(MEM_ROOT *root,const char *str);
 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 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,
                                char **defaults, char **extra_defaults);
 extern int load_defaults(const char *conf_file, const char **groups,

--- 1.60/mysys/default.c	2005-04-14 01:57:50 +04:00
+++ 1.61/mysys/default.c	2005-05-16 01:53:56 +04:00
@@ -50,8 +50,10 @@
 
 #ifdef __WIN__
 static const char *f_extensions[]= { ".ini", ".cnf", 0 };
+#define NEWLINE "\r\n"
 #else
 static const char *f_extensions[]= { ".cnf", 0 };
+#define NEWLINE "\n"
 #endif
 
 /*
@@ -77,6 +79,142 @@
 static void init_default_directories();
 
 static char *remove_end_comment(char *ptr);
+
+/*
+  Add/remove option to the option file section.
+
+  SYNOPSYS
+    my_correct_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;
+
+  optlen= strlen(option);
+
+  DBUG_ENTER("my_correct_file");
+
+  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 */
+}
 
 
 /*

--- 1.16/mysys/my_chsize.c	2004-11-05 00:43:51 +03:00
+++ 1.17/mysys/my_chsize.c	2005-05-16 01:53:56 +04:00
@@ -30,7 +30,9 @@
       MyFlags		Flags
 
   DESCRIPTION
-    my_chsize() truncates file if shorter else fill with the filler character
+    my_chsize() truncates file if shorter else fill with the filler character.
+    The function also changes the file pointer. Usually it points to the end
+    of the file after execution.
 
   RETURN VALUE
     0	Ok

--- 1.10/server-tools/instance-manager/listener.cc	2005-02-27 18:41:30 +03:00
+++ 1.11/server-tools/instance-manager/listener.cc	2005-05-16 01:53:56 +04:00
@@ -241,23 +241,20 @@
             }
           }
         }
-        else
-          if (FD_ISSET(ip_socket, &read_fds_arg))
+        else if (FD_ISSET(ip_socket, &read_fds_arg))
+        {
+          int client_fd= accept(ip_socket, 0, 0);
+          /* accept may return -1 (failure or spurious wakeup) */
+          if (client_fd >= 0)                    // connection established
           {
-            int client_fd= accept(ip_socket, 0, 0);
-            /* accept may return -1 (failure or spurious wakeup) */
-            if (client_fd >= 0)                    // connection established
+            if (Vio *vio= vio_new(client_fd, VIO_TYPE_TCPIP, 0))
+              handle_new_mysql_connection(vio);
+            else
             {
-              if (Vio *vio= vio_new(client_fd, VIO_TYPE_TCPIP, 0))
-              {
-                handle_new_mysql_connection(vio);
-              }
-              else
-              {
-                shutdown(client_fd, SHUT_RDWR);
-                close(client_fd);
-              }
+              shutdown(client_fd, SHUT_RDWR);
+              close(client_fd);
             }
+          }
         }
       }
     }

--- 1.4/server-tools/instance-manager/log.cc	2005-03-22 02:04:10 +03:00
+++ 1.5/server-tools/instance-manager/log.cc	2005-05-16 01:53:56 +04:00
@@ -70,7 +70,7 @@
   if (n < 0 || n == sizeof(buff_stack))
   {
     int size= sizeof(buff_stack) * 2;
-    buff_msg= (char *) my_malloc(size, 0);
+    buff_msg= (char*) my_malloc(size, MYF(0));
     while (true)
     {
       if (buff_msg == 0)
@@ -86,16 +86,16 @@
       size*= 2;
       /* realloc() does unnecessary memcpy */
       my_free(buff_msg, 0);
-      buff_msg= (char *) my_malloc(size, 0);
+      buff_msg= (char*) my_malloc(size, MYF(0));
     }
   }
   else if ((size_t) n > sizeof(buff_stack))
   {
-    buff_msg= (char *) my_malloc(n + 1, 0);
+    buff_msg= (char*) my_malloc(n + 1, MYF(0));
 #ifdef DBUG
     DBUG_ASSERT(n == vsnprintf(buff_msg, n + 1, format, args));
 #else
-   vsnprintf(buff_msg, n + 1, format, args); 
+   vsnprintf(buff_msg, n + 1, format, args);
 #endif
   }
   fprintf(file, "%s%s\n", buff_date, buff_msg);

--- 1.20/server-tools/instance-manager/manager.cc	2005-03-22 02:04:10 +03:00
+++ 1.21/server-tools/instance-manager/manager.cc	2005-05-16 01:53:56 +04:00
@@ -197,8 +197,7 @@
       goto err;
     }
 
-    switch (signo)
-    {
+    switch (signo) {
       case THR_SERVER_ALARM:
         process_alarm(signo);
       break;

--- 1.10/server-tools/instance-manager/mysqlmanager.cc	2005-03-22 02:04:10 +03:00
+++ 1.11/server-tools/instance-manager/mysqlmanager.cc	2005-05-16 01:53:56 +04:00
@@ -136,7 +136,8 @@
   {
     /* Allow a numeric uid to be used */
     const char *pos;
-    for (pos= user; my_isdigit(default_charset_info, *pos); pos++) ;
+    for (pos= user; my_isdigit(default_charset_info, *pos); pos++)
+    {}
     if (*pos)                                   /* Not numeric id */
       goto err;
     if (!(user_info= getpwuid(atoi(user))))

--- 1.13/server-tools/instance-manager/options.cc	2005-04-11 17:08:30 +04:00
+++ 1.14/server-tools/instance-manager/options.cc	2005-05-16 01:53:56 +04:00
@@ -158,7 +158,7 @@
 
   fprintf(stderr, "Creating record for new user.\n");
   fprintf(stderr, "Enter user name: ");
-  if (! fgets(user, sizeof(user), stdin))
+  if (!fgets(user, sizeof(user), stdin))
   {
     fprintf(stderr, "Unable to read user.\n");
     return;

--- 1.8/server-tools/instance-manager/buffer.cc	2005-02-27 18:41:29 +03:00
+++ 1.9/server-tools/instance-manager/buffer.cc	2005-05-16 01:53:56 +04:00
@@ -64,7 +64,7 @@
 
   DESCRIPTION
 
-    The method checks whether it is possible to pus a string of teh "len_arg"
+    The method checks whether it is possible to put a string of the "len_arg"
     length into the buffer, starting from "position" byte. In the case when the
     buffer is too small it reallocs the buffer. The total size of the buffer is
     restricted with 16 Mb.
@@ -81,7 +81,7 @@
 
   if (position + len_arg >= buffer_size)
   {
-    buffer= (char *) my_realloc(buffer,
+    buffer= (char*) my_realloc(buffer,
                                 min(MAX_BUFFER_SIZE,
                                     max((uint) (buffer_size*1.5),
                                         position + len_arg)), MYF(0));

--- 1.17/server-tools/instance-manager/commands.cc	2005-04-21 01:26:59 +04:00
+++ 1.18/server-tools/instance-manager/commands.cc	2005-05-16 01:53:56 +04:00
@@ -25,11 +25,32 @@
 
 #include <m_string.h>
 #include <mysql.h>
+#include <my_dir.h>
 
 
-/* some useful functions */
+/*
+  Add a string to a buffer
+
+  SYNOPSYS
+    put_to_buff()
+    buff              buffer to add the string
+    str               string to add
+    uint              offset in the buff to add a string
+
+  DESCRIPTION
+
+  Function to add a string to the buffer. It is different from
+  store_to_string, which is used in the protocol.cc. The last
+  one also stores the length of the string in a special way.
+  This is required for MySQL client/server protocol support only.
 
-static int put_to_buff(Buffer *buff, const char *str, uint *position)
+  RETURN
+    0 - ok
+    1 - error occured
+*/
+
+
+static inline int put_to_buff(Buffer *buff, const char *str, uint *position)
 {
   uint len= strlen(str);
   if (buff->append(*position, str, len))
@@ -47,15 +68,16 @@
   The method sends a list of instances in the instance map to the client.
 
   SYNOPSYS
-    Show_instances::do_command()
-    net               The network connection to the client.
+    Show_instances::execute()
+    net                    The network connection to the client.
+    connection_id          Client connection ID
 
   RETURN
     0 - ok
     1 - error occured
 */
 
-int Show_instances::do_command(struct st_net *net)
+int Show_instances::execute(struct st_net *net, ulong connection_id)
 {
   Buffer send_buff;  /* buffer for packets */
   LIST name, status;
@@ -63,11 +85,11 @@
   LIST *field_list;
   uint position=0;
 
-  name_field.name= (char *) "instance_name";
-  name_field.length= 20;
+  name_field.name= (char*) "instance_name";
+  name_field.length= DEFAULT_FIELD_LENGTH;
   name.data= &name_field;
-  status_field.name= (char *) "status";
-  status_field.length= 20;
+  status_field.name= (char*) "status";
+  status_field.length= DEFAULT_FIELD_LENGTH;
   status.data= &status_field;
   field_list= list_add(NULL, &status);
   field_list= list_add(field_list, &name);
@@ -84,9 +106,9 @@
       position= 0;
       store_to_string(&send_buff, instance->options.instance_name, &position);
       if (instance->is_running())
-        store_to_string(&send_buff, (char *) "online", &position);
+        store_to_string(&send_buff, (char*) "online", &position);
       else
-        store_to_string(&send_buff, (char *) "offline", &position);
+        store_to_string(&send_buff, (char*) "offline", &position);
       if (my_net_write(net, send_buff.buffer, (uint) position))
         goto err;
     }
@@ -99,16 +121,7 @@
 
   return 0;
 err:
-  return 1;
-}
-
-
-int Show_instances::execute(struct st_net *net, ulong connection_id)
-{
-  if (do_command(net))
-    return ER_OUT_OF_RESOURCES;
-
-  return 0;
+  return ER_OUT_OF_RESOURCES;
 }
 
 
@@ -116,10 +129,10 @@
 
 int Flush_instances::execute(struct st_net *net, ulong connection_id)
 {
-  if (instance_map->flush_instances())
+  if (instance_map->flush_instances() ||
+      net_send_ok(net, connection_id, NULL))
     return ER_OUT_OF_RESOURCES;
 
-  net_send_ok(net, connection_id, NULL);
   return 0;
 }
 
@@ -134,9 +147,7 @@
 
   /* we make a search here, since we don't want to store the name */
   if ((instance= instance_map->find(name, len)))
-  {
     instance_name= instance->options.instance_name;
-  }
   else
     instance_name= NULL;
 }
@@ -156,8 +167,8 @@
 */
 
 
-int Show_instance_status::do_command(struct st_net *net,
-                                     const char *instance_name)
+int Show_instance_status::execute(struct st_net *net,
+                                  ulong connection_id)
 {
   enum { MAX_VERSION_LENGTH= 40 };
   Buffer send_buff;  /* buffer for packets */
@@ -166,14 +177,17 @@
   NAME_WITH_LENGTH name_field, status_field, version_field;
   uint position=0;
 
+  if (!instance_name)
+    return ER_BAD_INSTANCE_NAME;
+
   /* create list of the fileds to be passed to send_fields */
-  name_field.name= (char *) "instance_name";
-  name_field.length= 20;
+  name_field.name= (char*) "instance_name";
+  name_field.length= DEFAULT_FIELD_LENGTH;
   name.data= &name_field;
-  status_field.name= (char *) "status";
-  status_field.length= 20;
+  status_field.name= (char*) "status";
+  status_field.length= DEFAULT_FIELD_LENGTH;
   status.data= &status_field;
-  version_field.name= (char *) "version";
+  version_field.name= (char*) "version";
   version_field.length= MAX_VERSION_LENGTH;
   version.data= &version_field;
   field_list= list_add(NULL, &version);
@@ -185,18 +199,18 @@
   {
     Instance *instance;
 
-    store_to_string(&send_buff, (char *) instance_name, &position);
+    store_to_string(&send_buff, (char*) instance_name, &position);
     if (!(instance= instance_map->find(instance_name, strlen(instance_name))))
       goto err;
     if (instance->is_running())
     {
-      store_to_string(&send_buff, (char *) "online", &position);
+      store_to_string(&send_buff, (char*) "online", &position);
       store_to_string(&send_buff, "unknown", &position);
     }
     else
     {
-      store_to_string(&send_buff, (char *) "offline", &position);
-      store_to_string(&send_buff, (char *) "unknown", &position);
+      store_to_string(&send_buff, (char*) "offline", &position);
+      store_to_string(&send_buff, (char*) "unknown", &position);
     }
 
 
@@ -205,28 +219,13 @@
       goto err;
   }
 
-  send_eof(net);
-  net_flush(net);
+  if (send_eof(net) || net_flush(net))
+    goto err;
 
   return 0;
 
 err:
-  return 1;
-}
-
-
-int Show_instance_status::execute(struct st_net *net, ulong connection_id)
-{
-  if ((instance_name))
-  {
-    if (do_command(net, instance_name))
-      return ER_OUT_OF_RESOURCES;
-    return 0;
-  }
-  else
-  {
-    return ER_BAD_INSTANCE_NAME;
-  }
+  return ER_OUT_OF_RESOURCES;
 }
 
 
@@ -240,30 +239,29 @@
 
   /* we make a search here, since we don't want to store the name */
   if ((instance= instance_map->find(name, len)))
-  {
     instance_name= instance->options.instance_name;
-  }
   else
     instance_name= NULL;
 }
 
 
-int Show_instance_options::do_command(struct st_net *net,
-                                      const char *instance_name)
+int Show_instance_options::execute(struct st_net *net, ulong connection_id)
 {
-  enum { MAX_VERSION_LENGTH= 40 };
   Buffer send_buff;  /* buffer for packets */
   LIST name, option;
   LIST *field_list;
   NAME_WITH_LENGTH name_field, option_field;
   uint position=0;
 
+  if (!instance_name)
+    return ER_BAD_INSTANCE_NAME;
+
   /* create list of the fileds to be passed to send_fields */
-  name_field.name= (char *) "option_name";
-  name_field.length= 20;
+  name_field.name= (char*) "option_name";
+  name_field.length= DEFAULT_FIELD_LENGTH;
   name.data= &name_field;
-  option_field.name= (char *) "value";
-  option_field.length= 20;
+  option_field.name= (char*) "value";
+  option_field.length= DEFAULT_FIELD_LENGTH;
   option.data= &option_field;
   field_list= list_add(NULL, &option);
   field_list= list_add(field_list, &name);
@@ -275,16 +273,16 @@
 
     if (!(instance= instance_map->find(instance_name, strlen(instance_name))))
       goto err;
-    store_to_string(&send_buff, (char *) "instance_name", &position);
-    store_to_string(&send_buff, (char *) instance_name, &position);
+    store_to_string(&send_buff, (char*) "instance_name", &position);
+    store_to_string(&send_buff, (char*) instance_name, &position);
     if (my_net_write(net, send_buff.buffer, (uint) position))
       goto err;
     if ((instance->options.mysqld_path))
     {
       position= 0;
-      store_to_string(&send_buff, (char *) "mysqld-path", &position);
+      store_to_string(&send_buff, (char*) "mysqld-path", &position);
       store_to_string(&send_buff,
-                     (char *) instance->options.mysqld_path,
+                     (char*) instance->options.mysqld_path,
                      &position);
       if (send_buff.is_error() ||
           my_net_write(net, send_buff.buffer, (uint) position))
@@ -294,7 +292,7 @@
     if ((instance->options.nonguarded))
     {
       position= 0;
-      store_to_string(&send_buff, (char *) "nonguarded", &position);
+      store_to_string(&send_buff, (char*) "nonguarded", &position);
       store_to_string(&send_buff, "", &position);
       if (send_buff.is_error() ||
           my_net_write(net, send_buff.buffer, (uint) position))
@@ -318,7 +316,8 @@
         /* join name and the value into the same option again */
         *option_value= '=';
       }
-      else store_to_string(&send_buff, tmp_option + 2, &position);
+      else
+        store_to_string(&send_buff, tmp_option + 2, &position);
 
       if (send_buff.is_error() ||
           my_net_write(net, send_buff.buffer, (uint) position))
@@ -326,28 +325,13 @@
     }
   }
 
-  send_eof(net);
-  net_flush(net);
+  if (send_eof(net) || net_flush(net))
+    goto err;
 
   return 0;
 
 err:
-  return 1;
-}
-
-
-int Show_instance_options::execute(struct st_net *net, ulong connection_id)
-{
-  if ((instance_name))
-  {
-    if (do_command(net, instance_name))
-      return ER_OUT_OF_RESOURCES;
-    return 0;
-  }
-  else
-  {
-    return ER_BAD_INSTANCE_NAME;
-  }
+  return ER_OUT_OF_RESOURCES;
 }
 
 
@@ -367,9 +351,7 @@
 {
   uint err_code;
   if (instance == 0)
-  {
     return ER_BAD_INSTANCE_NAME; /* haven't found an instance */
-  }
   else
   {
     if ((err_code= instance->start()))
@@ -404,33 +386,59 @@
 
   /* we make a search here, since we don't want to store the name */
   if ((instance= instance_map->find(name, len)))
-  {
     instance_name= instance->options.instance_name;
-  }
   else
     instance_name= NULL;
 }
 
 
-int Show_instance_log::do_command(struct st_net *net,
-                                  const char *instance_name)
+
+/*
+  Open the logfile, read requested part of the log and send the info
+  to the client.
+
+  SYNOPSYS
+    Show_instance_log::execute()
+    net                 The network connection to the client.
+    connection_id       Client connection ID
+
+  DESCRIPTION
+
+    Send a table with the content of the log requested. The function also
+    deals with errro handling, to be verbose.
+
+  RETURN
+   ER_OFFSET_ERROR      We were requested to read negative number of bytes
+                        from the log
+   ER_NO_SUCH_LOG       The kind log being read is not enabled in the instance
+   ER_GUESS_LOGFILE     IM wasn't able to figure out the log placement, while
+                        it is enabled. Probably user should specify the path
+                        to the logfile explicitly.
+   ER_OPEN_LOGFILE      Cannot open the logfile
+   ER_READ_FILE         Cannot read the logfile
+   ER_OUT_OF_RESOURCES  We weren't able to allocate some resources
+*/
+
+int Show_instance_log::execute(struct st_net *net, ulong connection_id)
 {
-  enum { MAX_VERSION_LENGTH= 40 };
   Buffer send_buff;  /* buffer for packets */
   LIST name;
   LIST *field_list;
   NAME_WITH_LENGTH name_field;
-  uint position=0;
+  uint position= 0;
 
   /* create list of the fileds to be passed to send_fields */
-  name_field.name= (char *) "Log";
-  name_field.length= 20;
+  name_field.name= (char*) "Log";
+  name_field.length= DEFAULT_FIELD_LENGTH;
   name.data= &name_field;
   field_list= list_add(NULL, &name);
 
+  if (!instance_name)
+    return ER_BAD_INSTANCE_NAME;
+
   /* cannot read negative number of bytes */
   if (offset > size)
-    return ER_SYNTAX_ERROR;
+    return ER_OFFSET_ERROR;
 
   send_fields(net, field_list);
 
@@ -439,43 +447,28 @@
     const char *logpath;
     File fd;
 
-    if ((instance= instance_map->find(instance_name, strlen(instance_name))) == NULL)
+    if ((instance= instance_map->find(instance_name,
+                                      strlen(instance_name))) == NULL)
       goto err;
 
-    switch (log_type)
-    {
-    case LOG_ERROR:
-      logpath= instance->options.error_log;
-      break;
-    case LOG_GENERAL:
-      logpath= instance->options.query_log;
-      break;
-    case LOG_SLOW:
-      logpath= instance->options.slow_log;
-      break;
-    default:
-      logpath= NULL;
-    }
+    logpath= instance->options.logs[log_type];
 
     /* Instance has no such log */
     if (logpath == NULL)
-    {
       return ER_NO_SUCH_LOG;
-    }
     else if (*logpath == '\0')
-    {
       return ER_GUESS_LOGFILE;
-    }
 
 
-    if ((fd= open(logpath, O_RDONLY)))
+    if ((fd= my_open(logpath, O_RDONLY | O_BINARY,  MYF(MY_WME))) >= 0)
     {
       size_t buff_size;
       int read_len;
       /* calculate buffer size */
       struct stat file_stat;
 
-      if(fstat(fd, &file_stat))
+      /* my_fstat doesn't use the flag parameter */
+      if (my_fstat(fd, &file_stat, MYF(0)))
         goto err;
 
       buff_size= (size - offset);
@@ -483,22 +476,21 @@
       /* read in one chunk */
       read_len= my_seek(fd, file_stat.st_size - size, MY_SEEK_SET, MYF(0));
 
-      char *bf= (char *) malloc(sizeof(char)*buff_size);
-      read_len= my_read(fd, bf, buff_size, MYF(0));
-      store_to_string(&send_buff, (char *) bf, &position, read_len);
+      char *bf= (char*) malloc(sizeof(char)*buff_size);
+      if ((read_len= my_read(fd, bf, buff_size, MYF(0))) < 0)
+        return ER_READ_FILE;
+      store_to_string(&send_buff, (char*) bf, &position, read_len);
       close(fd);
     }
     else
-    {
       return ER_OPEN_LOGFILE;
-    }
 
     if (my_net_write(net, send_buff.buffer, (uint) position))
       goto err;
   }
 
-  send_eof(net);
-  net_flush(net);
+  if (send_eof(net) ||  net_flush(net))
+    goto err;
 
   return 0;
 
@@ -507,20 +499,6 @@
 }
 
 
-int Show_instance_log::execute(struct st_net *net, ulong connection_id)
-{
-  if (instance_name != NULL)
-  {
-    return do_command(net, instance_name);
-  }
-  else
-  {
-    return ER_BAD_INSTANCE_NAME;
-  }
-}
-
-
-
 /* implementation for Show_instance_log_files: */
 
 Show_instance_log_files::Show_instance_log_files
@@ -531,48 +509,47 @@
 
   /* we make a search here, since we don't want to store the name */
   if ((instance= instance_map->find(name, len)))
-  {
     instance_name= instance->options.instance_name;
-  }
   else
     instance_name= NULL;
 }
 
 
 /*
-  The method sends a table with a the list of the log files
+  The method sends a table with a list of log files
   used by the instance.
 
   SYNOPSYS
-    Show_instance_log_files::do_command()
+    Show_instance_log_files::execute()
     net               The network connection to the client.
-    instance_name     The name of the instance.
+    connection_id     The ID of the client connection
 
   RETURN
+    ER_BAD_INSTANCE_NAME  The instance name specified is not valid
+    ER_OUT_OF_RESOURCES   some error occured
     0 - ok
-    1 - error occured
 */
 
-
-int Show_instance_log_files::do_command(struct st_net *net,
-                                        const char *instance_name)
+int Show_instance_log_files::execute(struct st_net *net, ulong connection_id)
 {
-  enum { MAX_VERSION_LENGTH= 40 };
   Buffer send_buff;  /* buffer for packets */
   LIST name, path, size;
   LIST *field_list;
   NAME_WITH_LENGTH name_field, path_field, size_field;
-  uint position=0;
+  uint position= 0;
+
+  if (!instance_name)
+    return ER_BAD_INSTANCE_NAME;
 
   /* create list of the fileds to be passed to send_fields */
-  name_field.name= (char *) "Logfile";
-  name_field.length= 20;
+  name_field.name= (char*) "Logfile";
+  name_field.length= DEFAULT_FIELD_LENGTH;
   name.data= &name_field;
-  path_field.name= (char *) "Path";
-  path_field.length= 20;
+  path_field.name= (char*) "Path";
+  path_field.length= DEFAULT_FIELD_LENGTH;
   path.data= &path_field;
-  size_field.name= (char *) "Filesize";
-  size_field.length= 20;
+  size_field.name= (char*) "Filesize";
+  size_field.length= DEFAULT_FIELD_LENGTH;
   size.data= &size_field;
   field_list= list_add(NULL, &size);
   field_list= list_add(field_list, &path);
@@ -588,7 +565,7 @@
   {
     /*
       We have alike structure in instance_options.cc. We use such to be able
-      to loop througt the options, which we need to handle in some common way.
+      to loop through the options, which we need to handle in some common way.
     */
     struct log_files_st
     {
@@ -596,72 +573,59 @@
       const char *value;
     } logs[]=
     {
-      {"ERROR LOG", instance->options.error_log},
-      {"GENERAL LOG", instance->options.query_log},
-      {"SLOW LOG", instance->options.slow_log},
+      {"ERROR LOG", instance->options.logs[LOG_ERROR]},
+      {"GENERAL LOG", instance->options.logs[LOG_GENERAL]},
+      {"SLOW LOG", instance->options.logs[LOG_SLOW]},
       {NULL, NULL}
     };
     struct log_files_st *log_files;
 
-
-    instance->options.print_argv();
     for (log_files= logs; log_files->name; log_files++)
     {
       if (log_files->value != NULL)
       {
         struct stat file_stat;
-        char buff[20];
+        /*
+          Save some more space for the log file names. In fact all
+          we need is srtlen("GENERAL_LOG") + 1
+        */
+        enum { LOG_NAME_BUFFER_SIZE= 20 };
+        char buff[LOG_NAME_BUFFER_SIZE];
 
         position= 0;
         /* store the type of the log in the send buffer */
         store_to_string(&send_buff, log_files->name, &position);
-        switch (stat(log_files->value, &file_stat)) {
-        case 0:
-          if (S_ISREG(file_stat.st_mode))
-          {
-            store_to_string(&send_buff,
-                            (char *) log_files->value,
-                            &position);
-            int10_to_str(file_stat.st_size, buff, 10);
-            store_to_string(&send_buff, (char *) buff, &position);
-            break;
-          }
-        default:
+        if (stat(log_files->value, &file_stat))
+        {
+          store_to_string(&send_buff, "", &position);
+          store_to_string(&send_buff, (char*) "0", &position);
+        }
+        else if (S_ISREG(file_stat.st_mode))
+        {
           store_to_string(&send_buff,
-                          "",
+                          (char*) log_files->value,
                           &position);
-          store_to_string(&send_buff, (char *) "0", &position);
+          int10_to_str(file_stat.st_size, buff, 10);
+          store_to_string(&send_buff, (char*) buff, &position);
         }
+
         if (my_net_write(net, send_buff.buffer, (uint) position))
           goto err;
       }
     }
   }
 
-  send_eof(net);
-  net_flush(net);
+  if (send_eof(net) || net_flush(net))
+    goto err;
 
   return 0;
 
 err:
-  return 1;
-}
-int Show_instance_log_files::execute(struct st_net *net, ulong connection_id)
-{
-  if (instance_name != NULL)
-  {
-    if (do_command(net, instance_name))
-      return ER_OUT_OF_RESOURCES;
-    return 0;
-  }
-  else
-  {
-    return ER_BAD_INSTANCE_NAME;
-  }
+  return ER_OUT_OF_RESOURCES;
 }
 
 
-/* implementation for SET nstance_name.option=option_value: */
+/* implementation for SET instance_name.option=option_value: */
 
 Set_option::Set_option(Instance_map *instance_map_arg,
                        const char *name, uint len,
@@ -679,10 +643,12 @@
     if ((option_len_arg < MAX_OPTION_LEN - 1) ||
         (option_value_len_arg < MAX_OPTION_LEN - 1))
     {
-      strncpy(option, option_arg, option_len_arg);
+      strmake(option, option_arg, option_len_arg);
+      strmake(option_value, option_value_arg, option_value_len_arg);
+/*    strncpy(option, option_arg, option_len_arg);
       option[option_len_arg]= 0;
       strncpy(option_value, option_value_arg, option_value_len_arg);
-      option_value[option_value_len_arg]= 0;
+      option_value[option_value_len_arg]= 0; */
     }
     else
     {
@@ -700,89 +666,38 @@
 
 
 /*
-  Correct the file. skip option could be used in future if we don't want to
-  let user change the options file (E.g. he lacks permissions to do that)
-*/
-int Set_option::correct_file(bool skip)
-{
-  FILE *cnf_file;
-  const char *default_location="/etc/my.cnf";
-  char linebuff[4096], *ptr;
-  uint optlen;
-  Buffer file_buffer;
-  uint position= 0;
-  bool isfound= false;
-
-  optlen= strlen(option);
-
-  if (!(cnf_file= my_fopen(default_location, O_RDONLY, MYF(0))))
-    goto err_fopen;
-
-  while (fgets(linebuff, sizeof(linebuff), cnf_file))
-  {
-    /* if the section is found traverse it */
-    if (isfound)
-    {
-        /* skip the old value of the option we are changing */
-      if (strncmp(linebuff, option, optlen))
-      {
-        /* copy all other lines line */
-        put_to_buff(&file_buffer, linebuff, &position);
-      }
-    }
-    else
-      put_to_buff(&file_buffer, linebuff, &position);
+  The method sends a table with a list of log files
+  used by the instance.
 
-    /* looking for appropriate instance section */
-    for (ptr= linebuff ; my_isspace(&my_charset_latin1,*ptr) ; ptr++);
-    if (*ptr == '[')
-    {
-      /* copy the line to the buffer */
-      if (!strncmp(++ptr, instance_name, instance_name_len))
-      {
-        isfound= true;
-        /* add option */
-        if (!skip)
-        {
-          put_to_buff(&file_buffer, option, &position);
-          if (option_value[0] != 0)
-          {
-           put_to_buff(&file_buffer, "=", &position);
-           put_to_buff(&file_buffer, option_value, &position);
-          }
-          /* add a newline */
-          put_to_buff(&file_buffer, "\n", &position);
-        }
-      }
-      else
-        isfound= false; /* mark that this section is of no interest to us */
-    }
+  SYNOPSYS
+    Set_option::correct_file()
+    skip     Skip the option, being searched while writing the result file.
+             That is, to delete it.
 
-  }
+  DESCRIPTION
 
-  if (my_fclose(cnf_file, MYF(0)))
-    goto err;
+  Correct the option file. The "skip" option is used to remove the found
+  option.
 
-  /* we must hold an instance_map mutex while changing config file */
-  instance_map->lock();
-
-  if (!(cnf_file= my_fopen(default_location, O_WRONLY|O_TRUNC, MYF(0))))
-    goto err;
-  if (my_fwrite(cnf_file, file_buffer.buffer, position, MYF(MY_NABP)))
-    goto err;
+  RETURN
+    ER_BAD_INSTANCE_NAME    The instance name specified is not valid
+    ER_ACCESS_OPTION_FILE   Cannot access the option file
+    0 - ok
+*/
 
-  if (my_fclose(cnf_file, MYF(0)))
-    goto err;
+int Set_option::correct_file(int skip)
+{
+  int error;
 
-  instance_map->unlock();
+  error= my_correct_defaults_file("/etc/my.cnf", option,
+                                  option_value, instance_name, skip);
+  if (error > 0)
+    return ER_OUT_OF_RESOURCES;
+  else if (error < 0)
+    return ER_ACCESS_OPTION_FILE;
 
+  /* everything was fine */
   return 0;
-
-err:
-  my_fclose(cnf_file, MYF(0));
-  return ER_OUT_OF_RESOURCES;
-err_fopen:
-  return ER_ACCESS_OPTION_FILE;
 }
 
 
@@ -801,7 +716,14 @@
 
 int Set_option::do_command(struct st_net *net)
 {
-  return correct_file(false);
+  int error= 0;
+
+  /* we must hold the instance_map mutex while changing config file */
+  instance_map->lock();
+  error= correct_file(FALSE);
+  instance_map->unlock();
+
+  return error;
 }
 
 
@@ -821,9 +743,7 @@
     return val;
   }
   else
-  {
     return ER_BAD_INSTANCE_NAME;
-  }
 }
 
 
@@ -831,7 +751,7 @@
 
 int Unset_option::do_command(struct st_net *net)
 {
-  return correct_file(true);
+  return correct_file(TRUE);
 }
 
 
@@ -852,9 +772,7 @@
   uint err_code;
 
   if (instance == 0)
-  {
     return ER_BAD_INSTANCE_NAME; /* haven't found an instance */
-  }
   else
   {
     if (!(instance->options.nonguarded))

--- 1.6/server-tools/instance-manager/commands.h	2005-04-09 14:28:34 +04:00
+++ 1.7/server-tools/instance-manager/commands.h	2005-05-16 01:53:56 +04:00
@@ -31,7 +31,6 @@
   Show_instances(Instance_map *instance_map_arg): Command(instance_map_arg)
   {}
 
-  int do_command(struct st_net *net);
   int execute(struct st_net *net, ulong connection_id);
 };
 
@@ -60,8 +59,8 @@
 {
 public:
 
-  Show_instance_status(Instance_map *instance_map_arg, const char *name, uint len);
-  int do_command(struct st_net *net, const char *instance_name);
+  Show_instance_status(Instance_map *instance_map_arg,
+                       const char *name, uint len);
   int execute(struct st_net *net, ulong connection_id);
   const char *instance_name;
 };
@@ -76,10 +75,10 @@
 {
 public:
 
-  Show_instance_options(Instance_map *instance_map_arg, const char *name, uint len);
+  Show_instance_options(Instance_map *instance_map_arg,
+                        const char *name, uint len);
 
   int execute(struct st_net *net, ulong connection_id);
-  int do_command(struct st_net *net, const char *instance_name);
   const char *instance_name;
 };
 
@@ -129,7 +128,6 @@
   Show_instance_log(Instance_map *instance_map_arg, const char *name,
                     uint len, Log_type log_type_arg, const char *size_arg,
                     const char *offset_arg);
-  int do_command(struct st_net *net, const char *instance_name);
   int execute(struct st_net *net, ulong connection_id);
   Log_type log_type;
   const char *instance_name;
@@ -147,8 +145,8 @@
 {
 public:
 
-  Show_instance_log_files(Instance_map *instance_map_arg, const char *name, uint len);
-  int do_command(struct st_net *net, const char *instance_name);
+  Show_instance_log_files(Instance_map *instance_map_arg,
+                          const char *name, uint len);
   int execute(struct st_net *net, ulong connection_id);
   const char *instance_name;
   const char *option;
@@ -156,10 +154,10 @@
 
 
 /*
-  Syntax error command. This command is issued if parser reported a syntax error.
-  We need it to distinguish the parse error and the situation when parser internal
-  error occured. E.g. parsing failed because we hadn't had enought memory. In the
-  latter case parse_command() should return an error.
+  Syntax error command. This command is issued if parser reported a syntax
+  error. We need it to distinguish the parse error and the situation when
+  parser internal error occured. E.g. parsing failed because we hadn't had
+  enought memory. In the latter case parse_command() should return an error.
 */
 
 class Syntax_error : public Command
@@ -185,7 +183,7 @@
   virtual int do_command(struct st_net *net);
   int execute(struct st_net *net, ulong connection_id);
 protected:
-  int correct_file(bool skip);
+  int correct_file(int skip);
 public:
   const char *instance_name;
   uint instance_name_len;

--- 1.12/server-tools/instance-manager/guardian.cc	2005-03-22 02:04:10 +03:00
+++ 1.13/server-tools/instance-manager/guardian.cc	2005-05-16 01:53:56 +04:00
@@ -315,7 +315,7 @@
   content->restart_counter= 0;
   content->crash_moment= 0;
   content->state= NOT_STARTED;
-  node->data= (void *) content;
+  node->data= (void*) content;
 
   if (nolock)
     guarded_instances= list_add(guarded_instances, node);

--- 1.16/server-tools/instance-manager/instance.cc	2005-04-11 17:19:08 +04:00
+++ 1.17/server-tools/instance-manager/instance.cc	2005-05-16 01:53:56 +04:00
@@ -304,12 +304,11 @@
     */
     if (!kill(pid, signum))
       options.unlink_pidfile();
-    else
-      if (signum == SIGKILL)      /* really killed instance with SIGKILL */
-        log_error("The instance %s is being stopped forsibly. Normally \
-                  it should not happed. Probably the instance has been \
-                  hanging. You should also check your IM setup",
-                  options.instance_name);
+    else if (signum == SIGKILL)      /* really killed instance with SIGKILL */
+      log_error("The instance %s is being stopped forsibly. Normally \
+                it should not happed. Probably the instance has been \
+                hanging. You should also check your IM setup",
+                options.instance_name);
   }
   return;
 }

--- 1.16/server-tools/instance-manager/instance_map.cc	2005-03-22 02:04:10 +03:00
+++ 1.17/server-tools/instance-manager/instance_map.cc	2005-05-16 01:53:56 +04:00
@@ -246,7 +246,7 @@
     argv_options[1]= '\0';
 
   if (my_search_option_files("my", &argc, (char ***) &argv, &args_used,
-                             process_option, (void *) this) ||
+                             process_option, (void*) this) ||
       complete_initialization())
     return 1;
 

--- 1.15/server-tools/instance-manager/instance_options.cc	2005-04-09 14:28:34 +04:00
+++ 1.16/server-tools/instance-manager/instance_options.cc	2005-05-16 01:53:56 +04:00
@@ -21,7 +21,6 @@
 #include "instance_options.h"
 
 #include "parse_output.h"
-#include "parse.h"
 #include "buffer.h"
 
 #include <my_sys.h>
@@ -36,7 +35,7 @@
     get_default_option()
     result            buffer to put found value
     result_len        buffer size
-    oprion_name       the name of the option, prefixed with "--"
+    option_name       the name of the option, prefixed with "--"
 
   DESCRIPTION
 
@@ -47,6 +46,7 @@
     1 - error occured
 */
 
+
 int Instance_options::get_default_option(char *result, size_t result_len,
                                          const char *option_name)
 {
@@ -76,16 +76,30 @@
 }
 
 
+/*
+  Get compiled-in value of default_option
+
+  SYNOPSYS
+    get_default_option()
+    result            buffer to put found value
+    result_len        buffer size
+    option_name       the name of the option, prefixed with "--"
+
+  DESCRIPTION
+
+   Get compile-in value of requested option from server
+
+  RETURN
+    0 - ok
+    1 - error occured
+*/
+
 int Instance_options::fill_log_options()
 {
-  /* array for the log option for mysqld */
-  enum { MAX_LOG_OPTIONS= 8 };
-  enum { MAX_LOG_OPTION_LENGTH= 256 };
-  /* the last option must be '\0', so we reserve space for it */
-  char log_options[MAX_LOG_OPTIONS + 1][MAX_LOG_OPTION_LENGTH];
   Buffer buff;
   uint position= 0;
   char **tmp_argv= argv;
+  enum { MAX_LOG_OPTION_LENGTH= 256 };
   char datadir[MAX_LOG_OPTION_LENGTH];
   char hostname[MAX_LOG_OPTION_LENGTH];
   uint hostname_length;
@@ -93,43 +107,17 @@
   {
     const char *name;
     uint length;
-    const char **value;
+    char **value;
     const char *default_suffix;
-  } logs[]=
+  } logs_st[]=
   {
-    {"--log-error", 11, &error_log, ".err"},
-    {"--log", 5, &query_log, ".log"},
-    {"--log-slow-queries", 18, &slow_log, "-slow.log"},
+    {"--log-error", 11, &(logs[LOG_ERROR]), ".err"},
+    {"--log", 5, &(logs[LOG_GENERAL]), ".log"},
+    {"--log-slow-queries", 18, &(logs[LOG_SLOW]), "-slow.log"},
     {NULL, 0, NULL, NULL}
   };
   struct log_files_st *log_files;
 
-  /* clean the buffer before usage */
-  bzero(log_options, sizeof(log_options));
-
-  /* create a "mysqld <argv_options>" command in the buffer */
-  buff.append(position, mysqld_path, strlen(mysqld_path));
-  position=  strlen(mysqld_path);
-
-  /* skip the first option */
-  tmp_argv++;
-
-  while (*tmp_argv != 0)
-  {
-    buff.append(position, " ", 1);
-    position++;
-    buff.append(position, *tmp_argv, strlen(*tmp_argv));
-    position+= strlen(*tmp_argv);
-    tmp_argv++;
-  }
-
-  buff.append(position, "\0", 1);
-  position++;
-
-  /* get options and parse them */
-  if (parse_arguments(buff.buffer, "--log", (char *) log_options,
-                      MAX_LOG_OPTIONS + 1, MAX_LOG_OPTION_LENGTH))
-    goto err;
   /* compute hostname and datadir for the instance */
   if (mysqld_datadir == NULL)
   {
@@ -148,11 +136,11 @@
   hostname_length= strlen(hostname);
 
 
-  for (log_files= logs; log_files->name; log_files++)
+  for (log_files= logs_st; log_files->name; log_files++)
   {
-    for (int i=0; (i < MAX_LOG_OPTIONS) && (log_options[i][0] != '\0'); i++)
+    for (int i=0; (argv[i] != 0); i++)
     {
-      if (!strncmp(log_options[i], log_files->name, log_files->length))
+      if (!strncmp(argv[i], log_files->name, log_files->length))
       {
         /*
           This is really log_files->name option if and only if it is followed
@@ -160,8 +148,8 @@
           options as '--log' and '--log-bin'. This is checked in the following
           two statements.
         */
-        if (log_options[i][log_files->length] == '\0' ||
-            my_isspace(default_charset_info, log_options[i][log_files->length]))
+        if (argv[i][log_files->length] == '\0' ||
+            my_isspace(default_charset_info, argv[i][log_files->length]))
         {
           char full_name[MAX_LOG_OPTION_LENGTH];
 
@@ -178,21 +166,25 @@
           else
             goto err;
 
-          *(log_files->value)= strdup_root(&alloc, datadir);
+          /*
+            If there were specified two identical logfiles options,
+            we would loose some memory in MEM_ROOT here. However
+            this situation is not typical.
+          */
+          *(log_files->value)= strdup_root(&alloc, full_name);
         }
 
-        if (log_options[i][log_files->length] == '=')
+        if (argv[i][log_files->length] == '=')
         {
           char full_name[MAX_LOG_OPTION_LENGTH];
 
-          fn_format(full_name, log_options[i] +log_files->length + 1,
+          fn_format(full_name, argv[i] +log_files->length + 1,
                     datadir, "", MY_UNPACK_FILENAME | MY_SAFE_PATH);
 
           if (!(*(log_files->value)=
                 strdup_root(&alloc, full_name)))
             goto err;
         }
-
       }
     }
   }
@@ -205,6 +197,25 @@
 }
 
 
+/*
+  Get the full pid file name with path
+
+  SYNOPSYS
+    get_pid_filaname()
+    result            buffer to sotre the pidfile value
+
+  IMPLEMENTATION
+    Get the data directory, then get the pid filename
+    (which is always set for an instance), then load the
+    full path with my_load_path(). It takes into account
+    whether it is already an absolute path or it should be
+    prefixed with the datadir and so on.
+
+  RETURN
+    0 - ok
+    1 - error occured
+*/
+
 int Instance_options::get_pid_filename(char *result)
 {
   const char *pid_file= mysqld_pid_file;
@@ -405,7 +416,7 @@
   DBUG_ASSERT(filled_default_options < MAX_NUMBER_OF_DEFAULT_OPTIONS);
 
   if ((option))
-    argv[filled_default_options++]= (char *) option;
+    argv[filled_default_options++]= (char*) option;
   return 0;
 }
 
@@ -433,10 +444,10 @@
 
   init_alloc_root(&alloc, MEM_ROOT_BLOCK_SIZE, 0);
 
-  if (my_init_dynamic_array(&options_array, sizeof(char *), 0, 32))
+  if (my_init_dynamic_array(&options_array, sizeof(char*), 0, 32))
       goto err;
 
-  if (!(instance_name= strmake_root(&alloc, (char *) instance_name_arg,
+  if (!(instance_name= strmake_root(&alloc, (char*) instance_name_arg,
                                   instance_name_len)))
     goto err;
 

--- 1.11/server-tools/instance-manager/instance_options.h	2005-04-09 14:28:34 +04:00
+++ 1.12/server-tools/instance-manager/instance_options.h	2005-05-16 01:53:56 +04:00
@@ -18,6 +18,7 @@
 
 #include <my_global.h>
 #include <my_sys.h>
+#include "parse.h"
 
 #ifdef __GNUC__
 #pragma interface
@@ -40,8 +41,7 @@
     mysqld_socket(0), mysqld_datadir(0),
     mysqld_bind_address(0), mysqld_pid_file(0), mysqld_port(0),
     mysqld_port_val(0), mysqld_path(0), nonguarded(0), shutdown_delay(0),
-    shutdown_delay_val(0), error_log(0), query_log(0), slow_log(0),
-    filled_default_options(0)
+    shutdown_delay_val(0), filled_default_options(0)
   {}
   ~Instance_options();
   /* fills in argv */
@@ -77,9 +77,8 @@
   const char *nonguarded;
   const char *shutdown_delay;
   uint shutdown_delay_val;
-  const char *error_log;
-  const char *query_log;
-  const char *slow_log;
+  /* log enums are defined in parse.h */
+  char *logs[3];
 
   /* this value is computed and cashed here */
   DYNAMIC_ARRAY options_array;

--- 1.4/server-tools/instance-manager/messages.cc	2005-04-09 14:28:34 +04:00
+++ 1.5/server-tools/instance-manager/messages.cc	2005-05-16 01:53:56 +04:00
@@ -55,8 +55,12 @@
   case ER_CANNOT_START_INSTANCE:
     return "Cannot start instance. Possible reasons are wrong instance options"
            " or resources shortage";
+  case ER_OFFSET_ERROR:
+    return "Cannot read negative number of bytes";
   case ER_STOP_INSTANCE:
     return "Cannot stop instance";
+  case ER_READ_FILE:
+    return "Cannot read requested part of the logfile";
   case ER_NO_SUCH_LOG:
     return "The instance has no such log enabled";
   case ER_OPEN_LOGFILE:

--- 1.8/server-tools/instance-manager/mysql_connection.cc	2005-04-09 14:28:34 +04:00
+++ 1.9/server-tools/instance-manager/mysql_connection.cc	2005-05-16 01:53:56 +04:00
@@ -261,10 +261,10 @@
   }
   client_capabilities|= ((ulong) uint2korr(net.read_pos + 2)) << 16;
 
-  pos= (char *) net.read_pos + 32;
+  pos= (char*) net.read_pos + 32;
 
   /* At least one byte for username and one byte for password */
-  if (pos >= (char *) net.read_pos + pkt_len + 2)
+  if (pos >= (char*) net.read_pos + pkt_len + 2)
   {
     /*TODO add user and password handling in error messages*/
     net_send_error(&net, ER_HANDSHAKE_ERROR);
@@ -301,9 +301,7 @@
   {
     /* Check if we can continue without closing the connection */
     if (net.error != 3) // what is 3 - find out
-    {
       return 1;
-    }
     if (thread_registry.is_shutdown())
       return 1;
     net_send_error(&net, net.last_errno);
@@ -346,14 +344,12 @@
       res= command->execute(&net, connection_id);
       delete command;
       if (!res)
-      {
-	log_info("query for connection %d executed ok",connection_id);
-      }
+        log_info("query for connection %d executed ok",connection_id);
       else
       {
-	log_info("query for connection %d executed err=%d",connection_id,res);
-	net_send_error(&net, res);
-	return 0;
+        log_info("query for connection %d executed err=%d",connection_id,res);
+        net_send_error(&net, res);
+        return 0;
       }
     }
     else

--- 1.2/server-tools/instance-manager/mysql_manager_error.h	2005-04-09 14:28:34 +04:00
+++ 1.3/server-tools/instance-manager/mysql_manager_error.h	2005-05-16 01:53:56 +04:00
@@ -27,5 +27,7 @@
 #define ER_OPEN_LOGFILE             3006
 #define ER_GUESS_LOGFILE            3007
 #define ER_ACCESS_OPTION_FILE       3008
+#define ER_OFFSET_ERROR             3009
+#define ER_READ_FILE                3010
 
 #endif /* INCLUDES_MYSQL_INSTANCE_MANAGER_MYSQL_MANAGER_ERROR_H */

--- 1.6/server-tools/instance-manager/parse.cc	2005-04-09 14:28:34 +04:00
+++ 1.7/server-tools/instance-manager/parse.cc	2005-05-16 01:53:56 +04:00
@@ -198,9 +198,7 @@
     /* should be empty */
     get_word(&text, &word_len);
     if (word_len)
-    {
       goto syntax_error;
-    }
 
     if (skip)
       command= factory->new_Unset_option(instance_name, instance_name_len,
@@ -330,44 +328,3 @@
   }
   return command;
 }
-
-/* additional parse function, needed to parse  */
-
-/* create an array of strings from the output, starting from "word" */
-int parse_arguments(const char *command, const char *word, char *result,
-                    int max_result_cardinality, size_t option_len)
-{
-  int wordlen;
-  int i= 0;              /* result array index */
-  /* should be enough to store the string from the output */
-  enum { MAX_LINE_LEN= 4096 };
-  char linebuf[MAX_LINE_LEN];
-
-  wordlen= strlen(word);
-
-  uint lineword_len= 0;
-  const char *linep= command;
-  get_word((const char **) &linep, &lineword_len, NONSPACE);
-  while ((*linep != '\0') && (i < max_result_cardinality))
-  {
-    if (!strncmp(word, linep, wordlen))
-    {
-      strncpy(result + i*option_len, linep, lineword_len);
-      *(result + i*option_len + lineword_len)= '\0';
-      linep+= lineword_len;
-      i++;
-    }
-    else
-      linep+= lineword_len;
-    get_word((const char **) &linep, &lineword_len, NONSPACE);
-
-    /* stop if we've filled the array */
-    if (i >= max_result_cardinality)
-      break;
-  }
-
-
-  return 0;
-}
-
-

--- 1.3/server-tools/instance-manager/parse.h	2005-04-09 14:28:34 +04:00
+++ 1.4/server-tools/instance-manager/parse.h	2005-05-16 01:53:56 +04:00
@@ -31,9 +31,6 @@
 
 Command *parse_command(Command_factory *factory, const char  *text);
 
-int parse_arguments(const char *command, const char *word, char *result,
-                    int max_result_cardinality, size_t option_len);
-
 /* define kinds of the word seek method */
 enum { ALPHANUM= 1, NONSPACE };
 

--- 1.7/server-tools/instance-manager/protocol.cc	2005-04-09 14:28:34 +04:00
+++ 1.8/server-tools/instance-manager/protocol.cc	2005-05-16 01:53:56 +04:00
@@ -122,6 +122,7 @@
 {
   uint currpos;
 
+  /* reserve max amount of bytes needed to store length */
   if (buf->reserve(*position, 9))
     goto err;
   currpos= (net_store_length(buf->buffer + *position,
@@ -175,10 +176,10 @@
     position= 0;
     field= (NAME_WITH_LENGTH *) tmp->data;
 
-    store_to_string(&send_buff, (char *) "", &position); /* catalog name */
-    store_to_string(&send_buff, (char *) "", &position); /* db name */
-    store_to_string(&send_buff, (char *) "", &position); /* table name */
-    store_to_string(&send_buff, (char *) "", &position); /* table name alias */
+    store_to_string(&send_buff, (char*) "", &position); /* catalog name */
+    store_to_string(&send_buff, (char*) "", &position); /* db name */
+    store_to_string(&send_buff, (char*) "", &position); /* table name */
+    store_to_string(&send_buff, (char*) "", &position); /* table name alias */
     store_to_string(&send_buff, field->name, &position); /* column name */
     store_to_string(&send_buff, field->name, &position); /* column name alias
*/
     send_buff.reserve(position, 12);

--- 1.4/server-tools/instance-manager/protocol.h	2005-04-09 14:28:34 +04:00
+++ 1.5/server-tools/instance-manager/protocol.h	2005-05-16 01:53:56 +04:00
@@ -25,6 +25,9 @@
   uint length;
 } NAME_WITH_LENGTH;
 
+/* default field length to be used in various field-realted functions */
+enum { DEFAULT_FIELD_LENGTH= 20 };
+
 struct st_net;
 
 int net_send_ok(struct st_net *net, unsigned long connection_id,

--- 1.60/libmysql/Makefile.shared	2005-03-24 13:28:25 +03:00
+++ 1.61/libmysql/Makefile.shared	2005-05-16 01:53:56 +04:00
@@ -67,7 +67,7 @@
                         mf_iocache2.lo my_seek.lo my_sleep.lo \
 			my_pread.lo mf_cache.lo md5.lo sha1.lo \
 			my_getopt.lo my_gethostbyname.lo my_port.lo \
-                        my_rename.lo
+                        my_rename.lo my_chsize.lo
 sqlobjects =		net.lo
 sql_cmn_objects =	pack.lo client.lo my_time.lo
 
Thread
bk commit into 5.0 tree (petr:1.1864)Petr Chardin15 May