以下是题外话: 一般情况下原文中我不会贴源代码,(主要太影响别人阅读,都是说到哪儿,截取那部分,而且我写博客的版式不太好,但是我觉的我把我知道的技术分享给需要的人才是最重要的,)一般都是放附件或者网盘,评论区留邮箱也会发附件等等,但之前我一篇文章中分段贴了源码有人竟然说我的附件不能用,我看了下载记录他并没有下载,想着让我给他发原件,我就呵呵了,你要是没有积分,留个邮箱我一般看见了也会直接发附件的,技术是一个分享过程,而不是在别人评论区瞎喊,旺柴,你记住了么
最后贴出源文件:
#include <mysql.h> #include <string.h> #include <stdio.h> #include <curl/curl.h> #include "mysql-udf-http.h" my_bool http_get_init(UDF_INIT *initid, UDF_ARGS *args, char *message); char *http_get(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error); void http_get_deinit(UDF_INIT *initid); my_bool http_post_init(UDF_INIT *initid, UDF_ARGS *args, char *message); char *http_post(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error); void http_post_deinit(UDF_INIT *initid); my_bool http_put_init(UDF_INIT *initid, UDF_ARGS *args, char *message); char *http_put(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error); void http_put_deinit(UDF_INIT *initid); my_bool http_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message); char *http_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error); void http_delete_deinit(UDF_INIT *initid); static void *myrealloc(void *ptr, size_t size) { /* There might be a realloc() out there that doesn't like reallocing NULL pointers, so we take care of it here */ if (ptr) return realloc(ptr, size); else return malloc(size); } static size_t result_cb(void *ptr, size_t size, size_t nmemb, void *data) { size_t realsize= size * nmemb; struct st_curl_results *res= (struct st_curl_results *)data; res->result= (char *)myrealloc(res->result, res->size + realsize + 1); if (res->result) { memcpy(&(res->result[res->size]), ptr, realsize); res->size += realsize; res->result[res->size]= 0; } return realsize; } /* ------------------------HTTP GET----------------------------- */ my_bool http_get_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { st_curl_results *container; if (args->arg_count != 1) { strncpy(message, "one argument must be supplied: http_get('<url>').", MYSQL_ERRMSG_SIZE); return 1; } args->arg_type[0]= STRING_RESULT; initid->max_length= CURL_UDF_MAX_SIZE; container= (st_curl_results *)malloc(sizeof(st_curl_results)); initid->ptr= (char *)container; return 0; } char *http_get(UDF_INIT *initid, UDF_ARGS *args, __attribute__ ((unused)) char *result, unsigned long *length, __attribute__ ((unused)) char *is_null, __attribute__ ((unused)) char *error) { CURLcode retref; CURL *curl; st_curl_results *res= (st_curl_results *)initid->ptr; curl_global_init(CURL_GLOBAL_ALL); curl= curl_easy_init(); res->result= NULL; res->size= 0; if (curl) { curl_easy_setopt(curl, CURLOPT_URL, args->args[0]); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, result_cb); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)res); curl_easy_setopt(curl, CURLOPT_USERAGENT, "mysql-udf-http/1.0"); retref= curl_easy_perform(curl); if (retref) { fprintf(stderr, "error\n"); strcpy(res->result,""); *length= 0; } } else { strcpy(res->result,""); *length= 0; } curl_easy_cleanup(curl); *length= res->size; return ((char *) res->result); } void http_get_deinit(UDF_INIT *initid) { /* if we allocated initid->ptr, free it here */ st_curl_results *res= (st_curl_results *)initid->ptr; free(res->result); free(res); return; } /* ------------------------HTTP POST----------------------------- */ my_bool http_post_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { st_curl_results *container; if (args->arg_count != 2) { strncpy(message, "two arguments must be supplied: http_post('<url>','<data>').", MYSQL_ERRMSG_SIZE); return 1; } args->arg_type[0]= STRING_RESULT; initid->max_length= CURL_UDF_MAX_SIZE; container= (st_curl_results *)malloc(sizeof(st_curl_results)); initid->ptr= (char *)container; return 0; } char *http_post(UDF_INIT *initid, UDF_ARGS *args, __attribute__ ((unused)) char *result, unsigned long *length, __attribute__ ((unused)) char *is_null, __attribute__ ((unused)) char *error) { CURLcode retref; CURL *curl; st_curl_results *res= (st_curl_results *)initid->ptr; curl_global_init(CURL_GLOBAL_ALL); curl= curl_easy_init(); res->result= NULL; res->size= 0; if (curl) { struct curl_slist *chunk = NULL; chunk = curl_slist_append(chunk, "Expect:"); curl_easy_setopt(curl, CURLOPT_URL, args->args[0]); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, result_cb); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)res); curl_easy_setopt(curl, CURLOPT_USERAGENT, "mysql-udf-http/1.0"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, args->args[1]); retref= curl_easy_perform(curl); if (retref) { fprintf(stderr, "error\n"); strcpy(res->result,""); *length= 0; } } else { strcpy(res->result,""); *length= 0; } curl_easy_cleanup(curl); *length= res->size; return ((char *) res->result); } void http_post_deinit(UDF_INIT *initid) { /* if we allocated initid->ptr, free it here */ st_curl_results *res= (st_curl_results *)initid->ptr; free(res->result); free(res); return; } /* ------------------------HTTP PUT----------------------------- */ my_bool http_put_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { st_curl_results *container; if (args->arg_count != 2) { strncpy(message, "two arguments must be supplied: http_put('<url>','<data>').", MYSQL_ERRMSG_SIZE); return 1; } args->arg_type[0]= STRING_RESULT; initid->max_length= CURL_UDF_MAX_SIZE; container= (st_curl_results *)malloc(sizeof(st_curl_results)); initid->ptr= (char *)container; return 0; } char *http_put(UDF_INIT *initid, UDF_ARGS *args, __attribute__ ((unused)) char *result, unsigned long *length, __attribute__ ((unused)) char *is_null, __attribute__ ((unused)) char *error) { CURLcode retref; CURL *curl; st_curl_results *res= (st_curl_results *)initid->ptr; curl_global_init(CURL_GLOBAL_ALL); curl= curl_easy_init(); res->result= NULL; res->size= 0; if (curl) { struct curl_slist *chunk = NULL; chunk = curl_slist_append(chunk, "Expect:"); curl_easy_setopt(curl, CURLOPT_URL, args->args[0]); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, result_cb); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)res); curl_easy_setopt(curl, CURLOPT_USERAGENT, "mysql-udf-http/1.0"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT"); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, args->args[1]); retref= curl_easy_perform(curl); if (retref) { fprintf(stderr, "error\n"); strcpy(res->result,""); *length= 0; } } else { strcpy(res->result,""); *length= 0; } curl_easy_cleanup(curl); *length= res->size; return ((char *) res->result); } void http_put_deinit(UDF_INIT *initid) { /* if we allocated initid->ptr, free it here */ st_curl_results *res= (st_curl_results *)initid->ptr; free(res->result); free(res); return; } /* ------------------------HTTP DELETE----------------------------- */ my_bool http_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { st_curl_results *container; if (args->arg_count != 1) { strncpy(message, "one arguments must be supplied: http_delete('<url>').", MYSQL_ERRMSG_SIZE); return 1; } args->arg_type[0]= STRING_RESULT; initid->max_length= CURL_UDF_MAX_SIZE; container= (st_curl_results *)malloc(sizeof(st_curl_results)); initid->ptr= (char *)container; return 0; } char *http_delete(UDF_INIT *initid, UDF_ARGS *args, __attribute__ ((unused)) char *result, unsigned long *length, __attribute__ ((unused)) char *is_null, __attribute__ ((unused)) char *error) { CURLcode retref; CURL *curl; st_curl_results *res= (st_curl_results *)initid->ptr; curl_global_init(CURL_GLOBAL_ALL); curl= curl_easy_init(); res->result= NULL; res->size= 0; if (curl) { curl_easy_setopt(curl, CURLOPT_URL, args->args[0]); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, result_cb); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)res); curl_easy_setopt(curl, CURLOPT_USERAGENT, "mysql-udf-http/1.0"); curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); retref= curl_easy_perform(curl); if (retref) { fprintf(stderr, "error\n"); strcpy(res->result,""); *length= 0; } } else { strcpy(res->result,""); *length= 0; } curl_easy_cleanup(curl); *length= res->size; return ((char *) res->result); } void http_delete_deinit(UDF_INIT *initid) { /* if we allocated initid->ptr, free it here */ st_curl_results *res= (st_curl_results *)initid->ptr; free(res->result); free(res); return; }