📜 ⬆️ ⬇️

PostgreSQL recipes: cURL: get, post and ... email

To make cURL in PostgreSQL, we need postgres itself and its pg_curl extension. (I gave links to my postgres fork, because I made some changes that I couldn’t get into the original repository yet. You can also use a ready-made way .)

First, install the extension with the command

CREATE EXTENSION pg_curl 

For get request, create a function

 CREATE OR REPLACE FUNCTION get(url TEXT) RETURNS TEXT LANGUAGE SQL AS $BODY$ WITH s AS (SELECT pg_curl_easy_init(), --  pg_curl_easy_reset(), --  (  ) pg_curl_easy_setopt('CURLOPT_URL', url), --    pg_curl_header_append('Connection', 'close'), --     pg_curl_easy_perform(), --   pg_curl_easy_getinfo_char('CURLINFO_RESPONSE'), --     pg_curl_easy_cleanup() --  ) SELECT pg_curl_easy_getinfo_char FROM s; --     $BODY$; 

For urlencoded post request create function
')
 CREATE OR REPLACE FUNCTION post(url TEXT, request JSON) RETURNS TEXT LANGUAGE SQL AS $BODY$ WITH s AS (SELECT pg_curl_easy_init(), --  pg_curl_easy_reset(), --  (  ) pg_curl_easy_setopt('CURLOPT_URL', url), --    pg_curl_header_append('Connection', 'close'), --     pg_curl_easy_setopt('CURLOPT_COPYPOSTFIELDS', ( --    WITH s AS ( SELECT (json_each_text(request)).* --    json- ) SELECT array_to_string(array_agg(concat_ws('=', --    urlencoded pg_curl_easy_escape(key), pg_curl_easy_escape(value) )), '&') FROM s )), pg_curl_easy_perform(), --   pg_curl_easy_getinfo_char('CURLINFO_RESPONSE'), --     pg_curl_easy_cleanup() --  ) SELECT pg_curl_easy_getinfo_char FROM s; --     $BODY$; 

For the json post request, create a function

 CREATE OR REPLACE FUNCTION post(url TEXT, request JSON) RETURNS TEXT LANGUAGE SQL AS $BODY$ WITH s AS (SELECT pg_curl_easy_init(), --  pg_curl_easy_reset(), --  (  ) pg_curl_easy_setopt('CURLOPT_URL', url), --    pg_curl_header_append('Content-Type', 'application/json; charset=utf-8'), --    pg_curl_header_append('Connection', 'close'), --     pg_curl_easy_setopt('CURLOPT_COPYPOSTFIELDS', request::TEXT), --    pg_curl_easy_perform(), --   pg_curl_easy_getinfo_char('CURLINFO_RESPONSE'), --     pg_curl_easy_cleanup() --  ) SELECT pg_curl_easy_getinfo_char FROM s; --     $BODY$; 

To send mail, create a function

 CREATE OR REPLACE FUNCTION email(url TEXT, username TEXT, password TEXT, subject TEXT, "from" TEXT, "to" TEXT[], data TEXT, type TEXT) RETURNS TEXT LANGUAGE SQL AS $BODY$ WITH s AS (SELECT pg_curl_easy_init(), --  pg_curl_easy_reset(), --  (  ) pg_curl_easy_setopt('CURLOPT_URL', url), --    pg_curl_easy_setopt('CURLOPT_USERNAME', username), --   pg_curl_easy_setopt('CURLOPT_PASSWORD', password), --   pg_curl_recipient_append("to"), --   pg_curl_header_append('Subject', subject), --   pg_curl_header_append('From', "from"), --   pg_curl_header_append('To', "to"), --   pg_curl_mime_data(data, type:=type), --   pg_curl_header_append('Connection', 'close'), --    pg_curl_easy_perform(), --  pg_curl_easy_getinfo_char('CURLINFO_HEADERS'), --   pg_curl_easy_cleanup() --  ) SELECT pg_curl_easy_getinfo_char FROM s; --   $BODY$; 

And all this can be done asynchronously in the background using the scheduler .

Source: https://habr.com/ru/post/456736/


All Articles