mysql在C中聚合UDF(用户定义的函数)
我需要为mySQL 5.x编写一个聚合扩展函数(用C实现)。 我已经搜索了文档(包括浏览sql / udf_example.c),但我找不到任何简短的内容,并且向我展示了我需要做的事情。
这就是问题:
- 我有一个C结构(Foo)
-
我有一个C函数,它接受这些Foo结构的数组,对数组执行操作,并返回一个double。
struct FooBar {char * date; 双倍年龄; 双重怀疑; 双薪; int eye_color; };
/ *处理函数/ 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 – 或者更多我能如何实现编写聚合函数所需的function,如上所述,作为扩展函数C / C ++。
不回答你的问题,但有关MySQL udf的文章相当不错: