《Mysql應(yīng)用mysql的udf編程之非阻塞超時(shí)重傳》要點(diǎn):
本文介紹了Mysql應(yīng)用mysql的udf編程之非阻塞超時(shí)重傳,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
MYSQL數(shù)據(jù)庫(kù)MySQL的UDF(User Defined Function)類(lèi)似于一種API, 用戶(hù)根據(jù)一定的規(guī)范用C/C++(或采用C調(diào)用規(guī)范的語(yǔ)言)編寫(xiě)一組函數(shù)(UDF),然后編譯成動(dòng)態(tài)鏈接庫(kù),通過(guò)DROP FUNCTION語(yǔ)句來(lái)加載和卸載UDF.UDF被加載后可以像調(diào)用MySQL的內(nèi)置函數(shù)一樣來(lái)調(diào)用它,并且服務(wù)器在啟動(dòng)時(shí)會(huì)自動(dòng)加載本來(lái)存在的UDF.
MYSQL數(shù)據(jù)庫(kù)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數(shù)據(jù)庫(kù)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數(shù)據(jù)庫(kù)}
?? return 0;
MYSQL數(shù)據(jù)庫(kù)}
MYSQL數(shù)據(jù)庫(kù)/淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂*
** 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數(shù)據(jù)庫(kù)}
MYSQL數(shù)據(jù)庫(kù)/淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂淫亂
** 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數(shù)據(jù)庫(kù)??? fd_set wset;
??? struct timeval tval;
??? tval.tv_sec = 0;
??? tval.tv_usec = 300000;
MYSQL數(shù)據(jù)庫(kù)??? if(initid->ptr == NULL)
??? {
??????? char sendArray[160000] = "\0";
??????? sendBuffer=sendArray;
??? }
??? else
??? {
??????? sendBuffer = initid->ptr;
??? }
MYSQL數(shù)據(jù)庫(kù)??? 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數(shù)據(jù)庫(kù)??? 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數(shù)據(jù)庫(kù)??? 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);//設(shè)置為非壅閉
??? 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培訓(xùn)學(xué)院每天發(fā)布《Mysql應(yīng)用mysql的udf編程之非阻塞超時(shí)重傳》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/13603.html