Changeset: ceea046dfaaa for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ceea046dfaaa
Added Files:
        monetdb5/modules/atoms/Tests/curl00.mal
        monetdb5/modules/atoms/Tests/curl00.stable.err
        monetdb5/modules/atoms/Tests/curl00.stable.out
        monetdb5/modules/atoms/mcurl.c
        monetdb5/modules/atoms/mcurl.h
        monetdb5/modules/atoms/mcurl.mal
Modified Files:
        configure.ag
        monetdb5/modules/atoms/Makefile.ag
        monetdb5/modules/atoms/Tests/All
        monetdb5/modules/mal/mal_init.mal
Branch: default
Log Message:

wrap curl library functions in mal to be able to test jsonstore


diffs (truncated from 353 to 300 lines):

diff --git a/configure.ag b/configure.ag
--- a/configure.ag
+++ b/configure.ag
@@ -2104,6 +2104,7 @@ if test x"$have_curl" = x"yes" ; then
        AC_DEFINE(HAVE_CURL, 1, [Define if you have the cURL library])
        AC_SUBST(PKG_CURL, libcurl)
 fi
+AM_CONDITIONAL(HAVE_CURL, test x"$have_curl" != xno)
 
 PKG_CHECK_MODULES([zlib], [zlib], [have_zlib="yes"], [have_zlib="no"; 
why_have_zlib="(zlib not found)"])
 if test x"$have_zlib" = x"yes" ; then
diff --git a/monetdb5/modules/atoms/Makefile.ag 
b/monetdb5/modules/atoms/Makefile.ag
--- a/monetdb5/modules/atoms/Makefile.ag
+++ b/monetdb5/modules/atoms/Makefile.ag
@@ -20,7 +20,7 @@ INCLUDES = ../../mal \
                   ../../../common/stream \
                   ../../../common/utils \
                   ../../../gdk \
-                  $(libxml2_CFLAGS)
+                  $(libxml2_CFLAGS) $(curl_CFLAGS)
 MTSAFE
 
 lib_atoms = {
@@ -37,6 +37,7 @@ lib_atoms = {
                url.c url.h \
                json_atom.c json_atom.h \
                uuid.c uuid.h \
+               mcurl.c mcurl.h \
                xml.c xml.h
 }
 
@@ -55,8 +56,9 @@ headers_mal = {
                json_atom.mal \
                uuid.mal \
                xml.mal \
+        mcurl.mal \
                mtime.mal
 }
 
 EXTRA_DIST_DIR = Tests
-EXTRA_DIST = blob.mal color.mal identifier.mal inet.mal xml.mal xml.sql 
batxml.sql str.mal batxml.mal url.mal json_atom.mal uuid.mal streams.mal 
mtime.mal
+EXTRA_DIST = blob.mal color.mal identifier.mal inet.mal xml.mal xml.sql 
batxml.sql str.mal batxml.mal url.mal json_atom.mal uuid.mal streams.mal 
mtime.mal mcurl.mal
diff --git a/monetdb5/modules/atoms/Tests/All b/monetdb5/modules/atoms/Tests/All
--- a/monetdb5/modules/atoms/Tests/All
+++ b/monetdb5/modules/atoms/Tests/All
@@ -24,3 +24,4 @@ json05
 jsonrender
 
 uuid00
+#curl00
\ No newline at end of file
diff --git a/monetdb5/modules/atoms/Tests/curl00.mal 
b/monetdb5/modules/atoms/Tests/curl00.mal
new file mode 100644
--- /dev/null
+++ b/monetdb5/modules/atoms/Tests/curl00.mal
@@ -0,0 +1,8 @@
+
+a:="http://localhost:8998/";;
+b:str:= mcurl.getrequest(a);
+io.print(b);
+
+#a:="http://www.example.com/";;
+#b:str:= mcurl.getrequest(a);
+#io.print(b);
diff --git a/monetdb5/modules/atoms/Tests/curl00.stable.err 
b/monetdb5/modules/atoms/Tests/curl00.stable.err
new file mode 100644
--- /dev/null
+++ b/monetdb5/modules/atoms/Tests/curl00.stable.err
@@ -0,0 +1,29 @@
+stderr of test 'curl00` in directory 'monetdb5/modules/atoms` itself:
+
+
+# 18:14:24 >  
+# 18:14:24 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=35895" "--set" 
"mapi_usock=/var/tmp/mtest-19428/.s.monetdb.35895" "--set" "monet_prompt=" 
"--forcemito" "--set" "mal_listing=2" 
"--dbpath=/export/work/arjen/monetdb/monetdb/default/var/MonetDB/mTests_monetdb5_modules_atoms"
 "curl00.mal"
+# 18:14:24 >  
+
+# builtin opt  gdk_dbpath = 
/export/work/arjen/monetdb/monetdb/default/var/monetdb5/dbfarm/demo
+# builtin opt  gdk_debug = 0
+# builtin opt  gdk_vmtrim = yes
+# builtin opt  monet_prompt = >
+# builtin opt  monet_daemon = no
+# builtin opt  mapi_port = 50000
+# builtin opt  mapi_open = false
+# builtin opt  mapi_autosense = false
+# builtin opt  sql_optimizer = default_pipe
+# builtin opt  sql_debug = 0
+# cmdline opt  gdk_nr_threads = 0
+# cmdline opt  mapi_open = true
+# cmdline opt  mapi_port = 35895
+# cmdline opt  mapi_usock = /var/tmp/mtest-19428/.s.monetdb.35895
+# cmdline opt  monet_prompt = 
+# cmdline opt  mal_listing = 2
+# cmdline opt  gdk_dbpath = 
/export/work/arjen/monetdb/monetdb/default/var/MonetDB/mTests_monetdb5_modules_atoms
+
+# 18:14:25 >  
+# 18:14:25 >  "Done."
+# 18:14:25 >  
+
diff --git a/monetdb5/modules/atoms/Tests/curl00.stable.out 
b/monetdb5/modules/atoms/Tests/curl00.stable.out
new file mode 100644
--- /dev/null
+++ b/monetdb5/modules/atoms/Tests/curl00.stable.out
@@ -0,0 +1,37 @@
+stdout of test 'curl00` in directory 'monetdb5/modules/atoms` itself:
+
+
+# 18:14:24 >  
+# 18:14:24 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=35895" "--set" 
"mapi_usock=/var/tmp/mtest-19428/.s.monetdb.35895" "--set" "monet_prompt=" 
"--forcemito" "--set" "mal_listing=2" 
"--dbpath=/export/work/arjen/monetdb/monetdb/default/var/MonetDB/mTests_monetdb5_modules_atoms"
 "curl00.mal"
+# 18:14:24 >  
+
+# MonetDB 5 server v11.16.0
+# This is an unreleased version
+# Serving database 'mTests_monetdb5_modules_atoms', using 2 threads
+# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs dynamically 
linked
+# Found 3.875 GiB available main-memory.
+# Copyright (c) 1993-July 2008 CWI.
+# Copyright (c) August 2008-2013 MonetDB B.V., all rights reserved
+# Visit http://www.monetdb.org/ for further information
+# Listening for connection requests on mapi:monetdb://harvest:35895/
+# Listening for UNIX domain connection requests on 
mapi:monetdb:///var/tmp/mtest-19428/.s.monetdb.35895
+# MonetDB/GIS module loaded
+# MonetDB/JAQL module loaded
+# MonetDB/SQL module loaded
+function user.main():void;
+    a := "http://localhost:8888/";;
+    b:str  := mcurl.getrequest(a);
+    io.print(b);
+    a := "http://www.example.com/";;
+    b:str  := mcurl.getrequest(a);
+    io.print(b);
+end main;
+38 bytes retrieved
+[ "<html><body>Hello, json!</body></html>" ]
+0 bytes retrieved
+[ "<html><body>Hello, json!</body></html>" ]
+
+# 18:14:25 >  
+# 18:14:25 >  "Done."
+# 18:14:25 >  
+
diff --git a/monetdb5/modules/atoms/mcurl.c b/monetdb5/modules/atoms/mcurl.c
new file mode 100644
--- /dev/null
+++ b/monetdb5/modules/atoms/mcurl.c
@@ -0,0 +1,141 @@
+/*
+ * The contents of this file are subject to the MonetDB Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ * http://www.monetdb.org/Legal/MonetDBLicense
+ * 
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * The Original Code is the MonetDB Database System.
+ * 
+ * The Initial Developer of the Original Code is CWI.
+ * Portions created by CWI are Copyright (C) 1997-July 2008 CWI.
+ * Copyright August 2008-2013 MonetDB B.V.
+ * All Rights Reserved.
+*/
+
+/*
+ *  A. de Rijke
+ * The cURL module
+ * The cURL module contains a wrapper for all function in
+ * libcurl.
+ */
+
+#include "monetdb_config.h"
+#include "mcurl.h"
+#include "mal.h"
+#include "mal_exception.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+struct MemoryStruct {
+  char *memory;
+  size_t size;
+};
+
+#ifdef HAVE_CURL
+#include <curl/curl.h>
+
+str
+handle_get_request(str *retval, str *url);
+
+static size_t
+WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
+{
+  size_t realsize = size * nmemb;
+  struct MemoryStruct *mem = (struct MemoryStruct *)userp;
+
+  mem->memory = realloc(mem->memory, mem->size + realsize + 1);
+  if(mem->memory == NULL) {
+    /* out of memory! */
+    printf("not enough memory (realloc returned NULL)\n");
+    return 0;
+  }
+
+  memcpy(&(mem->memory[mem->size]), contents, realsize);
+  mem->size += realsize;
+  mem->memory[mem->size] = 0;
+
+  return realsize;
+}
+
+str
+handle_get_request(str *retval, str *url) {
+  str d;
+  char err_string[128];
+
+  CURL *curl_handle;
+  CURLcode res = 0;
+
+  struct MemoryStruct chunk;
+
+  chunk.memory = malloc(1);  /* will be grown as needed by the realloc above 
*/ 
+  chunk.size = 0;    /* no data at this point */
+
+  curl_global_init(CURL_GLOBAL_ALL);
+  /* init the curl session */
+  curl_handle = curl_easy_init();
+  curl_easy_setopt(curl_handle, CURLOPT_HTTPGET, 1);
+  /* set URL to get */
+
+  curl_easy_setopt(curl_handle, CURLOPT_URL, *url);
+
+  /* no progress meter please */
+  curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);
+
+  /* send all data to this function  */
+  curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
+
+  /* we want the body be written to this file handle instead of stdout */
+  curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
+
+  /* get it! */
+  res = curl_easy_perform(curl_handle);
+
+ /* check for errors */ 
+  if(res != CURLE_OK) {
+    sprintf(err_string, "curl_easy_perform() failed: %s\n",
+            curl_easy_strerror(res));
+    d = GDKstrdup(err_string);
+  }
+  else {
+    /*
+     * Now, our chunk.memory points to a memory block that is chunk.size
+     * bytes big and contains the remote file.
+     *
+     * Do something nice with it!
+     *
+     * You should be aware of the fact that at this point we might have an
+     * allocated data block, and nothing has yet deallocated that data. So when
+     * you're done with it, you should free() it as a nice application.
+     */ 
+ 
+    printf("%lu bytes retrieved\n", (long)chunk.size);
+  }
+  if (chunk.size) {
+    d = GDKstrdup(chunk.memory);
+    if(chunk.memory)
+      free(chunk.memory);
+  }
+  /* cleanup curl stuff */
+  curl_easy_cleanup(curl_handle);
+
+  *retval = d;
+  return MAL_SUCCEED;
+}
+#endif
+
+str CURLgetRequest(str *retval, str *url) {
+  (void)retval;
+  (void)url;
+#ifdef HAVE_CURL
+  return handle_get_request(retval, url);
+#endif
+  return MAL_SUCCEED;
+}
diff --git a/monetdb5/modules/atoms/mcurl.h b/monetdb5/modules/atoms/mcurl.h
new file mode 100644
--- /dev/null
+++ b/monetdb5/modules/atoms/mcurl.h
@@ -0,0 +1,41 @@
+/*
+ * The contents of this file are subject to the MonetDB Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ * http://www.monetdb.org/Legal/MonetDBLicense
+ * 
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific language governing rights and limitations
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to