欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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]

相关标签: MySql udf stat