diff --git a/src/modules/xhttp_pi/http_db_handler.c b/src/modules/xhttp_pi/http_db_handler.c index cb8b5bc4b26..1767d047c1d 100644 --- a/src/modules/xhttp_pi/http_db_handler.c +++ b/src/modules/xhttp_pi/http_db_handler.c @@ -32,17 +32,17 @@ #include "xhttp_pi_fnc.h" - int connect_http_db(ph_framework_t *framework_data, int index) { ph_db_url_t *ph_db_urls = framework_data->ph_db_urls; - if (ph_db_urls[index].http_db_handle) { + if(ph_db_urls[index].http_db_handle) { LM_CRIT("BUG - db connection found already open\n"); return -1; } - if ((ph_db_urls[index].http_db_handle = - ph_db_urls[index].http_dbf.init(&ph_db_urls[index].db_url)) == NULL) { + if((ph_db_urls[index].http_db_handle = ph_db_urls[index].http_dbf.init( + &ph_db_urls[index].db_url)) + == NULL) { return -1; } return 0; @@ -52,21 +52,21 @@ int use_table(ph_db_table_t *db_table) { ph_db_url_t *db_url; - if(db_table==NULL){ + if(db_table == NULL) { LM_ERR("null db_table handler\n"); return -1; } - if(db_table->db_url==NULL){ + if(db_table->db_url == NULL) { LM_ERR("null db_url for table [%s]\n", db_table->name.s); return -1; } db_url = db_table->db_url; - if(db_url->http_db_handle==NULL){ + if(db_url->http_db_handle == NULL) { LM_ERR("null db handle for table [%s]\n", db_table->name.s); return -1; } - db_table->db_url->http_dbf.use_table(db_table->db_url->http_db_handle, - &db_table->name); + db_table->db_url->http_dbf.use_table( + db_table->db_url->http_db_handle, &db_table->name); return 0; } @@ -74,12 +74,12 @@ int init_http_db(ph_framework_t *framework_data, int index) { ph_db_url_t *ph_db_urls = framework_data->ph_db_urls; - if (db_bind_mod(&ph_db_urls[index].db_url, - &ph_db_urls[index].http_dbf) < 0) { + if(db_bind_mod(&ph_db_urls[index].db_url, &ph_db_urls[index].http_dbf) + < 0) { LM_ERR("Unable to bind to a database driver\n"); return -1; } - if (connect_http_db(framework_data, index)!=0){ + if(connect_http_db(framework_data, index) != 0) { LM_ERR("unable to connect to the database\n"); return -1; } @@ -96,12 +96,13 @@ void destroy_http_db(ph_framework_t *framework_data) int i; ph_db_url_t *ph_db_urls; - if (framework_data == NULL) return; + if(framework_data == NULL) + return; ph_db_urls = framework_data->ph_db_urls; /* close the DB connections */ - for(i=0;iph_db_urls_size;i++){ - if (ph_db_urls[i].http_db_handle) { + for(i = 0; i < framework_data->ph_db_urls_size; i++) { + if(ph_db_urls[i].http_db_handle) { ph_db_urls[i].http_dbf.close(ph_db_urls[i].http_db_handle); ph_db_urls[i].http_db_handle = NULL; } diff --git a/src/modules/xhttp_pi/xhttp_pi.c b/src/modules/xhttp_pi/xhttp_pi.c index 2edc95797f0..9757d94e3c6 100644 --- a/src/modules/xhttp_pi/xhttp_pi.c +++ b/src/modules/xhttp_pi/xhttp_pi.c @@ -65,7 +65,7 @@ extern ph_framework_t *ph_framework_data; static int mod_init(void); static void destroy(void); -static int xhttp_pi_dispatch(sip_msg_t* msg, char* s1, char* s2); +static int xhttp_pi_dispatch(sip_msg_t *msg, char *s1, char *s2); /** The context of the xhttp_pi request being processed. @@ -78,7 +78,7 @@ static pi_ctx_t ctx; static xhttp_api_t xhttp_api; -gen_lock_t* ph_lock; +gen_lock_t *ph_lock; str xhttp_pi_root = str_init("pi"); @@ -88,32 +88,28 @@ int buf_size = 0; char error_buf[ERROR_REASON_BUF_LEN]; static cmd_export_t cmds[] = { - {"dispatch_xhttp_pi",(cmd_function)xhttp_pi_dispatch,0,0,0, - REQUEST_ROUTE|EVENT_ROUTE}, - {0, 0, 0, 0, 0, 0} -}; + {"dispatch_xhttp_pi", (cmd_function)xhttp_pi_dispatch, 0, 0, 0, + REQUEST_ROUTE | EVENT_ROUTE}, + {0, 0, 0, 0, 0, 0}}; -static param_export_t params[] = { - {"xhttp_pi_root", PARAM_STR, &xhttp_pi_root}, - {"xhttp_pi_buf_size", INT_PARAM, &buf_size}, - {"framework", PARAM_STR, &filename}, - {0, 0, 0} -}; +static param_export_t params[] = {{"xhttp_pi_root", PARAM_STR, &xhttp_pi_root}, + {"xhttp_pi_buf_size", INT_PARAM, &buf_size}, + {"framework", PARAM_STR, &filename}, {0, 0, 0}}; static rpc_export_t rpc_methods[]; /** module exports */ -struct module_exports exports= { - "xhttp_pi", /* module name */ - DEFAULT_DLFLAGS, /* dlopen flags */ - cmds, /* cmd (cfg function) exports */ - params, /* param exports */ - 0, /* RPC method exports */ - 0, /* pv exports */ - 0, /* response handling function */ - mod_init, /* module init function */ - 0, /* per-child init function */ - destroy /* module destroy function */ +struct module_exports exports = { + "xhttp_pi", /* module name */ + DEFAULT_DLFLAGS, /* dlopen flags */ + cmds, /* cmd (cfg function) exports */ + params, /* param exports */ + 0, /* RPC method exports */ + 0, /* pv exports */ + 0, /* response handling function */ + mod_init, /* module init function */ + 0, /* per-child init function */ + destroy /* module destroy function */ }; @@ -129,7 +125,7 @@ struct module_exports exports= { * @param code Reason code. * @param fmt Formatting string used to build the reason phrase. */ -static void pi_fault(pi_ctx_t* ctx, int code, char* fmt, ...) +static void pi_fault(pi_ctx_t *ctx, int code, char *fmt, ...) { va_list ap; struct xhttp_pi_reply *reply = &ctx->reply; @@ -147,45 +143,44 @@ static void pi_fault(pi_ctx_t* ctx, int code, char* fmt, ...) } -static int pi_send(pi_ctx_t* ctx) +static int pi_send(pi_ctx_t *ctx) { - struct xhttp_pi_reply* reply; + struct xhttp_pi_reply *reply; - if (ctx->reply_sent) return 1; + if(ctx->reply_sent) + return 1; reply = &ctx->reply; - if (0!=ph_run_pi_cmd(ctx)){ + if(0 != ph_run_pi_cmd(ctx)) { LM_DBG("pi_fault(500,\"Internal Server Error\"\n"); pi_fault(ctx, 500, "Internal Server Error"); } ctx->reply_sent = 1; - if (reply->body.len) { + if(reply->body.len) { xhttp_api.reply(ctx->msg, reply->code, &reply->reason, - &XHTTP_PI_CONTENT_TYPE_TEXT_HTML, &reply->body); - } - else { - LM_DBG("xhttp_api.reply(%p, %d, %.*s, %.*s, %.*s)\n", - ctx->msg, reply->code, - (&reply->reason)->len, (&reply->reason)->s, - (&XHTTP_PI_CONTENT_TYPE_TEXT_HTML)->len, - (&XHTTP_PI_CONTENT_TYPE_TEXT_HTML)->s, - (&reply->reason)->len, (&reply->reason)->s); + &XHTTP_PI_CONTENT_TYPE_TEXT_HTML, &reply->body); + } else { + LM_DBG("xhttp_api.reply(%p, %d, %.*s, %.*s, %.*s)\n", ctx->msg, + reply->code, (&reply->reason)->len, (&reply->reason)->s, + (&XHTTP_PI_CONTENT_TYPE_TEXT_HTML)->len, + (&XHTTP_PI_CONTENT_TYPE_TEXT_HTML)->s, (&reply->reason)->len, + (&reply->reason)->s); xhttp_api.reply(ctx->msg, reply->code, &reply->reason, - &XHTTP_PI_CONTENT_TYPE_TEXT_HTML, &reply->reason); + &XHTTP_PI_CONTENT_TYPE_TEXT_HTML, &reply->reason); } - if (reply->buf.s) { + if(reply->buf.s) { pkg_free(reply->buf.s); reply->buf.s = NULL; reply->buf.len = 0; } - if (ctx->arg.s) { - pkg_free(ctx->arg.s); - ctx->arg.s = NULL; - ctx->arg.len = 0; - } + if(ctx->arg.s) { + pkg_free(ctx->arg.s); + ctx->arg.s = NULL; + ctx->arg.len = 0; + } return 0; } @@ -205,7 +200,7 @@ static int init_xhttp_pi_reply(pi_ctx_t *ctx) reply->code = 200; reply->reason = XHTTP_PI_REASON_OK; reply->buf.s = pkg_malloc(buf_size); - if (!reply->buf.s) { + if(!reply->buf.s) { PKG_MEM_ERROR; pi_fault(ctx, 500, "Internal Server Error (No memory left)"); return -1; @@ -217,15 +212,14 @@ static int init_xhttp_pi_reply(pi_ctx_t *ctx) } - int ph_init_async_lock(void) { ph_lock = lock_alloc(); - if (ph_lock==NULL) { + if(ph_lock == NULL) { LM_ERR("failed to create lock\n"); return -1; } - if (lock_init(ph_lock)==NULL) { + if(lock_init(ph_lock) == NULL) { LM_ERR("failed to init lock\n"); return -1; } @@ -235,7 +229,7 @@ int ph_init_async_lock(void) void ph_destroy_async_lock(void) { - if (ph_lock) { + if(ph_lock) { lock_destroy(ph_lock); lock_dealloc(ph_lock); } @@ -245,56 +239,56 @@ static int mod_init(void) { int i; - if (rpc_register_array(rpc_methods)!=0) { + if(rpc_register_array(rpc_methods) != 0) { LM_ERR("failed to register RPC commands\n"); return -1; } /* bind the XHTTP API */ - if (xhttp_load_api(&xhttp_api) < 0) { + if(xhttp_load_api(&xhttp_api) < 0) { LM_ERR("cannot bind to XHTTP API\n"); return -1; } /* Check xhttp_pi_buf_size param */ - if (buf_size == 0) - buf_size = pkg_mem_size/3; + if(buf_size == 0) + buf_size = pkg_mem_size / 3; /* Check xhttp_pi_root param */ - for(i=0;iph_db_urls_size; i++) { + LM_DBG("initializing db[%d] [%s]\n", i, + ph_framework_data->ph_db_urls[i].db_url.s); + if(init_http_db(ph_framework_data, i) != 0) { + LM_ERR("failed to initialize the DB support\n"); return -1; - for(i=0;iph_db_urls_size;i++){ - LM_DBG("initializing db[%d] [%s]\n", - i, ph_framework_data->ph_db_urls[i].db_url.s); - if (init_http_db(ph_framework_data, i)!=0) { - LM_ERR("failed to initialize the DB support\n"); - return -1; - } - if (connect_http_db(ph_framework_data, i)) { - LM_ERR("failed to connect to database\n"); - return -1; - } } + if(connect_http_db(ph_framework_data, i)) { + LM_ERR("failed to connect to database\n"); + return -1; + } + } /* Build async lock */ - if (ph_init_async_lock() != 0) return -1; + if(ph_init_async_lock() != 0) + return -1; return 0; } @@ -307,7 +301,7 @@ void destroy(void) } -static int ki_xhttp_pi_dispatch(sip_msg_t* msg) +static int ki_xhttp_pi_dispatch(sip_msg_t *msg) { str arg = {NULL, 0}; int ret = 0; @@ -319,33 +313,39 @@ static int ki_xhttp_pi_dispatch(sip_msg_t* msg) } /* Init xhttp_pi context */ - if (ctx.reply.buf.s) LM_ERR("Unexpected buf value [%p][%d]\n", - ctx.reply.buf.s, ctx.reply.buf.len); + if(ctx.reply.buf.s) + LM_ERR("Unexpected buf value [%p][%d]\n", ctx.reply.buf.s, + ctx.reply.buf.len); memset(&ctx, 0, sizeof(pi_ctx_t)); ctx.msg = msg; ctx.mod = ctx.cmd = -1; - if (init_xhttp_pi_reply(&ctx) < 0) goto send_reply; + if(init_xhttp_pi_reply(&ctx) < 0) + goto send_reply; lock_get(ph_lock); - LM_DBG("ph_framework_data: [%p]->[%p]\n", &ph_framework_data, ph_framework_data); + LM_DBG("ph_framework_data: [%p]->[%p]\n", &ph_framework_data, + ph_framework_data); /* Extract arguments from url */ - if (0!=ph_parse_url(&msg->first_line.u.request.uri, - &ctx.mod, &ctx.cmd, &arg)){ + if(0 + != ph_parse_url( + &msg->first_line.u.request.uri, &ctx.mod, &ctx.cmd, &arg)) { pi_fault(&ctx, 500, "Bad URL"); goto send_reply; } - if (arg.s) { - if (arg.len) { + if(arg.s) { + if(arg.len) { /* Unescape args */ - ctx.arg.s = pkg_malloc((arg.len)*sizeof(char)); - if (ctx.arg.s==NULL){ + ctx.arg.s = pkg_malloc((arg.len) * sizeof(char)); + if(ctx.arg.s == NULL) { PKG_MEM_ERROR; pi_fault(&ctx, 500, "Internal Server Error (oom)"); goto send_reply; } - for(i=0;iun_escape(&arg, &ctx.arg)) { + for(i = 0; i < arg.len; i++) + if(arg.s[i] == '+') + arg.s[i] = ' '; + if(0 > un_escape(&arg, &ctx.arg)) { LM_ERR("unable to escape [%.*s]\n", arg.len, arg.s); pi_fault(&ctx, 500, "Bad arg in URL"); goto send_reply; @@ -356,31 +356,32 @@ static int ki_xhttp_pi_dispatch(sip_msg_t* msg) LM_DBG("Got no arg\n"); goto send_reply; } - + send_reply: - LM_DBG("ph_framework_data: [%p]->[%p]\n", &ph_framework_data, ph_framework_data); + LM_DBG("ph_framework_data: [%p]->[%p]\n", &ph_framework_data, + ph_framework_data); lock_release(ph_lock); - if (!ctx.reply_sent) { + if(!ctx.reply_sent) { ret = pi_send(&ctx); } - if (ret < 0) return -1; + if(ret < 0) + return -1; return 0; } -static int xhttp_pi_dispatch(sip_msg_t* msg, char* s1, char* s2) +static int xhttp_pi_dispatch(sip_msg_t *msg, char *s1, char *s2) { return ki_xhttp_pi_dispatch(msg); } /* rpc function documentation */ -static const char *rpc_reload_doc[2] = { - "Reload the xml framework", 0 -}; +static const char *rpc_reload_doc[2] = {"Reload the xml framework", 0}; /* rpc function implementations */ -static void rpc_reload(rpc_t *rpc, void *c) { +static void rpc_reload(rpc_t *rpc, void *c) +{ lock_get(ph_lock); - if (0!=ph_init_cmds(&ph_framework_data, filename.s)) { + if(0 != ph_init_cmds(&ph_framework_data, filename.s)) { rpc->rpl_printf(c, "Reload failed"); } else { rpc->rpl_printf(c, "Reload OK"); @@ -390,9 +391,7 @@ static void rpc_reload(rpc_t *rpc, void *c) { } static rpc_export_t rpc_methods[] = { - {"xhttp_pi.reload", rpc_reload, rpc_reload_doc, 0}, - {0, 0, 0, 0} -}; + {"xhttp_pi.reload", rpc_reload, rpc_reload_doc, 0}, {0, 0, 0, 0}}; /** * diff --git a/src/modules/xhttp_pi/xhttp_pi.h b/src/modules/xhttp_pi/xhttp_pi.h index 66703b08da3..94c4342c9eb 100644 --- a/src/modules/xhttp_pi/xhttp_pi.h +++ b/src/modules/xhttp_pi/xhttp_pi.h @@ -37,15 +37,15 @@ #define PRINT_VALUE_BUF_LEN 256 - /** Representation of the xhttp_pi reply being constructed. * * This data structure describes the xhttp_pi reply that is being constructed * and will be sent to the client. */ -struct xhttp_pi_reply { +struct xhttp_pi_reply +{ int code; /**< Reply code which indicates the type of the reply */ - str reason; /**< Reason phrase text which provides human-readable + str reason; /**< Reason phrase text which provides human-readable * description that augments the reply code */ str body; /**< The xhttp_pi http body built so far */ str buf; /**< The memory buffer allocated for the reply, this is @@ -61,16 +61,16 @@ struct xhttp_pi_reply { * * There is always one context per xhttp_pi request. */ -typedef struct pi_ctx { - sip_msg_t* msg; /**< The SIP/HTTP received message. */ - struct xhttp_pi_reply reply; /**< xhttp_pi reply to be sent to the client */ +typedef struct pi_ctx +{ + sip_msg_t *msg; /**< The SIP/HTTP received message. */ + struct xhttp_pi_reply reply; /**< xhttp_pi reply to be sent to the client */ int reply_sent; - int mod; /**< Module being processed */ - int cmd; /**< PI command being processed */ - int arg_received; /**< PI argument flag */ - str arg; /**< PI command argument */ + int mod; /**< Module being processed */ + int cmd; /**< PI command being processed */ + int arg_received; /**< PI argument flag */ + str arg; /**< PI command argument */ } pi_ctx_t; #endif - diff --git a/src/modules/xhttp_pi/xhttp_pi_fnc.c b/src/modules/xhttp_pi/xhttp_pi_fnc.c index 7d58e06987f..de1187f8cb8 100644 --- a/src/modules/xhttp_pi/xhttp_pi_fnc.c +++ b/src/modules/xhttp_pi/xhttp_pi_fnc.c @@ -44,304 +44,398 @@ #include "http_db_handler.h" -#define XHTTP_PI_XML_FRAMEWORK_NODE "framework" -#define XHTTP_PI_XML_DB1_URL_NODE "db_url" -#define XHTTP_PI_XML_DB1_TABLE_NODE "db_table" -#define XHTTP_PI_XML_TABLE_NAME_NODE "table_name" -#define XHTTP_PI_XML_DB1_URL_ID_NODE "db_url_id" - -#define XHTTP_PI_XML_MOD_NODE "mod" -#define XHTTP_PI_XML_MOD_NAME_NODE "mod_name" -#define XHTTP_PI_XML_CMD_NODE "cmd" -#define XHTTP_PI_XML_DB1_TABLE_ID_NODE "db_table_id" -#define XHTTP_PI_XML_CMD_NAME_NODE "cmd_name" -#define XHTTP_PI_XML_CMD_TYPE_NODE "cmd_type" -#define XHTTP_PI_XML_CLAUSE_COLS_NODE "clause_cols" -#define XHTTP_PI_XML_QUERY_COLS_NODE "query_cols" -#define XHTTP_PI_XML_ORDER_BY_COLS_NODE "order_by_cols" - -#define XHTTP_PI_XML_COLUMN_NODE "column" -#define XHTTP_PI_XML_COL_NODE "col" - -#define XHTTP_PI_XML_FIELD_NODE "field" -#define XHTTP_PI_XML_LINK_CMD_NODE "link_cmd" -#define XHTTP_PI_XML_TYPE_NODE "type" -#define XHTTP_PI_XML_OPERATOR_NODE "operator" -#define XHTTP_PI_XML_VALUE_NODE "value" -#define XHTTP_PI_XML_VALIDATE_NODE "validate" - -#define XHTTP_PI_XML_ID_ATTR "id" +#define XHTTP_PI_XML_FRAMEWORK_NODE "framework" +#define XHTTP_PI_XML_DB1_URL_NODE "db_url" +#define XHTTP_PI_XML_DB1_TABLE_NODE "db_table" +#define XHTTP_PI_XML_TABLE_NAME_NODE "table_name" +#define XHTTP_PI_XML_DB1_URL_ID_NODE "db_url_id" + +#define XHTTP_PI_XML_MOD_NODE "mod" +#define XHTTP_PI_XML_MOD_NAME_NODE "mod_name" +#define XHTTP_PI_XML_CMD_NODE "cmd" +#define XHTTP_PI_XML_DB1_TABLE_ID_NODE "db_table_id" +#define XHTTP_PI_XML_CMD_NAME_NODE "cmd_name" +#define XHTTP_PI_XML_CMD_TYPE_NODE "cmd_type" +#define XHTTP_PI_XML_CLAUSE_COLS_NODE "clause_cols" +#define XHTTP_PI_XML_QUERY_COLS_NODE "query_cols" +#define XHTTP_PI_XML_ORDER_BY_COLS_NODE "order_by_cols" + +#define XHTTP_PI_XML_COLUMN_NODE "column" +#define XHTTP_PI_XML_COL_NODE "col" + +#define XHTTP_PI_XML_FIELD_NODE "field" +#define XHTTP_PI_XML_LINK_CMD_NODE "link_cmd" +#define XHTTP_PI_XML_TYPE_NODE "type" +#define XHTTP_PI_XML_OPERATOR_NODE "operator" +#define XHTTP_PI_XML_VALUE_NODE "value" +#define XHTTP_PI_XML_VALIDATE_NODE "validate" + +#define XHTTP_PI_XML_ID_ATTR "id" extern str xhttp_pi_root; ph_framework_t *ph_framework_data = NULL; -#define XHTTP_PI_DB1_UNDEF 0 -#define XHTTP_PI_DB1_QUERY 1 -#define XHTTP_PI_DB1_INSERT 2 -#define XHTTP_PI_DB1_DELETE 3 -#define XHTTP_PI_DB1_UPDATE 4 -#define XHTTP_PI_DB1_REPLACE 5 - - -#define XHTTP_PI_COPY(p,str) \ -do{ \ - if ((int)((p)-buf)+(str).len>max_page_len) { \ - goto error; \ - } \ - memcpy((p), (str).s, (str).len); (p) += (str).len; \ -}while(0) - -#define XHTTP_PI_COPY_2(p,str1,str2) \ -do{ \ - if ((int)((p)-buf)+(str1).len+(str2).len>max_page_len) { \ - goto error; \ - } \ - memcpy((p), (str1).s, (str1).len); (p) += (str1).len; \ - memcpy((p), (str2).s, (str2).len); (p) += (str2).len; \ -}while(0) - -#define XHTTP_PI_COPY_3(p,str1,str2,str3) \ -do{ \ - if ((int)((p)-buf)+(str1).len+(str2).len+(str3).len>max_page_len) { \ - goto error; \ - } \ - memcpy((p), (str1).s, (str1).len); (p) += (str1).len; \ - memcpy((p), (str2).s, (str2).len); (p) += (str2).len; \ - memcpy((p), (str3).s, (str3).len); (p) += (str3).len; \ -}while(0) - -#define XHTTP_PI_COPY_4(p,str1,str2,str3,str4) \ -do{ \ - if ((int)((p)-buf)+(str1).len+(str2).len+(str3).len+(str4).len>max_page_len) { \ - goto error; \ - } \ - memcpy((p), (str1).s, (str1).len); (p) += (str1).len; \ - memcpy((p), (str2).s, (str2).len); (p) += (str2).len; \ - memcpy((p), (str3).s, (str3).len); (p) += (str3).len; \ - memcpy((p), (str4).s, (str4).len); (p) += (str4).len; \ -}while(0) - -#define XHTTP_PI_COPY_5(p,s1,s2,s3,s4,s5) \ -do{ \ - if ((int)((p)-buf)+(s1).len+(s2).len+(s3).len+(s4).len+(s5).len>max_page_len) { \ - goto error; \ - } \ - memcpy((p), (s1).s, (s1).len); (p) += (s1).len; \ - memcpy((p), (s2).s, (s2).len); (p) += (s2).len; \ - memcpy((p), (s3).s, (s3).len); (p) += (s3).len; \ - memcpy((p), (s4).s, (s4).len); (p) += (s4).len; \ - memcpy((p), (s5).s, (s5).len); (p) += (s5).len; \ -}while(0) - -#define XHTTP_PI_COPY_6(p,s1,s2,s3,s4,s5,s6) \ -do{ \ - if ((int)((p)-buf)+(s1).len+(s2).len+(s3).len+(s4).len+(s5).len+(s6).len>max_page_len) { \ - goto error; \ - } \ - memcpy((p), (s1).s, (s1).len); (p) += (s1).len; \ - memcpy((p), (s2).s, (s2).len); (p) += (s2).len; \ - memcpy((p), (s3).s, (s3).len); (p) += (s3).len; \ - memcpy((p), (s4).s, (s4).len); (p) += (s4).len; \ - memcpy((p), (s5).s, (s5).len); (p) += (s5).len; \ - memcpy((p), (s6).s, (s6).len); (p) += (s6).len; \ -}while(0) - -#define XHTTP_PI_COPY_8(p,s1,s2,s3,s4,s5,s6,s7,s8) \ -do{ \ - if ((int)((p)-buf)+(s1).len+(s2).len+(s3).len+(s4).len+(s5).len+(s6).len+(s7).len+(s8).len>max_page_len) { \ - goto error; \ - } \ - memcpy((p), (s1).s, (s1).len); (p) += (s1).len; \ - memcpy((p), (s2).s, (s2).len); (p) += (s2).len; \ - memcpy((p), (s3).s, (s3).len); (p) += (s3).len; \ - memcpy((p), (s4).s, (s4).len); (p) += (s4).len; \ - memcpy((p), (s5).s, (s5).len); (p) += (s5).len; \ - memcpy((p), (s6).s, (s6).len); (p) += (s6).len; \ - memcpy((p), (s7).s, (s7).len); (p) += (s7).len; \ - memcpy((p), (s8).s, (s8).len); (p) += (s8).len; \ -}while(0) - -#define XHTTP_PI_COPY_9(p,s1,s2,s3,s4,s5,s6,s7,s8,s9) \ -do{ \ - if ((int)((p)-buf)+(s1).len+(s2).len+(s3).len+(s4).len+(s5).len+(s6).len+(s7).len+(s8).len+(s9).len>max_page_len) { \ - goto error; \ - } \ - memcpy((p), (s1).s, (s1).len); (p) += (s1).len; \ - memcpy((p), (s2).s, (s2).len); (p) += (s2).len; \ - memcpy((p), (s3).s, (s3).len); (p) += (s3).len; \ - memcpy((p), (s4).s, (s4).len); (p) += (s4).len; \ - memcpy((p), (s5).s, (s5).len); (p) += (s5).len; \ - memcpy((p), (s6).s, (s6).len); (p) += (s6).len; \ - memcpy((p), (s7).s, (s7).len); (p) += (s7).len; \ - memcpy((p), (s8).s, (s8).len); (p) += (s8).len; \ - memcpy((p), (s9).s, (s9).len); (p) += (s9).len; \ -}while(0) - -#define XHTTP_PI_COPY_10(p,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10) \ -do{ \ - if ((int)((p)-buf)+(s1).len+(s2).len+(s3).len+(s4).len+(s5).len+(s6).len+(s7).len+(s8).len+(s9).len+(s10).len>max_page_len) { \ - goto error; \ - } \ - memcpy((p), (s1).s, (s1).len); (p) += (s1).len; \ - memcpy((p), (s2).s, (s2).len); (p) += (s2).len; \ - memcpy((p), (s3).s, (s3).len); (p) += (s3).len; \ - memcpy((p), (s4).s, (s4).len); (p) += (s4).len; \ - memcpy((p), (s5).s, (s5).len); (p) += (s5).len; \ - memcpy((p), (s6).s, (s6).len); (p) += (s6).len; \ - memcpy((p), (s7).s, (s7).len); (p) += (s7).len; \ - memcpy((p), (s8).s, (s8).len); (p) += (s8).len; \ - memcpy((p), (s9).s, (s9).len); (p) += (s9).len; \ - memcpy((p), (s10).s, (s10).len); (p) += (s10).len; \ -}while(0) - -#define XHTTP_PI_COPY_11(p,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11) \ -do{ \ - if ((int)((p)-buf)+(s1).len+(s2).len+(s3).len+(s4).len+(s5).len+(s6).len+(s7).len+(s8).len+(s9).len+(s10).len+(s11).len>max_page_len) { \ - goto error; \ - } \ - memcpy((p), (s1).s, (s1).len); (p) += (s1).len; \ - memcpy((p), (s2).s, (s2).len); (p) += (s2).len; \ - memcpy((p), (s3).s, (s3).len); (p) += (s3).len; \ - memcpy((p), (s4).s, (s4).len); (p) += (s4).len; \ - memcpy((p), (s5).s, (s5).len); (p) += (s5).len; \ - memcpy((p), (s6).s, (s6).len); (p) += (s6).len; \ - memcpy((p), (s7).s, (s7).len); (p) += (s7).len; \ - memcpy((p), (s8).s, (s8).len); (p) += (s8).len; \ - memcpy((p), (s9).s, (s9).len); (p) += (s9).len; \ - memcpy((p), (s10).s, (s10).len); (p) += (s10).len; \ - memcpy((p), (s11).s, (s11).len); (p) += (s11).len; \ -}while(0) - - -#define XHTTP_PI_COMPLETE_REPLY(ctx,fmt,args...) \ -do{ \ - _len = snprintf((ctx)->reply.body.s + (ctx)->reply.body.len, \ - (ctx)->reply.buf.len - (ctx)->reply.body.len, \ - fmt, ##args); \ - if(_len<0) \ - goto error; \ - else \ - (ctx)->reply.body.len += _len; \ - p = (ctx)->reply.body.s + (ctx)->reply.body.len; \ - XHTTP_PI_COPY(p,XHTTP_PI_Response_Menu_Cmd_td_4d); \ - (ctx)->reply.body.len = p - (ctx)->reply.body.s; \ - if(ph_build_reply_footer(ctx)<0) \ - goto error; \ -}while(0) - - -#define XHTTP_PI_BUILD_REPLY(ctx,fmt,args...) \ -do{ \ - if(ph_build_reply(ctx)<0) \ - goto error; \ - _len = snprintf((ctx)->reply.body.s + (ctx)->reply.body.len, \ - (ctx)->reply.buf.len - ctx->reply.body.len, \ - fmt, ##args); \ - if(_len<0) \ - goto error; \ - else \ - (ctx)->reply.body.len += _len; \ - p = (ctx)->reply.body.s + (ctx)->reply.body.len; \ - XHTTP_PI_COPY(p,XHTTP_PI_Response_Menu_Cmd_td_4d); \ - (ctx)->reply.body.len = p - (ctx)->reply.body.s; \ - if(ph_build_reply_footer(ctx)<0) \ - goto error; \ -}while(0) - - -#define XHTTP_PI_ESC_COPY(p,str,temp_holder,temp_counter) \ -do{ \ - (temp_holder).s = (str).s; \ - (temp_holder).len = 0; \ - for((temp_counter)=0;(temp_counter)<(str).len;(temp_counter)++) { \ - switch((str).s[(temp_counter)]) { \ - case '<': \ - (temp_holder).len = (temp_counter) - (temp_holder).len; \ - XHTTP_PI_COPY_2(p, (temp_holder), XHTTP_PI_ESC_LT); \ - (temp_holder).s = (str).s + (temp_counter) + 1; \ - (temp_holder).len = (temp_counter) + 1; \ - break; \ - case '>': \ - (temp_holder).len = (temp_counter) - (temp_holder).len; \ - XHTTP_PI_COPY_2(p, (temp_holder), XHTTP_PI_ESC_GT); \ - (temp_holder).s = (str).s + (temp_counter) + 1; \ - (temp_holder).len = (temp_counter) + 1; \ - break; \ - case '&': \ - (temp_holder).len = (temp_counter) - (temp_holder).len; \ - XHTTP_PI_COPY_2(p, (temp_holder), XHTTP_PI_ESC_AMP); \ - (temp_holder).s = (str).s + (temp_counter) + 1; \ - (temp_holder).len = (temp_counter) + 1; \ - break; \ - case '"': \ - (temp_holder).len = (temp_counter) - (temp_holder).len; \ - XHTTP_PI_COPY_2(p, (temp_holder), XHTTP_PI_ESC_QUOT); \ - (temp_holder).s = (str).s + (temp_counter) + 1; \ - (temp_holder).len = (temp_counter) + 1; \ - break; \ - case '\'': \ - (temp_holder).len = (temp_counter) - (temp_holder).len; \ - XHTTP_PI_COPY_2(p, (temp_holder), XHTTP_PI_ESC_SQUOT); \ - (temp_holder).s = (str).s + (temp_counter) + 1; \ - (temp_holder).len = (temp_counter) + 1; \ - break; \ - } \ - } \ - (temp_holder).len = (temp_counter) - (temp_holder).len; \ - XHTTP_PI_COPY(p, (temp_holder)); \ -}while(0) - - -static const str XHTTP_PI_Response_Head_1 = str_init(""\ - "Kamailio Provisioning Interface"\ - ""\ - ""\ - ""); - - -static const str XHTTP_PI_Response_Head_2 = str_init(\ -""\ -""); - -static const str XHTTP_PI_Response_Title_Table_1 = str_init(\ -""\ - ""\ - "
"\ - "

Kamailio Provisioning Interface

"); -static const str XHTTP_PI_Response_Title_Table_3 = str_init("
\n
\n"); - -static const str XHTTP_PI_Response_Menu_Table_1 = str_init("\n"); + "table.center{margin-left:auto;margin-right:auto;}\n" + "" + "" + ""); + + +static const str XHTTP_PI_Response_Head_2 = + str_init("" + ""); + +static const str XHTTP_PI_Response_Title_Table_1 = str_init( + "
" + "" + "
" + "

Kamailio Provisioning Interface

"); +static const str XHTTP_PI_Response_Title_Table_3 = + str_init("
\n
\n"); + +static const str XHTTP_PI_Response_Menu_Table_1 = + str_init("\n"); static const str XHTTP_PI_Response_Menu_Table_2 = str_init("
"); static const str XHTTP_PI_Response_Menu_Table_4 = str_init("\n"); static const str XHTTP_PI_Response_Menu_Table_4b = str_init("\n"); -static const str XHTTP_PI_Response_Menu_Table_5 = str_init("
\n"); - -static const str XHTTP_PI_Response_Menu_Cmd_Table_1a = str_init("\n"); -static const str XHTTP_PI_Response_Menu_Cmd_Table_1b = str_init("
\n"); +static const str XHTTP_PI_Response_Menu_Table_5 = + str_init("
\n"); + +static const str XHTTP_PI_Response_Menu_Cmd_Table_1a = + str_init("\n"); +static const str XHTTP_PI_Response_Menu_Cmd_Table_1b = + str_init("
\n"); static const str XHTTP_PI_Response_Menu_Cmd_tr_1 = str_init("\n"); -static const str XHTTP_PI_Response_Menu_Cmd_td_1a = str_init(" \n"); -static const str XHTTP_PI_Response_Menu_Cmd_td_1b = str_init(" \n"); static const str XHTTP_PI_Response_Menu_Cmd_td_4c = str_init(" \n"); static const str XHTTP_PI_Response_Menu_Cmd_td_4d = str_init("\n"); static const str XHTTP_PI_Response_Menu_Cmd_tr_2 = str_init("\n"); -static const str XHTTP_PI_Response_Menu_Cmd_Table_2 = str_init("
"); -static const str XHTTP_PI_Response_Menu_Cmd_td_1c = str_init(" "); +static const str XHTTP_PI_Response_Menu_Cmd_td_1c = + str_init(" "); -static const str XHTTP_PI_Response_Menu_Cmd_td_1e = str_init(" "); -static const str XHTTP_PI_Response_Menu_Cmd_td_1f = str_init(" "); +static const str XHTTP_PI_Response_Menu_Cmd_td_1e = + str_init(" "); +static const str XHTTP_PI_Response_Menu_Cmd_td_1f = + str_init(" "); static const str XHTTP_PI_Response_Menu_Cmd_td_3c = str_init("\">"); static const str XHTTP_PI_Response_Menu_Cmd_td_4b = str_init("
\n"); +static const str XHTTP_PI_Response_Menu_Cmd_Table_2 = + str_init("\n"); static const str XHTTP_PI_NBSP = str_init(" "); static const str XHTTP_PI_SLASH = str_init("/"); @@ -350,53 +444,55 @@ static const str XHTTP_PI_SQUOT_GT = str_init("'>"); static const str XHTTP_PI_ATTR_SEPARATOR = str_init(" "); static const str XHTTP_PI_ATTR_VAL_SEPARATOR = str_init("="); -static const str XHTTP_PI_Post_Form_1 = str_init("\n"\ -"
\n" -" \n"); -static const str XHTTP_PI_Post_Input = str_init(\ -" "); +static const str XHTTP_PI_Post_Form_1 = + str_init("\n" + " \n" + " \n"); +static const str XHTTP_PI_Post_Input = str_init(" "); static const str XHTTP_PI_Post_Clause_Input = str_init("
Clause:"); static const str XHTTP_PI_Post_Values_Input = str_init("
Values:"); -static const str XHTTP_PI_Post_Query_Input = str_init("\n"); -static const str XHTTP_PI_Post_Input_1 = str_init(\ -" \n"); +static const str XHTTP_PI_Post_Input_1 = str_init(" \n"); -static const str XHTTP_PI_Post_Input_Hidden_1 = str_init(\ -" \n"); static const str XHTTP_PI_Post_Input_3 = str_init("\"/>\n"); -static const str XHTTP_PI_Post_Input_4 = str_init(\ -"
"); -static const str XHTTP_PI_Post_Input_Text = str_init(\ -"
"); +static const str XHTTP_PI_Post_Input_Text = + str_init("
\n"); -static const str XHTTP_PI_Post_Form_2 = str_init(\ -"
\n"\ -"
\n"); - -static const str XHTTP_PI_Response_Foot = str_init(\ -"\n
\n
"\ - ""\ - "Kamailio web site
"\ - "Copyright © 2012-2014 VoIP Embedded Inc."\ - ". All rights reserved."\ -"
"); +static const str XHTTP_PI_Post_Input_4 = + str_init(" \n"); +static const str XHTTP_PI_Post_Form_2 = + str_init("
\n" + " \n"); + +static const str XHTTP_PI_Response_Foot = + str_init("\n
\n
" + "" + "Kamailio web site
" + "Copyright © 2012-2014 VoIP Embedded Inc." + ". All rights reserved." + "
"); #define XHTTP_PI_ROWSPAN 20 static const str XHTTP_PI_CMD_ROWSPAN = str_init("20"); -static const str XHTTP_PI_ESC_LT = str_init("<"); /* < */ -static const str XHTTP_PI_ESC_GT = str_init(">"); /* > */ -static const str XHTTP_PI_ESC_AMP = str_init("&"); /* & */ -static const str XHTTP_PI_ESC_QUOT = str_init("""); /* " */ -static const str XHTTP_PI_ESC_SQUOT = str_init("'"); /* ' */ +static const str XHTTP_PI_ESC_LT = str_init("<"); /* < */ +static const str XHTTP_PI_ESC_GT = str_init(">"); /* > */ +static const str XHTTP_PI_ESC_AMP = str_init("&"); /* & */ +static const str XHTTP_PI_ESC_QUOT = str_init("""); /* " */ +static const str XHTTP_PI_ESC_SQUOT = str_init("'"); /* ' */ static const str XHTTP_PI_HREF_1 = str_init("=url_len) + if(index >= url_len) return 0; - for(i=index;iph_modules_size && - (mod_len!=ph_modules[i].module.len || - strncmp(&url[index], ph_modules[i].module.s,mod_len)!=0);i++); - if (i==ph_framework_data->ph_modules_size) { - LM_ERR("Invalid mod [%.*s] in url [%s]\n", - mod_len, &url[index], url); + for(i = 0; i < ph_framework_data->ph_modules_size + && (mod_len != ph_modules[i].module.len + || strncmp(&url[index], ph_modules[i].module.s, mod_len) + != 0); + i++) + ; + if(i == ph_framework_data->ph_modules_size) { + LM_ERR("Invalid mod [%.*s] in url [%s]\n", mod_len, &url[index], url); return -1; } *mod = i; @@ -2027,40 +2067,43 @@ int ph_parse_url(const str* url_str, int* mod, int* cmd, str* arg) index += mod_len; LM_DBG("index=%d url_len=%d\n", index, url_len); - if (index>=url_len) + if(index >= url_len) return 0; /* skip over '/' */ index++; /* Looking for "cmd" */ - if (index>=url_len) + if(index >= url_len) return 0; - for(i=index;i=url_len) + if(index >= url_len) return 0; - if (url[index]=='/') { + if(url[index] == '/') { /* We expect to have here a '?' not a '/' */ return 0; } /* skip over '?' */ index++; - if (url_len - index>0) { + if(url_len - index > 0) { arg->s = &url[index]; arg->len = url_len - index; LM_DBG("got extra [%.*s]\n", arg->len, arg->s); @@ -2070,52 +2113,57 @@ int ph_parse_url(const str* url_str, int* mod, int* cmd, str* arg) } -void ph_parse_arg(str* buf, str* name, str* val) +void ph_parse_arg(str *buf, str *name, str *val) { int i; val->s = NULL; val->len = 0; - LM_DBG("looking for [%.*s] in [%p][%d]->[%.*s]\n", - name->len, name->s, - buf->s, buf->len, buf->len, buf->s); - if (buf->len < name->len) { + LM_DBG("looking for [%.*s] in [%p][%d]->[%.*s]\n", name->len, name->s, + buf->s, buf->len, buf->len, buf->s); + if(buf->len < name->len) { LM_DBG("cannot extract arg [%.*s]\n", name->len, name->s); return; } - if (strncmp(buf->s, name->s, name->len)!=0) { + if(strncmp(buf->s, name->s, name->len) != 0) { LM_ERR("no match for arg [%.*s]\n", name->len, name->s); return; } - if (buf->s[name->len]!='=') { + if(buf->s[name->len] != '=') { LM_ERR("unexpected char [%c] while looking for [=]\n", buf->s[name->len]); return; } - val->s =&(buf->s[name->len+1]); - if (name->len == buf->len) { - buf->s = NULL; buf->len = 0; + val->s = &(buf->s[name->len + 1]); + if(name->len == buf->len) { + buf->s = NULL; + buf->len = 0; return; } - for(i=name->len+1;ilen&&buf->s[i]!='&';i++); - val->len = i - name->len -1; - if(i==buf->len) { + for(i = name->len + 1; i < buf->len && buf->s[i] != '&'; i++) + ; + val->len = i - name->len - 1; + if(i == buf->len) { /* We reached the end of buf */ - LM_DBG("advancing [%d] slots, enf of buffer, val=[%d][%.*s]\n", - i, val->len, val->len, val->s); - buf->s = NULL; buf->len = 0; + LM_DBG("advancing [%d] slots, enf of buffer, val=[%d][%.*s]\n", i, + val->len, val->len, val->s); + buf->s = NULL; + buf->len = 0; } else { i++; /* skip over '&' */ - buf->s = &(buf->s[i]); buf->len -= i; - if (buf->len) { + buf->s = &(buf->s[i]); + buf->len -= i; + if(buf->len) { LM_DBG("advancing [%d] slots, remaining buffer" - " [%p][%d]->[%.*s], val=[%d][%.*s]\n", - i, buf->s, buf->len, buf->len, buf->s, val->len, val->len, val->s); + " [%p][%d]->[%.*s], val=[%d][%.*s]\n", + i, buf->s, buf->len, buf->len, buf->s, val->len, val->len, + val->s); } else { - LM_DBG("advancing [%d] slots, no remaining buffer, val=[%d][%.*s]\n", - i, val->len, val->len, val->s); + LM_DBG("advancing [%d] slots, no remaining buffer, " + "val=[%d][%.*s]\n", + i, val->len, val->len, val->s); buf->s = NULL; } } @@ -2125,7 +2173,7 @@ void ph_parse_arg(str* buf, str* name, str* val) int ph_build_form_imput(char **p, char *buf, str *page, int max_page_len, - int mod, int cmd, str *clause, db_val_t *values) + int mod, int cmd, str *clause, db_val_t *values) { unsigned long i, j; char c; @@ -2138,227 +2186,237 @@ int ph_build_form_imput(char **p, char *buf, str *page, int max_page_len, ph_modules = ph_framework_data->ph_modules; command = &ph_modules[mod].cmds[cmd]; - if(command->c_keys_size && (command->type==DB_CAP_QUERY || - command->type==DB_CAP_DELETE || - command->type==DB_CAP_UPDATE)){ - XHTTP_PI_COPY_3(*p,XHTTP_PI_Post_Input, - XHTTP_PI_Post_Clause_Input, + if(command->c_keys_size + && (command->type == DB_CAP_QUERY || command->type == DB_CAP_DELETE + || command->type == DB_CAP_UPDATE)) { + XHTTP_PI_COPY_3(*p, XHTTP_PI_Post_Input, XHTTP_PI_Post_Clause_Input, XHTTP_PI_Post_Query_Input); - for(i=0;ic_keys_size;i++){ + for(i = 0; i < command->c_keys_size; i++) { /* FIXME: we should escape c_ops */ - op.s = (char*)command->c_ops[i]; + op.s = (char *)command->c_ops[i]; op.len = strlen(op.s); arg.s = int2str(i, &arg.len); - switch(command->c_vals[i].vals_size){ - case 0: - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_1); - XHTTP_PI_COPY(*p, *command->c_keys[i]); - XHTTP_PI_COPY(*p, XHTTP_PI_ATTR_SEPARATOR); - XHTTP_PI_COPY(*p, op); - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Text); - XHTTP_PI_COPY(*p, arg); - if (i==0 && clause) { + switch(command->c_vals[i].vals_size) { + case 0: + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_1); + XHTTP_PI_COPY(*p, *command->c_keys[i]); + XHTTP_PI_COPY(*p, XHTTP_PI_ATTR_SEPARATOR); + XHTTP_PI_COPY(*p, op); + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Text); + XHTTP_PI_COPY(*p, arg); + if(i == 0 && clause) { + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Hidden_2); + XHTTP_PI_COPY(*p, *clause); + } + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_3); + break; + case 1: + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Hidden_1); + XHTTP_PI_COPY(*p, arg); XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Hidden_2); - XHTTP_PI_COPY(*p, *clause); - } - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_3); - break; - case 1: - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Hidden_1); - XHTTP_PI_COPY(*p, arg); - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Hidden_2); - XHTTP_PI_COPY(*p, command->c_vals[i].vals[0]); - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Hidden_3); - break; - default: - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_1); - XHTTP_PI_COPY(*p, *command->c_keys[i]); - XHTTP_PI_COPY(*p, XHTTP_PI_ATTR_SEPARATOR); - XHTTP_PI_COPY(*p, op); - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Select_1); - XHTTP_PI_COPY(*p, arg); - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Select_2); - for(j=0;jc_vals[i].vals_size;j++){ - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Option_1); - XHTTP_PI_COPY(*p, command->c_vals[i].vals[j]); - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Option_2); - XHTTP_PI_COPY(*p, command->c_vals[i].ids[j]); - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Option_3); - } - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Select_3); + XHTTP_PI_COPY(*p, command->c_vals[i].vals[0]); + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Hidden_3); + break; + default: + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_1); + XHTTP_PI_COPY(*p, *command->c_keys[i]); + XHTTP_PI_COPY(*p, XHTTP_PI_ATTR_SEPARATOR); + XHTTP_PI_COPY(*p, op); + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Select_1); + XHTTP_PI_COPY(*p, arg); + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Select_2); + for(j = 0; j < command->c_vals[i].vals_size; j++) { + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Option_1); + XHTTP_PI_COPY(*p, command->c_vals[i].vals[j]); + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Option_2); + XHTTP_PI_COPY(*p, command->c_vals[i].ids[j]); + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Option_3); + } + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Select_3); } } XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_4); } - if(command->q_keys_size && (command->type==DB_CAP_INSERT || - command->type==DB_CAP_UPDATE || - command->type==DB_CAP_REPLACE)){ - XHTTP_PI_COPY_3(*p,XHTTP_PI_Post_Input, - XHTTP_PI_Post_Values_Input, + if(command->q_keys_size + && (command->type == DB_CAP_INSERT || command->type == DB_CAP_UPDATE + || command->type == DB_CAP_REPLACE)) { + XHTTP_PI_COPY_3(*p, XHTTP_PI_Post_Input, XHTTP_PI_Post_Values_Input, XHTTP_PI_Post_Query_Input); - arg.s = &c; arg.len = 1; - for(i=0,c='a';iq_keys_size;i++,c++){ - if(c=='z'){ - LM_ERR("To many q_keys\n"); return -1; + arg.s = &c; + arg.len = 1; + for(i = 0, c = 'a'; i < command->q_keys_size; i++, c++) { + if(c == 'z') { + LM_ERR("To many q_keys\n"); + return -1; } - switch(command->q_vals[i].vals_size){ - case 0: - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_1); - XHTTP_PI_COPY(*p, *command->q_keys[i]); - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Text); - XHTTP_PI_COPY(*p, arg); - if (values) { - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Hidden_2); - switch(command->q_types[i]){ - case DB1_STR: - case DB1_STRING: - case DB1_BLOB: - if(values[i].val.str_val.s==NULL){ - val_str.s = NULL; val_str.len = 0; - } else { - val_str.s = values[i].val.str_val.s; - val_str.len = strlen(val_str.s); - } - LM_DBG("...got %.*s[0]=>" - "[%.*s][%.*s]\n", - command->q_keys[i]->len, - command->q_keys[i]->s, - values[i].val.str_val.len, - values[i].val.str_val.s, - val_str.len, val_str.s); - if (val_str.len) { - XHTTP_PI_ESC_COPY(*p, val_str, temp_holder, temp_counter); - } - break; - case DB1_INT: - val_str.s = *p; - val_str.len = max_page_len - page->len; - if(db_int2str(values[i].val.int_val, - val_str.s, &val_str.len)!=0){ - LM_ERR("Unable to convert int [%d]\n", - values[i].val.int_val); - goto error; - } - *p += val_str.len; - page->len += val_str.len; - LM_DBG(" got %.*s[0]=>" - "[%d][%.*s]\n", - command->q_keys[i]->len, - command->q_keys[i]->s, - values[i].val.int_val, - val_str.len, val_str.s); - break; - case DB1_BITMAP: - val_str.s = *p; - val_str.len = max_page_len - page->len; - if(db_int2str(values[i].val.bitmap_val, - val_str.s, &val_str.len)!=0){ - LM_ERR("Unable to convert bitmap [%d]\n", - values[i].val.bitmap_val); - goto error; - } - *p += val_str.len; - page->len += val_str.len; - LM_DBG(" got %.*s[0]=>" - "[%d][%.*s]\n", - command->q_keys[i]->len, - command->q_keys[i]->s, - values[i].val.bitmap_val, - val_str.len, val_str.s); - break; - case DB1_BIGINT: - val_str.s = *p; - val_str.len = max_page_len - page->len; - if(db_longlong2str(values[i].val.ll_val, - val_str.s, &val_str.len)!=0){ - LM_ERR("Unable to convert bigint [%-lld]\n", - values[i].val.ll_val); - goto error; - } - *p += val_str.len; - page->len += val_str.len; - LM_DBG(" got %.*s[0]=>" - "[%-lld][%.*s]\n", - command->q_keys[i]->len, - command->q_keys[i]->s, - values[i].val.ll_val, - val_str.len, val_str.s); - break; - case DB1_DOUBLE: - val_str.s = *p; - val_str.len = max_page_len - page->len; - if(db_double2str(values[i].val.double_val, - val_str.s, &val_str.len)!=0){ - LM_ERR("Unable to convert double [%-10.2f]\n", - values[i].val.double_val); - goto error; - } - *p += val_str.len; - page->len += val_str.len; - LM_DBG(" got %.*s[0]=>" - "[%-10.2f][%.*s]\n", - command->q_keys[i]->len, - command->q_keys[i]->s, - values[i].val.double_val, - val_str.len, val_str.s); - break; - case DB1_DATETIME: - val_str.s = *p; - val_str.len = max_page_len - page->len; - if (db_time2str(values[i].val.time_val, - val_str.s, &val_str.len)!=0){ - LM_ERR("Unable to convert time [%ld]\n", - (unsigned long int)values[i].val.time_val); - goto error; + switch(command->q_vals[i].vals_size) { + case 0: + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_1); + XHTTP_PI_COPY(*p, *command->q_keys[i]); + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Text); + XHTTP_PI_COPY(*p, arg); + if(values) { + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Hidden_2); + switch(command->q_types[i]) { + case DB1_STR: + case DB1_STRING: + case DB1_BLOB: + if(values[i].val.str_val.s == NULL) { + val_str.s = NULL; + val_str.len = 0; + } else { + val_str.s = values[i].val.str_val.s; + val_str.len = strlen(val_str.s); + } + LM_DBG("...got %.*s[0]=>" + "[%.*s][%.*s]\n", + command->q_keys[i]->len, + command->q_keys[i]->s, + values[i].val.str_val.len, + values[i].val.str_val.s, val_str.len, + val_str.s); + if(val_str.len) { + XHTTP_PI_ESC_COPY(*p, val_str, temp_holder, + temp_counter); + } + break; + case DB1_INT: + val_str.s = *p; + val_str.len = max_page_len - page->len; + if(db_int2str(values[i].val.int_val, val_str.s, + &val_str.len) + != 0) { + LM_ERR("Unable to convert int [%d]\n", + values[i].val.int_val); + goto error; + } + *p += val_str.len; + page->len += val_str.len; + LM_DBG(" got %.*s[0]=>" + "[%d][%.*s]\n", + command->q_keys[i]->len, + command->q_keys[i]->s, + values[i].val.int_val, val_str.len, + val_str.s); + break; + case DB1_BITMAP: + val_str.s = *p; + val_str.len = max_page_len - page->len; + if(db_int2str(values[i].val.bitmap_val, + val_str.s, &val_str.len) + != 0) { + LM_ERR("Unable to convert bitmap [%d]\n", + values[i].val.bitmap_val); + goto error; + } + *p += val_str.len; + page->len += val_str.len; + LM_DBG(" got %.*s[0]=>" + "[%d][%.*s]\n", + command->q_keys[i]->len, + command->q_keys[i]->s, + values[i].val.bitmap_val, val_str.len, + val_str.s); + break; + case DB1_BIGINT: + val_str.s = *p; + val_str.len = max_page_len - page->len; + if(db_longlong2str(values[i].val.ll_val, + val_str.s, &val_str.len) + != 0) { + LM_ERR("Unable to convert bigint [%-lld]\n", + values[i].val.ll_val); + goto error; + } + *p += val_str.len; + page->len += val_str.len; + LM_DBG(" got %.*s[0]=>" + "[%-lld][%.*s]\n", + command->q_keys[i]->len, + command->q_keys[i]->s, + values[i].val.ll_val, val_str.len, + val_str.s); + break; + case DB1_DOUBLE: + val_str.s = *p; + val_str.len = max_page_len - page->len; + if(db_double2str(values[i].val.double_val, + val_str.s, &val_str.len) + != 0) { + LM_ERR("Unable to convert double " + "[%-10.2f]\n", + values[i].val.double_val); + goto error; + } + *p += val_str.len; + page->len += val_str.len; + LM_DBG(" got %.*s[0]=>" + "[%-10.2f][%.*s]\n", + command->q_keys[i]->len, + command->q_keys[i]->s, + values[i].val.double_val, val_str.len, + val_str.s); + break; + case DB1_DATETIME: + val_str.s = *p; + val_str.len = max_page_len - page->len; + if(db_time2str(values[i].val.time_val, + val_str.s, &val_str.len) + != 0) { + LM_ERR("Unable to convert time [%ld]\n", + (unsigned long int)values[i] + .val.time_val); + goto error; + } + *p += val_str.len; + page->len += val_str.len; + LM_DBG(" got %.*s[0]=>" + "[%ld][%.*s]\n", + command->q_keys[i]->len, + command->q_keys[i]->s, + (unsigned long int)values[i] + .val.time_val, + val_str.len, val_str.s); + break; + default: + LM_ERR("unexpected type [%d] " + "for [%.*s]\n", + command->q_types[i], + command->q_keys[i]->len, + command->q_keys[i]->s); } - *p += val_str.len; - page->len += val_str.len; - LM_DBG(" got %.*s[0]=>" - "[%ld][%.*s]\n", - command->q_keys[i]->len, - command->q_keys[i]->s, - (unsigned long int)values[i].val.time_val, - val_str.len, val_str.s); - break; - default: - LM_ERR("unexpected type [%d] " - "for [%.*s]\n", - command->q_types[i], - command->q_keys[i]->len, - command->q_keys[i]->s); } - } - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_3); - break; - case 1: - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Hidden_1); - XHTTP_PI_COPY(*p, arg); - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Hidden_2); - XHTTP_PI_COPY(*p, command->q_vals[i].vals[0]); - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Hidden_3); - break; - default: - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_1); - XHTTP_PI_COPY(*p, *command->q_keys[i]); - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Select_1); - XHTTP_PI_COPY(*p, arg); - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Select_2); - for(j=0;jq_vals[i].vals_size;j++){ - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Option_1); - XHTTP_PI_COPY(*p, command->q_vals[i].vals[j]); - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Option_2); - XHTTP_PI_COPY(*p, command->q_vals[i].ids[j]); - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Option_3); - } - XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Select_3); + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_3); + break; + case 1: + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Hidden_1); + XHTTP_PI_COPY(*p, arg); + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Hidden_2); + XHTTP_PI_COPY(*p, command->q_vals[i].vals[0]); + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Hidden_3); + break; + default: + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_1); + XHTTP_PI_COPY(*p, *command->q_keys[i]); + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Select_1); + XHTTP_PI_COPY(*p, arg); + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Select_2); + for(j = 0; j < command->q_vals[i].vals_size; j++) { + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Option_1); + XHTTP_PI_COPY(*p, command->q_vals[i].vals[j]); + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Option_2); + XHTTP_PI_COPY(*p, command->q_vals[i].ids[j]); + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Option_3); + } + XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_Select_3); } } XHTTP_PI_COPY(*p, XHTTP_PI_Post_Input_4); } return 0; error: - LM_ERR("buffer 2 small: *p=[%p] buf=[%p] max_page_len=[%d]\n", - *p, buf, max_page_len); + LM_ERR("buffer 2 small: *p=[%p] buf=[%p] max_page_len=[%d]\n", *p, buf, + max_page_len); return -1; } @@ -2374,32 +2432,29 @@ int ph_build_header(pi_ctx_t *ctx) ph_modules = ph_framework_data->ph_modules; p = ctx->reply.body.s + ctx->reply.body.len; - XHTTP_PI_COPY_4(p,XHTTP_PI_Response_Head_1, - XHTTP_PI_Response_Head_2, - XHTTP_PI_Response_Title_Table_1, - XHTTP_PI_Response_Title_Table_3); + XHTTP_PI_COPY_4(p, XHTTP_PI_Response_Head_1, XHTTP_PI_Response_Head_2, + XHTTP_PI_Response_Title_Table_1, XHTTP_PI_Response_Title_Table_3); /* Building module menu */ - XHTTP_PI_COPY(p,XHTTP_PI_Response_Menu_Table_1); - for(i=0;iph_modules_size;i++) { - if(i!=ctx->mod) { - XHTTP_PI_COPY(p,XHTTP_PI_Response_Menu_Table_2); + XHTTP_PI_COPY(p, XHTTP_PI_Response_Menu_Table_1); + for(i = 0; i < ph_framework_data->ph_modules_size; i++) { + if(i != ctx->mod) { + XHTTP_PI_COPY(p, XHTTP_PI_Response_Menu_Table_2); } else { - XHTTP_PI_COPY(p,XHTTP_PI_Response_Menu_Table_2b); + XHTTP_PI_COPY(p, XHTTP_PI_Response_Menu_Table_2b); } - XHTTP_PI_COPY(p,XHTTP_PI_SLASH); - if (xhttp_pi_root.len) { - XHTTP_PI_COPY_2(p,xhttp_pi_root,XHTTP_PI_SLASH); + XHTTP_PI_COPY(p, XHTTP_PI_SLASH); + if(xhttp_pi_root.len) { + XHTTP_PI_COPY_2(p, xhttp_pi_root, XHTTP_PI_SLASH); } - XHTTP_PI_COPY_3(p,ph_modules[i].module, - XHTTP_PI_Response_Menu_Table_3, + XHTTP_PI_COPY_3(p, ph_modules[i].module, XHTTP_PI_Response_Menu_Table_3, ph_modules[i].module); - if(i!=ctx->mod) { - XHTTP_PI_COPY(p,XHTTP_PI_Response_Menu_Table_4); + if(i != ctx->mod) { + XHTTP_PI_COPY(p, XHTTP_PI_Response_Menu_Table_4); } else { - XHTTP_PI_COPY(p,XHTTP_PI_Response_Menu_Table_4b); + XHTTP_PI_COPY(p, XHTTP_PI_Response_Menu_Table_4b); } } - XHTTP_PI_COPY(p,XHTTP_PI_Response_Menu_Table_5); + XHTTP_PI_COPY(p, XHTTP_PI_Response_Menu_Table_5); ctx->reply.body.len = p - ctx->reply.body.s; return 0; @@ -2410,7 +2465,6 @@ int ph_build_header(pi_ctx_t *ctx) } - int ph_build_reply(pi_ctx_t *ctx) { char *p; @@ -2422,28 +2476,22 @@ int ph_build_reply(pi_ctx_t *ctx) p = ctx->reply.body.s + ctx->reply.body.len; /* Print command name */ - XHTTP_PI_COPY_4(p,XHTTP_PI_Response_Menu_Cmd_Table_1b, - XHTTP_PI_Response_Menu_Cmd_tr_1, - XHTTP_PI_Response_Menu_Cmd_td_1a, + XHTTP_PI_COPY_4(p, XHTTP_PI_Response_Menu_Cmd_Table_1b, + XHTTP_PI_Response_Menu_Cmd_tr_1, XHTTP_PI_Response_Menu_Cmd_td_1a, XHTTP_PI_SLASH); - if (xhttp_pi_root.len) { - XHTTP_PI_COPY_2(p,xhttp_pi_root, XHTTP_PI_SLASH); + if(xhttp_pi_root.len) { + XHTTP_PI_COPY_2(p, xhttp_pi_root, XHTTP_PI_SLASH); } - XHTTP_PI_COPY_6(p,ph_modules[ctx->mod].module, - XHTTP_PI_SLASH, - ph_modules[ctx->mod].cmds[ctx->cmd].name, - XHTTP_PI_SQUOT_GT, + XHTTP_PI_COPY_6(p, ph_modules[ctx->mod].module, XHTTP_PI_SLASH, + ph_modules[ctx->mod].cmds[ctx->cmd].name, XHTTP_PI_SQUOT_GT, ph_modules[ctx->mod].cmds[ctx->cmd].name, XHTTP_PI_Response_Menu_Cmd_td_4a); /* Print cmd name */ - XHTTP_PI_COPY_9(p,XHTTP_PI_Response_Menu_Cmd_td_1e, + XHTTP_PI_COPY_9(p, XHTTP_PI_Response_Menu_Cmd_td_1e, ph_modules[ctx->mod].cmds[ctx->cmd].name, - XHTTP_PI_Response_Menu_Cmd_td_4d, - XHTTP_PI_Response_Menu_Cmd_tr_2, - XHTTP_PI_Response_Menu_Cmd_tr_1, - XHTTP_PI_Response_Menu_Cmd_td_1f, - XHTTP_PI_NBSP, - XHTTP_PI_Response_Menu_Cmd_td_4d, + XHTTP_PI_Response_Menu_Cmd_td_4d, XHTTP_PI_Response_Menu_Cmd_tr_2, + XHTTP_PI_Response_Menu_Cmd_tr_1, XHTTP_PI_Response_Menu_Cmd_td_1f, + XHTTP_PI_NBSP, XHTTP_PI_Response_Menu_Cmd_td_4d, XHTTP_PI_Response_Menu_Cmd_td_1d); ctx->reply.body.len = p - ctx->reply.body.s; @@ -2461,9 +2509,8 @@ int ph_build_reply_footer(pi_ctx_t *ctx) /* Here we print the footer */ buf = ctx->reply.buf.s; p = ctx->reply.body.s + ctx->reply.body.len; - XHTTP_PI_COPY_3(p,XHTTP_PI_Response_Menu_Cmd_tr_2, - XHTTP_PI_Response_Menu_Cmd_Table_2, - XHTTP_PI_Response_Foot); + XHTTP_PI_COPY_3(p, XHTTP_PI_Response_Menu_Cmd_tr_2, + XHTTP_PI_Response_Menu_Cmd_Table_2, XHTTP_PI_Response_Foot); ctx->reply.body.len = p - ctx->reply.body.s; return 0; error: @@ -2485,91 +2532,79 @@ int ph_build_content(pi_ctx_t *ctx, str *clause, db_val_t *values) buf = ctx->reply.buf.s; p = ctx->reply.body.s + ctx->reply.body.len; - if (mod>=0) { /* Building command menu */ + if(mod >= 0) { /* Building command menu */ /* Build the list of commands for the selected module */ - XHTTP_PI_COPY_4(p,XHTTP_PI_Response_Menu_Cmd_Table_1a, + XHTTP_PI_COPY_4(p, XHTTP_PI_Response_Menu_Cmd_Table_1a, XHTTP_PI_Response_Menu_Cmd_tr_1, - XHTTP_PI_Response_Menu_Cmd_td_1a, - XHTTP_PI_SLASH); - if (xhttp_pi_root.len) { - XHTTP_PI_COPY_2(p,xhttp_pi_root,XHTTP_PI_SLASH); + XHTTP_PI_Response_Menu_Cmd_td_1a, XHTTP_PI_SLASH); + if(xhttp_pi_root.len) { + XHTTP_PI_COPY_2(p, xhttp_pi_root, XHTTP_PI_SLASH); } - XHTTP_PI_COPY_6(p,ph_modules[mod].module, - XHTTP_PI_SLASH, - ph_modules[mod].cmds[0].name, - XHTTP_PI_SQUOT_GT, - ph_modules[mod].cmds[0].name, - XHTTP_PI_Response_Menu_Cmd_td_4a); - if (cmd>=0) { - XHTTP_PI_COPY_3(p,XHTTP_PI_Response_Menu_Cmd_td_1b, + XHTTP_PI_COPY_6(p, ph_modules[mod].module, XHTTP_PI_SLASH, + ph_modules[mod].cmds[0].name, XHTTP_PI_SQUOT_GT, + ph_modules[mod].cmds[0].name, XHTTP_PI_Response_Menu_Cmd_td_4a); + if(cmd >= 0) { + XHTTP_PI_COPY_3(p, XHTTP_PI_Response_Menu_Cmd_td_1b, ph_modules[mod].cmds[cmd].name, XHTTP_PI_Response_Menu_Cmd_td_4b); } - XHTTP_PI_COPY(p,XHTTP_PI_Response_Menu_Cmd_tr_2); - for(j=1;j=0){ - if (j==1) { - XHTTP_PI_COPY_4(p, - XHTTP_PI_Response_Menu_Cmd_td_1c, - XHTTP_PI_CMD_ROWSPAN, - XHTTP_PI_Response_Menu_Cmd_td_3c, - XHTTP_PI_Post_Form_1); - if(ph_build_form_imput(&p, buf, &ctx->reply.body, max_page_len, - mod, cmd, clause, values)!=0) + if(cmd >= 0) { + if(j == 1) { + XHTTP_PI_COPY_4(p, XHTTP_PI_Response_Menu_Cmd_td_1c, + XHTTP_PI_CMD_ROWSPAN, + XHTTP_PI_Response_Menu_Cmd_td_3c, + XHTTP_PI_Post_Form_1); + if(ph_build_form_imput(&p, buf, &ctx->reply.body, + max_page_len, mod, cmd, clause, values) + != 0) return -1; XHTTP_PI_COPY_2(p, XHTTP_PI_Post_Form_2, - XHTTP_PI_Response_Menu_Cmd_td_4c); - } else if (j>XHTTP_PI_ROWSPAN) { - XHTTP_PI_COPY_3(p, - XHTTP_PI_Response_Menu_Cmd_td_1d, - XHTTP_PI_NBSP, - XHTTP_PI_Response_Menu_Cmd_td_4d); + XHTTP_PI_Response_Menu_Cmd_td_4c); + } else if(j > XHTTP_PI_ROWSPAN) { + XHTTP_PI_COPY_3(p, XHTTP_PI_Response_Menu_Cmd_td_1d, + XHTTP_PI_NBSP, XHTTP_PI_Response_Menu_Cmd_td_4d); } } - XHTTP_PI_COPY(p,XHTTP_PI_Response_Menu_Cmd_tr_2); + XHTTP_PI_COPY(p, XHTTP_PI_Response_Menu_Cmd_tr_2); } - if (cmd>=0){ - if (j==1) { - XHTTP_PI_COPY_8(p,XHTTP_PI_Response_Menu_Cmd_tr_1, - XHTTP_PI_Response_Menu_Cmd_td_1d, - XHTTP_PI_NBSP, + if(cmd >= 0) { + if(j == 1) { + XHTTP_PI_COPY_8(p, XHTTP_PI_Response_Menu_Cmd_tr_1, + XHTTP_PI_Response_Menu_Cmd_td_1d, XHTTP_PI_NBSP, XHTTP_PI_Response_Menu_Cmd_td_4d, - XHTTP_PI_Response_Menu_Cmd_td_1c, - XHTTP_PI_CMD_ROWSPAN, - XHTTP_PI_Response_Menu_Cmd_td_3c, - XHTTP_PI_Post_Form_1); + XHTTP_PI_Response_Menu_Cmd_td_1c, XHTTP_PI_CMD_ROWSPAN, + XHTTP_PI_Response_Menu_Cmd_td_3c, XHTTP_PI_Post_Form_1); if(ph_build_form_imput(&p, buf, &ctx->reply.body, max_page_len, - mod, cmd, clause, values)!=0) + mod, cmd, clause, values) + != 0) return -1; XHTTP_PI_COPY_3(p, XHTTP_PI_Post_Form_2, XHTTP_PI_Response_Menu_Cmd_td_4c, XHTTP_PI_Response_Menu_Cmd_tr_2); j++; } - for(;j<=XHTTP_PI_ROWSPAN;j++) { - XHTTP_PI_COPY_5(p,XHTTP_PI_Response_Menu_Cmd_tr_1, - XHTTP_PI_Response_Menu_Cmd_td_1d, - XHTTP_PI_NBSP, + for(; j <= XHTTP_PI_ROWSPAN; j++) { + XHTTP_PI_COPY_5(p, XHTTP_PI_Response_Menu_Cmd_tr_1, + XHTTP_PI_Response_Menu_Cmd_td_1d, XHTTP_PI_NBSP, XHTTP_PI_Response_Menu_Cmd_td_4d, XHTTP_PI_Response_Menu_Cmd_tr_2); } } - XHTTP_PI_COPY_2(p,XHTTP_PI_Response_Menu_Cmd_Table_2, - XHTTP_PI_Response_Foot); + XHTTP_PI_COPY_2( + p, XHTTP_PI_Response_Menu_Cmd_Table_2, XHTTP_PI_Response_Foot); } else { - XHTTP_PI_COPY(p,XHTTP_PI_Response_Foot); + XHTTP_PI_COPY(p, XHTTP_PI_Response_Foot); } ctx->reply.body.len = p - ctx->reply.body.s; @@ -2581,8 +2616,8 @@ int ph_build_content(pi_ctx_t *ctx, str *clause, db_val_t *values) } -int getVal(db_val_t *val, db_type_t val_type, db_key_t key, ph_db_table_t *table, - str *arg, pi_ctx_t *ctx) +int getVal(db_val_t *val, db_type_t val_type, db_key_t key, + ph_db_table_t *table, str *arg, pi_ctx_t *ctx) { char *p = ctx->reply.body.s + ctx->reply.body.len; char *buf = ctx->reply.buf.s; @@ -2595,180 +2630,168 @@ int getVal(db_val_t *val, db_type_t val_type, db_key_t key, ph_db_table_t *table int port, proto; struct sip_uri uri; - for(i=0;i<=table->cols_size;i++){ - if(table->cols[i].type==val_type && - table->cols[i].field.len==key->len && - strncmp(table->cols[i].field.s,key->s,key->len)==0){ - if(table->cols[i].validation==0) continue; + for(i = 0; i <= table->cols_size; i++) { + if(table->cols[i].type == val_type + && table->cols[i].field.len == key->len + && strncmp(table->cols[i].field.s, key->s, key->len) == 0) { + if(table->cols[i].validation == 0) + continue; flags = table->cols[i].validation; LM_DBG("[%.*s] has flags [%u]\n", key->len, key->s, flags); - if(flags&PH_FLAG_P_HOST_PORT){ - flags&= ~ PH_FLAG_P_HOST_PORT; + if(flags & PH_FLAG_P_HOST_PORT) { + flags &= ~PH_FLAG_P_HOST_PORT; c = arg->s[arg->len]; arg->s[arg->len] = '\0'; - if (parse_phostport(arg->s, - &host.s, &host.len, - &port, &proto)!=0){ + if(parse_phostport(arg->s, &host.s, &host.len, &port, &proto) + != 0) { arg->s[arg->len] = c; XHTTP_PI_BUILD_REPLY(ctx, - "Invalid [proto:]host[:port] for" - "%.*s [%.*s].", - key->len, key->s, arg->len, arg->s); + "Invalid [proto:]host[:port] for" + "%.*s [%.*s].", + key->len, key->s, arg->len, arg->s); goto done; } arg->s[arg->len] = c; - LM_DBG("[%.*s]->[%d][%.*s][%d] (%d)\n", - arg->len, arg->s, proto, - host.len, host.s, port, (int)flags); + LM_DBG("[%.*s]->[%d][%.*s][%d] (%d)\n", arg->len, arg->s, proto, + host.len, host.s, port, (int)flags); continue; } LM_DBG("[%.*s] has flags [%d]\n", key->len, key->s, flags); - if(flags&PH_FLAG_P_IPV4_PORT){ - flags&= ~ PH_FLAG_P_IPV4_PORT; + if(flags & PH_FLAG_P_IPV4_PORT) { + flags &= ~PH_FLAG_P_IPV4_PORT; c = arg->s[arg->len]; arg->s[arg->len] = '\0'; - if (parse_phostport(arg->s, - &host.s, &host.len, - &port, &proto)!=0){ + if(parse_phostport(arg->s, &host.s, &host.len, &port, &proto) + != 0) { arg->s[arg->len] = c; XHTTP_PI_BUILD_REPLY(ctx, - "Invalid [proto:]IPv4[:port] for" - " %.*s [%.*s].", - key->len, key->s, arg->len, arg->s); + "Invalid [proto:]IPv4[:port] for" + " %.*s [%.*s].", + key->len, key->s, arg->len, arg->s); goto done; } arg->s[arg->len] = c; - LM_DBG("[%.*s]->[%d][%.*s][%d] (%d)\n", - arg->len, arg->s, proto, - host.len, host.s, port, (int)flags); - if (str2ip(&host)==NULL) { + LM_DBG("[%.*s]->[%d][%.*s][%d] (%d)\n", arg->len, arg->s, proto, + host.len, host.s, port, (int)flags); + if(str2ip(&host) == NULL) { XHTTP_PI_BUILD_REPLY(ctx, - "Invalid IPv4 in [proto:]IPv4[:port]" - " %.*s [%.*s][%.*s].", - key->len, key->s, - host.len, host.s, - arg->len, arg->s); + "Invalid IPv4 in [proto:]IPv4[:port]" + " %.*s [%.*s][%.*s].", + key->len, key->s, host.len, host.s, arg->len, + arg->s); goto done; } continue; } LM_DBG("[%.*s] has flags [%d]\n", key->len, key->s, flags); - if(flags&PH_FLAG_IPV4){ - flags&= ~ PH_FLAG_IPV4; - if (str2ip(arg)==NULL) { - XHTTP_PI_BUILD_REPLY(ctx, - "Invalid IPv4 for %.*s [%.*s].", - key->len, key->s, arg->len, arg->s); + if(flags & PH_FLAG_IPV4) { + flags &= ~PH_FLAG_IPV4; + if(str2ip(arg) == NULL) { + XHTTP_PI_BUILD_REPLY(ctx, "Invalid IPv4 for %.*s [%.*s].", + key->len, key->s, arg->len, arg->s); goto done; } LM_DBG("[%.*s] has new flags [%d]\n", key->len, key->s, flags); continue; } LM_DBG("[%.*s] has flags [%d]\n", key->len, key->s, flags); - if(flags&PH_FLAG_URI){ - flags&= ~ PH_FLAG_URI; - if (parse_uri(arg->s, arg->len, &uri)<0){ + if(flags & PH_FLAG_URI) { + flags &= ~PH_FLAG_URI; + if(parse_uri(arg->s, arg->len, &uri) < 0) { XHTTP_PI_BUILD_REPLY(ctx, - "Invalid SIP URI for %.*s [%.*s].", - key->len, key->s, arg->len, arg->s); + "Invalid SIP URI for %.*s [%.*s].", key->len, + key->s, arg->len, arg->s); goto done; } LM_DBG("[%.*s] has new flags [%d]\n", key->len, key->s, flags); continue; } LM_DBG("[%.*s] has flags [%d]\n", key->len, key->s, flags); - if(flags&PH_FLAG_URI_IPV4HOST){ - flags&= ~ PH_FLAG_URI_IPV4HOST; - if (parse_uri(arg->s, arg->len, &uri)<0){ + if(flags & PH_FLAG_URI_IPV4HOST) { + flags &= ~PH_FLAG_URI_IPV4HOST; + if(parse_uri(arg->s, arg->len, &uri) < 0) { XHTTP_PI_BUILD_REPLY(ctx, - "Invalid SIP URI for %.*s [%.*s].", - key->len, key->s, arg->len, arg->s); + "Invalid SIP URI for %.*s [%.*s].", key->len, + key->s, arg->len, arg->s); goto done; } - if (str2ip(&uri.host)==NULL) { + if(str2ip(&uri.host) == NULL) { XHTTP_PI_BUILD_REPLY(ctx, - "Invalid IPv4 host in SIP URI for" - " %.*s [%.*s][%.*s].", - key->len, key->s, - uri.host.len, uri.host.s, - arg->len, arg->s); + "Invalid IPv4 host in SIP URI for" + " %.*s [%.*s][%.*s].", + key->len, key->s, uri.host.len, uri.host.s, + arg->len, arg->s); goto done; } LM_DBG("[%.*s] has new flags [%d]\n", key->len, key->s, flags); continue; } LM_DBG("[%.*s] has flags [%d]\n", key->len, key->s, flags); - if(flags){ - XHTTP_PI_BUILD_REPLY(ctx, - "Unknown validation [%d] for %s.", - table->cols[i].validation, key->s); + if(flags) { + XHTTP_PI_BUILD_REPLY(ctx, "Unknown validation [%d] for %s.", + table->cols[i].validation, key->s); goto done; } } } - switch(val_type){ - case DB1_STR: - case DB1_STRING: - case DB1_BLOB: - if(arg->len){ - val->val.str_val.s = arg->s; - val->val.str_val.len = arg->len; - } - break; - case DB1_INT: - case DB1_BITMAP: - c = arg->s[arg->len]; - arg->s[arg->len] = '\0'; - if(db_str2int(arg->s,&val->val.int_val)<0){ + switch(val_type) { + case DB1_STR: + case DB1_STRING: + case DB1_BLOB: + if(arg->len) { + val->val.str_val.s = arg->s; + val->val.str_val.len = arg->len; + } + break; + case DB1_INT: + case DB1_BITMAP: + c = arg->s[arg->len]; + arg->s[arg->len] = '\0'; + if(db_str2int(arg->s, &val->val.int_val) < 0) { + arg->s[arg->len] = c; + XHTTP_PI_BUILD_REPLY(ctx, "Bogus field %.*s [%.*s].", key->len, + key->s, arg->len, arg->s); + goto done; + } arg->s[arg->len] = c; - XHTTP_PI_BUILD_REPLY(ctx, - "Bogus field %.*s [%.*s].", - key->len, key->s, arg->len, arg->s); - goto done; - } - arg->s[arg->len] = c; - break; - case DB1_BIGINT: - c = arg->s[arg->len]; - arg->s[arg->len] = '\0'; - if(db_str2longlong(arg->s,&val->val.ll_val)<0){ + break; + case DB1_BIGINT: + c = arg->s[arg->len]; + arg->s[arg->len] = '\0'; + if(db_str2longlong(arg->s, &val->val.ll_val) < 0) { + arg->s[arg->len] = c; + XHTTP_PI_BUILD_REPLY(ctx, "Bogus field %.*s [%.*s].", key->len, + key->s, arg->len, arg->s); + goto done; + } arg->s[arg->len] = c; - XHTTP_PI_BUILD_REPLY(ctx, - "Bogus field %.*s [%.*s].", - key->len, key->s, arg->len, arg->s); - goto done; - } - arg->s[arg->len] = c; - break; - case DB1_DOUBLE: - c = arg->s[arg->len]; - arg->s[arg->len] = '\0'; - if(db_str2double(arg->s,&val->val.double_val)<0){ + break; + case DB1_DOUBLE: + c = arg->s[arg->len]; + arg->s[arg->len] = '\0'; + if(db_str2double(arg->s, &val->val.double_val) < 0) { + arg->s[arg->len] = c; + XHTTP_PI_BUILD_REPLY(ctx, "Bogus field %.*s [%.*s].", key->len, + key->s, arg->len, arg->s); + goto done; + } arg->s[arg->len] = c; - XHTTP_PI_BUILD_REPLY(ctx, - "Bogus field %.*s [%.*s].", - key->len, key->s, arg->len, arg->s); - goto done; - } - arg->s[arg->len] = c; - break; - case DB1_DATETIME: - c = arg->s[arg->len]; - arg->s[arg->len] = '\0'; - if(db_str2time(arg->s,&val->val.time_val)<0){ + break; + case DB1_DATETIME: + c = arg->s[arg->len]; + arg->s[arg->len] = '\0'; + if(db_str2time(arg->s, &val->val.time_val) < 0) { + arg->s[arg->len] = c; + XHTTP_PI_BUILD_REPLY(ctx, "Bogus field %.*s [%.*s].", key->len, + key->s, arg->len, arg->s); + goto done; + } arg->s[arg->len] = c; - XHTTP_PI_BUILD_REPLY(ctx, - "Bogus field %.*s [%.*s].", - key->len, key->s, arg->len, arg->s); + break; + default: + XHTTP_PI_BUILD_REPLY(ctx, "Unexpected type [%d] for field [%.*s]\n", + val_type, key->len, key->s); goto done; - } - arg->s[arg->len] = c; - break; - default: - XHTTP_PI_BUILD_REPLY(ctx, - "Unexpected type [%d] for field [%.*s]\n", - val_type, key->len, key->s); - goto done; } ctx->reply.body.len = p - ctx->reply.body.s; return 0; @@ -2782,8 +2805,7 @@ int getVal(db_val_t *val, db_type_t val_type, db_key_t key, ph_db_table_t *table } - -int ph_run_pi_cmd(pi_ctx_t* ctx) +int ph_run_pi_cmd(pi_ctx_t *ctx) { char *p; char *buf = ctx->reply.buf.s; @@ -2819,98 +2841,103 @@ int ph_run_pi_cmd(pi_ctx_t* ctx) ph_modules = ph_framework_data->ph_modules; - if (0!=ph_build_header(ctx)) return -1; + if(0 != ph_build_header(ctx)) + return -1; p = ctx->reply.body.s + ctx->reply.body.len; - if (cmd<0) return ph_build_content(ctx, NULL, NULL); + if(cmd < 0) + return ph_build_content(ctx, NULL, NULL); - arg_name.s = "cmd"; arg_name .len=3; + arg_name.s = "cmd"; + arg_name.len = 3; ph_parse_arg(&arg_url, &arg_name, &arg_val); - if (arg_val.s==NULL) return ph_build_content(ctx, NULL, NULL); + if(arg_val.s == NULL) + return ph_build_content(ctx, NULL, NULL); LM_DBG("got arg cmd=[%.*s]\n", arg_val.len, arg_val.s); command = &ph_modules[mod].cmds[cmd]; - if (arg_val.len==3 && strncmp(arg_val.s, "pre", 3)==0) { + if(arg_val.len == 3 && strncmp(arg_val.s, "pre", 3) == 0) { /* We prebuild values only for update */ - if(command->type!=DB_CAP_UPDATE) { + if(command->type != DB_CAP_UPDATE) { LM_ERR("command [%.*s] is not DB_CAP_UPDATE type\n", - command->name.len, command->name.s); + command->name.len, command->name.s); return ph_build_content(ctx, NULL, NULL); } /* We prebuild values only for single clause update command */ - if(command->c_keys_size!=1) { - LM_ERR("command [%.*s] has [%d] clause keys\n", - command->name.len, command->name.s, command->c_keys_size); + if(command->c_keys_size != 1) { + LM_ERR("command [%.*s] has [%d] clause keys\n", command->name.len, + command->name.s, command->c_keys_size); return ph_build_content(ctx, NULL, NULL); } - LM_DBG("[%.*s] with clause key [%.*s]\n", - command->name.len, command->name.s, - command->c_keys[0]->len, command->c_keys[0]->s); + LM_DBG("[%.*s] with clause key [%.*s]\n", command->name.len, + command->name.s, command->c_keys[0]->len, + command->c_keys[0]->s); - arg_name.s = command->c_keys[0]->s; arg_name.len = command->c_keys[0]->len; + arg_name.s = command->c_keys[0]->s; + arg_name.len = command->c_keys[0]->len; ph_parse_arg(&arg_url, &arg_name, &arg_val); - if(arg_val.s==NULL) { + if(arg_val.s == NULL) { LM_ERR("missing clause key [%.*s] in args\n", - command->c_keys[0]->len, command->c_keys[0]->s); + command->c_keys[0]->len, command->c_keys[0]->s); return ph_build_content(ctx, NULL, NULL); } - LM_DBG("got clause [%.*s] with value [%.*s]\n", - command->c_keys[0]->len, command->c_keys[0]->s, arg_val.len, arg_val.s); + LM_DBG("got clause [%.*s] with value [%.*s]\n", command->c_keys[0]->len, + command->c_keys[0]->s, arg_val.len, arg_val.s); - c_vals = (db_val_t*)pkg_malloc(command->c_keys_size*sizeof(db_val_t)); - if(c_vals==NULL){ + c_vals = + (db_val_t *)pkg_malloc(command->c_keys_size * sizeof(db_val_t)); + if(c_vals == NULL) { PKG_MEM_ERROR; return -1; } - memset(c_vals, 0, command->c_keys_size*sizeof(db_val_t)); + memset(c_vals, 0, command->c_keys_size * sizeof(db_val_t)); val = &c_vals[0]; val->type = command->c_types[0]; ret = getVal(val, command->c_types[0], command->c_keys[0], command->db_table, &arg_val, ctx); - if(ret<0) + if(ret < 0) goto error; - else if(ret>0) + else if(ret > 0) goto finish_page; /* Let's run the query to get the values for the record to update*/ db_url = command->db_table->db_url; - if(use_table(command->db_table)<0){ - XHTTP_PI_BUILD_REPLY(ctx, - "Error on table [%.*s].", - command->db_table->name.len, - command->db_table->name.s); + if(use_table(command->db_table) < 0) { + XHTTP_PI_BUILD_REPLY(ctx, "Error on table [%.*s].", + command->db_table->name.len, command->db_table->name.s); goto finish_page; } - if(db_url->http_dbf.query(db_url->http_db_handle, - command->c_keys, command->c_ops, c_vals, - command->q_keys, - command->c_keys_size, - command->q_keys_size, - command->o_keys?*command->o_keys:0, &res) < 0){ - XHTTP_PI_COMPLETE_REPLY(ctx, - "Error while querying database."); + if(db_url->http_dbf.query(db_url->http_db_handle, command->c_keys, + command->c_ops, c_vals, command->q_keys, + command->c_keys_size, command->q_keys_size, + command->o_keys ? *command->o_keys : 0, &res) + < 0) { + XHTTP_PI_COMPLETE_REPLY(ctx, "Error while querying database."); goto finish_page; } nr_rows = RES_ROW_N(res); - switch (nr_rows) { - case 0: - LM_ERR("no record on clause key [%.*s]\n", - command->c_keys[0]->len, command->c_keys[0]->s); - if(c_vals) { pkg_free(c_vals); c_vals = NULL; } - goto finish_page; - case 1: - LM_DBG("got [%d] rows for key [%.*s]\n", - nr_rows, command->c_keys[0]->len, command->c_keys[0]->s); - break; - default: - LM_ERR("to many records [%d] on clause key [%.*s]\n", - nr_rows, command->c_keys[0]->len, command->c_keys[0]->s); - goto finish_page; + switch(nr_rows) { + case 0: + LM_ERR("no record on clause key [%.*s]\n", + command->c_keys[0]->len, command->c_keys[0]->s); + if(c_vals) { + pkg_free(c_vals); + c_vals = NULL; + } + goto finish_page; + case 1: + LM_DBG("got [%d] rows for key [%.*s]\n", nr_rows, + command->c_keys[0]->len, command->c_keys[0]->s); + break; + default: + LM_ERR("to many records [%d] on clause key [%.*s]\n", nr_rows, + command->c_keys[0]->len, command->c_keys[0]->s); + goto finish_page; } rows = RES_ROWS(res); @@ -2919,385 +2946,414 @@ int ph_run_pi_cmd(pi_ctx_t* ctx) db_url->http_dbf.free_result(db_url->http_db_handle, res); //res = NULL; return ret; - } else if(arg_val.len==2 && strncmp(arg_val.s, "on", 2)==0) { + } else if(arg_val.len == 2 && strncmp(arg_val.s, "on", 2) == 0) { /* allocate c_vals array */ - if(command->c_keys_size){ - c_vals = (db_val_t*)pkg_malloc(command->c_keys_size*sizeof(db_val_t)); - if(c_vals==NULL){ + if(command->c_keys_size) { + c_vals = (db_val_t *)pkg_malloc( + command->c_keys_size * sizeof(db_val_t)); + if(c_vals == NULL) { PKG_MEM_ERROR; return -1; } - memset(c_vals, 0, command->c_keys_size*sizeof(db_val_t)); - for(i=0;ic_keys_size;i++){ + memset(c_vals, 0, command->c_keys_size * sizeof(db_val_t)); + for(i = 0; i < command->c_keys_size; i++) { arg_name.s = int2str(i, &arg_name.len); ph_parse_arg(&arg_url, &arg_name, &arg_val); - if(arg_val.s==NULL){ + if(arg_val.s == NULL) { XHTTP_PI_BUILD_REPLY(ctx, - "No argument for clause field #%d: %.*s.", - i, command->c_keys[i]->len, - command->c_keys[i]->s); + "No argument for clause field #%d: %.*s.", i, + command->c_keys[i]->len, command->c_keys[i]->s); goto done; } - if(arg_val.len==0){ + if(arg_val.len == 0) { XHTTP_PI_BUILD_REPLY(ctx, - "Empty argument for clause field #%d: %.*s.", - i, command->c_keys[i]->len, - command->c_keys[i]->s); + "Empty argument for clause field #%d: %.*s.", i, + command->c_keys[i]->len, command->c_keys[i]->s); goto done; } //LM_DBG("arg_val=[%s] arg=[%s]\n", arg_val.s, arg); val = &c_vals[i]; val->type = command->c_types[i]; - + ret = getVal(val, command->c_types[i], command->c_keys[i], - command->db_table, &arg_val, ctx); - if(ret<0) + command->db_table, &arg_val, ctx); + if(ret < 0) goto error; - else if(ret>0) + else if(ret > 0) goto done; } } } - if(command->q_keys_size && command->type!=DB_CAP_QUERY){ - q_vals = (db_val_t*)pkg_malloc(command->q_keys_size*sizeof(db_val_t)); - if(q_vals==NULL){ + if(command->q_keys_size && command->type != DB_CAP_QUERY) { + q_vals = + (db_val_t *)pkg_malloc(command->q_keys_size * sizeof(db_val_t)); + if(q_vals == NULL) { PKG_MEM_ERROR; return -1; } - memset(q_vals, 0, command->q_keys_size*sizeof(db_val_t)); - for(i=0,c='a';iq_keys_size;i++,c++){ - if(c=='z'){ - XHTTP_PI_BUILD_REPLY(ctx, - "Too many query values."); + memset(q_vals, 0, command->q_keys_size * sizeof(db_val_t)); + for(i = 0, c = 'a'; i < command->q_keys_size; i++, c++) { + if(c == 'z') { + XHTTP_PI_BUILD_REPLY(ctx, "Too many query values."); goto done; } LM_DBG("looking for arg [%c]\n", c); - arg_name.s = &c; arg_name.len = 1; + arg_name.s = &c; + arg_name.len = 1; ph_parse_arg(&arg_url, &arg_name, &arg_val); - if(arg_val.s==NULL){ + if(arg_val.s == NULL) { XHTTP_PI_BUILD_REPLY(ctx, - "No argument for query field #%d: %.*s.", - i, command->q_keys[i]->len, - command->q_keys[i]->s); + "No argument for query field #%d: %.*s.", i, + command->q_keys[i]->len, command->q_keys[i]->s); goto done; } - if(arg_val.len==0 && (command->q_types[i]!=DB1_STR && - command->q_types[i]!=DB1_STRING && - command->q_types[i]!=DB1_BLOB)){ + if(arg_val.len == 0 + && (command->q_types[i] != DB1_STR + && command->q_types[i] != DB1_STRING + && command->q_types[i] != DB1_BLOB)) { XHTTP_PI_BUILD_REPLY(ctx, - "Empty argument for query field #%d: %.*s.", - i, command->q_keys[i]->len, - command->q_keys[i]->s); + "Empty argument for query field #%d: %.*s.", i, + command->q_keys[i]->len, command->q_keys[i]->s); goto done; } val = &q_vals[i]; val->type = command->q_types[i]; ret = getVal(val, command->q_types[i], command->q_keys[i], - command->db_table, &arg_val, ctx); - if(ret<0) + command->db_table, &arg_val, ctx); + if(ret < 0) goto error; - else if(ret>0) + else if(ret > 0) goto done; - } } db_url = command->db_table->db_url; - if(use_table(command->db_table)<0){ - XHTTP_PI_BUILD_REPLY(ctx, - "Error on table [%.*s].", - command->db_table->name.len, - command->db_table->name.s); + if(use_table(command->db_table) < 0) { + XHTTP_PI_BUILD_REPLY(ctx, "Error on table [%.*s].", + command->db_table->name.len, command->db_table->name.s); goto done; } - if(ph_build_reply(ctx)<0) + if(ph_build_reply(ctx) < 0) goto error; p = ctx->reply.body.s + ctx->reply.body.len; - switch (command->type) { - case DB_CAP_QUERY: - for(j=0;jq_keys_size;j++){ - if(j)XHTTP_PI_COPY(p,XHTTP_PI_Response_Menu_Cmd_td_1d); - XHTTP_PI_COPY_2(p,*(command->q_keys[j]), - XHTTP_PI_Response_Menu_Cmd_td_4d); - - } - if (DB_CAPABILITY(db_url->http_dbf, DB_CAP_FETCH)){ - if(db_url->http_dbf.query(db_url->http_db_handle, - command->c_keys, command->c_ops, c_vals, - command->q_keys, - command->c_keys_size, - command->q_keys_size, - command->o_keys?*command->o_keys:0, 0) < 0){ - XHTTP_PI_COMPLETE_REPLY(ctx, - "Error while querying (fetch) database."); - goto done; - } - if(db_url->http_dbf.fetch_result(db_url->http_db_handle, - &res, 100)<0){ - XHTTP_PI_COMPLETE_REPLY(ctx, - "Fetching rows failed."); - goto done; + switch(command->type) { + case DB_CAP_QUERY: + for(j = 0; j < command->q_keys_size; j++) { + if(j) + XHTTP_PI_COPY(p, XHTTP_PI_Response_Menu_Cmd_td_1d); + XHTTP_PI_COPY_2(p, *(command->q_keys[j]), + XHTTP_PI_Response_Menu_Cmd_td_4d); } - }else{ - if(db_url->http_dbf.query(db_url->http_db_handle, - command->c_keys, command->c_ops, c_vals, - command->q_keys, - command->c_keys_size, - command->q_keys_size, - command->o_keys?*command->o_keys:0, &res) < 0){ - XHTTP_PI_COMPLETE_REPLY(ctx, - "Error while querying database."); - goto done; + if(DB_CAPABILITY(db_url->http_dbf, DB_CAP_FETCH)) { + if(db_url->http_dbf.query(db_url->http_db_handle, + command->c_keys, command->c_ops, c_vals, + command->q_keys, command->c_keys_size, + command->q_keys_size, + command->o_keys ? *command->o_keys : 0, 0) + < 0) { + XHTTP_PI_COMPLETE_REPLY( + ctx, "Error while querying (fetch) database."); + goto done; + } + if(db_url->http_dbf.fetch_result( + db_url->http_db_handle, &res, 100) + < 0) { + XHTTP_PI_COMPLETE_REPLY(ctx, "Fetching rows failed."); + goto done; + } + } else { + if(db_url->http_dbf.query(db_url->http_db_handle, + command->c_keys, command->c_ops, c_vals, + command->q_keys, command->c_keys_size, + command->q_keys_size, + command->o_keys ? *command->o_keys : 0, &res) + < 0) { + XHTTP_PI_COMPLETE_REPLY( + ctx, "Error while querying database."); + goto done; + } } - } - nr_rows = RES_ROW_N(res); - do{ - LM_DBG("loading [%i] records from db\n", nr_rows); - rows = RES_ROWS(res); - for(i=0;iq_keys_size;j++){ - XHTTP_PI_COPY(p,XHTTP_PI_Response_Menu_Cmd_td_1d); - /* BEGIN */ - link_on = 0; - if(command->link_cmd && command->link_cmd[j].s) { - link_on = 1; - XHTTP_PI_COPY(p,XHTTP_PI_HREF_1); - if (xhttp_pi_root.len) { - XHTTP_PI_COPY_2(p, xhttp_pi_root, XHTTP_PI_SLASH); - } - XHTTP_PI_COPY_2(p,ph_modules[mod].module, XHTTP_PI_SLASH); - XHTTP_PI_COPY(p,command->link_cmd[j]); /* this is the command */ - XHTTP_PI_COPY_3(p,XHTTP_PI_HREF_2, - *command->q_keys[j], - XHTTP_PI_ATTR_VAL_SEPARATOR); - } - /* END */ - switch(command->q_types[j]){ - case DB1_STR: - case DB1_STRING: - case DB1_BLOB: - if(values[j].val.str_val.s==NULL){ - val_str.s = NULL; val_str.len = 0; - } else { - val_str.s = values[j].val.str_val.s; - val_str.len = strlen(val_str.s); - } - LM_DBG("...got %.*s[%d]=>" - "[%.*s][%.*s]\n", - command->q_keys[j]->len, - command->q_keys[j]->s, i, - values[j].val.str_val.len, - values[j].val.str_val.s, - val_str.len, val_str.s); - if (val_str.len) { - if(link_on) { - XHTTP_PI_ESC_COPY(p, val_str, temp_holder, temp_counter); - XHTTP_PI_COPY(p, XHTTP_PI_SQUOT_GT); - } - XHTTP_PI_ESC_COPY(p, val_str, temp_holder, temp_counter); - } else { - if(link_on) { - XHTTP_PI_COPY(p, XHTTP_PI_NBSP); - XHTTP_PI_COPY(p, XHTTP_PI_SQUOT_GT); + nr_rows = RES_ROW_N(res); + do { + LM_DBG("loading [%i] records from db\n", nr_rows); + rows = RES_ROWS(res); + for(i = 0; i < nr_rows; i++) { + values = ROW_VALUES(rows + i); + XHTTP_PI_COPY(p, XHTTP_PI_Response_Menu_Cmd_tr_1); + for(j = 0; j < command->q_keys_size; j++) { + XHTTP_PI_COPY(p, XHTTP_PI_Response_Menu_Cmd_td_1d); + /* BEGIN */ + link_on = 0; + if(command->link_cmd && command->link_cmd[j].s) { + link_on = 1; + XHTTP_PI_COPY(p, XHTTP_PI_HREF_1); + if(xhttp_pi_root.len) { + XHTTP_PI_COPY_2( + p, xhttp_pi_root, XHTTP_PI_SLASH); } - XHTTP_PI_COPY(p, XHTTP_PI_NBSP); - } - break; - case DB1_INT: - val_str.s = p; - val_str.len = max_page_len - ctx->reply.body.len; - if(db_int2str(values[j].val.int_val, - val_str.s, &val_str.len)!=0){ - LM_ERR("Unable to convert int [%d]\n", - values[j].val.int_val); - goto error; - } - p += val_str.len; - ctx->reply.body.len += val_str.len; - if(link_on) XHTTP_PI_COPY_2(p,XHTTP_PI_SQUOT_GT,val_str); - LM_DBG(" got %.*s[%d]=>" - "[%d][%.*s]\n", - command->q_keys[j]->len, - command->q_keys[j]->s, i, - values[j].val.int_val, - val_str.len, val_str.s); - break; - case DB1_BITMAP: - val_str.s = p; - val_str.len = max_page_len - ctx->reply.body.len; - if(db_int2str(values[j].val.bitmap_val, - val_str.s, &val_str.len)!=0){ - LM_ERR("Unable to convert bitmap [%d]\n", - values[j].val.bitmap_val); - goto error; - } - p += val_str.len; - ctx->reply.body.len += val_str.len; - if(link_on) XHTTP_PI_COPY_2(p,XHTTP_PI_SQUOT_GT,val_str); - LM_DBG(" got %.*s[%d]=>" - "[%d][%.*s]\n", - command->q_keys[j]->len, - command->q_keys[j]->s, i, - values[j].val.bitmap_val, - val_str.len, val_str.s); - break; - case DB1_BIGINT: - val_str.s = p; - val_str.len = max_page_len - ctx->reply.body.len; - if(db_longlong2str(values[j].val.ll_val, - val_str.s, &val_str.len)!=0){ - LM_ERR("Unable to convert bigint [%-lld]\n", - values[j].val.ll_val); - goto error; + XHTTP_PI_COPY_2( + p, ph_modules[mod].module, XHTTP_PI_SLASH); + XHTTP_PI_COPY( + p, command->link_cmd + [j]); /* this is the command */ + XHTTP_PI_COPY_3(p, XHTTP_PI_HREF_2, + *command->q_keys[j], + XHTTP_PI_ATTR_VAL_SEPARATOR); } - p += val_str.len; - ctx->reply.body.len += val_str.len; - if(link_on) XHTTP_PI_COPY_2(p,XHTTP_PI_SQUOT_GT,val_str); - LM_DBG(" got %.*s[%d]=>" - "[%-lld][%.*s]\n", - command->q_keys[j]->len, - command->q_keys[j]->s, i, - values[j].val.ll_val, - val_str.len, val_str.s); - break; - case DB1_DOUBLE: - val_str.s = p; - val_str.len = max_page_len - ctx->reply.body.len; - if(db_double2str(values[j].val.double_val, - val_str.s, &val_str.len)!=0){ - LM_ERR("Unable to convert double [%-10.2f]\n", - values[j].val.double_val); - goto error; - } - p += val_str.len; - ctx->reply.body.len += val_str.len; - if(link_on) XHTTP_PI_COPY_2(p,XHTTP_PI_SQUOT_GT,val_str); - LM_DBG(" got %.*s[%d]=>" - "[%-10.2f][%.*s]\n", - command->q_keys[j]->len, - command->q_keys[j]->s, i, - values[j].val.double_val, - val_str.len, val_str.s); - break; - case DB1_DATETIME: - val_str.s = p; - val_str.len = max_page_len - ctx->reply.body.len; - if(db_time2str(values[j].val.time_val, - val_str.s, &val_str.len)!=0){ - LM_ERR("Unable to convert double [%" TIME_T_FMT "]\n", - TIME_T_CAST(values[j].val.time_val)); - goto error; + /* END */ + switch(command->q_types[j]) { + case DB1_STR: + case DB1_STRING: + case DB1_BLOB: + if(values[j].val.str_val.s == NULL) { + val_str.s = NULL; + val_str.len = 0; + } else { + val_str.s = values[j].val.str_val.s; + val_str.len = strlen(val_str.s); + } + LM_DBG("...got %.*s[%d]=>" + "[%.*s][%.*s]\n", + command->q_keys[j]->len, + command->q_keys[j]->s, i, + values[j].val.str_val.len, + values[j].val.str_val.s, val_str.len, + val_str.s); + if(val_str.len) { + if(link_on) { + XHTTP_PI_ESC_COPY(p, val_str, + temp_holder, temp_counter); + XHTTP_PI_COPY(p, XHTTP_PI_SQUOT_GT); + } + XHTTP_PI_ESC_COPY(p, val_str, temp_holder, + temp_counter); + } else { + if(link_on) { + XHTTP_PI_COPY(p, XHTTP_PI_NBSP); + XHTTP_PI_COPY(p, XHTTP_PI_SQUOT_GT); + } + XHTTP_PI_COPY(p, XHTTP_PI_NBSP); + } + break; + case DB1_INT: + val_str.s = p; + val_str.len = + max_page_len - ctx->reply.body.len; + if(db_int2str(values[j].val.int_val, val_str.s, + &val_str.len) + != 0) { + LM_ERR("Unable to convert int [%d]\n", + values[j].val.int_val); + goto error; + } + p += val_str.len; + ctx->reply.body.len += val_str.len; + if(link_on) + XHTTP_PI_COPY_2( + p, XHTTP_PI_SQUOT_GT, val_str); + LM_DBG(" got %.*s[%d]=>" + "[%d][%.*s]\n", + command->q_keys[j]->len, + command->q_keys[j]->s, i, + values[j].val.int_val, val_str.len, + val_str.s); + break; + case DB1_BITMAP: + val_str.s = p; + val_str.len = + max_page_len - ctx->reply.body.len; + if(db_int2str(values[j].val.bitmap_val, + val_str.s, &val_str.len) + != 0) { + LM_ERR("Unable to convert bitmap [%d]\n", + values[j].val.bitmap_val); + goto error; + } + p += val_str.len; + ctx->reply.body.len += val_str.len; + if(link_on) + XHTTP_PI_COPY_2( + p, XHTTP_PI_SQUOT_GT, val_str); + LM_DBG(" got %.*s[%d]=>" + "[%d][%.*s]\n", + command->q_keys[j]->len, + command->q_keys[j]->s, i, + values[j].val.bitmap_val, val_str.len, + val_str.s); + break; + case DB1_BIGINT: + val_str.s = p; + val_str.len = + max_page_len - ctx->reply.body.len; + if(db_longlong2str(values[j].val.ll_val, + val_str.s, &val_str.len) + != 0) { + LM_ERR("Unable to convert bigint [%-lld]\n", + values[j].val.ll_val); + goto error; + } + p += val_str.len; + ctx->reply.body.len += val_str.len; + if(link_on) + XHTTP_PI_COPY_2( + p, XHTTP_PI_SQUOT_GT, val_str); + LM_DBG(" got %.*s[%d]=>" + "[%-lld][%.*s]\n", + command->q_keys[j]->len, + command->q_keys[j]->s, i, + values[j].val.ll_val, val_str.len, + val_str.s); + break; + case DB1_DOUBLE: + val_str.s = p; + val_str.len = + max_page_len - ctx->reply.body.len; + if(db_double2str(values[j].val.double_val, + val_str.s, &val_str.len) + != 0) { + LM_ERR("Unable to convert double " + "[%-10.2f]\n", + values[j].val.double_val); + goto error; + } + p += val_str.len; + ctx->reply.body.len += val_str.len; + if(link_on) + XHTTP_PI_COPY_2( + p, XHTTP_PI_SQUOT_GT, val_str); + LM_DBG(" got %.*s[%d]=>" + "[%-10.2f][%.*s]\n", + command->q_keys[j]->len, + command->q_keys[j]->s, i, + values[j].val.double_val, val_str.len, + val_str.s); + break; + case DB1_DATETIME: + val_str.s = p; + val_str.len = + max_page_len - ctx->reply.body.len; + if(db_time2str(values[j].val.time_val, + val_str.s, &val_str.len) + != 0) { + LM_ERR("Unable to convert double " + "[%" TIME_T_FMT "]\n", + TIME_T_CAST( + values[j].val.time_val)); + goto error; + } + p += val_str.len; + ctx->reply.body.len += val_str.len; + if(link_on) + XHTTP_PI_COPY_2( + p, XHTTP_PI_SQUOT_GT, val_str); + LM_DBG(" got %.*s[%d]=>" + "[%" TIME_T_FMT "][%.*s]\n", + command->q_keys[j]->len, + command->q_keys[j]->s, i, + TIME_T_CAST(values[j].val.time_val), + val_str.len, val_str.s); + break; + default: + LM_ERR("unexpected type [%d] " + "for [%.*s]\n", + command->q_types[j], + command->q_keys[j]->len, + command->q_keys[j]->s); } - p += val_str.len; - ctx->reply.body.len += val_str.len; - if(link_on) XHTTP_PI_COPY_2(p,XHTTP_PI_SQUOT_GT,val_str); - LM_DBG(" got %.*s[%d]=>" - "[%" TIME_T_FMT "][%.*s]\n", - command->q_keys[j]->len, - command->q_keys[j]->s, i, - TIME_T_CAST(values[j].val.time_val), - val_str.len, val_str.s); - break; - default: - LM_ERR("unexpected type [%d] " - "for [%.*s]\n", - command->q_types[j], - command->q_keys[j]->len, - command->q_keys[j]->s); + if(link_on) + XHTTP_PI_COPY(p, XHTTP_PI_HREF_3); + XHTTP_PI_COPY(p, XHTTP_PI_Response_Menu_Cmd_td_4d); } - if(link_on) XHTTP_PI_COPY(p,XHTTP_PI_HREF_3); - XHTTP_PI_COPY(p,XHTTP_PI_Response_Menu_Cmd_td_4d); + XHTTP_PI_COPY(p, XHTTP_PI_Response_Menu_Cmd_tr_2); } - XHTTP_PI_COPY(p,XHTTP_PI_Response_Menu_Cmd_tr_2); - } - /* any more data to be fetched ?*/ - if (DB_CAPABILITY(db_url->http_dbf, DB_CAP_FETCH)){ - if(db_url->http_dbf.fetch_result(db_url->http_db_handle, - &res, 100)<0){ - LM_ERR("fetching more rows failed\n"); - goto error; + /* any more data to be fetched ?*/ + if(DB_CAPABILITY(db_url->http_dbf, DB_CAP_FETCH)) { + if(db_url->http_dbf.fetch_result( + db_url->http_db_handle, &res, 100) + < 0) { + LM_ERR("fetching more rows failed\n"); + goto error; + } + nr_rows = RES_ROW_N(res); + } else { + nr_rows = 0; } - nr_rows = RES_ROW_N(res); - }else{ - nr_rows = 0; + } while(nr_rows > 0); + db_url->http_dbf.free_result(db_url->http_db_handle, res); + goto finish_page; + break; + case DB_CAP_INSERT: + if((db_url->http_dbf.insert(db_url->http_db_handle, command->q_keys, + q_vals, command->q_keys_size)) + != 0) { + XHTTP_PI_COMPLETE_REPLY(ctx, "Unable to add record to db."); + } else { + XHTTP_PI_COMPLETE_REPLY( + ctx, "Record successfully added to db."); } - }while (nr_rows>0); - db_url->http_dbf.free_result(db_url->http_db_handle, res); - goto finish_page; - break; - case DB_CAP_INSERT: - if((db_url->http_dbf.insert(db_url->http_db_handle, - command->q_keys, q_vals, command->q_keys_size))!=0){ - XHTTP_PI_COMPLETE_REPLY(ctx, - "Unable to add record to db."); - }else{ - XHTTP_PI_COMPLETE_REPLY(ctx, - "Record successfully added to db."); - } - goto done; - break; - case DB_CAP_DELETE: - if((db_url->http_dbf.delete(db_url->http_db_handle, - command->c_keys, command->c_ops, c_vals, - command->c_keys_size))!=0) { - XHTTP_PI_COMPLETE_REPLY(ctx, - "Unable to delete record."); - }else{ - XHTTP_PI_COMPLETE_REPLY(ctx, - "Record successfully deleted from db."); - } - goto done; - break; - case DB_CAP_UPDATE: - if((db_url->http_dbf.update(db_url->http_db_handle, - command->c_keys, command->c_ops, c_vals, - command->q_keys, q_vals, - command->c_keys_size, command->q_keys_size))!=0){ - XHTTP_PI_COMPLETE_REPLY(ctx, - "Unable to update record."); - }else{ - XHTTP_PI_COMPLETE_REPLY(ctx, - "Record successfully updated."); - } - goto done; - break; - case DB_CAP_REPLACE: - /* FIXME: set proper values for: + goto done; + break; + case DB_CAP_DELETE: + if((db_url->http_dbf.delete(db_url->http_db_handle, command->c_keys, + command->c_ops, c_vals, command->c_keys_size)) + != 0) { + XHTTP_PI_COMPLETE_REPLY(ctx, "Unable to delete record."); + } else { + XHTTP_PI_COMPLETE_REPLY( + ctx, "Record successfully deleted from db."); + } + goto done; + break; + case DB_CAP_UPDATE: + if((db_url->http_dbf.update(db_url->http_db_handle, command->c_keys, + command->c_ops, c_vals, command->q_keys, q_vals, + command->c_keys_size, command->q_keys_size)) + != 0) { + XHTTP_PI_COMPLETE_REPLY(ctx, "Unable to update record."); + } else { + XHTTP_PI_COMPLETE_REPLY(ctx, "Record successfully updated."); + } + goto done; + break; + case DB_CAP_REPLACE: + /* FIXME: set proper values for: _un number of keys to build the unique key, starting from first _k _m mode - first update, then insert, or first insert, then update */ - if((db_url->http_dbf.replace(db_url->http_db_handle, - command->q_keys, q_vals, command->q_keys_size, - /*FIXME*/0, /*FIXME*/0))!=0){ - XHTTP_PI_COMPLETE_REPLY(ctx, - "Unable to replace record."); - }else{ - XHTTP_PI_COMPLETE_REPLY(ctx, - "Record successfully replaced."); - } - break; - default: - XHTTP_PI_COMPLETE_REPLY(ctx, - "Corrupt data for mod=[%d] and cmd=[%d]\n", mod, cmd); - goto done; + if((db_url->http_dbf.replace(db_url->http_db_handle, + command->q_keys, q_vals, command->q_keys_size, + /*FIXME*/ 0, /*FIXME*/ 0)) + != 0) { + XHTTP_PI_COMPLETE_REPLY(ctx, "Unable to replace record."); + } else { + XHTTP_PI_COMPLETE_REPLY(ctx, "Record successfully replaced."); + } + break; + default: + XHTTP_PI_COMPLETE_REPLY( + ctx, "Corrupt data for mod=[%d] and cmd=[%d]\n", mod, cmd); + goto done; } LM_ERR("You shoudn't end up here\n"); error: - if(c_vals) pkg_free(c_vals); - if(q_vals) pkg_free(q_vals); + if(c_vals) + pkg_free(c_vals); + if(q_vals) + pkg_free(q_vals); return -1; finish_page: - if(c_vals) pkg_free(c_vals); - if(q_vals) pkg_free(q_vals); + if(c_vals) + pkg_free(c_vals); + if(q_vals) + pkg_free(q_vals); ctx->reply.body.len = p - ctx->reply.body.s; return ph_build_reply_footer(ctx); done: - if(c_vals) pkg_free(c_vals); - if(q_vals) pkg_free(q_vals); + if(c_vals) + pkg_free(c_vals); + if(q_vals) + pkg_free(q_vals); return 0; } - diff --git a/src/modules/xhttp_pi/xhttp_pi_fnc.h b/src/modules/xhttp_pi/xhttp_pi_fnc.h index b32463516d3..4bc35ecf217 100644 --- a/src/modules/xhttp_pi/xhttp_pi_fnc.h +++ b/src/modules/xhttp_pi/xhttp_pi_fnc.h @@ -33,87 +33,93 @@ #include "xhttp_pi.h" /**< no validation required */ -#define PH_FLAG_NONE 0 +#define PH_FLAG_NONE 0 /**< validate as socket: [proto:]host[:port] */ -#define PH_FLAG_P_HOST_PORT (1<<0) +#define PH_FLAG_P_HOST_PORT (1 << 0) /**< validate as socket: [proto:]IPv4[:port] */ -#define PH_FLAG_P_IPV4_PORT (1<<1) +#define PH_FLAG_P_IPV4_PORT (1 << 1) /**< validate as IPv4 */ -#define PH_FLAG_IPV4 (1<<2) +#define PH_FLAG_IPV4 (1 << 2) /**< validate as SIP URI */ -#define PH_FLAG_URI (1<<3) +#define PH_FLAG_URI (1 << 3) /**< validate as SIP URI w/ IPv4 host */ -#define PH_FLAG_URI_IPV4HOST (1<<4) +#define PH_FLAG_URI_IPV4HOST (1 << 4) typedef short int ph_val_flags; -typedef struct ph_db_url_ { - str id; - str db_url; - db1_con_t *http_db_handle; - db_func_t http_dbf; -}ph_db_url_t; - -typedef struct ph_table_col_ { - str field; - db_type_t type; - ph_val_flags validation; -}ph_table_col_t; -typedef struct ph_db_table_ { - str id; - str name; - ph_db_url_t *db_url; - ph_table_col_t *cols; - int cols_size; -}ph_db_table_t; - -typedef struct ph_vals_ { - str *ids; /* String to display for the given value */ - str *vals; /* prepopulated value for a specific field */ - int vals_size; -}ph_vals_t; - -typedef struct ph_cmd_ { - str name; - unsigned int type; - ph_db_table_t *db_table; - db_op_t *c_ops; - db_key_t *c_keys; - db_type_t *c_types; - ph_vals_t *c_vals; /* array of prepopulated values */ - int c_keys_size; - db_key_t *q_keys; - db_type_t *q_types; - ph_vals_t *q_vals; /* array of prepopulated values */ - str *link_cmd; /* cmd to be executed for query links */ - int q_keys_size; - db_key_t *o_keys; - int o_keys_size; -}ph_cmd_t; - -typedef struct ph_mod_ { - str module; - ph_cmd_t *cmds; - int cmds_size; -}ph_mod_t; - -typedef struct ph_framework_ { - ph_db_url_t *ph_db_urls; - int ph_db_urls_size; - ph_db_table_t *ph_db_tables; - int ph_db_tables_size; - ph_mod_t *ph_modules; - int ph_modules_size; -}ph_framework_t; +typedef struct ph_db_url_ +{ + str id; + str db_url; + db1_con_t *http_db_handle; + db_func_t http_dbf; +} ph_db_url_t; + +typedef struct ph_table_col_ +{ + str field; + db_type_t type; + ph_val_flags validation; +} ph_table_col_t; +typedef struct ph_db_table_ +{ + str id; + str name; + ph_db_url_t *db_url; + ph_table_col_t *cols; + int cols_size; +} ph_db_table_t; + +typedef struct ph_vals_ +{ + str *ids; /* String to display for the given value */ + str *vals; /* prepopulated value for a specific field */ + int vals_size; +} ph_vals_t; + +typedef struct ph_cmd_ +{ + str name; + unsigned int type; + ph_db_table_t *db_table; + db_op_t *c_ops; + db_key_t *c_keys; + db_type_t *c_types; + ph_vals_t *c_vals; /* array of prepopulated values */ + int c_keys_size; + db_key_t *q_keys; + db_type_t *q_types; + ph_vals_t *q_vals; /* array of prepopulated values */ + str *link_cmd; /* cmd to be executed for query links */ + int q_keys_size; + db_key_t *o_keys; + int o_keys_size; +} ph_cmd_t; + +typedef struct ph_mod_ +{ + str module; + ph_cmd_t *cmds; + int cmds_size; +} ph_mod_t; + +typedef struct ph_framework_ +{ + ph_db_url_t *ph_db_urls; + int ph_db_urls_size; + ph_db_table_t *ph_db_tables; + int ph_db_tables_size; + ph_mod_t *ph_modules; + int ph_modules_size; +} ph_framework_t; int ph_init_async_lock(void); void ph_destroy_async_lock(void); -int ph_init_cmds(ph_framework_t **framework_data, const char* filename); -int ph_parse_url(const str* url_str, int* mod, int* cmd, str* arg); +int ph_init_cmds(ph_framework_t **framework_data, const char *filename); +int ph_parse_url(const str *url_str, int *mod, int *cmd, str *arg); int ph_run_pi_cmd(pi_ctx_t *ctx); #endif -