- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章mysql的udf编程之非阻塞超时重传由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
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 <stdlib.h> #include <stdio.h> #include <string.h> #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 <my_global.h> #include <my_sys.h> #if defined(MYSQL_SERVER) #include <m_string.h> /* To get strmov() */ #else /* when compiled as standalone */ #include <string.h> #endif #endif #include <mysql.h> #include <m_ctype.h> #include <m_string.h> #include <stdlib.h> #include <errno.h> #include <netdb.h> #include <unistd.h> #include<fcntl.h> #include<sys time.h=""> #include<sys ioctl.h=""> #include <sys types.h=""> #include <netinet in.h=""> #include <sys socket.h=""> #include <sys wait.h=""> #include<arpa inet.h=""> #include<unistd.h> #include <mysql.h> #include <ctype.h> #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 < 3 ) { 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,
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) <= 0 && cycletimes==5) { close(sockfd); return 5; } numbytes = send(sockfd,sendBuffer,strlen(sendBuffer),0); if(numbytes<0) { usleep(20000); } cycletimes++; }while(numbytes<0 && cycletimes!=5); if(numbytes<0) { close(sockfd); return 4; } close(sockfd); return 0; } #endif /* HAVE_DLOPEN */ </ctype.h></mysql.h></unistd.h></arpa></sys></sys></netinet></sys></sys></sys></fcntl.h></unistd.h></netdb.h></errno.h></stdlib.h></m_string.h></m_ctype.h></mysql.h></string.h></m_string.h></my_sys.h></my_global.h></string.h></stdio.h></stdlib.h> 。
。
。
最后此篇关于mysql的udf编程之非阻塞超时重传的文章就讲到这里了,如果你想了解更多关于mysql的udf编程之非阻塞超时重传的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!