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