《Mysql应用mysql的udf编程之非阻塞超时重传》要点: 本文介绍了Mysql应用mysql的udf编程之非阻塞超时重传,希望对您有用。如果有疑问,可以联系我们。
MYSQL数据库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
MYSQL数据库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,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,char *message) { if (args->arg_count < 3 ) { ??? strcpy(message,"Wrong arguments to http_post; "); ??? return 1; }
MYSQL数据库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; ??? }
MYSQL数据库} ?? return 0;
MYSQL数据库}
MYSQL数据库/淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱* ** 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; ????????? }
MYSQL数据库}
MYSQL数据库/淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱 ** 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, ??????????????? char *is_null __attribute__((unused)), ??????????????? char *error __attribute__((unused))) { ??? int sockfd=0; ??? int numbytes=0; ??? int flags=0; ??? int cycletimes=0; ??? char* sendBuffer=NULL;
MYSQL数据库??? fd_set wset; ??? struct timeval tval; ??? tval.tv_sec = 0; ??? tval.tv_usec = 300000;
MYSQL数据库??? if(initid->ptr == NULL) ??? { ??????? char sendArray[160000] = " "; ??????? sendBuffer=sendArray; ??? } ??? else ??? { ??????? sendBuffer = initid->ptr; ??? }
MYSQL数据库??? 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);
MYSQL数据库??? if(args->arg_count == 4 && (args->args[3]!=NULL) ) ??? { ??????? int argsNum = strlen(args->args[3]); ??????? sprintf(sendBuffer,"POST /?%s HTTP/1.1rnContent-Length:%drnrn%s",args->args[2],argsNum,args->args[3]); ??? } ??? else ??? { ??????? sprintf(sendBuffer,"POST /?%s HTTP/1.1rn",args->args[2]); ??? }
MYSQL数据库??? 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,&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>
编程之家PHP培训学院每天发布《Mysql应用mysql的udf编程之非阻塞超时重传》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|