getFileModifiedTime.c
#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 getFileModifiedTime_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
/*自定义函数*/
char *getFileModifiedTime(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error);
/*资源回收*/
void getFileModifiedTime_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函数在getFileModifiedTime函数执行前调用*/
my_bool getFileModifiedTime_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
{
if(args->arg_count==1
&& args->arg_type[0]==STRING_RESULT
){
initid->maybe_null = 1;
return 0;
} else {
strcpy(
message
, "Expected exactly one parameter(STRING filePath)"
);
return 1;
}
}
/*
参数说明:
UDF_INT *initid
同init函数
UDF_ARG *args
用于读取穿进来参数的信息:传入的值,传入值的长度 ,类型等等,具体看上面结构体的说明
*result
保留参数
*length
用于设置返回值的长度
*is_null
是否为空
*error
如果设置为1自定义函数将不被再调用
*/
char *getFileModifiedTime(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
{
struct stat attr;
int tmpResult = -1;
static char str_time[20];
struct tm *local_time = NULL;
time_t utc_time;
tmpResult=stat(args->args[0], &attr);
if (tmpResult == -1 ) {
*length=0;
return NULL;
}
/**length=strlen(ctime(&attr.st_mtime));
return ctime(&attr.st_mtime);*/
utc_time = attr.st_mtime;
local_time = localtime(&utc_time);
strftime(str_time, sizeof(str_time), "%Y-%m-%d %H:%M:%S", local_time);
*length=sizeof(str_time);
return str_time;
}
/* deinit函数在getFileModifiedTime函数执行完调用*/
void getFileModifiedTime_deinit(UDF_INIT *initid)
{
if(initid->ptr){
free(initid->ptr);
}
return;
}
gcc -shared -o getFileModifiedTime.so getFileModifiedTime.c -I /usr/include/mysql
sudo cp getFileModifiedTime.so /usr/lib/mysql/plugin/
mysql@localhost:(none) 05:31:46>create function getFileModifiedTime returns string soname "getFileModifiedTime.so";
mysql@localhost:(none) 05:31:46>select getFileModifiedTime("/home/haibo/script/c/getFileModifiedTime.c");
+-------------------------------------------------------------------+
| getFileModifiedTime("/home/haibo/script/c/getFileModifiedTime.c") |
+-------------------------------------------------------------------+
| 2016-11-10 17:02:04 |
+-------------------------------------------------------------------+
备注:只适合[linux/unix]
本文介绍了一个MySQL用户定义函数(UDF)的实现,该函数用于获取指定文件的最后修改时间,并以人类可读的日期时间格式返回。文章详细展示了如何编写、编译并加载UDF到MySQL中。
356

被折叠的 条评论
为什么被折叠?



