added davqlexec source

Sat, 02 May 2015 18:45:13 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 02 May 2015 18:45:13 +0200
changeset 104
6fb4d24d9df9
parent 103
b29692d5f7a7
child 105
ee0de2b1872e

added davqlexec source

libidav/davqlexec.c file | annotate | diff | comparison | revisions
libidav/davqlexec.h file | annotate | diff | comparison | revisions
libidav/methods.c file | annotate | diff | comparison | revisions
libidav/session.c file | annotate | diff | comparison | revisions
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libidav/davqlexec.c	Sat May 02 18:45:13 2015 +0200
@@ -0,0 +1,137 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2015 Olaf Wintermann. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <ucx/utils.h>
+
+#include "davqlexec.h"
+
+DavQLResult* dav_statement_exec(DavSession *sn, DavQLStatement *st, ...) {
+    va_list ap;
+    va_start(ap, st);
+    DavQLResult *result = dav_statement_execv(sn, st, ap);
+    va_end(ap);
+    return result;
+}
+
+DavQLResult* dav_statement_execv(DavSession *sn, DavQLStatement *st, va_list ap) {
+    DavQLResult *result = dav_session_malloc(sn, sizeof(DavQLResult));
+    result->result = NULL;
+    result->status = 1;
+    
+    // make sure the statement was successfully parsed
+    if(st->type == DAVQL_ERROR) {
+        return result;
+    }
+    
+    // get path string
+    davqlerror_t error;
+    UcxBuffer *path = dav_path_string(st->path, ap, &error);
+    
+    if(st->type == DAVQL_GET) {
+        dav_exec_get(sn, st, path->space, ap);
+    } else {
+        // TODO
+    }
+    
+    return result;
+}
+
+UcxBuffer* dav_path_string(sstr_t pathfmt, va_list ap, davqlerror_t *error) {
+    UcxBuffer *path = ucx_buffer_new(NULL, 128, UCX_BUFFER_AUTOEXTEND);
+    
+    int placeholder = 0;
+    for(int i=0;i<pathfmt.length;i++) {
+        char c = pathfmt.ptr[i];
+        if(placeholder) {
+            if(c == '%') {
+                // no placeholder, %% transposes to %
+                ucx_buffer_putc(path, c);
+            } else {
+                // detect placeholder type and insert arg
+                int err = 0;
+                switch(c) {
+                    case 's': {
+                        char *arg = va_arg(ap, char*);
+                        ucx_buffer_puts(path, arg);
+                        break;
+                    }
+                    case 'd': {
+                        int arg = va_arg(ap, int);
+                        ucx_bprintf(path, "%d", arg);
+                        break;
+                    }
+                    case 'u': {
+                        unsigned int arg = va_arg(ap, unsigned int);
+                        ucx_bprintf(path, "%u", arg);
+                        break;
+                    }
+                    case 't': {
+                        // time arguments doesn't make any sense in a path
+                        *error = DAVQL_UNSUPPORTED_FORMATCHAR;
+                        err = 1;
+                        break;
+                    }
+                    default: {
+                        *error = DAVQL_UNKNOWN_FORMATCHAR;
+                        err = 1;
+                    }
+                }
+                if(err) {
+                    ucx_buffer_free(path);
+                    return NULL;
+                }
+            }
+            placeholder = 0;
+        } else {
+            if(c == '%') {
+                placeholder = 1;
+            } else {
+                ucx_buffer_putc(path, c);
+            }
+        }
+    }
+    ucx_buffer_putc(path, '\0');
+    *error = DAVQL_OK;
+    return path;
+}
+
+void dav_exec_get(DavSession *sn, DavQLStatement *st, char* path, va_list ap) {
+    // execute a davql get statement
+    
+    // TODO: get property list
+    
+    
+}
+
+int dav_eval_lexpr(DavResource *res, DavQLExpression *lexpr) {
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libidav/davqlexec.h	Sat May 02 18:45:13 2015 +0200
@@ -0,0 +1,71 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2015 Olaf Wintermann. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef DAVQLEXEC_H
+#define	DAVQLEXEC_H
+
+#include <stdarg.h>
+#include "davqlparser.h"
+#include "webdav.h"
+
+#include <ucx/buffer.h>
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+typedef struct DavQLResult DavQLResult;
+
+typedef enum {
+    DAVQL_OK = 0,
+    DAVQL_UNSUPPORTED_FORMATCHAR,
+    DAVQL_UNKNOWN_FORMATCHAR
+} davqlerror_t;
+
+struct DavQLResult {
+    DavResource *result;
+    int         status;
+};
+    
+DavQLResult* dav_statement_exec(DavSession *sn, DavQLStatement *st, ...);
+DavQLResult* dav_statement_execv(DavSession *sn, DavQLStatement *st, va_list ap);
+
+UcxBuffer* dav_path_string(sstr_t src, va_list ap, davqlerror_t *error);
+
+void dav_exec_get(DavSession *sn,DavQLStatement *st,char* path,va_list ap);
+
+int dav_eval_lexpr(DavResource *res, DavQLExpression *lexpr);
+
+
+
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* DAVQLEXEC_H */
+
--- a/libidav/methods.c	Sat May 02 18:44:25 2015 +0200
+++ b/libidav/methods.c	Sat May 02 18:45:13 2015 +0200
@@ -465,14 +465,14 @@
     UCX_FOREACH(elm, data->set) {
         DavProperty *p = elm->data;
         if(strcmp(p->ns->name, "DAV:")) {
-            snprintf(prefix, 8, "x%d\0", pfxnum++);
+            snprintf(prefix, 8, "x%d", pfxnum++);
             ucx_map_cstr_put(namespaces, p->ns->name, prefix);
         }
     }
     UCX_FOREACH(elm, data->remove) {
         DavProperty *p = elm->data;
         if(strcmp(p->ns->name, "DAV:")) {
-            snprintf(prefix, 8, "x%d\0", pfxnum++);
+            snprintf(prefix, 8, "x%d", pfxnum++);
             ucx_map_cstr_put(namespaces, p->ns->name, prefix);
         }
     }
--- a/libidav/session.c	Sat May 02 18:44:25 2015 +0200
+++ b/libidav/session.c	Sat May 02 18:45:13 2015 +0200
@@ -120,7 +120,7 @@
         size_t plen = strlen(password);
         size_t upwdlen = ulen + plen + 2;
         char *upwdbuf = malloc(upwdlen);
-        snprintf(upwdbuf, upwdlen, "%s:%s\0", user, password);
+        snprintf(upwdbuf, upwdlen, "%s:%s", user, password);
         curl_easy_setopt(sn->handle, CURLOPT_USERPWD, upwdbuf);
         free(upwdbuf);
     }

mercurial