MySQL агрегат UDF (пользовательская функция) в C - PullRequest
1 голос
/ 16 декабря 2009

Мне нужно написать агрегатную функцию расширения (реализованную в C) для MySQL 5.x. Я просмотрел документацию (включая просмотр sql / udf_example.c), но я не нашел ничего краткого, по сути и показывающего мне, что мне нужно сделать.

Это проблема:

  1. У меня есть структура C (Foo)
  2. У меня есть функция 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 ++.

1 Ответ

1 голос
/ 16 декабря 2009

Не отвечает на ваш вопрос, но статья на MySQL udf довольно хорошая:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...