《Mysql應用mysql的udf編程之非阻塞超時重傳》要點:
本文介紹了Mysql應用mysql的udf編程之非阻塞超時重傳,希望對您有用。如果有疑問,可以聯系我們。
MYSQL數據庫MySQL的UDF(User Defined Function)類似于一種API, 用戶根據一定的規范用C/C++(或采用C調用規范的語言)編寫一組函數(UDF),然后編譯成動態鏈接庫,通過DROP FUNCTION語句來加載和卸載UDF.UDF被加載后可以像調用MySQL的內置函數一樣來調用它,并且服務器在啟動時會自動加載本來存在的UDF.
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, 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;
}
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, 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;
MYSQL數據庫??? fd_set wset;
??? struct timeval tval;
??? tval.tv_sec = 0;
??? tval.tv_usec = 300000;
MYSQL數據庫??? if(initid->ptr == NULL)
??? {
??????? char sendArray[160000] = "\0";
??????? 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.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]);
??? }
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, 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>
維易PHP培訓學院每天發布《Mysql應用mysql的udf編程之非阻塞超時重傳》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。