libidav/davqlexec.h

changeset 124
41939c8f3f9c
parent 123
806c4dccf2ae
child 126
b156cae29e65
--- a/libidav/davqlexec.h	Fri May 29 14:16:45 2015 +0200
+++ b/libidav/davqlexec.h	Sat May 30 13:49:17 2015 +0200
@@ -38,7 +38,10 @@
 extern "C" {
 #endif
 
-typedef struct DavQLResult DavQLResult;
+typedef struct DavQLCmd      DavQLCmd;
+typedef struct DavQLStackObj DavQLStackObj;
+
+typedef void*(*davql_func)(); // TODO: interface?
 
 typedef enum {
     DAVQL_OK = 0,
@@ -46,22 +49,82 @@
     DAVQL_UNKNOWN_FORMATCHAR
 } davqlerror_t;
 
-struct DavQLResult {
-    DavResource *result;
-    int         status;
+typedef enum {
+    DAVQL_CMD_INT = 0,
+    DAVQL_CMD_STRING,
+    DAVQL_CMD_TIMESTAMP,
+    DAVQL_CMD_RES_IDENTIFIER,
+    DAVQL_CMD_PROP_IDENTIFIER,
+    DAVQL_CMD_OP_UNARY_ADD,
+    DAVQL_CMD_OP_UNARY_SUB,
+    DAVQL_CMD_OP_UNARY_NEG,
+    DAVQL_CMD_OP_BINARY_ADD,
+    DAVQL_CMD_OP_BINARY_SUB,
+    DAVQL_CMD_OP_BINARY_MUL,
+    DAVQL_CMD_OP_BINARY_DIV,
+    DAVQL_CMD_OP_BINARY_AND,
+    DAVQL_CMD_OP_BINARY_OR,
+    DAVQL_CMD_OP_BINARY_XOR,
+    DAVQL_CMD_OP_LOGICAL_NOT,
+    DAVQL_CMD_OP_LOGICAL_AND,
+    DAVQL_CMD_OP_LOGICAL_OR_L,
+    DAVQL_CMD_OP_LOGICAL_OR,
+    DAVQL_CMD_OP_LOGICAL_XOR,
+    DAVQL_CMD_OP_EQ,
+    DAVQL_CMD_OP_NEQ,
+    DAVQL_CMD_OP_LT,
+    DAVQL_CMD_OP_GT,
+    DAVQL_CMD_OP_LE,
+    DAVQL_CMD_OP_GE,
+    DAVQL_CMD_OP_LIKE,
+    DAVQL_CMD_OP_UNLIKE,
+    DAVQL_CMD_CALL
+} davqlcmdtype_t;
+
+typedef enum {
+    DAVQL_RES_NAME = 0,
+    DAVQL_RES_PATH,
+    DAVQL_RES_HREF,
+    DAVQL_RES_CONTENTLENGTH,
+    DAVQL_RES_CONTENTTYPE,
+    DAVQL_RES_CREATIONDATE,
+    DAVQL_RES_LASTMODIFIED,
+    DAVQL_RES_ISCOLLECTION
+} davqlresprop_t;
+
+struct DavQLCmd {
+    davqlcmdtype_t type;
+    union DavQLCmdData {
+        int64_t        integer;
+        sstr_t         string;
+        time_t         timestamp;
+        davqlresprop_t resprop;
+        DavPropName    property;
+        davql_func     func;
+    } data;
+};
+
+struct DavQLStackObj {
+    int32_t  type; // 0: int, 1: string
+    uint32_t length;
+    union DavQLStackData {
+        int64_t integer;
+        char    *string;
+    } data;
 };
     
 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);
+sstr_t dav_format_string(UcxAllocator *a, sstr_t fstr, va_list ap, davqlerror_t *error);
 
 void dav_exec_get(DavSession *sn, DavQLStatement *st, char* path, va_list ap);
 
-UcxBuffer* dav_compile_lexpr(DavQLExpression *lexpr);
+UcxBuffer* dav_compile_expr(UcxAllocator *a, DavQLExpression *lexpr, va_list ap);
 
 
-
+void print_bytecode(UcxBuffer *bcode);
 
 #ifdef	__cplusplus
 }

mercurial