参考
- C++でMySQLのUDFを作る - qiita
- MySQL :: MySQL 8.0 Reference Manual :: 29.4.2 Adding a User-Defined Function
作成した関数
#include <mysql.h>
#include <string>
extern "C" {
my_bool factorial_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
char *factorial(UDF_INIT *initid, UDF_ARGS *args, char *result,
unsigned long *length, char *is_null, char *error);
}
my_bool factorial_init(UDF_INIT *initid, UDF_ARGS *args, char *message) {
if (args->arg_count != 1)
{
strcpy(message,"FACTORIAL() requires one arguments");
return 1;
}
if (args->arg_type[0] != INT_RESULT)
{
strcpy(message,"FACTORIAL() require an integer");
return 1;
}
return 0;
}
char *factorial(UDF_INIT *initid, UDF_ARGS *args, char *result,
unsigned long *length, char *is_null, char *error) {
long long val = *(long long*) args->args[0];
int sum = 1;
for (int i = 1; i <= val; ++i)
{
sum *= i;
}
strcpy(result, std::to_string(sum).c_str());
*length = strlen(result);
return result;
}
factorial_init
とfactorial
を作成しています。
factorial_init
が関数実行時に最初に実行されて、引数のチェックなどを行い、
factorial
が実際に処理をする部分です。
コンパイル
$ mysql_config --cflags #mysql.hがあるパスを確認
-I/usr/local/opt/mysql@5.7/include/mysql
$ mysql_config --plugindir #プラグインのパスを確認
/usr/local/opt/mysql@5.7/lib/plugin
$ g++ factorial.cpp -shared \
-o /usr/local/opt/mysql@5.7/lib/plugin/factorial.so \
-I /usr/local/opt/mysql@5.7/include/mysql/ #コンパイル
mysql> create function factorial returns string soname 'factorial.so';
Query OK, 0 rows affected (0.01 sec)
mysql> select factorial(6);
+--------------+
| factorial(6) |
+--------------+
| 720 |
+--------------+
1 row in set (0.00 sec)
UDFを動かせました。見ていただいてありがとうございました。m(_ _)m