Changeset: f3c92bdfb810 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f3c92bdfb810
Added Files:
        clients/mapiclient/curl-stream.h
Modified Files:
        clients/examples/C/CMakeLists.txt
        clients/examples/C/streamcat.c
        clients/mapiclient/CMakeLists.txt
Branch: ascii-flag
Log Message:

Use a single source for open_urlstream (CURL support).


diffs (182 lines):

diff --git a/clients/examples/C/CMakeLists.txt 
b/clients/examples/C/CMakeLists.txt
--- a/clients/examples/C/CMakeLists.txt
+++ b/clients/examples/C/CMakeLists.txt
@@ -43,6 +43,10 @@ target_link_libraries(smack01
 add_executable(streamcat
   streamcat.c)
 
+target_include_directories(streamcat
+  PRIVATE
+  ../../mapiclient)
+
 target_link_libraries(streamcat
   PRIVATE
   monetdb_config_header
diff --git a/clients/examples/C/streamcat.c b/clients/examples/C/streamcat.c
--- a/clients/examples/C/streamcat.c
+++ b/clients/examples/C/streamcat.c
@@ -437,68 +437,20 @@ opener_rastream(char *filename)
 }
 
 #ifdef HAVE_CURL
-#include <curl/curl.h>
-
-#ifndef CURL_WRITEFUNC_ERROR
-#define CURL_WRITEFUNC_ERROR 0
-#endif
-
-static size_t
-write_callback(char *buffer, size_t size, size_t nitems, void *userp)
-{
-       stream *s = userp;
-
-       /* size is expected to always be 1 */
-
-       ssize_t sz = mnstr_write(s, buffer, size, nitems);
-       if (sz < 0)
-               return CURL_WRITEFUNC_ERROR; /* indicate failure to library */
-       return (size_t) sz * size;
-}
+#include "curl-stream.h"
 
 static stream *
-open_urlstream(const char *url)
+opener_urlstream(char *url)
 {
-       CURL *handle;
-       stream *s;
-       CURLcode ret;
        char errbuf[CURL_ERROR_SIZE];
-
-       s = buffer_wastream(NULL, url);
-       if (s == NULL) {
-               return NULL;
-       }
-
-       if ((handle = curl_easy_init()) == NULL) {
-               mnstr_destroy(s);
-               return NULL;
-       }
-
-       errbuf[0] = 0;
-
-       if ((ret = curl_easy_setopt(handle, CURLOPT_ERRORBUFFER, errbuf)) != 
CURLE_OK ||
-           (ret = curl_easy_setopt(handle, CURLOPT_URL, url)) != CURLE_OK ||
-           (ret = curl_easy_setopt(handle, CURLOPT_WRITEDATA, s)) != CURLE_OK 
||
-           (ret = curl_easy_setopt(handle, CURLOPT_VERBOSE, 0)) != CURLE_OK ||
-           (ret = curl_easy_setopt(handle, CURLOPT_NOSIGNAL, 1)) != CURLE_OK ||
-           (ret = curl_easy_setopt(handle, CURLOPT_FAILONERROR, 1)) != 
CURLE_OK ||
-           (ret = curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, 
write_callback)) != CURLE_OK ||
-           (ret = curl_easy_perform(handle)) != CURLE_OK) {
-               curl_easy_cleanup(handle);
-               mnstr_destroy(s);
-               if (errbuf[0])
-                       fprintf(stderr, "%s\n", errbuf);
-               else
-                       fprintf(stderr, "%s\n", curl_easy_strerror(ret));
-               return NULL;
-       }
-       curl_easy_cleanup(handle);
-       (void) mnstr_get_buffer(s);     /* switch to read-only */
+       stream *s = open_urlstream(url,  errbuf);
+       if (s == NULL)
+               fprintf(stderr, "%s\n", errbuf);
        return s;
 }
 #else
 static stream *
-open_urlstream(const char *url)
+opener_urlstream(char *url)
 {
        (void) url;
        return NULL;
@@ -506,13 +458,6 @@ open_urlstream(const char *url)
 #endif
 
 static stream *
-opener_urlstream(char *url)
-{
-       stream *s = open_urlstream(url);
-       return s;
-}
-
-static stream *
 opener_wstream(char *filename)
 {
        stream *s = open_wstream(filename);
diff --git a/clients/mapiclient/CMakeLists.txt 
b/clients/mapiclient/CMakeLists.txt
--- a/clients/mapiclient/CMakeLists.txt
+++ b/clients/mapiclient/CMakeLists.txt
@@ -38,7 +38,8 @@ target_sources(mclient
   ReadlineTools.c
   ReadlineTools.h
   mhelp.c
-  mhelp.h)
+  mhelp.h
+  curl-stream.h)
 
 target_include_directories(mclient
   PRIVATE
diff --git a/clients/mapiclient/curl-stream.h b/clients/mapiclient/curl-stream.h
new file mode 100644
--- /dev/null
+++ b/clients/mapiclient/curl-stream.h
@@ -0,0 +1,58 @@
+#include <curl/curl.h>
+
+#ifndef CURL_WRITEFUNC_ERROR
+#define CURL_WRITEFUNC_ERROR 0
+#endif
+
+static size_t
+write_callback(char *buffer, size_t size, size_t nitems, void *userp)
+{
+       stream *s = userp;
+
+       /* size is expected to always be 1 */
+
+       ssize_t sz = mnstr_write(s, buffer, size, nitems);
+       if (sz < 0)
+               return CURL_WRITEFUNC_ERROR; /* indicate failure to library */
+       return (size_t) sz * size;
+}
+
+static stream *
+open_urlstream(const char *url, char *errbuf)
+{
+       CURL *handle;
+       stream *s;
+       CURLcode ret;
+
+       s = buffer_wastream(NULL, url);
+       if (s == NULL) {
+               snprintf(errbuf, CURL_ERROR_SIZE, "could not allocate memory");
+               return NULL;
+       }
+
+       if ((handle = curl_easy_init()) == NULL) {
+               mnstr_destroy(s);
+               snprintf(errbuf, CURL_ERROR_SIZE, "could not create CURL 
handle");
+               return NULL;
+       }
+
+       errbuf[0] = 0;
+
+       if ((ret = curl_easy_setopt(handle, CURLOPT_ERRORBUFFER, errbuf)) != 
CURLE_OK ||
+           (ret = curl_easy_setopt(handle, CURLOPT_URL, url)) != CURLE_OK ||
+           (ret = curl_easy_setopt(handle, CURLOPT_WRITEDATA, s)) != CURLE_OK 
||
+           (ret = curl_easy_setopt(handle, CURLOPT_VERBOSE, 0)) != CURLE_OK ||
+           (ret = curl_easy_setopt(handle, CURLOPT_NOSIGNAL, 1)) != CURLE_OK ||
+           (ret = curl_easy_setopt(handle, CURLOPT_FAILONERROR, 1)) != 
CURLE_OK ||
+           (ret = curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, 
write_callback)) != CURLE_OK ||
+           (ret = curl_easy_perform(handle)) != CURLE_OK) {
+               curl_easy_cleanup(handle);
+               mnstr_destroy(s);
+               if (errbuf[0] == 0)
+                       snprintf(errbuf, CURL_ERROR_SIZE, "%s", 
curl_easy_strerror(ret));
+               return NULL;
+       }
+       curl_easy_cleanup(handle);
+       (void) mnstr_get_buffer(s);     /* switch to read-only */
+       return s;
+}
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to