こんにちは。
MySQLのUDF関数(user defined function)を作ってみました(下記のmystring(n)
)。文字数を与え、文字列('x'の羅列)を返します。この文字列は自分でメモリ確保しています1(#define MYRESULT initid->ptr
)。
mysql> CREATE FUNCTION mystring RETURNS STRING SONAME 'mystring.dylib';
mysql> select n, mystring(n) from my_table;
+-----+-------------+
| n | mystring(n) |
+-----+-------------+
| 4 | xxxx |
| 6 | xxxxxx |
+-----+-------------+
mysql> SELECT * from mysql.func WHERE name LIKE 'mystring%';
mysql> SHOW VARIABLES LIKE 'plugin_dir'
$ gcc -Wall -I $MYSQLDIR/include/mysql -dynamiclib -o mystring.dylib -DMYSQL_DYNAMIC_PLUGIN mystring.c $MYSQLDIR/lib/libmysqlclient.dylib
$ mv mystring.dylib $MYSQLDIR/lib/plugin/
mystring.c
# include <mysql.h>
# include <stdlib.h>
# include <string.h>
# define MYRESULT initid->ptr
my_bool mystring_init(UDF_INIT *initid, UDF_ARGS *args, char *message) {
if(args->arg_count != 1 || args->arg_type[0] != INT_RESULT) {
strcpy(message, "Expected exactly one integer parameter.");
return 1;
}
MYRESULT = NULL;
return 0;
}
void mystring_deinit(UDF_INIT *initid) {
if (MYRESULT) free(MYRESULT);
}
char *mystring(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *len, char *is_null, char *error) {
int i;
*len = *((long long*) args->args[0]);
MYRESULT = (char *)realloc(MYRESULT,*len);
for (i=0; i<*len; i++) {MYRESULT[i]='x';}
return MYRESULT;
}
-
変数
result
には固定で 255 バイトが確保済みで、こちらを使う方法もあります。 ↩