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

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. /* This file defines structures needed by udf functions */
  14. #ifdef USE_PRAGMA_INTERFACE
  15. #pragma interface
  16. #endif
  17. enum Item_udftype {UDFTYPE_FUNCTION=1,UDFTYPE_AGGREGATE};
  18. typedef struct st_udf_func
  19. {
  20.   LEX_STRING name;
  21.   Item_result returns;
  22.   Item_udftype type;
  23.   char *dl;
  24.   void *dlhandle;
  25.   void *func;
  26.   void *func_init;
  27.   void *func_deinit;
  28.   void *func_clear;
  29.   void *func_add;
  30.   ulong usage_count;
  31. } udf_func;
  32. class Item_result_field;
  33. struct st_table_list;
  34. class udf_handler :public Sql_alloc
  35. {
  36.  protected:
  37.   udf_func *u_d;
  38.   String *buffers;
  39.   UDF_ARGS f_args;
  40.   UDF_INIT initid;
  41.   char *num_buffer;
  42.   uchar error, is_null;
  43.   bool initialized;
  44.   Item **args;
  45.  public:
  46.   table_map used_tables_cache;
  47.   bool const_item_cache;
  48.   bool not_original;
  49.   udf_handler(udf_func *udf_arg) :u_d(udf_arg), buffers(0), error(0),
  50.     is_null(0), initialized(0), not_original(0)
  51.   {}
  52.   ~udf_handler();
  53.   const char *name() const { return u_d ? u_d->name.str : "?"; }
  54.   Item_result result_type () const
  55.   { return u_d ? u_d->returns : STRING_RESULT;}
  56.   bool get_arguments();
  57.   bool fix_fields(THD *thd,struct st_table_list *tlist,Item_result_field *item,
  58.   uint arg_count,Item **args);
  59.   void cleanup();
  60.   double val(my_bool *null_value)
  61.   {
  62.     if (get_arguments())
  63.     {
  64.       *null_value=1;
  65.       return 0.0;
  66.     }
  67.     double (*func)(UDF_INIT *, UDF_ARGS *, uchar *, uchar *)=
  68.       (double (*)(UDF_INIT *, UDF_ARGS *, uchar *, uchar *)) u_d->func;
  69.     double tmp=func(&initid, &f_args, &is_null, &error);
  70.     if (is_null || error)
  71.     {
  72.       *null_value=1;
  73.       return 0.0;
  74.     }
  75.     *null_value=0;
  76.     return tmp;
  77.   }
  78.   longlong val_int(my_bool *null_value)
  79.   {
  80.     if (get_arguments())
  81.     {
  82.       *null_value=1;
  83.       return LL(0);
  84.     }
  85.     longlong (*func)(UDF_INIT *, UDF_ARGS *, uchar *, uchar *)=
  86.       (longlong (*)(UDF_INIT *, UDF_ARGS *, uchar *, uchar *)) u_d->func;
  87.     longlong tmp=func(&initid, &f_args, &is_null, &error);
  88.     if (is_null || error)
  89.     {
  90.       *null_value=1;
  91.       return LL(0);
  92.     }
  93.     *null_value=0;
  94.     return tmp;
  95.   }
  96.   void clear()
  97.   {
  98.     is_null= 0;
  99.     void (*func)(UDF_INIT *, uchar *, uchar *)=
  100.     (void (*)(UDF_INIT *, uchar *, uchar *)) u_d->func_clear;
  101.     func(&initid, &is_null, &error);
  102.   }
  103.   void add(my_bool *null_value)
  104.   {
  105.     if (get_arguments())
  106.     {
  107.       *null_value=1;
  108.       return;
  109.     }
  110.     void (*func)(UDF_INIT *, UDF_ARGS *, uchar *, uchar *)=
  111.     (void (*)(UDF_INIT *, UDF_ARGS *, uchar *, uchar *)) u_d->func_add;
  112.     func(&initid, &f_args, &is_null, &error);
  113.     *null_value= (my_bool) (is_null || error);
  114.   }
  115.   String *val_str(String *str,String *save_str);
  116. };
  117. #ifdef HAVE_DLOPEN
  118. void udf_init(void),udf_free(void);
  119. udf_func *find_udf(const char *name, uint len=0,bool mark_used=0);
  120. void free_udf(udf_func *udf);
  121. int mysql_create_function(THD *thd,udf_func *udf);
  122. int mysql_drop_function(THD *thd,const LEX_STRING *name);
  123. #endif