set_var.h
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:27k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /* Classes to support the SET command */
  14. #ifdef USE_PRAGMA_INTERFACE
  15. #pragma interface /* gcc class implementation */
  16. #endif
  17. /****************************************************************************
  18.   Variables that are changable runtime are declared using the
  19.   following classes
  20. ****************************************************************************/
  21. class sys_var;
  22. class set_var;
  23. typedef struct system_variables SV;
  24. extern TYPELIB bool_typelib, delay_key_write_typelib, sql_mode_typelib;
  25. typedef int (*sys_check_func)(THD *,  set_var *);
  26. typedef bool (*sys_update_func)(THD *, set_var *);
  27. typedef void (*sys_after_update_func)(THD *,enum_var_type);
  28. typedef void (*sys_set_default_func)(THD *, enum_var_type);
  29. typedef byte *(*sys_value_ptr_func)(THD *thd);
  30. class sys_var
  31. {
  32. public:
  33.   struct my_option *option_limits; /* Updated by by set_var_init() */
  34.   uint name_length; /* Updated by by set_var_init() */
  35.   const char *name;
  36.   
  37.   sys_after_update_func after_update;
  38. #if MYSQL_VERSION_ID < 50000
  39.   bool no_support_one_shot;
  40. #endif
  41.   sys_var(const char *name_arg)
  42.     :name(name_arg), after_update(0)
  43. #if MYSQL_VERSION_ID < 50000
  44.     , no_support_one_shot(1)
  45. #endif
  46.     {}
  47.   sys_var(const char *name_arg,sys_after_update_func func)
  48.     :name(name_arg), after_update(func)
  49. #if MYSQL_VERSION_ID < 50000
  50.     , no_support_one_shot(1)
  51. #endif
  52.   {}
  53.   virtual ~sys_var() {}
  54.   virtual bool check(THD *thd, set_var *var);
  55.   bool check_enum(THD *thd, set_var *var, TYPELIB *enum_names);
  56.   bool check_set(THD *thd, set_var *var, TYPELIB *enum_names);
  57.   virtual bool update(THD *thd, set_var *var)=0;
  58.   virtual void set_default(THD *thd, enum_var_type type) {}
  59.   virtual SHOW_TYPE type() { return SHOW_UNDEF; }
  60.   virtual byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
  61.   { return 0; }
  62.   virtual bool check_type(enum_var_type type)
  63.   { return type != OPT_GLOBAL; } /* Error if not GLOBAL */
  64.   virtual bool check_update_type(Item_result type)
  65.   { return type != INT_RESULT; } /* Assume INT */
  66.   virtual bool check_default(enum_var_type type)
  67.   { return option_limits == 0; }
  68.   Item *item(THD *thd, enum_var_type type, LEX_STRING *base);
  69.   virtual bool is_struct() { return 0; }
  70. };
  71. class sys_var_long_ptr :public sys_var
  72. {
  73. public:
  74.   ulong *value;
  75.   sys_var_long_ptr(const char *name_arg, ulong *value_ptr)
  76.     :sys_var(name_arg),value(value_ptr) {}
  77.   sys_var_long_ptr(const char *name_arg, ulong *value_ptr,
  78.    sys_after_update_func func)
  79.     :sys_var(name_arg,func), value(value_ptr) {}
  80.   bool check(THD *thd, set_var *var);
  81.   bool update(THD *thd, set_var *var);
  82.   void set_default(THD *thd, enum_var_type type);
  83.   SHOW_TYPE type() { return SHOW_LONG; }
  84.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
  85.   { return (byte*) value; }
  86. };
  87. class sys_var_ulonglong_ptr :public sys_var
  88. {
  89. public:
  90.   ulonglong *value;
  91.   sys_var_ulonglong_ptr(const char *name_arg, ulonglong *value_ptr)
  92.     :sys_var(name_arg),value(value_ptr) {}
  93.   sys_var_ulonglong_ptr(const char *name_arg, ulonglong *value_ptr,
  94.        sys_after_update_func func)
  95.     :sys_var(name_arg,func), value(value_ptr) {}
  96.   bool update(THD *thd, set_var *var);
  97.   void set_default(THD *thd, enum_var_type type);
  98.   SHOW_TYPE type() { return SHOW_LONGLONG; }
  99.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
  100.   { return (byte*) value; }
  101. };
  102. class sys_var_bool_ptr :public sys_var
  103. {
  104. public:
  105.   my_bool *value;
  106.   sys_var_bool_ptr(const char *name_arg, my_bool *value_arg)
  107.     :sys_var(name_arg),value(value_arg)
  108.   {}
  109.   bool check(THD *thd, set_var *var)
  110.   {
  111.     return check_enum(thd, var, &bool_typelib);
  112.   }
  113.   bool update(THD *thd, set_var *var);
  114.   void set_default(THD *thd, enum_var_type type);
  115.   SHOW_TYPE type() { return SHOW_MY_BOOL; }
  116.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
  117.   { return (byte*) value; }
  118.   bool check_update_type(Item_result type) { return 0; }
  119. };
  120. class sys_var_str :public sys_var
  121. {
  122. public:
  123.   char *value; // Pointer to allocated string
  124.   uint value_length;
  125.   sys_check_func check_func;
  126.   sys_update_func update_func;
  127.   sys_set_default_func set_default_func;
  128.   sys_var_str(const char *name_arg,
  129.       sys_check_func check_func_arg,
  130.       sys_update_func update_func_arg,
  131.       sys_set_default_func set_default_func_arg,
  132.               char *value_arg)
  133.     :sys_var(name_arg), value(value_arg), check_func(check_func_arg),
  134.     update_func(update_func_arg),set_default_func(set_default_func_arg)
  135.   {}
  136.   bool check(THD *thd, set_var *var);
  137.   bool update(THD *thd, set_var *var)
  138.   {
  139.     return (*update_func)(thd, var);
  140.   }
  141.   void set_default(THD *thd, enum_var_type type)
  142.   {
  143.     (*set_default_func)(thd, type);
  144.   }
  145.   SHOW_TYPE type() { return SHOW_CHAR; }
  146.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
  147.   { return (byte*) value; }
  148.   bool check_update_type(Item_result type)
  149.   {
  150.     return type != STRING_RESULT; /* Only accept strings */
  151.   }
  152.   bool check_default(enum_var_type type) { return 0; }
  153. };
  154. class sys_var_const_str :public sys_var
  155. {
  156. public:
  157.   char *value; // Pointer to const value
  158.   sys_var_const_str(const char *name_arg, const char *value_arg)
  159.     :sys_var(name_arg), value((char*) value_arg)
  160.   {}
  161.   bool check(THD *thd, set_var *var)
  162.   {
  163.     return 1;
  164.   }
  165.   bool update(THD *thd, set_var *var)
  166.   {
  167.     return 1;
  168.   }
  169.   SHOW_TYPE type() { return SHOW_CHAR; }
  170.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
  171.   {
  172.     return (byte*) value;
  173.   }
  174.   bool check_update_type(Item_result type)
  175.   {
  176.     return 1;
  177.   }
  178.   bool check_default(enum_var_type type) { return 1; }
  179. };
  180. class sys_var_enum :public sys_var
  181. {
  182.   uint *value; 
  183.   TYPELIB *enum_names;
  184. public:
  185.   sys_var_enum(const char *name_arg, uint *value_arg,
  186.        TYPELIB *typelib, sys_after_update_func func)
  187.     :sys_var(name_arg,func), value(value_arg), enum_names(typelib)
  188.   {}
  189.   bool check(THD *thd, set_var *var)
  190.   {
  191.     return check_enum(thd, var, enum_names);
  192.   }
  193.   bool update(THD *thd, set_var *var);
  194.   SHOW_TYPE type() { return SHOW_CHAR; }
  195.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  196.   bool check_update_type(Item_result type) { return 0; }
  197. };
  198. class sys_var_thd :public sys_var
  199. {
  200. public:
  201.   sys_var_thd(const char *name_arg)
  202.     :sys_var(name_arg)
  203.   {}
  204.   sys_var_thd(const char *name_arg, sys_after_update_func func)
  205.     :sys_var(name_arg,func)
  206.   {}
  207.   bool check_type(enum_var_type type) { return 0; }
  208.   bool check_default(enum_var_type type)
  209.   {
  210.     return type == OPT_GLOBAL && !option_limits;
  211.   }
  212. };
  213. class sys_var_thd_ulong :public sys_var_thd
  214. {
  215.   sys_check_func check_func;
  216. public:
  217.   ulong SV::*offset;
  218.   sys_var_thd_ulong(const char *name_arg, ulong SV::*offset_arg)
  219.     :sys_var_thd(name_arg), check_func(0), offset(offset_arg)
  220.   {}
  221.   sys_var_thd_ulong(const char *name_arg, ulong SV::*offset_arg,
  222.    sys_check_func c_func, sys_after_update_func au_func)
  223.     :sys_var_thd(name_arg,au_func), check_func(c_func), offset(offset_arg)
  224.   {}
  225.   bool check(THD *thd, set_var *var);
  226.   bool update(THD *thd, set_var *var);
  227.   void set_default(THD *thd, enum_var_type type);
  228.   SHOW_TYPE type() { return SHOW_LONG; }
  229.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  230. };
  231. class sys_var_thd_ha_rows :public sys_var_thd
  232. {
  233. public:
  234.   ha_rows SV::*offset;
  235.   sys_var_thd_ha_rows(const char *name_arg, ha_rows SV::*offset_arg)
  236.     :sys_var_thd(name_arg), offset(offset_arg)
  237.   {}
  238.   sys_var_thd_ha_rows(const char *name_arg, ha_rows SV::*offset_arg,
  239.       sys_after_update_func func)
  240.     :sys_var_thd(name_arg,func), offset(offset_arg)
  241.   {}
  242.   bool update(THD *thd, set_var *var);
  243.   void set_default(THD *thd, enum_var_type type);
  244.   SHOW_TYPE type() { return SHOW_HA_ROWS; }
  245.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  246. };
  247. class sys_var_thd_ulonglong :public sys_var_thd
  248. {
  249. public:
  250.   ulonglong SV::*offset;
  251.   bool only_global;
  252.   sys_var_thd_ulonglong(const char *name_arg, ulonglong SV::*offset_arg)
  253.     :sys_var_thd(name_arg), offset(offset_arg)
  254.   {}
  255.   sys_var_thd_ulonglong(const char *name_arg, ulonglong SV::*offset_arg,
  256. sys_after_update_func func, bool only_global_arg)
  257.     :sys_var_thd(name_arg, func), offset(offset_arg),
  258.     only_global(only_global_arg)
  259.   {}
  260.   bool update(THD *thd, set_var *var);
  261.   void set_default(THD *thd, enum_var_type type);
  262.   SHOW_TYPE type() { return SHOW_LONGLONG; }
  263.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  264.   bool check_default(enum_var_type type)
  265.   {
  266.     return type == OPT_GLOBAL && !option_limits;
  267.   }
  268.   bool check_type(enum_var_type type)
  269.   {
  270.     return (only_global && type != OPT_GLOBAL);
  271.   }
  272. };
  273. class sys_var_thd_bool :public sys_var_thd
  274. {
  275. public:
  276.   my_bool SV::*offset;
  277.   sys_var_thd_bool(const char *name_arg, my_bool SV::*offset_arg)
  278.     :sys_var_thd(name_arg), offset(offset_arg)
  279.   {}
  280.   sys_var_thd_bool(const char *name_arg, my_bool SV::*offset_arg,
  281.    sys_after_update_func func)
  282.     :sys_var_thd(name_arg,func), offset(offset_arg)
  283.   {}
  284.   bool update(THD *thd, set_var *var);
  285.   void set_default(THD *thd, enum_var_type type);
  286.   SHOW_TYPE type() { return SHOW_MY_BOOL; }
  287.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  288.   bool check(THD *thd, set_var *var)
  289.   {
  290.     return check_enum(thd, var, &bool_typelib);
  291.   }
  292.   bool check_update_type(Item_result type) { return 0; }
  293. };
  294. class sys_var_thd_enum :public sys_var_thd
  295. {
  296. protected:
  297.   ulong SV::*offset;
  298.   TYPELIB *enum_names;
  299. public:
  300.   sys_var_thd_enum(const char *name_arg, ulong SV::*offset_arg,
  301.    TYPELIB *typelib)
  302.     :sys_var_thd(name_arg), offset(offset_arg), enum_names(typelib)
  303.   {}
  304.   sys_var_thd_enum(const char *name_arg, ulong SV::*offset_arg,
  305.    TYPELIB *typelib,
  306.    sys_after_update_func func)
  307.     :sys_var_thd(name_arg,func), offset(offset_arg), enum_names(typelib)
  308.   {}
  309.   bool check(THD *thd, set_var *var)
  310.   {
  311.     return check_enum(thd, var, enum_names);
  312.   }
  313.   bool update(THD *thd, set_var *var);
  314.   void set_default(THD *thd, enum_var_type type);
  315.   SHOW_TYPE type() { return SHOW_CHAR; }
  316.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  317.   bool check_update_type(Item_result type) { return 0; }
  318. };
  319. extern void fix_sql_mode_var(THD *thd, enum_var_type type);
  320. class sys_var_thd_sql_mode :public sys_var_thd_enum
  321. {
  322. public:
  323.   sys_var_thd_sql_mode(const char *name_arg, ulong SV::*offset_arg)
  324.     :sys_var_thd_enum(name_arg, offset_arg, &sql_mode_typelib,
  325.       fix_sql_mode_var)
  326.   {}
  327.   bool check(THD *thd, set_var *var)
  328.   {
  329.     return check_set(thd, var, enum_names);
  330.   }
  331.   void set_default(THD *thd, enum_var_type type);
  332.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  333. };
  334. class sys_var_thd_storage_engine :public sys_var_thd
  335. {
  336. protected:
  337.   ulong SV::*offset;
  338. public:
  339.   sys_var_thd_storage_engine(const char *name_arg, ulong SV::*offset_arg)
  340.     :sys_var_thd(name_arg), offset(offset_arg)
  341.   {}
  342.   bool check(THD *thd, set_var *var);
  343. SHOW_TYPE type() { return SHOW_CHAR; }
  344.   bool check_update_type(Item_result type)
  345.   {
  346.     return type != STRING_RESULT; /* Only accept strings */
  347.   }
  348.   void set_default(THD *thd, enum_var_type type);
  349.   bool update(THD *thd, set_var *var);
  350.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  351. };
  352. class sys_var_thd_table_type :public sys_var_thd_storage_engine
  353. {
  354. public:
  355.   sys_var_thd_table_type(const char *name_arg, ulong SV::*offset_arg)
  356.     :sys_var_thd_storage_engine(name_arg, offset_arg)
  357.   {}
  358.   void warn_deprecated(THD *thd);
  359.   void set_default(THD *thd, enum_var_type type);
  360.   bool update(THD *thd, set_var *var);
  361. };
  362. class sys_var_thd_bit :public sys_var_thd
  363. {
  364.   sys_check_func check_func;
  365.   sys_update_func update_func;
  366. public:
  367.   ulong bit_flag;
  368.   bool reverse;
  369.   sys_var_thd_bit(const char *name_arg, 
  370.                   sys_check_func c_func, sys_update_func u_func,
  371.                   ulong bit, bool reverse_arg=0)
  372.     :sys_var_thd(name_arg), check_func(c_func), update_func(u_func),
  373.     bit_flag(bit), reverse(reverse_arg)
  374.   {}
  375.   bool check(THD *thd, set_var *var);
  376.   bool update(THD *thd, set_var *var);
  377.   bool check_update_type(Item_result type) { return 0; }
  378.   bool check_type(enum_var_type type) { return type == OPT_GLOBAL; }
  379.   SHOW_TYPE type() { return SHOW_MY_BOOL; }
  380.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  381. };
  382. /* some variables that require special handling */
  383. class sys_var_timestamp :public sys_var
  384. {
  385. public:
  386.   sys_var_timestamp(const char *name_arg) :sys_var(name_arg) {}
  387.   bool update(THD *thd, set_var *var);
  388.   void set_default(THD *thd, enum_var_type type);
  389.   bool check_type(enum_var_type type)    { return type == OPT_GLOBAL; }
  390.   bool check_default(enum_var_type type) { return 0; }
  391.   SHOW_TYPE type() { return SHOW_LONG; }
  392.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  393. };
  394. class sys_var_last_insert_id :public sys_var
  395. {
  396. public:
  397.   sys_var_last_insert_id(const char *name_arg) :sys_var(name_arg) {}
  398.   bool update(THD *thd, set_var *var);
  399.   bool check_type(enum_var_type type) { return type == OPT_GLOBAL; }
  400.   SHOW_TYPE type() { return SHOW_LONGLONG; }
  401.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  402. };
  403. class sys_var_insert_id :public sys_var
  404. {
  405. public:
  406.   sys_var_insert_id(const char *name_arg) :sys_var(name_arg) {}
  407.   bool update(THD *thd, set_var *var);
  408.   bool check_type(enum_var_type type) { return type == OPT_GLOBAL; }
  409.   SHOW_TYPE type() { return SHOW_LONGLONG; }
  410.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  411. };
  412. #ifdef HAVE_REPLICATION
  413. class sys_var_slave_skip_counter :public sys_var
  414. {
  415. public:
  416.   sys_var_slave_skip_counter(const char *name_arg) :sys_var(name_arg) {}
  417.   bool check(THD *thd, set_var *var);
  418.   bool update(THD *thd, set_var *var);
  419.   bool check_type(enum_var_type type) { return type != OPT_GLOBAL; }
  420.   /*
  421.     We can't retrieve the value of this, so we don't have to define
  422.     type() or value_ptr()
  423.   */
  424. };
  425. class sys_var_sync_binlog_period :public sys_var_long_ptr
  426. {
  427. public:
  428.   sys_var_sync_binlog_period(const char *name_arg, ulong *value_ptr)
  429.     :sys_var_long_ptr(name_arg,value_ptr) {}
  430.   bool update(THD *thd, set_var *var);
  431. };
  432. #endif
  433. class sys_var_rand_seed1 :public sys_var
  434. {
  435. public:
  436.   sys_var_rand_seed1(const char *name_arg) :sys_var(name_arg) {}
  437.   bool update(THD *thd, set_var *var);
  438.   bool check_type(enum_var_type type) { return type == OPT_GLOBAL; }
  439. };
  440. class sys_var_rand_seed2 :public sys_var
  441. {
  442. public:
  443.   sys_var_rand_seed2(const char *name_arg) :sys_var(name_arg) {}
  444.   bool update(THD *thd, set_var *var);
  445.   bool check_type(enum_var_type type) { return type == OPT_GLOBAL; }
  446. };
  447. class sys_var_collation :public sys_var_thd
  448. {
  449. public:
  450.   sys_var_collation(const char *name_arg) :sys_var_thd(name_arg)
  451.     {
  452. #if MYSQL_VERSION_ID < 50000
  453.     no_support_one_shot= 0;
  454. #endif
  455.     }
  456.   bool check(THD *thd, set_var *var);
  457. SHOW_TYPE type() { return SHOW_CHAR; }
  458.   bool check_update_type(Item_result type)
  459.   {
  460.     return ((type != STRING_RESULT) && (type != INT_RESULT));
  461.   }
  462.   bool check_default(enum_var_type type) { return 0; }
  463.   virtual void set_default(THD *thd, enum_var_type type)= 0;
  464. };
  465. class sys_var_character_set :public sys_var_thd
  466. {
  467. public:
  468.   bool nullable;
  469.   sys_var_character_set(const char *name_arg) :
  470.     sys_var_thd(name_arg)
  471.   {
  472.     nullable= 0;
  473. #if MYSQL_VERSION_ID < 50000
  474.     /*
  475.       In fact only almost all variables derived from sys_var_character_set
  476.       support ONE_SHOT; character_set_results doesn't. But that's good enough.
  477.     */
  478.     no_support_one_shot= 0;
  479. #endif
  480.   }
  481.   bool check(THD *thd, set_var *var);
  482.   SHOW_TYPE type() { return SHOW_CHAR; }
  483.   bool check_update_type(Item_result type)
  484.   {
  485.     return ((type != STRING_RESULT) && (type != INT_RESULT));
  486.   }
  487.   bool check_default(enum_var_type type) { return 0; }
  488.   bool update(THD *thd, set_var *var);
  489.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  490.   virtual void set_default(THD *thd, enum_var_type type)= 0;
  491.   virtual CHARSET_INFO **ci_ptr(THD *thd, enum_var_type type)= 0;
  492. };
  493. class sys_var_character_set_client :public sys_var_character_set
  494. {
  495. public:
  496.   sys_var_character_set_client(const char *name_arg) :
  497.     sys_var_character_set(name_arg) {}
  498.   void set_default(THD *thd, enum_var_type type);
  499.   CHARSET_INFO **ci_ptr(THD *thd, enum_var_type type);
  500. };
  501. class sys_var_character_set_results :public sys_var_character_set
  502. {
  503. public:
  504.   sys_var_character_set_results(const char *name_arg) :
  505.     sys_var_character_set(name_arg) 
  506.     { nullable= 1; }
  507.   void set_default(THD *thd, enum_var_type type);
  508.   CHARSET_INFO **ci_ptr(THD *thd, enum_var_type type);
  509. };
  510. class sys_var_character_set_server :public sys_var_character_set
  511. {
  512. public:
  513.   sys_var_character_set_server(const char *name_arg) :
  514.     sys_var_character_set(name_arg) {}
  515. #if defined(HAVE_REPLICATION) && (MYSQL_VERSION_ID < 50000)
  516.   bool check(THD *thd, set_var *var);
  517. #endif
  518.   void set_default(THD *thd, enum_var_type type);
  519.   CHARSET_INFO **ci_ptr(THD *thd, enum_var_type type);
  520. };
  521. class sys_var_character_set_database :public sys_var_character_set
  522. {
  523. public:
  524.   sys_var_character_set_database(const char *name_arg) :
  525.     sys_var_character_set(name_arg) {}
  526.   void set_default(THD *thd, enum_var_type type);
  527.   CHARSET_INFO **ci_ptr(THD *thd, enum_var_type type);
  528. };
  529. class sys_var_character_set_connection :public sys_var_character_set
  530. {
  531. public:
  532.   sys_var_character_set_connection(const char *name_arg) :
  533.     sys_var_character_set(name_arg) {}
  534.   void set_default(THD *thd, enum_var_type type);
  535.   CHARSET_INFO **ci_ptr(THD *thd, enum_var_type type);
  536. };
  537. class sys_var_collation_connection :public sys_var_collation
  538. {
  539. public:
  540.   sys_var_collation_connection(const char *name_arg) :sys_var_collation(name_arg) {}
  541.   bool update(THD *thd, set_var *var);
  542.   void set_default(THD *thd, enum_var_type type);
  543.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  544. };
  545. class sys_var_collation_server :public sys_var_collation
  546. {
  547. public:
  548.   sys_var_collation_server(const char *name_arg) :sys_var_collation(name_arg) {}
  549. #if defined(HAVE_REPLICATION) && (MYSQL_VERSION_ID < 50000)
  550.   bool check(THD *thd, set_var *var);
  551. #endif
  552.   bool update(THD *thd, set_var *var);
  553.   void set_default(THD *thd, enum_var_type type);
  554.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  555. };
  556. class sys_var_collation_database :public sys_var_collation
  557. {
  558. public:
  559.   sys_var_collation_database(const char *name_arg) :sys_var_collation(name_arg) {}
  560.   bool update(THD *thd, set_var *var);
  561.   void set_default(THD *thd, enum_var_type type);
  562.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  563. };
  564. class sys_var_key_cache_param :public sys_var
  565. {
  566. protected:
  567.   size_t offset;
  568. public:
  569.   sys_var_key_cache_param(const char *name_arg, size_t offset_arg)
  570.     :sys_var(name_arg), offset(offset_arg)
  571.   {}
  572.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  573.   bool check_default(enum_var_type type) { return 1; }
  574.   bool is_struct() { return 1; }
  575. };
  576. class sys_var_key_buffer_size :public sys_var_key_cache_param
  577. {
  578. public:
  579.   sys_var_key_buffer_size(const char *name_arg)
  580.     :sys_var_key_cache_param(name_arg, offsetof(KEY_CACHE, param_buff_size))
  581.   {}
  582.   bool update(THD *thd, set_var *var);
  583.   SHOW_TYPE type() { return SHOW_LONGLONG; }
  584. };
  585. class sys_var_key_cache_long :public sys_var_key_cache_param
  586. {
  587. public:
  588.   sys_var_key_cache_long(const char *name_arg, size_t offset_arg)
  589.     :sys_var_key_cache_param(name_arg, offset_arg)
  590.   {}
  591.   bool update(THD *thd, set_var *var);
  592.   SHOW_TYPE type() { return SHOW_LONG; }
  593. };
  594. class sys_var_thd_date_time_format :public sys_var_thd
  595. {
  596.   DATE_TIME_FORMAT *SV::*offset;
  597.   timestamp_type date_time_type;
  598. public:
  599.   sys_var_thd_date_time_format(const char *name_arg,
  600.        DATE_TIME_FORMAT *SV::*offset_arg,
  601.        timestamp_type date_time_type_arg)
  602.     :sys_var_thd(name_arg), offset(offset_arg),
  603.     date_time_type(date_time_type_arg)
  604.   {}
  605.   SHOW_TYPE type() { return SHOW_CHAR; }
  606.   bool check_update_type(Item_result type)
  607.   {
  608.     return type != STRING_RESULT; /* Only accept strings */
  609.   }
  610.   bool check_default(enum_var_type type) { return 0; }
  611.   bool check(THD *thd, set_var *var);
  612.   bool update(THD *thd, set_var *var);
  613.   void update2(THD *thd, enum_var_type type, DATE_TIME_FORMAT *new_value);
  614.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  615.   void set_default(THD *thd, enum_var_type type);
  616. };
  617. /* Variable that you can only read from */
  618. class sys_var_readonly: public sys_var
  619. {
  620. public:
  621.   enum_var_type var_type;
  622.   SHOW_TYPE show_type;
  623.   sys_value_ptr_func value_ptr_func;
  624.   sys_var_readonly(const char *name_arg, enum_var_type type,
  625.    SHOW_TYPE show_type_arg,
  626.    sys_value_ptr_func value_ptr_func_arg)
  627.     :sys_var(name_arg), var_type(type), 
  628.        show_type(show_type_arg), value_ptr_func(value_ptr_func_arg)
  629.   {}
  630.   bool update(THD *thd, set_var *var) { return 1; }
  631.   bool check_default(enum_var_type type) { return 1; }
  632.   bool check_type(enum_var_type type) { return type != var_type; }
  633.   bool check_update_type(Item_result type) { return 1; }
  634.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
  635.   {
  636.     return (*value_ptr_func)(thd);
  637.   }
  638.   SHOW_TYPE type() { return show_type; }
  639. };
  640. class sys_var_thd_time_zone :public sys_var_thd
  641. {
  642. public:
  643.   sys_var_thd_time_zone(const char *name_arg):
  644.     sys_var_thd(name_arg) 
  645.   {
  646. #if MYSQL_VERSION_ID < 50000
  647.     no_support_one_shot= 0;
  648. #endif
  649.   }
  650.   bool check(THD *thd, set_var *var);
  651.   SHOW_TYPE type() { return SHOW_CHAR; }
  652.   bool check_update_type(Item_result type)
  653.   {
  654.     return type != STRING_RESULT; /* Only accept strings */
  655.   }
  656.   bool check_default(enum_var_type type) { return 0; }
  657.   bool update(THD *thd, set_var *var);
  658.   byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
  659.   virtual void set_default(THD *thd, enum_var_type type);
  660. };
  661. /****************************************************************************
  662.   Classes for parsing of the SET command
  663. ****************************************************************************/
  664. class set_var_base :public Sql_alloc
  665. {
  666. public:
  667.   set_var_base() {}
  668.   virtual ~set_var_base() {}
  669.   virtual int check(THD *thd)=0; /* To check privileges etc. */
  670.   virtual int update(THD *thd)=0; /* To set the value */
  671.   /* light check for PS */
  672.   virtual int light_check(THD *thd) { return check(thd); }
  673. #if MYSQL_VERSION_ID < 50000
  674.   virtual bool no_support_one_shot() { return 1; }
  675. #endif
  676. };
  677. /* MySQL internal variables, like query_cache_size */
  678. class set_var :public set_var_base
  679. {
  680. public:
  681.   sys_var *var;
  682.   Item *value;
  683.   enum_var_type type;
  684.   union
  685.   {
  686.     CHARSET_INFO *charset;
  687.     ulong ulong_value;
  688.     ulonglong ulonglong_value;
  689.     DATE_TIME_FORMAT *date_time_format;
  690.     Time_zone *time_zone;
  691.   } save_result;
  692.   LEX_STRING base; /* for structs */
  693.   set_var(enum_var_type type_arg, sys_var *var_arg, LEX_STRING *base_name_arg,
  694.   Item *value_arg)
  695.     :var(var_arg), type(type_arg), base(*base_name_arg)
  696.   {
  697.     /*
  698.       If the set value is a field, change it to a string to allow things like
  699.       SET table_type=MYISAM;
  700.     */
  701.     if (value_arg && value_arg->type() == Item::FIELD_ITEM)
  702.     {
  703.       Item_field *item= (Item_field*) value_arg;
  704.       if (!(value=new Item_string(item->field_name, strlen(item->field_name),
  705.   item->collation.collation)))
  706. value=value_arg; /* Give error message later */
  707.     }
  708.     else
  709.       value=value_arg;
  710.   }
  711.   int check(THD *thd);
  712.   int update(THD *thd);
  713.   int light_check(THD *thd);
  714. #if MYSQL_VERSION_ID < 50000
  715.   bool no_support_one_shot() { return var->no_support_one_shot; }
  716. #endif
  717. };
  718. /* User variables like @my_own_variable */
  719. class set_var_user: public set_var_base
  720. {
  721.   Item_func_set_user_var *user_var_item;
  722. public:
  723.   set_var_user(Item_func_set_user_var *item)
  724.     :user_var_item(item)
  725.   {}
  726.   int check(THD *thd);
  727.   int update(THD *thd);
  728.   int light_check(THD *thd);
  729. };
  730. /* For SET PASSWORD */
  731. class set_var_password: public set_var_base
  732. {
  733.   LEX_USER *user;
  734.   char *password;
  735. public:
  736.   set_var_password(LEX_USER *user_arg,char *password_arg)
  737.     :user(user_arg), password(password_arg)
  738.   {}
  739.   int check(THD *thd);
  740.   int update(THD *thd);
  741. };
  742. /* For SET NAMES and SET CHARACTER SET */
  743. class set_var_collation_client: public set_var_base
  744. {
  745.   CHARSET_INFO *character_set_client;
  746.   CHARSET_INFO *character_set_results;
  747.   CHARSET_INFO *collation_connection;
  748. public:
  749.   set_var_collation_client(CHARSET_INFO *client_coll_arg,
  750.       CHARSET_INFO *connection_coll_arg,
  751.       CHARSET_INFO *result_coll_arg)
  752.     :character_set_client(client_coll_arg),
  753.      character_set_results(result_coll_arg),
  754.      collation_connection(connection_coll_arg)
  755.   {}
  756.   int check(THD *thd);
  757.   int update(THD *thd);
  758. };
  759. /* Named lists (used for keycaches) */
  760. class NAMED_LIST :public ilink
  761. {
  762.   const char *name;
  763.   uint name_length;
  764. public:
  765.   gptr data;
  766.   NAMED_LIST(I_List<NAMED_LIST> *links, const char *name_arg,
  767.      uint name_length_arg, gptr data_arg)
  768.     :name_length(name_length_arg), data(data_arg)
  769.   {
  770.     name= my_strdup_with_length((byte*) name_arg, name_length, MYF(MY_WME));
  771.     links->push_back(this);
  772.   }
  773.   inline bool cmp(const char *name_cmp, uint length)
  774.   {
  775.     return length == name_length && !memcmp(name, name_cmp, length);
  776.   }
  777.   ~NAMED_LIST()
  778.   {
  779.     my_free((char*) name, MYF(0));
  780.   }
  781.   friend bool process_key_caches(int (* func) (const char *name,
  782.        KEY_CACHE *));
  783.   friend void delete_elements(I_List<NAMED_LIST> *list,
  784.       void (*free_element)(const char*, gptr));
  785. };
  786. /* updated in sql_acl.cc */
  787. extern sys_var_thd_bool sys_old_passwords;
  788. extern LEX_STRING default_key_cache_base;
  789. /* For sql_yacc */
  790. struct sys_var_with_base
  791. {
  792.   sys_var *var;
  793.   LEX_STRING base_name;
  794. };
  795. /*
  796.   Prototypes for helper functions
  797. */
  798. void set_var_init();
  799. void set_var_free();
  800. sys_var *find_sys_var(const char *str, uint length=0);
  801. int sql_set_variables(THD *thd, List<set_var_base> *var_list);
  802. bool not_all_support_one_shot(List<set_var_base> *var_list);
  803. void fix_delay_key_write(THD *thd, enum_var_type type);
  804. ulong fix_sql_mode(ulong sql_mode);
  805. extern sys_var_str sys_charset_system;
  806. extern sys_var_str sys_init_connect;
  807. extern sys_var_str sys_init_slave;
  808. extern sys_var_thd_time_zone sys_time_zone;
  809. CHARSET_INFO *get_old_charset_by_name(const char *old_name);
  810. gptr find_named(I_List<NAMED_LIST> *list, const char *name, uint length,
  811. NAMED_LIST **found);
  812. /* key_cache functions */
  813. KEY_CACHE *get_key_cache(LEX_STRING *cache_name);
  814. KEY_CACHE *get_or_create_key_cache(const char *name, uint length);
  815. void free_key_cache(const char *name, KEY_CACHE *key_cache);
  816. bool process_key_caches(int (* func) (const char *name, KEY_CACHE *));
  817. void delete_elements(I_List<NAMED_LIST> *list,
  818.      void (*free_element)(const char*, gptr));