summaryrefslogtreecommitdiff
path: root/mysys/getvar.c
diff options
context:
space:
mode:
Diffstat (limited to 'mysys/getvar.c')
-rw-r--r--mysys/getvar.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/mysys/getvar.c b/mysys/getvar.c
new file mode 100644
index 00000000000..1d452002490
--- /dev/null
+++ b/mysys/getvar.c
@@ -0,0 +1,105 @@
+/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA */
+
+/* Allow use of the -O variable= option to set long variables */
+
+#include "mysys_priv.h"
+#include <m_string.h>
+#include <m_ctype.h>
+
+ /* set all changeable variables */
+
+void set_all_changeable_vars(CHANGEABLE_VAR *vars)
+{
+ for ( ; vars->name ; vars++)
+ *vars->varptr= vars->def_value;
+}
+
+
+my_bool set_changeable_varval(const char* var, ulong val,
+ CHANGEABLE_VAR *vars)
+{
+ char buffer[256];
+ sprintf( buffer, "%s=%lu", var, (unsigned long) val );
+ return set_changeable_var( buffer, vars );
+}
+
+
+my_bool set_changeable_var(my_string str,CHANGEABLE_VAR *vars)
+{
+ char endchar;
+ my_string end;
+ DBUG_ENTER("set_changeable_var");
+ DBUG_PRINT("enter",("%s",str));
+
+ if (str)
+ {
+ if (!(end=strchr(str,'=')))
+ fprintf(stderr,"Can't find '=' in expression '%s' to option -O\n",str);
+ else
+ {
+ uint length=(uint) (end-str),found_count=0;
+ CHANGEABLE_VAR *var,*found;
+ const char *name;
+ long num;
+
+ for (var=vars,found=0 ; (name=var->name) ; var++)
+ {
+ if (!my_casecmp(name,str,length))
+ {
+ found=var; found_count++;
+ if (!name[length])
+ {
+ found_count=1;
+ break;
+ }
+ }
+ }
+ if (found_count == 0)
+ {
+ fprintf(stderr,"No variable match for: -O '%s'\n",str);
+ DBUG_RETURN(1);
+ }
+ if (found_count > 1)
+ {
+ fprintf(stderr,"Variable prefix '%*s' is not unique\n",length,str);
+ DBUG_RETURN(1);
+ }
+
+ num=(long) atol(end+1); endchar=strend(end+1)[-1];
+ if (endchar == 'k' || endchar == 'K')
+ num*=1024;
+ else if (endchar == 'm' || endchar == 'M')
+ num*=1024L*1024L;
+ else if (!isdigit(endchar))
+ {
+ fprintf(stderr,"Unknown prefix used for variable value '%s'\n",str);
+ DBUG_RETURN(1);
+ }
+ if (num < (long) found->min_value)
+ num=(long) found->min_value;
+ else if ((unsigned long) num >
+ (unsigned long) found->max_value)
+ num=(long) found->max_value;
+ *found->varptr=(long) ((ulong) (num-found->sub_size) /
+ (ulong) found->block_size);
+ (*found->varptr)*= (ulong) found->block_size;
+ DBUG_RETURN(0);
+ }
+ }
+ DBUG_RETURN(1);
+}