22 #include <drizzled/plugin/function.h>
23 #include <drizzled/function/str/strfunc.h>
24 #include <drizzled/charset.h>
25 #include <drizzled/error.h>
27 #include <curl/curl.h>
29 using namespace drizzled;
37 void fix_length_and_dec();
38 const char *func_name()
const {
return "http_get"; }
40 bool check_argument_count(
int n)
47 http_get_result_cb(
void *ptr,
size_t size,
size_t nmemb,
void *data);
50 http_get_result_cb(
void *ptr,
size_t size,
size_t nmemb,
void *data)
52 size_t realsize= size * nmemb;
55 result->reserve(realsize + 1);
56 result->append((
const char*)ptr, realsize);
65 String *url = args[0]->val_str(str);
69 if ((null_value=args[0]->null_value))
72 curl= curl_easy_init();
73 curl_easy_setopt(curl, CURLOPT_URL, url->c_str());
74 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http_get_result_cb);
75 curl_easy_setopt(curl, CURLOPT_WRITEDATA, (
void *)&result);
76 curl_easy_setopt(curl, CURLOPT_USERAGENT,
"drizzle-http-functions/1.0");
77 retref= curl_easy_perform(curl);
78 curl_easy_cleanup(curl);
81 my_error(ER_GET_ERRMSG, MYF(0), retref, curl_easy_strerror(retref),
87 void HttpGetFunction::fix_length_and_dec()
89 collation.set(args[0]->collation);
99 void fix_length_and_dec();
100 const char *func_name()
const {
return "http_post"; }
102 bool check_argument_count(
int n)
117 size_t length() {
return data->length(); }
119 size_t write(
void* dest,
size_t size)
121 size_t to_write= size;
123 if ((data->length() - progress) < to_write)
124 to_write= data->length() - progress;
126 memcpy(dest, data->ptr() + progress, to_write);
135 http_post_readfunc(
void *ptr,
size_t size,
size_t nmemb,
void *data);
138 http_post_readfunc(
void *ptr,
size_t size,
size_t nmemb,
void *data)
140 size_t realsize= size * nmemb;
143 return post_data->write(ptr, realsize);
149 String *url = args[0]->val_str(str);
152 HttpPostData post_data(args[1]->val_str(&post_storage));
154 if ((null_value=args[0]->null_value))
157 curl= curl_easy_init();
158 curl_easy_setopt(curl, CURLOPT_URL, url->c_str());
159 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http_get_result_cb);
160 curl_easy_setopt(curl, CURLOPT_POST, 1L);
161 curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, post_data.length());
162 curl_easy_setopt(curl, CURLOPT_READDATA, &post_data);
163 curl_easy_setopt(curl, CURLOPT_READFUNCTION, http_post_readfunc);
164 curl_easy_setopt(curl, CURLOPT_WRITEDATA, (
void *)&result);
165 curl_easy_setopt(curl, CURLOPT_USERAGENT,
"drizzle-http-functions/1.0");
166 curl_easy_perform(curl);
167 curl_easy_cleanup(curl);
172 void HttpPostFunction::fix_length_and_dec()
174 collation.set(args[0]->collation);
180 curl_global_init(CURL_GLOBAL_ALL);
181 context.add(
new plugin::Create_function<HttpGetFunction>(
"http_get"));
182 context.add(
new plugin::Create_function<HttpPostFunction>(
"http_post"));
186 DRIZZLE_DECLARE_PLUGIN
192 N_(
"HTTP_GET and HTTP_POST functions"),
198 DRIZZLE_DECLARE_PLUGIN_END;