MySQL udf 获取linux文件修改时间 博客分类: mysql MySql udfstat
程序员文章站
2024-03-13 08:52:33
...
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]