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

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

这就是问题:

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

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

/ *处理函数/ double processFooBars(struct FooBar foob​​ars,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 – 或者更多我能如何实现编写聚合函数所需的function,如上所述,作为扩展函数C / C ++。

不回答你的问题,但有关MySQL udf的文章相当不错:

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