getvar.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17. /* Allow use of the -O variable= option to set long variables */
  18. #include "mysys_priv.h"
  19. #include <m_string.h>
  20. #include <m_ctype.h>
  21. /* set all changeable variables */
  22. void set_all_changeable_vars(CHANGEABLE_VAR *vars)
  23. {
  24.   for ( ; vars->name ; vars++)
  25.     *vars->varptr= vars->def_value;
  26. }
  27. my_bool set_changeable_varval(const char* var, ulong val,
  28.       CHANGEABLE_VAR *vars)
  29. {
  30.   char buffer[256];
  31.   sprintf( buffer, "%s=%lu", var, (unsigned long) val );
  32.   return set_changeable_var( buffer, vars );
  33. }
  34. my_bool set_changeable_var(my_string str,CHANGEABLE_VAR *vars)
  35. {
  36.   char endchar;
  37.   my_string end;
  38.   DBUG_ENTER("set_changeable_var");
  39.   DBUG_PRINT("enter",("%s",str));
  40.   if (str)
  41.   {
  42.     if (!(end=strchr(str,'=')))
  43.       fprintf(stderr,"Can't find '=' in expression '%s' to option -On",str);
  44.     else
  45.     {
  46.       uint length,found_count=0;
  47.       CHANGEABLE_VAR *var,*found;
  48.       my_string var_end;
  49.       const char *name;
  50.       long num;
  51.       /* Skip end space from variable */
  52.       for (var_end=end ; end > str && isspace(var_end[-1]) ; var_end--) ;
  53.       length=(uint) (var_end-str);
  54.       /* Skip start space from argument */
  55.       for (end++ ; isspace(*end) ; end++) ;
  56.       for (var=vars,found=0 ; (name=var->name) ; var++)
  57.       {
  58. if (!my_casecmp(name,str,length))
  59. {
  60.   found=var; found_count++;
  61.   if (!name[length])
  62.   {
  63.     found_count=1;
  64.     break;
  65.   }
  66. }
  67.       }
  68.       if (found_count == 0)
  69.       {
  70. fprintf(stderr,"No variable match for: -O '%s'n",str);
  71. DBUG_RETURN(1);
  72.       }
  73.       if (found_count > 1)
  74.       {
  75. fprintf(stderr,"Variable prefix '%*s' is not uniquen",length,str);
  76. DBUG_RETURN(1);
  77.       }
  78.       num=(long) atol(end); endchar=strend(end)[-1];
  79.       if (endchar == 'k' || endchar == 'K')
  80. num*=1024;
  81.       else if (endchar == 'm' || endchar == 'M')
  82. num*=1024L*1024L;
  83.       else if (endchar == 'g' || endchar == 'G')
  84. num*=1024L*1024L*1024L;
  85.       else if (!isdigit(endchar))
  86.       {
  87. fprintf(stderr,"Unknown prefix used for variable value '%s'n",str);
  88. DBUG_RETURN(1);
  89.       }
  90.       if (num < (long) found->min_value)
  91. num=(long) found->min_value;
  92.       else if ((unsigned long) num >
  93.        (unsigned long) found->max_value)
  94. num=(long) found->max_value;
  95.       *found->varptr=(long) ((ulong) (num-found->sub_size) /
  96.      (ulong) found->block_size);
  97.       (*found->varptr)*= (ulong) found->block_size;
  98.       DBUG_RETURN(0);
  99.     }
  100.   }
  101.   DBUG_RETURN(1);
  102. }