diff -r 806c4dccf2ae -r 41939c8f3f9c libidav/davqlexec.h --- 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 }