MySQL udf 获取linux文件修改时间

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]

猜你喜欢

转载自ucstudio.iteye.com/blog/2337181