0

0

mysql的udf编程之非阻塞超时重传_MySQL

php中文网

php中文网

发布时间:2016-06-01 13:18:23

|

1024人浏览过

|

来源于php中文网

原创

bitsCN.com

MySQL的UDF(User Defined Function)类似于一种API, 用户根据一定的规范用C/C++(或采用C调用规范的语言)编写一组函数(UDF),然后编译成动态链接库,通过DROP FUNCTION语句来加载和卸载UDF。UDF被加载后可以像调用MySQL的内置函数一样来调用它,并且服务器在启动时会自动加载原来存在的UDF。


#ifdef STANDARD/* STANDARD is defined, don't use any mysql functions */
#include
#include
#include
#ifdef __WIN__
typedef unsigned __int64 ulonglong;    /* Microsofts 64 bit types */
typedef __int64 longlong;
#else
typedef unsigned long long ulonglong;
typedef long long longlong;
#endif /*__WIN__*/
#else
#include
#include
#if defined(MYSQL_SERVER)
#include         /* To get strmov() */
#else
/* when compiled as standalone */
#include
#endif
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifdef HAVE_DLOPEN

my_bool http_post_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
void http_post_deinit(UDF_INIT *initid);
longlong http_post(UDF_INIT *initid, UDF_ARGS *args, char *is_null,char *error);
/*************************************************************************
** Example of init function
** Arguments:
** initid                        Points to a structure that the init function should fill.
**            char *ptr;            A pointer that the function can use.
** message                        Error message
**RETURN                        This function should return 1 if something goes wrong. In this case
**************************************************************************/
my_bool http_post_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
{
if (args->arg_count {
    strcpy(message,"Wrong arguments to http_post; ");
    return 1;
}

if(args->arg_count == 4 && args->args[3]!=NULL)
{
      int flexibleLength = strlen(args->args[3]);
      if(flexibleLength > 160000)
      {
          int allocLength = 200 + flexibleLength;
          if (!(initid->ptr=(char*) malloc(allocLength) ) )
          {
                strcpy(message,"Couldn't allocate memory in http_post_init");
                return 1;
          }
        return 0;
      }
      else
      {
          initid->ptr=NULL;
    }

}
   return 0;

}

/****************************************************************************
** Deinit function. This should all resources allocated by
** this function.
** Arguments:
** initid    Return value from xxxx_init
****************************************************************************/
void http_post_deinit(UDF_INIT *initid)
{
     if (initid!=NULL && initid->ptr!=NULL)
          {
              free(initid->ptr);
              initid->ptr = NULL;
          }

}

/***************************************************************************
** UDF string function.
** Arguments:
** initid    Structure filled by xxx_init
** args        The same structure as to xxx_init. This structure
** This function should return a pointer to the result string.
** Normally this is 'result' but may also be an alloced string.
***************************************************************************/
longlong http_post(    UDF_INIT *initid, UDF_ARGS *args,
                char *is_null __attribute__((unused)),
                char *error __attribute__((unused)))
{
    int sockfd=0;
    int numbytes=0;
    int flags=0;
    int cycletimes=0;
    char* sendBuffer=NULL;

Dreamhouse AI
Dreamhouse AI

AI室内设计,快速重新设计你的家,虚拟布置家具

下载

    fd_set wset;
    struct timeval tval;
    tval.tv_sec = 0;
    tval.tv_usec = 300000;

    if(initid->ptr == NULL)
    {
        char sendArray[160000] = "/0";
        sendBuffer=sendArray;
    }
    else
    {
        sendBuffer = initid->ptr;
    }

    struct sockaddr_in serv_addr;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(atoi(args->args[1]));
    serv_addr.sin_addr.s_addr = inet_addr(args->args[0]);
    bzero(&(serv_addr.sin_zero),8);

    if(args->arg_count == 4 && (args->args[3]!=NULL) )
    {
        int argsNum = strlen(args->args[3]);
        sprintf(sendBuffer,"POST /?%s HTTP/1.1/r/nContent-Length:%d/r/n/r/n%s",args->args[2],argsNum,args->args[3]);
    }
    else
    {
        sprintf(sendBuffer,"POST /?%s HTTP/1.1/r/n",args->args[2]);
    }

    if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
    {
        close(sockfd);
        return 2;
    }
    flags = fcntl(sockfd,F_GETFL,0);
    fcntl(sockfd,F_SETFL,flags|O_NONBLOCK);//设置为非阻塞
    do
    {
        connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr));
        FD_ZERO(&wset);
        FD_SET(sockfd,&wset);
        if( select(sockfd+1, NULL, &wset, NULL,&tval)         {
            close(sockfd);
            return 5;
        }
        numbytes = send(sockfd,sendBuffer,strlen(sendBuffer),0);
        if(numbytes        {
            usleep(20000);
        }
        cycletimes++;
    }while(numbytes    if(numbytes    {
        close(sockfd);
        return 4;
    }
    close(sockfd);
    return 0;
}
#endif /* HAVE_DLOPEN */


bitsCN.com

相关专题

更多
javascript void运算符
javascript void运算符

void是一元运算符,执行右侧表达式但始终返回undefined;用于丢弃返回值、阻止a标签跳转、IIFE忽略结果、动态导入不取Promise、安全获取undefined。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.29

vscode的界面字体大小调整
vscode的界面字体大小调整

调整VSCode界面字体大小可通过设置编辑器或整体UI缩放实现;2.修改"Editor:FontSize"改变代码字体;3.设置"Window:ZoomLevel"调整整体界面字体;4.使用Ctrl+滚轮快捷键临时缩放。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.29

VSCode的注释快捷键
VSCode的注释快捷键

单行注释快捷键为Ctrl+/(Windows/Linux)或Cmd+/(macOS),块注释使用Shift+Alt+A(Windows/Linux)或Shift+Option+A(macOS),VSCode会根据语言类型自动匹配语法,如JavaScript用//,Python用#,C++用//,若快捷键无效需检查语言扩展或插件冲突。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.29

Golang 命令行工具(CLI)开发实战
Golang 命令行工具(CLI)开发实战

本专题系统讲解 Golang 在命令行工具(CLI)开发中的实战应用,内容涵盖参数解析、子命令设计、配置文件读取、日志输出、错误处理、跨平台编译以及常用CLI库(如 Cobra、Viper)的使用方法。通过完整案例,帮助学习者掌握 使用 Go 构建专业级命令行工具与开发辅助程序的能力。

4

2025.12.29

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

165

2025.12.26

压缩文件加密教程汇总
压缩文件加密教程汇总

本专题整合了压缩文件加密教程,阅读专题下面的文章了解更多详细教程。

56

2025.12.26

wifi无ip分配
wifi无ip分配

本专题整合了wifi无ip分配相关教程,阅读专题下面的文章了解更多详细教程。

108

2025.12.26

漫蛙漫画入口网址
漫蛙漫画入口网址

本专题整合了漫蛙入口网址大全,阅读下面的文章领取更多入口。

356

2025.12.26

b站看视频入口合集
b站看视频入口合集

本专题整合了b站哔哩哔哩相关入口合集,阅读下面的文章查看更多入口。

703

2025.12.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 776人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号