mysql在C中聚合UDF(用户定义的函数)

时间:2009-12-16 13:53:52

标签: c++ mysql c

我需要为mySQL 5.x编写一个聚合扩展函数(用C实现)。我已经仔细检查了文档(包括浏览sql / udf_example.c),但我找不到任何简短的内容,并向我展示了我需要做的事情。

这是问题所在:

  1. 我有一个C结构(Foo)
  2. 我有一个C函数,它接受这些Foo结构的数组,对数组执行操作,并返回一个double。

    struct FooBar {   char * date;   双倍年龄;   双重怀疑;   双薪;   int eye_color; };

  3. / *处理功能 / double processFooBars(struct FooBar foobars,const size_t size);

    / * MySQL表* / CREATE TABLE foo_bar(the_date DATE,double age,double weight,double salary,int eye_color};

    我希望能够创建一个聚合函数:(我可能使用PostgreSQL语法)

    CREATE AGGREGATE FUNCTION proc_foobar RETURNS REAL soname myshlib.so ALIAS my_wrapper_func

    然后我可以在MySQL Query中使用它:

    SELECT proc_foobar()as likeability FROM foo_bar WHERE the_date BETWEEN'1-Jan-09'和'1-Dec-09'

    这个查询应该做的是从表foo_bar中获取所有匹配的记录,将它们传递给我在processFooBar周围的包装器函数,然后它将从收到的记录中提取FooBar结构,然后将它们传递给C函数它完成工作并返回值。

    使用(伪)代码解释更简单:

    #ifdefined __cplusplus
    extern "C" {
    #endif
    
      /* this is the wrapper function that mySQL calls and passes the records to */
      double my_wrapper_func(/*Matching rows sent by mySQL + other info .. ?*/)
      {
         /* create FooBar Array from received record */
         struct FooBar ** the_array = ExtractArrayFromRowset(/*some params*/);
         double result = processFooBar(the_array, ARRAY_SIZE_MACRO(*the_array));
    
         /* free resources */
         FreeFooBarArray(the_array);
         RETURN_DOUBLE(result);  /* or similar macro to return a double in MySQL */
      }
    
    #ifdefined __cplusplus
    };
    #endif
    

    任何人都可以提供一个小片段(或者直接告诉我一个代码片段),告诉我如何编写my_wrapper_func - 或者更多我能如何实现编写聚合函数所需的功能,如上所述C / C ++中的扩展函数。

1 个答案:

答案 0 :(得分:1)

没有回答你的问题,但有关MySQL udf的文章非常好:

http://www.codeproject.com/KB/database/MySQL_UDFs.aspx