欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql的udf編程之非阻塞超時(shí)重傳

 更新時(shí)間:2014年03月12日 10:51:03   作者:  
這篇文章主要介紹了mysql udf編程的非阻塞超時(shí)重傳示例,需要的朋友可以參考下

MySQL的UDF(User Defined Function)類似于一種API, 用戶根據(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。

復(fù)制代碼 代碼如下:

#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

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 = inet_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 = 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>


相關(guān)文章

  • MySQL關(guān)于sql_mode解析與設(shè)置講解

    MySQL關(guān)于sql_mode解析與設(shè)置講解

    今天小編就為大家分享一篇關(guān)于MySQL關(guān)于sql_mode解析與設(shè)置講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • mysql增加新用戶無(wú)法登陸解決方法

    mysql增加新用戶無(wú)法登陸解決方法

    在使用mysql增加新用戶之后,發(fā)現(xiàn)新增的用戶無(wú)法登陸,一時(shí)束手無(wú)策,網(wǎng)上搜集整理了一下,曬出來(lái)和大家分享一下,希望可以幫助你們
    2012-11-11
  • MySQL中的聚簇索引、非聚簇索引、聯(lián)合索引和唯一索引詳細(xì)介紹

    MySQL中的聚簇索引、非聚簇索引、聯(lián)合索引和唯一索引詳細(xì)介紹

    本文主要介紹了MySQL的索引類型,根據(jù)索引的存儲(chǔ)方式來(lái)劃分,索引可以分為聚簇索引和非聚簇索引。聚簇索引的特點(diǎn)是葉子節(jié)點(diǎn)包含了完整的記錄行,而非聚簇索引的葉子節(jié)點(diǎn)只有所以字段和主鍵ID,感興趣的同學(xué)可以閱讀本文
    2023-04-04
  • Windows8下mysql 5.6.15 安裝配置方法圖文教程

    Windows8下mysql 5.6.15 安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了Windows8下mysql 5.6.15 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Linux下MySQL安裝配置 MySQL配置參數(shù)詳解

    Linux下MySQL安裝配置 MySQL配置參數(shù)詳解

    Linux下MySQL安裝配置 MySQL配置參數(shù)詳解,在linux下配置mysql的朋友可以參考下。
    2011-07-07
  • MySQL DDL 引發(fā)的同步延遲該如何解決

    MySQL DDL 引發(fā)的同步延遲該如何解決

    這篇文章主要介紹了MySQL DDL 引發(fā)的同步延遲該如何解決,幫助大家更好的理解和學(xué)習(xí)使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2021-05-05
  • Mysql學(xué)習(xí)心得之插入、更新、刪除記錄

    Mysql學(xué)習(xí)心得之插入、更新、刪除記錄

    在程序開(kāi)發(fā)過(guò)程中,離不開(kāi)數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)離不開(kāi)增刪改查操作,下面小編把我對(duì)mysql學(xué)習(xí)之插入、更新、刪除記錄心得總結(jié)分享給大家,需要的朋友可以參考下
    2015-08-08
  • MySql?update語(yǔ)句的詳細(xì)用法

    MySql?update語(yǔ)句的詳細(xì)用法

    這篇文章主要給大家介紹了關(guān)于MySql?update語(yǔ)句的詳細(xì)用法,Update 是SQL中用于更新表格中已有記錄的命令,通過(guò)使用Update命令,您可以更新表格中的一行或多行記錄,并根據(jù)需要更改它們的值,需要的朋友可以參考下
    2023-11-11
  • MySQL中數(shù)據(jù)類型相關(guān)的優(yōu)化辦法

    MySQL中數(shù)據(jù)類型相關(guān)的優(yōu)化辦法

    這篇文章主要介紹了MySQL中數(shù)據(jù)類型相關(guān)的優(yōu)化辦法,包括使用多列索引等相關(guān)的優(yōu)化方法,需要的朋友可以參考下
    2015-07-07
  • mysql?體系結(jié)構(gòu)和存儲(chǔ)引擎介紹

    mysql?體系結(jié)構(gòu)和存儲(chǔ)引擎介紹

    這篇文章主要介紹了mysql?體系結(jié)構(gòu)和存儲(chǔ)引擎,通過(guò)mysql數(shù)據(jù)庫(kù)常見(jiàn)的數(shù)據(jù)庫(kù)引擎展開(kāi)各個(gè)引擎之間的特性和區(qū)別。下文更多相關(guān)資料介紹感興趣的小伙伴可以參考一下
    2022-05-05

最新評(píng)論