Changeset: b35d66612032 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b35d66612032
Branch: ascii-flag
Log Message:

Merge with default branch.


diffs (truncated from 2731 to 300 lines):

diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml
--- a/.github/workflows/linux.yml
+++ b/.github/workflows/linux.yml
@@ -43,7 +43,7 @@ jobs:
     runs-on: ${{ matrix.os }}
     steps:
       - name: Checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
           ref: ${{ github.ref }}
 
@@ -129,7 +129,7 @@ jobs:
       - name: Tar files
         run: tar -cvf mtests.tar mTests
       - name: Publish mtest results
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         with:
           name: mtest-${{ github.sha }}-${{ matrix.os }}-${{ matrix.c_compiler 
}}
           path: mtests.tar
diff --git a/clients/Tests/MAL-signatures-hge.test 
b/clients/Tests/MAL-signatures-hge.test
--- a/clients/Tests/MAL-signatures-hge.test
+++ b/clients/Tests/MAL-signatures-hge.test
@@ -50440,7 +50440,12 @@ SQLwindow_bound;
 computes window ranges for each row
 sqlcatalog
 alter_add_range_partition
-pattern sqlcatalog.alter_add_range_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:any_1, X_5:any_1, X_6:bit, X_7:int):void 
+pattern sqlcatalog.alter_add_range_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:any_1, X_5:any_1, X_6:bit, X_7:int, X_8:bat[:lng]):void 
+SQLalter_add_range_partition;
+Catalog operation alter_add_range_partition
+sqlcatalog
+alter_add_range_partition
+pattern sqlcatalog.alter_add_range_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:any_1, X_5:any_1, X_6:bit, X_7:int, X_8:lng):void 
 SQLalter_add_range_partition;
 Catalog operation alter_add_range_partition
 sqlcatalog
@@ -50450,12 +50455,22 @@ SQLalter_add_table;
 Catalog operation alter_add_table
 sqlcatalog
 alter_add_value_partition
-pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:bit, X_5:int):void 
+pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:bit, X_5:int, X_6:bat[:lng]):void 
 SQLalter_add_value_partition;
 Catalog operation alter_add_value_partition
 sqlcatalog
 alter_add_value_partition
-pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:bit, X_5:int, X_6:any...):void 
+pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:bit, X_5:int, X_6:bat[:lng], X_7:any...):void 
+SQLalter_add_value_partition;
+Catalog operation alter_add_value_partition
+sqlcatalog
+alter_add_value_partition
+pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:bit, X_5:int, X_6:lng):void 
+SQLalter_add_value_partition;
+Catalog operation alter_add_value_partition
+sqlcatalog
+alter_add_value_partition
+pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:bit, X_5:int, X_6:lng, X_7:any...):void 
 SQLalter_add_value_partition;
 Catalog operation alter_add_value_partition
 sqlcatalog
diff --git a/clients/Tests/MAL-signatures.test 
b/clients/Tests/MAL-signatures.test
--- a/clients/Tests/MAL-signatures.test
+++ b/clients/Tests/MAL-signatures.test
@@ -38765,7 +38765,12 @@ SQLwindow_bound;
 computes window ranges for each row
 sqlcatalog
 alter_add_range_partition
-pattern sqlcatalog.alter_add_range_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:any_1, X_5:any_1, X_6:bit, X_7:int):void 
+pattern sqlcatalog.alter_add_range_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:any_1, X_5:any_1, X_6:bit, X_7:int, X_8:bat[:lng]):void 
+SQLalter_add_range_partition;
+Catalog operation alter_add_range_partition
+sqlcatalog
+alter_add_range_partition
+pattern sqlcatalog.alter_add_range_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:any_1, X_5:any_1, X_6:bit, X_7:int, X_8:lng):void 
 SQLalter_add_range_partition;
 Catalog operation alter_add_range_partition
 sqlcatalog
@@ -38775,12 +38780,22 @@ SQLalter_add_table;
 Catalog operation alter_add_table
 sqlcatalog
 alter_add_value_partition
-pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:bit, X_5:int):void 
+pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:bit, X_5:int, X_6:bat[:lng]):void 
 SQLalter_add_value_partition;
 Catalog operation alter_add_value_partition
 sqlcatalog
 alter_add_value_partition
-pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:bit, X_5:int, X_6:any...):void 
+pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:bit, X_5:int, X_6:bat[:lng], X_7:any...):void 
+SQLalter_add_value_partition;
+Catalog operation alter_add_value_partition
+sqlcatalog
+alter_add_value_partition
+pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:bit, X_5:int, X_6:lng):void 
+SQLalter_add_value_partition;
+Catalog operation alter_add_value_partition
+sqlcatalog
+alter_add_value_partition
+pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str, 
X_3:str, X_4:bit, X_5:int, X_6:lng, X_7:any...):void 
 SQLalter_add_value_partition;
 Catalog operation alter_add_value_partition
 sqlcatalog
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1728,7 +1728,6 @@ int mnstr_writeShtArray(stream *restrict
 int mnstr_writeStr(stream *restrict s, const char *restrict val);
 stream *open_rastream(const char *filename);
 stream *open_rstream(const char *filename);
-stream *open_urlstream(const char *url);
 stream *open_wastream(const char *filename);
 stream *open_wstream(const char *filename);
 stream *openssl_rstream(const char *hostname, BIO *bio);
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
@@ -46,7 +46,8 @@ add_executable(streamcat
 target_link_libraries(streamcat
   PRIVATE
   monetdb_config_header
-  stream)
+  stream
+  $<$<BOOL:${CURL_FOUND}>:CURL::libcurl>)
 
 add_executable(testcondvar
   testcondvar.c)
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
@@ -436,6 +436,71 @@ opener_rastream(char *filename)
        return s;
 }
 
+#ifdef HAVE_CURL
+#include <curl/curl.h>
+
+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)
+{
+       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 */
+       return s;
+}
+#else
+static stream *
+open_urlstream(const char *url)
+{
+       (void) url;
+       return NULL;
+}
+#endif
+
 static stream *
 opener_urlstream(char *url)
 {
diff --git a/clients/mapiclient/CMakeLists.txt 
b/clients/mapiclient/CMakeLists.txt
--- a/clients/mapiclient/CMakeLists.txt
+++ b/clients/mapiclient/CMakeLists.txt
@@ -54,6 +54,7 @@ target_link_libraries(mclient
   mapi
   stream
   $<$<BOOL:${READLINE_FOUND}>:Readline::Readline>
+  $<$<BOOL:${CURL_FOUND}>:CURL::libcurl>
   $<$<BOOL:${Iconv_FOUND}>:Iconv::Iconv>
   $<$<PLATFORM_ID:Windows>:${GETOPT_LIB}>)
 
diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c
--- a/clients/mapiclient/mclient.c
+++ b/clients/mapiclient/mclient.c
@@ -3072,10 +3072,70 @@ doFile(Mapi mid, stream *fp, bool useins
        return errseen;
 }
 
+#ifdef HAVE_CURL
+#include <curl/curl.h>
+
+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;
+}
+#endif
+
 struct privdata {
        stream *f;
        char *buf;
        Mapi mid;
+#ifdef HAVE_CURL
+       char errbuf[CURL_ERROR_SIZE];
+#endif
 };
 
 #define READSIZE       (1 << 16)
@@ -3086,7 +3146,7 @@ static const char alpha[] = "ABCDEFGHIJK
 
 static char *
 getfile(void *data, const char *filename, bool binary,
-       uint64_t offset, size_t *size)
+               uint64_t offset, size_t *size)
 {
        stream *f;
        char *buf;
@@ -3116,9 +3176,13 @@ getfile(void *data, const char *filename
                                    && filename[x] == ':'
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to