加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Mysql应用mysql的udf编程之非阻塞超时重传

发布时间:2020-12-12 02:32:17 所属栏目:MySql教程 来源:网络整理
导读:《Mysql应用mysql的udf编程之非阻塞超时重传》要点: 本文介绍了Mysql应用mysql的udf编程之非阻塞超时重传,希望对您有用。如果有疑问,可以联系我们。 MYSQL数据库 MySQL的UDF(User Defined Function)类似于一种API,用户根据一定的规范用C/C++(或采用C调用

《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全面培养人才。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读