同事需要对一个表的不同字段进行处理,生成一些数据,使用shell处理比较慢,帮他写了一个mysql 的扩展函数,对UDF接口的资料做了一个了解,有需要的人可以看看,效率还是蛮高的。
-
#include <mysql.h>
-
#include <string.h>
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <time.h>
-
#include <sys/types.h>
-
#include <sys/stat.h>
-
#include <errno.h>
-
#include <unistd.h>
-
#include <stdint.h>
-
-
/*资源分配*/
-
my_bool myfun_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
-
-
/*自定义函数*/
-
char *myfun(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error);
-
-
/*资源回收*/
-
void myfun_deinit(UDF_INIT *initid);
-
-
/*
-
参数说明:
-
UDF_INT *initid
-
UDF_INIT 指针可以用于将分配好的资源传递给其他函数使用。
-
-
UDF_ARG *args
-
UDF_ARG 指针
-
-
char *message
-
出错信息指针
-
-
返回值 0 成功, 1 失败
-
-
-
针对UFD_INT和UDF_ARG的成员做一个简单说明。
-
typedef struct st_udf_args
-
{
-
unsigned int arg_count; 参数个数
-
enum Item_result *arg_type; 参数类型
-
char **args; 参数指针
-
unsigned long *lengths; 参数长度
-
char *maybe_null; 是否可以为空,1表示可以为空
-
char **attributes; 参数属性的指针
-
unsigned long *attribute_lengths; 参数属性的指针指向内容的长度
-
void *extension; 扩展指针
-
} UDF_ARGS;
-
-
-
typedef struct st_udf_init
-
{
-
my_bool maybe_null; 1表示返回值可以为空
-
unsigned int decimals; 可以用来设置double类型小数点后的长度
-
unsigned long max_length; 自定义字符串函数返回结果的最大长度
-
char *ptr; 字符串指针 一般init里面分配的内存可以把地址给ptr,用于传递到其他函数,比如deinit里面释放分配的内存
-
my_bool const_item; 函数是否返回固定结果
-
void *extension; 扩展指针
-
} UDF_INIT;
-
*/
-
-
/* init函数在myfun函数执行前调用*/
-
my_bool myfun_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
-
{
-
char *pstr;
-
-
if (args->arg_count != 1 || args->arg_type[0] != STRING_RESULT) {
-
/* 检测参数个数和参数类型 */
-
strncpy(message, " USAGE: myfun('').", MYSQL_ERRMSG_SIZE);
-
return 1;
-
}
-
-
pstr = malloc(sizeof(char) * 128);
-
-
/* 强制参数为指针类型 */
-
args->arg_type[0]= STRING_RESULT;
-
-
initid->ptr= (char *)total_bytes;
-
-
return 0;
-
}
-
-
/*
-
参数说明:
-
UDF_INT *initid
-
同init函数
-
-
UDF_ARG *args
-
用于读取穿进来参数的信息:传入的值,传入值的长度 ,类型等等,具体看上面结构体的说明
-
-
*result
-
保留参数
-
-
*length
-
用于设置返回值的长度
-
-
*is_null
-
是否为空
-
-
*error
-
如果设置为1自定义函数将不被再调用
-
-
RETURNS
-
字符串指针
-
*/
-
char *myfun(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
-
{
-
char *pstr= (char *)initid->ptr;
-
strcpy(pstr,"hello");
-
-
memcpy(pstr+strlen(pstr),args->args[0],args->lengths[0]);
-
/*可以试试
-
-
sprintf(pstr,“hello %s”, args->args[0]);
-
-
可以深入理解args->lengths的作用了*/
-
-
return (result);
-
}
-
-
/* deinit函数在myfun函数执行完调用*/
-
void myfun_deinit(UDF_INIT *initid)
-
{
-
char *total_bytes= initid->ptr;
-
-
/* 释放内存*/
-
free(total_bytes);
-
-
return;
-
}
阅读(13898) | 评论(0) | 转发(0) |