From 8488498545a109affd83dd99b8f79e96245baec9 Mon Sep 17 00:00:00 2001
From: "petr@mysql.com" <>
Date: Fri, 10 Feb 2006 03:35:07 +0300
Subject: [PATCH] IM changes by GUI team: add a version_no column to the SHOW
 INSTANCE STATUS output

---
 mysql-test/r/im_life_cycle.result             | 24 +++++-----
 mysql-test/t/im_life_cycle.imtest             | 12 ++---
 server-tools/instance-manager/commands.cc     | 46 ++++++++++++++++++-
 .../instance-manager/instance_options.cc      |  9 ++--
 4 files changed, 68 insertions(+), 23 deletions(-)

diff --git a/mysql-test/r/im_life_cycle.result b/mysql-test/r/im_life_cycle.result
index f8eaf0ccb46..ca9ad7ce31c 100644
--- a/mysql-test/r/im_life_cycle.result
+++ b/mysql-test/r/im_life_cycle.result
@@ -3,22 +3,22 @@ instance_name	status
 mysqld1	online
 mysqld2	offline
 SHOW INSTANCE STATUS mysqld1;
-instance_name	status	version
-mysqld1	online	VERSION
+instance_name	status	version_number	version
+mysqld1	online	VERSION_NUMBER	VERSION
 SHOW INSTANCE STATUS mysqld2;
-instance_name	status	version
-mysqld2	offline	VERSION
+instance_name	status	version_number	version
+mysqld2	offline	VERSION_NUMBER	VERSION
 START INSTANCE mysqld2;
 SHOW INSTANCES;
 instance_name	status
 mysqld1	online
 mysqld2	online
 SHOW INSTANCE STATUS mysqld1;
-instance_name	status	version
-mysqld1	online	VERSION
+instance_name	status	version_number	version
+mysqld1	online	VERSION_NUMBER	VERSION
 SHOW INSTANCE STATUS mysqld2;
-instance_name	status	version
-mysqld2	online	VERSION
+instance_name	status	version_number	version
+mysqld2	online	VERSION_NUMBER	VERSION
 SHOW VARIABLES LIKE 'port';
 Variable_name	Value
 port	IM_MYSQLD1_PORT
@@ -28,11 +28,11 @@ instance_name	status
 mysqld1	online
 mysqld2	offline
 SHOW INSTANCE STATUS mysqld1;
-instance_name	status	version
-mysqld1	online	VERSION
+instance_name	status	version_number	version
+mysqld1	online	VERSION_NUMBER	VERSION
 SHOW INSTANCE STATUS mysqld2;
-instance_name	status	version
-mysqld2	offline	VERSION
+instance_name	status	version_number	version
+mysqld2	offline	VERSION_NUMBER	VERSION
 START INSTANCE mysqld3;
 ERROR HY000: Bad instance name. Check that the instance with such a name exists
 START INSTANCE mysqld1;
diff --git a/mysql-test/t/im_life_cycle.imtest b/mysql-test/t/im_life_cycle.imtest
index c2b1c9a56ec..70851137f6d 100644
--- a/mysql-test/t/im_life_cycle.imtest
+++ b/mysql-test/t/im_life_cycle.imtest
@@ -18,9 +18,9 @@
 ###########################################################################
 
 SHOW INSTANCES;
---replace_column 3 VERSION
+--replace_column 3 VERSION_NUMBER 4 VERSION
 SHOW INSTANCE STATUS mysqld1;
---replace_column 3 VERSION
+--replace_column 3 VERSION_NUMBER 4 VERSION
 SHOW INSTANCE STATUS mysqld2;
 
 ###########################################################################
@@ -38,9 +38,9 @@ START INSTANCE mysqld2;
 --sleep 3
 
 SHOW INSTANCES;
---replace_column 3 VERSION
+--replace_column 3 VERSION_NUMBER 4 VERSION
 SHOW INSTANCE STATUS mysqld1;
---replace_column 3 VERSION
+--replace_column 3 VERSION_NUMBER 4 VERSION
 SHOW INSTANCE STATUS mysqld2;
 
 --connect (mysql_con,localhost,root,,mysql,$IM_MYSQLD1_PORT,$IM_MYSQLD1_SOCK)
@@ -66,9 +66,9 @@ STOP INSTANCE mysqld2;
 --sleep 3
 
 SHOW INSTANCES;
---replace_column 3 VERSION
+--replace_column 3 VERSION_NUMBER 4 VERSION
 SHOW INSTANCE STATUS mysqld1;
---replace_column 3 VERSION
+--replace_column 3 VERSION_NUMBER 4 VERSION
 SHOW INSTANCE STATUS mysqld2;
 
 ###########################################################################
diff --git a/server-tools/instance-manager/commands.cc b/server-tools/instance-manager/commands.cc
index b4dd1b469f1..cde0f784f39 100644
--- a/server-tools/instance-manager/commands.cc
+++ b/server-tools/instance-manager/commands.cc
@@ -25,6 +25,7 @@
 #include "options.h"
 
 #include <m_string.h>
+#include <m_ctype.h>
 #include <mysql.h>
 #include <my_dir.h>
 
@@ -62,6 +63,31 @@ static inline int put_to_buff(Buffer *buff, const char *str, uint *position)
 }
 
 
+static int parse_version_number(const char *version_str, char *version,
+                                uint version_size)
+{
+  const char *start= version_str;
+  const char *end;
+
+  // skip garbage
+  while (!my_isdigit(default_charset_info, *start))
+    start++;
+
+  end= start;
+  // skip digits and dots
+  while (my_isdigit(default_charset_info, *end) || *end == '.')
+    end++;
+
+  if ((uint)(end - start) >= version_size)
+    return -1;
+
+  strncpy(version, start, end-start);
+  version[end-start]= '\0';
+
+  return 0;
+}
+
+
 /* implementation for Show_instances: */
 
 
@@ -174,9 +200,10 @@ int Show_instance_status::execute(struct st_net *net,
 {
   enum { MAX_VERSION_LENGTH= 40 };
   Buffer send_buff;  /* buffer for packets */
-  LIST name, status, version;
+  LIST name, status, version, version_number;
   LIST *field_list;
-  NAME_WITH_LENGTH name_field, status_field, version_field;
+  NAME_WITH_LENGTH name_field, status_field, version_field,
+                   version_number_field;
   uint position=0;
 
   if (!instance_name)
@@ -192,7 +219,11 @@ int Show_instance_status::execute(struct st_net *net,
   version_field.name= (char*) "version";
   version_field.length= MAX_VERSION_LENGTH;
   version.data= &version_field;
+  version_number_field.name= (char*) "version_number";
+  version_number_field.length= MAX_VERSION_LENGTH;
+  version_number.data= &version_number_field;
   field_list= list_add(NULL, &version);
+  field_list= list_add(field_list, &version_number);
   field_list= list_add(field_list, &status);
   field_list= list_add(field_list, &name);
 
@@ -210,10 +241,21 @@ int Show_instance_status::execute(struct st_net *net,
       store_to_protocol_packet(&send_buff, (char*) "offline", &position);
 
     if (instance->options.mysqld_version)
+    {
+      char parsed_version[MAX_VERSION_LENGTH];
+
+      parse_version_number(instance->options.mysqld_version, parsed_version,
+                           sizeof(parsed_version));
+      store_to_protocol_packet(&send_buff, parsed_version, &position);
+
       store_to_protocol_packet(&send_buff, instance->options.mysqld_version,
                                &position);
+    }
     else
+    {
       store_to_protocol_packet(&send_buff, (char*) "unknown", &position);
+      store_to_protocol_packet(&send_buff, (char*) "unknown", &position);
+    }
 
 
     if (send_buff.is_error() ||
diff --git a/server-tools/instance-manager/instance_options.cc b/server-tools/instance-manager/instance_options.cc
index 83f13b34aa2..d2946270b9e 100644
--- a/server-tools/instance-manager/instance_options.cc
+++ b/server-tools/instance-manager/instance_options.cc
@@ -138,9 +138,14 @@ int Instance_options::fill_instance_version()
 
   if (*result != '\0')
   {
+    char *start;
     /* chop the newline from the end of the version string */
     result[strlen(result) - NEWLINE_LEN]= '\0';
-    mysqld_version= strdup_root(&alloc, result);
+    /* trim leading whitespaces */
+    start= result;
+    while (my_isspace(default_charset_info, *start))
+      ++start;
+    mysqld_version= strdup_root(&alloc, start);
   }
 err:
   return rc;
@@ -167,8 +172,6 @@ int Instance_options::fill_instance_version()
 int Instance_options::fill_log_options()
 {
   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];
-- 
2.30.9