LoginSignup
3
0

More than 3 years have passed since last update.

(初心者)MySQLのUDFを簡単に作ってみた

Last updated at Posted at 2020-01-19

参考

作成した関数

#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_initfactorialを作成しています。
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

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0