Мне нужно написать агрегатную функцию расширения (реализованную в C) для MySQL 5.x. Я просмотрел документацию (включая просмотр sql / udf_example.c), но я не нашел ничего краткого, по сути и показывающего мне, что мне нужно сделать.
Это проблема:
- У меня есть структура C (Foo)
У меня есть функция C, которая принимает массив этих структур Foo, выполняет операцию над массивом и возвращает double.
struct FooBar {
char * date;
двойной возраст;
двойной уайт;
двойная зарплата;
int eye_color;
};
/ * Функция обработки /
double processFooBars (struct FooBar foobars, размер const size_t);
/ * MySQL таблица * /
CREATE TABLE foo_bar (the_date DATE, двойной возраст, двойной вес, двойной оклад, int eye_color};
Я хочу иметь возможность создавать агрегатную функцию таким образом: (возможно, я использую синтаксис PostgreSQL)
СОЗДАТЬ ФУНКЦИЮ АГРЕГАТА proc_foobar ВОЗВРАЩАЕТСЯ НАСТОЯЩЕЕ имя сына myshlib.so ALIAS my_wrapper_func
Затем я могу использовать его в MySQL Query таким образом:
ВЫБЕРИТЕ proc_foobar () в качестве вероятности ОТ foo_bar ГДЕ the_date МЕЖДУ '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 ++.