@@ -2756,6 +2756,22 @@ static st_bookmark *find_bookmark(const char *plugin, const char *name,
2756
2756
}
2757
2757
2758
2758
2759
+ static size_t var_storage_size (int flags)
2760
+ {
2761
+ switch (flags & PLUGIN_VAR_TYPEMASK) {
2762
+ case PLUGIN_VAR_BOOL: return sizeof (my_bool);
2763
+ case PLUGIN_VAR_INT: return sizeof (int );
2764
+ case PLUGIN_VAR_LONG: return sizeof (long );
2765
+ case PLUGIN_VAR_ENUM: return sizeof (long );
2766
+ case PLUGIN_VAR_LONGLONG: return sizeof (ulonglong);
2767
+ case PLUGIN_VAR_SET: return sizeof (ulonglong);
2768
+ case PLUGIN_VAR_STR: return sizeof (char *);
2769
+ case PLUGIN_VAR_DOUBLE: return sizeof (double );
2770
+ default : DBUG_ASSERT (0 ); return 0 ;
2771
+ }
2772
+ }
2773
+
2774
+
2759
2775
/*
2760
2776
returns a bookmark for thd-local variables, creating if neccessary.
2761
2777
returns null for non thd-local variables.
@@ -2764,39 +2780,13 @@ static st_bookmark *find_bookmark(const char *plugin, const char *name,
2764
2780
static st_bookmark *register_var (const char *plugin, const char *name,
2765
2781
int flags)
2766
2782
{
2767
- uint length= strlen (plugin) + strlen (name) + 3 , size= 0 , offset, new_size;
2783
+ uint length= strlen (plugin) + strlen (name) + 3 , size, offset, new_size;
2768
2784
st_bookmark *result;
2769
2785
char *varname, *p;
2770
2786
2771
- if (!(flags & PLUGIN_VAR_THDLOCAL))
2772
- return NULL ;
2773
-
2774
- switch (flags & PLUGIN_VAR_TYPEMASK) {
2775
- case PLUGIN_VAR_BOOL:
2776
- size= sizeof (my_bool);
2777
- break ;
2778
- case PLUGIN_VAR_INT:
2779
- size= sizeof (int );
2780
- break ;
2781
- case PLUGIN_VAR_LONG:
2782
- case PLUGIN_VAR_ENUM:
2783
- size= sizeof (long );
2784
- break ;
2785
- case PLUGIN_VAR_LONGLONG:
2786
- case PLUGIN_VAR_SET:
2787
- size= sizeof (ulonglong);
2788
- break ;
2789
- case PLUGIN_VAR_STR:
2790
- size= sizeof (char *);
2791
- break ;
2792
- case PLUGIN_VAR_DOUBLE:
2793
- size= sizeof (double );
2794
- break ;
2795
- default :
2796
- DBUG_ASSERT (0 );
2797
- return NULL ;
2798
- };
2787
+ DBUG_ASSERT (flags & PLUGIN_VAR_THDLOCAL);
2799
2788
2789
+ size= var_storage_size (flags);
2800
2790
varname= ((char *) my_alloca (length));
2801
2791
strxmov (varname + 1 , plugin, " _" , name, NullS);
2802
2792
for (p= varname + 1 ; *p; p++)
@@ -3005,25 +2995,17 @@ void sync_dynamic_session_variables(THD* thd, bool global_lock)
3005
2995
*/
3006
2996
for (idx= 0 ; idx < bookmark_hash.records ; idx++)
3007
2997
{
3008
- sys_var_pluginvar *pi;
3009
- sys_var *var;
3010
2998
st_bookmark *v= (st_bookmark*) my_hash_element (&bookmark_hash,idx);
3011
2999
3012
3000
if (v->version <= thd->variables .dynamic_variables_version )
3013
3001
continue ; /* already in thd->variables */
3014
3002
3015
- if (!(var= intern_find_sys_var (v->key + 1 , v->name_len )) ||
3016
- !(pi= var->cast_pluginvar ()) ||
3017
- v->key [0 ] != plugin_var_bookmark_key (pi->plugin_var ->flags ))
3018
- continue ;
3019
-
3020
3003
/* Here we do anything special that may be required of the data types */
3021
3004
3022
- if ((pi-> plugin_var -> flags & PLUGIN_VAR_TYPEMASK) == PLUGIN_VAR_STR &&
3023
- pi-> plugin_var -> flags & PLUGIN_VAR_MEMALLOC )
3005
+ if ((v-> key [ 0 ] & PLUGIN_VAR_TYPEMASK) == PLUGIN_VAR_STR &&
3006
+ v-> key [ 0 ] & BOOKMARK_MEMALLOC )
3024
3007
{
3025
- int offset= ((thdvar_str_t *)(pi->plugin_var ))->offset ;
3026
- char **pp= (char **) (thd->variables .dynamic_variables_ptr + offset);
3008
+ char **pp= (char **) (thd->variables .dynamic_variables_ptr + v->offset );
3027
3009
if (*pp)
3028
3010
*pp= my_strdup (*pp, MYF (MY_WME|MY_FAE));
3029
3011
}
@@ -3284,69 +3266,58 @@ bool sys_var_pluginvar::session_update(THD *thd, set_var *var)
3284
3266
return false ;
3285
3267
}
3286
3268
3287
- bool sys_var_pluginvar::global_update (THD *thd, set_var *var )
3269
+ static const void * var_def_ptr (st_mysql_sys_var *pv )
3288
3270
{
3289
- DBUG_ASSERT (!is_readonly ());
3290
- mysql_mutex_assert_owner (&LOCK_global_system_variables);
3291
-
3292
- void *tgt= real_value_ptr (thd, var->type );
3293
- const void *src= &var->save_result ;
3294
-
3295
- if (!var->value )
3296
- {
3297
- switch (plugin_var->flags & (PLUGIN_VAR_TYPEMASK | PLUGIN_VAR_THDLOCAL)) {
3271
+ switch (pv->flags & (PLUGIN_VAR_TYPEMASK | PLUGIN_VAR_THDLOCAL)) {
3298
3272
case PLUGIN_VAR_INT:
3299
- src= &((sysvar_uint_t *) plugin_var)->def_val ;
3300
- break ;
3273
+ return &((sysvar_uint_t *) pv)->def_val ;
3301
3274
case PLUGIN_VAR_LONG:
3302
- src= &((sysvar_ulong_t *) plugin_var)->def_val ;
3303
- break ;
3275
+ return &((sysvar_ulong_t *) pv)->def_val ;
3304
3276
case PLUGIN_VAR_LONGLONG:
3305
- src= &((sysvar_ulonglong_t *) plugin_var)->def_val ;
3306
- break ;
3277
+ return &((sysvar_ulonglong_t *) pv)->def_val ;
3307
3278
case PLUGIN_VAR_ENUM:
3308
- src= &((sysvar_enum_t *) plugin_var)->def_val ;
3309
- break ;
3279
+ return &((sysvar_enum_t *) pv)->def_val ;
3310
3280
case PLUGIN_VAR_SET:
3311
- src= &((sysvar_set_t *) plugin_var)->def_val ;
3312
- break ;
3281
+ return &((sysvar_set_t *) pv)->def_val ;
3313
3282
case PLUGIN_VAR_BOOL:
3314
- src= &((sysvar_bool_t *) plugin_var)->def_val ;
3315
- break ;
3283
+ return &((sysvar_bool_t *) pv)->def_val ;
3316
3284
case PLUGIN_VAR_STR:
3317
- src= &((sysvar_str_t *) plugin_var)->def_val ;
3318
- break ;
3285
+ return &((sysvar_str_t *) pv)->def_val ;
3319
3286
case PLUGIN_VAR_DOUBLE:
3320
- src= &((sysvar_double_t *) plugin_var)->def_val ;
3321
- break ;
3287
+ return &((sysvar_double_t *) pv)->def_val ;
3322
3288
case PLUGIN_VAR_INT | PLUGIN_VAR_THDLOCAL:
3323
- src= &((thdvar_uint_t *) plugin_var)->def_val ;
3324
- break ;
3289
+ return &((thdvar_uint_t *) pv)->def_val ;
3325
3290
case PLUGIN_VAR_LONG | PLUGIN_VAR_THDLOCAL:
3326
- src= &((thdvar_ulong_t *) plugin_var)->def_val ;
3327
- break ;
3291
+ return &((thdvar_ulong_t *) pv)->def_val ;
3328
3292
case PLUGIN_VAR_LONGLONG | PLUGIN_VAR_THDLOCAL:
3329
- src= &((thdvar_ulonglong_t *) plugin_var)->def_val ;
3330
- break ;
3293
+ return &((thdvar_ulonglong_t *) pv)->def_val ;
3331
3294
case PLUGIN_VAR_ENUM | PLUGIN_VAR_THDLOCAL:
3332
- src= &((thdvar_enum_t *) plugin_var)->def_val ;
3333
- break ;
3295
+ return &((thdvar_enum_t *) pv)->def_val ;
3334
3296
case PLUGIN_VAR_SET | PLUGIN_VAR_THDLOCAL:
3335
- src= &((thdvar_set_t *) plugin_var)->def_val ;
3336
- break ;
3297
+ return &((thdvar_set_t *) pv)->def_val ;
3337
3298
case PLUGIN_VAR_BOOL | PLUGIN_VAR_THDLOCAL:
3338
- src= &((thdvar_bool_t *) plugin_var)->def_val ;
3339
- break ;
3299
+ return &((thdvar_bool_t *) pv)->def_val ;
3340
3300
case PLUGIN_VAR_STR | PLUGIN_VAR_THDLOCAL:
3341
- src= &((thdvar_str_t *) plugin_var)->def_val ;
3342
- break ;
3301
+ return &((thdvar_str_t *) pv)->def_val ;
3343
3302
case PLUGIN_VAR_DOUBLE | PLUGIN_VAR_THDLOCAL:
3344
- src= &((thdvar_double_t *) plugin_var)->def_val ;
3345
- break ;
3303
+ return &((thdvar_double_t *) pv)->def_val ;
3346
3304
default :
3347
3305
DBUG_ASSERT (0 );
3306
+ return NULL ;
3348
3307
}
3349
- }
3308
+ }
3309
+
3310
+
3311
+ bool sys_var_pluginvar::global_update (THD *thd, set_var *var)
3312
+ {
3313
+ DBUG_ASSERT (!is_readonly ());
3314
+ mysql_mutex_assert_owner (&LOCK_global_system_variables);
3315
+
3316
+ void *tgt= real_value_ptr (thd, var->type );
3317
+ const void *src= &var->save_result ;
3318
+
3319
+ if (!var->value )
3320
+ src= var_def_ptr (plugin_var);
3350
3321
3351
3322
plugin_var->update (thd, plugin_var, tgt, src);
3352
3323
return false ;
@@ -3713,7 +3684,18 @@ static int construct_options(MEM_ROOT *mem_root, struct st_plugin_int *tmp,
3713
3684
*(int *)(opt + 1 )= offset= v->offset ;
3714
3685
3715
3686
if (opt->flags & PLUGIN_VAR_NOCMDOPT)
3687
+ {
3688
+ char *val= global_system_variables.dynamic_variables_ptr + offset;
3689
+ if (((opt->flags & PLUGIN_VAR_TYPEMASK) == PLUGIN_VAR_STR) &&
3690
+ (opt->flags & PLUGIN_VAR_MEMALLOC))
3691
+ {
3692
+ char *def_val= *(char **)var_def_ptr (opt);
3693
+ *(char **)val= def_val ? my_strdup (def_val, MYF (0 )) : NULL ;
3694
+ }
3695
+ else
3696
+ memcpy (val, var_def_ptr (opt), var_storage_size (opt->flags ));
3716
3697
continue ;
3698
+ }
3717
3699
3718
3700
optname= (char *) memdup_root (mem_root, v->key + 1 ,
3719
3701
(optnamelen= v->name_len ) + 1 );
@@ -3912,9 +3894,10 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp,
3912
3894
*str->value = strdup_root (mem_root, *str->value );
3913
3895
}
3914
3896
3897
+ var= find_bookmark (plugin_name.str , o->name , o->flags );
3915
3898
if (o->flags & PLUGIN_VAR_NOSYSVAR)
3916
3899
continue ;
3917
- if (( var= find_bookmark (plugin_name. str , o-> name , o-> flags )) )
3900
+ if (var)
3918
3901
v= new (mem_root) sys_var_pluginvar (&chain, var->key + 1 , o, tmp);
3919
3902
else
3920
3903
{
0 commit comments