569
569
typedef DECLARE_DRIZZLE_SYSVAR_BASIC(sysvar_str_t, char *);
570
570
typedef DECLARE_DRIZZLE_SessionVAR_BASIC(sessionvar_str_t, char *);
572
typedef DECLARE_DRIZZLE_SYSVAR_TYPELIB(sysvar_enum_t, unsigned long);
573
572
typedef DECLARE_DRIZZLE_SessionVAR_TYPELIB(sessionvar_enum_t, unsigned long);
574
typedef DECLARE_DRIZZLE_SYSVAR_TYPELIB(sysvar_set_t, uint64_t);
575
573
typedef DECLARE_DRIZZLE_SessionVAR_TYPELIB(sessionvar_set_t, uint64_t);
577
575
typedef DECLARE_DRIZZLE_SYSVAR_SIMPLE(sysvar_int_t, int);
711
static int check_func_enum(Session *, drizzle_sys_var *var,
712
void *save, drizzle_value *value)
714
char buff[STRING_BUFFER_USUAL_SIZE];
715
const char *strvalue= "NULL", *str;
721
if (var->flags & PLUGIN_VAR_SessionLOCAL)
722
typelib= ((sessionvar_enum_t*) var)->typelib;
724
typelib= ((sysvar_enum_t*) var)->typelib;
726
if (value->value_type(value) == DRIZZLE_VALUE_TYPE_STRING)
728
length= sizeof(buff);
729
if (!(str= value->val_str(value, buff, &length)))
731
if ((result= (long)find_type(typelib, str, length, 1)-1) < 0)
739
if (value->val_int(value, &tmp))
741
if (tmp >= typelib->count)
749
*(long*)save= result;
752
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), var->name, strvalue);
757
static int check_func_set(Session *, drizzle_sys_var *var,
758
void *save, drizzle_value *value)
760
char buff[STRING_BUFFER_USUAL_SIZE], *error= 0;
761
const char *strvalue= "NULL", *str;
768
if (var->flags & PLUGIN_VAR_SessionLOCAL)
769
typelib= ((sessionvar_set_t*) var)->typelib;
771
typelib= ((sysvar_set_t*)var)->typelib;
773
if (value->value_type(value) == DRIZZLE_VALUE_TYPE_STRING)
775
length= sizeof(buff);
776
if (!(str= value->val_str(value, buff, &length)))
778
result= find_set(typelib, str, length, NULL,
779
&error, &error_len, ¬_used);
782
length= min((uint32_t)sizeof(buff), error_len);
783
strncpy(buff, error, length);
791
if (value->val_int(value, (int64_t *)&result))
793
if (unlikely((result >= (1UL << typelib->count)) &&
794
(typelib->count < sizeof(long)*8)))
801
*(uint64_t*)save= result;
804
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), var->name, strvalue);
809
709
static void update_func_bool(Session *, drizzle_sys_var *,
810
710
void *tgt, const void *save)
1154
1052
return (char **)intern_sys_var_ptr(a_session, offset, true);
1157
static uint64_t *mysql_sys_var_ptr_set(Session* a_session, int offset)
1159
return (uint64_t *)intern_sys_var_ptr(a_session, offset, true);
1162
static unsigned long *mysql_sys_var_ptr_enum(Session* a_session, int offset)
1164
return (unsigned long *)intern_sys_var_ptr(a_session, offset, true);
1168
1055
void plugin_sessionvar_init(Session *session)
1170
1057
session->variables.storage_engine= NULL;
1331
1215
TYPELIB* sys_var_pluginvar::plugin_var_typelib(void)
1333
1217
switch (plugin_var->flags & (PLUGIN_VAR_TYPEMASK | PLUGIN_VAR_SessionLOCAL)) {
1334
case PLUGIN_VAR_ENUM:
1335
return ((sysvar_enum_t *)plugin_var)->typelib;
1336
case PLUGIN_VAR_SET:
1337
return ((sysvar_set_t *)plugin_var)->typelib;
1338
case PLUGIN_VAR_ENUM | PLUGIN_VAR_SessionLOCAL:
1218
case PLUGIN_VAR_SessionLOCAL:
1339
1219
return ((sessionvar_enum_t *)plugin_var)->typelib;
1340
case PLUGIN_VAR_SET | PLUGIN_VAR_SessionLOCAL:
1341
return ((sessionvar_set_t *)plugin_var)->typelib;
1353
1231
result= real_value_ptr(session, type);
1355
if ((plugin_var->flags & PLUGIN_VAR_TYPEMASK) == PLUGIN_VAR_ENUM)
1356
result= (unsigned char*) get_type(plugin_var_typelib(), *(ulong*)result);
1357
else if ((plugin_var->flags & PLUGIN_VAR_TYPEMASK) == PLUGIN_VAR_SET)
1359
char buffer[STRING_BUFFER_USUAL_SIZE];
1360
String str(buffer, sizeof(buffer), system_charset_info);
1361
TYPELIB *typelib= plugin_var_typelib();
1362
uint64_t mask= 1, value= *(uint64_t*) result;
1366
for (i= 0; i < typelib->count; i++, mask<<=1)
1368
if (!(value & mask))
1370
str.append(typelib->type_names[i], typelib->type_lengths[i]);
1374
result= (unsigned char*) "";
1376
result= (unsigned char*) session->strmake(str.ptr(), str.length()-1);
1523
1372
case PLUGIN_VAR_LONGLONG | PLUGIN_VAR_UNSIGNED:
1524
1373
OPTION_SET_LIMITS(GET_ULL, options, (sysvar_uint64_t_t*) opt);
1526
case PLUGIN_VAR_ENUM:
1527
options->var_type= GET_ENUM;
1528
options->typelib= ((sysvar_enum_t*) opt)->typelib;
1529
options->def_value= ((sysvar_enum_t*) opt)->def_val;
1530
options->min_value= options->block_size= 0;
1531
options->max_value= options->typelib->count - 1;
1533
case PLUGIN_VAR_SET:
1534
options->var_type= GET_SET;
1535
options->typelib= ((sysvar_set_t*) opt)->typelib;
1536
options->def_value= ((sysvar_set_t*) opt)->def_val;
1537
options->min_value= options->block_size= 0;
1538
options->max_value= (1UL << options->typelib->count) - 1;
1540
1375
case PLUGIN_VAR_BOOL:
1541
1376
options->var_type= GET_BOOL;
1542
1377
options->def_value= ((sysvar_bool_t*) opt)->def_val;
1565
1400
case PLUGIN_VAR_LONGLONG | PLUGIN_VAR_UNSIGNED | PLUGIN_VAR_SessionLOCAL:
1566
1401
OPTION_SET_LIMITS(GET_ULL, options, (sessionvar_uint64_t_t*) opt);
1568
case PLUGIN_VAR_ENUM | PLUGIN_VAR_SessionLOCAL:
1569
options->var_type= GET_ENUM;
1570
options->typelib= ((sessionvar_enum_t*) opt)->typelib;
1571
options->def_value= ((sessionvar_enum_t*) opt)->def_val;
1572
options->min_value= options->block_size= 0;
1573
options->max_value= options->typelib->count - 1;
1575
case PLUGIN_VAR_SET | PLUGIN_VAR_SessionLOCAL:
1576
options->var_type= GET_SET;
1577
options->typelib= ((sessionvar_set_t*) opt)->typelib;
1578
options->def_value= ((sessionvar_set_t*) opt)->def_val;
1579
options->min_value= options->block_size= 0;
1580
options->max_value= (1UL << options->typelib->count) - 1;
1582
1403
case PLUGIN_VAR_BOOL | PLUGIN_VAR_SessionLOCAL:
1583
1404
options->var_type= GET_BOOL;
1584
1405
options->def_value= ((sessionvar_bool_t*) opt)->def_val;
1690
1511
case PLUGIN_VAR_STR:
1691
1512
(((sessionvar_str_t *)opt)->resolve)= mysql_sys_var_ptr_str;
1693
case PLUGIN_VAR_ENUM:
1694
(((sessionvar_enum_t *)opt)->resolve)= mysql_sys_var_ptr_enum;
1696
case PLUGIN_VAR_SET:
1697
(((sessionvar_set_t *)opt)->resolve)= mysql_sys_var_ptr_set;
1700
1515
errmsg_printf(ERRMSG_LVL_ERROR, _("Unknown variable type code 0x%x in plugin '%s'."),
1701
1516
opt->flags, plugin_name);
1750
case PLUGIN_VAR_ENUM:
1752
opt->check= check_func_enum;
1754
opt->update= update_func_long;
1756
case PLUGIN_VAR_SET:
1758
opt->check= check_func_set;
1760
opt->update= update_func_int64_t;
1763
1566
errmsg_printf(ERRMSG_LVL_ERROR, _("Unknown variable type code 0x%x in plugin '%s'."),
1764
1567
opt->flags, plugin_name);