Skip to content

Commit a9d7ab6

Browse files
authored
Merge pull request #4 from pakrentos/dev
New HTTP methods
2 parents 36bb772 + 1e3e5f6 commit a9d7ab6

File tree

4 files changed

+135
-34
lines changed

4 files changed

+135
-34
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ sudo ./install.sh
2222

2323
### Usage
2424

25-
``` sql
26-
SELECT send_post([<URL or IP with port>] as alias0, data1 as alias1, data2 as alias2, ...) FROM ...;
25+
``` text
26+
SELECT send_<post/put/delete>([<URL or IP with port>] as alias0, data1 as alias1, data2 as alias2, ...) FROM ...;
2727
```
2828

2929
Returns 0 per request if request was successfully delivered (but HTTP response code could be 4xx or 5xx)

src/libmsqlcurl.c

Lines changed: 108 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -28,29 +28,107 @@ OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2828
#include <string.h>
2929
#include <my_global.h>
3030
#include <curl/curl.h>
31-
#include "mysql.h"
31+
#include <mysql.h>
3232
#include <stdarg.h>
3333

3434
my_bool send_post_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
3535
{
36-
if (args->arg_count < 2) {
37-
strcpy(message, "Send() requires >=2 arguments");
38-
return 1;
39-
}
40-
if (args->arg_type[0] != STRING_RESULT) {
41-
strcpy(message, "Send() requires [addr:string]");
42-
return 1;
43-
}
44-
return 0;
36+
return wrapped_init(initid, args, message);
4537
}
4638

4739
my_bool send_post_deinit(UDF_INIT *initid, UDF_ARGS *args, char *message)
4840
{
49-
if(initid->ptr){
41+
return wrapped_deinit(initid, args, message);
42+
}
43+
44+
long long send_post(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
45+
{
46+
CURLcode code = 1;
47+
char method[] = "POST";
48+
if (wrapup_request(args, method, &code))
49+
{
50+
*error = 1;
51+
}
52+
if (code)
53+
{
54+
*error = 1;
55+
}
56+
return code;
57+
}
58+
59+
my_bool send_put_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
60+
{
61+
return wrapped_init(initid, args, message);
62+
}
63+
64+
my_bool send_put_deinit(UDF_INIT *initid, UDF_ARGS *args, char *message)
65+
{
66+
return wrapped_deinit(initid, args, message);
67+
}
68+
69+
long long send_put(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
70+
{
71+
CURLcode code = 1;
72+
char method[] = "PUT";
73+
if (wrapup_request(args, method, &code))
74+
{
75+
*error = 1;
76+
}
77+
if (code)
78+
{
79+
*error = 1;
80+
}
81+
return code;
82+
}
83+
84+
my_bool send_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
85+
{
86+
return wrapped_init(initid, args, message);
87+
}
88+
89+
my_bool send_delete_deinit(UDF_INIT *initid, UDF_ARGS *args, char *message)
90+
{
91+
return wrapped_deinit(initid, args, message);
92+
}
93+
94+
long long send_delete(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
95+
{
96+
CURLcode code = 1;
97+
char method[] = "DELETE";
98+
if (wrapup_request(args, method, &code))
99+
{
100+
*error = 1;
101+
}
102+
if (code)
103+
{
104+
*error = 1;
105+
}
106+
return code;
107+
}
108+
109+
my_bool wrapped_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
110+
{
111+
if (args->arg_count < 2)
112+
{
113+
strcpy(message, "Function requires >=2 arguments");
114+
return 1;
115+
}
116+
if (args->arg_type[0] != STRING_RESULT)
117+
{
118+
strcpy(message, "Function requires [addr:string]");
119+
return 1;
120+
}
121+
return 0;
122+
}
123+
124+
my_bool wrapped_deinit(UDF_INIT *initid, UDF_ARGS *args, char *message)
125+
{
126+
if (initid->ptr)
127+
{
50128
free(initid->ptr);
51129
initid->ptr = NULL;
52130
}
53-
return 0;
131+
return 0;
54132
}
55133

56134
void json_string(char *res_str, char *attr_name, char *arg, enum Item_result arg_type, int trail_com)
@@ -125,7 +203,8 @@ void encapsulate_data(UDF_ARGS* udf_args, char** res_str)
125203
*res_str = (char *)calloc(res_len + 3, sizeof(char));
126204
**res_str = '{';
127205
unsigned long current_pos = 1;
128-
for(int i = 0; i < num_of_args; i++){
206+
for(int i = 0; i < num_of_args; i++)
207+
{
129208
strcpy((*res_str + current_pos), char_args[i]);
130209
current_pos += strlen(char_args[i]);
131210
free(char_args[i]);
@@ -134,28 +213,28 @@ void encapsulate_data(UDF_ARGS* udf_args, char** res_str)
134213
(*res_str)[res_len + 2] = '\0';
135214
}
136215

137-
long long send_post(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
216+
int wrapup_request(UDF_ARGS *args, const char *method, CURLcode *code)
138217
{
139218
curl_global_init(CURL_GLOBAL_ALL);
140-
char* addr = args->args[0];
141-
char* json = NULL;
219+
CURL *handle = curl_easy_init();
220+
char *addr = args->args[0];
221+
char *json = NULL;
142222
encapsulate_data(args, &json);
143-
if(json == NULL) {
144-
*error = 1;
145-
return 0;
223+
if (json == NULL || handle == NULL)
224+
{
225+
return 1;
146226
}
147-
CURL* handle = curl_easy_init();
148227
struct curl_slist *list = NULL;
149228
list = curl_slist_append(list, "Content-Type: application/json");
150-
list = curl_slist_append(list, "accept: application/json");
229+
curl_easy_setopt(handle, CURLOPT_CUSTOMREQUEST, method);
151230
curl_easy_setopt(handle, CURLOPT_HTTPHEADER, list);
152-
curl_easy_setopt(handle, CURLOPT_URL, addr);
153-
curl_easy_setopt(handle, CURLOPT_POSTFIELDS, json);
154-
CURLcode code = curl_easy_perform(handle);
155-
if(code != 0)
231+
curl_easy_setopt(handle, CURLOPT_URL, addr);
232+
curl_easy_setopt(handle, CURLOPT_POSTFIELDS, json);
233+
if(list == NULL)
156234
{
157-
*error = 1;
158-
}
159-
curl_global_cleanup();
160-
return code;
235+
return 1;
236+
}
237+
*code = curl_easy_perform(handle);
238+
curl_global_cleanup();
239+
return 0;
161240
}

src/libmsqlcurl.h

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
2121
OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2222
*/
2323

24-
#ifndef UNTITLED2_LIBRARY_H
25-
#define UNTITLED2_LIBRARY_H
24+
#ifndef LIBMYSQLCURL_LIBRARY_H
25+
#define LIBMYSQLCURL_LIBRARY_H
2626
#include <curl/curl.h>
2727
#include <mysql.h>
2828

@@ -32,6 +32,24 @@ my_bool send_post_deinit(UDF_INIT *, UDF_ARGS *, char *);
3232

3333
long long send_post(UDF_INIT *, UDF_ARGS *, char *, char *);
3434

35+
my_bool send_put_init(UDF_INIT *, UDF_ARGS *, char *);
36+
37+
my_bool send_put_deinit(UDF_INIT *, UDF_ARGS *, char *);
38+
39+
long long send_put(UDF_INIT *, UDF_ARGS *, char *, char *);
40+
41+
my_bool send_delete_init(UDF_INIT *, UDF_ARGS *, char *);
42+
43+
my_bool send_delete_deinit(UDF_INIT *, UDF_ARGS *, char *);
44+
45+
long long send_delete(UDF_INIT *, UDF_ARGS *, char *, char *);
46+
47+
my_bool wrapped_init(UDF_INIT *, UDF_ARGS *, char *);
48+
49+
my_bool wrapped_deinit(UDF_INIT *, UDF_ARGS *, char *);
50+
51+
int wrapup_request(UDF_ARGS *, const char *, CURLcode *);
52+
3553
void encapsulate_data(UDF_ARGS *, char **);
3654

3755
void json_string(char *, char *, char *, enum Item_result, int);

src/libmsqlcurl.sql

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,9 @@ OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2222
*/
2323

2424
DROP FUNCTION IF EXISTS send_post;
25+
DROP FUNCTION IF EXISTS send_put;
26+
DROP FUNCTION IF EXISTS send_delete;
2527

26-
CREATE FUNCTION send_post RETURNS integer SONAME 'libmsqlcurl.so';
28+
CREATE FUNCTION send_post RETURNS integer SONAME 'libmsqlcurl.so';
29+
CREATE FUNCTION send_put RETURNS integer SONAME 'libmsqlcurl.so';
30+
CREATE FUNCTION send_delete RETURNS integer SONAME 'libmsqlcurl.so';

0 commit comments

Comments
 (0)