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 piled 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 <db.h>
#include <unistd.h>
#include<ftl.h>
#include<sys time.h="">
#include<sys ioctl.h="">
#include <sys types.h="">
#include <i in.h="">
#include <sys socket.h="">
#include <sys wait.h="">
#include<arpa i.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 = i_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 = ftl(sockfd,F_GETFL,0);
ftl(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></i></sys></sys></sys></ftl.h></unistd.h></db.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>
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程