/****************************************************************************** **函数名称: invtd_search_send_and_free **功 能: 从发送搜索结果并释放内存 **输入参数: ** ctx: 上下文 ** xml: 搜索结果信息 ** req: 搜索请求信息 **输出参数: NONE **返 回: 0:成功 !0:失败 **实现描述: 从倒排表中查询结果,并将结果以XML树组织. **注意事项: **作 者: # Qifeng.zou # 2016.01.04 17:35:35 # ******************************************************************************/ static int invtd_search_send_and_free(invtd_cntx_t *ctx, xml_tree_t *xml, mesg_header_t *head, mesg_search_req_t *req, int orig) { void *addr = NULL; mesg_header_t *rsp; /* 应答 */ int body_len, total_len; if (NULL == xml) { return 0; } /* > 发送搜索应答 */ body_len = XML_PACK_LEN(xml); total_len = MESG_TOTAL_LEN(body_len); do { /* 申请内存空间(注: 多1个字符是为字串结束符'\0'预留空间) */ addr = (char *)calloc(1, total_len+1); if (NULL == addr) { break; } /* 设置发送内容 */ rsp = (mesg_header_t *)addr; MESG_HEAD_SET(rsp, MSG_SEARCH_RSP, head->sid, head->nid, head->serial, body_len); MESG_HEAD_HTON(rsp, rsp); xml_spack(xml, rsp->body); /* 放入发送队列 */ if (rtmq_proxy_async_send(ctx->frwder, MSG_SEARCH_RSP, addr, total_len)) { log_error(ctx->log, "Send response failed! serial:%ld words:%s", head->serial, req->words); } free(addr); } while(0); xml_destroy(xml); return INVT_OK; }
/****************************************************************************** **函数名称: mon_srch_set_body **功 能: 设置搜索报体 **输入参数: ** word: 搜索信息 ** size: 搜索请求的最大报体 **输出参数: NONE ** body: 搜索请求的报体 **返 回: 报体实际长度 **实现描述: **注意事项: **作 者: # Qifeng.zou # 2015.12.27 03:01:48 # ******************************************************************************/ static int mon_srch_set_body(const char *words, char *body, int size) { int len; xml_opt_t opt; xml_tree_t *xml; xml_node_t *node; memset(&opt, 0, sizeof(opt)); /* > 创建XML树 */ opt.log = NULL; opt.pool = NULL; opt.alloc = mem_alloc; opt.dealloc = mem_dealloc; xml = xml_creat_empty(&opt); if (NULL == xml) { fprintf(stderr, "Create xml failed!"); return -1; } node = xml_add_child(xml, xml->root, "SEARCH", NULL); xml_add_attr(xml, node, "WORDS", words); /* > 计算XML长度 */ len = xml_pack_len(xml); if (len >= size) { xml_destroy(xml); return -1; } /* > 输出XML至缓存 */ len = xml_spack(xml, body); xml_destroy(xml); return len; }
/****************************************************************************** **函数名称: intvd_search_send_and_free **功 能: 从发送搜索结果并释放内存 **输入参数: ** ctx: 上下文 ** xml: 搜索结果信息 ** req: 搜索请求信息 **输出参数: NONE **返 回: 0:成功 !0:失败 **实现描述: 从倒排表中查询结果,并将结果以XML树组织. **注意事项: **作 者: # Qifeng.zou # 2016.01.04 17:35:35 # ******************************************************************************/ static int intvd_search_send_and_free(invtd_cntx_t *ctx, xml_tree_t *xml, mesg_header_t *head, mesg_search_word_req_t *req, int orig) { void *addr = NULL; mesg_header_t *rsp; /* 应答 */ int body_len, total_len; if (NULL == xml) { return 0; } /* > 发送搜索应答 */ body_len = xml_pack_len(xml); total_len = mesg_total_len(body_len); do { addr = (char *)calloc(1, total_len); if (NULL == addr) { break; } rsp = (mesg_header_t *)addr; mesg_head_set(rsp, MSG_SEARCH_WORD_RSP, head->serial, sizeof(mesg_search_word_req_t)); mesg_head_hton(rsp, rsp); xml_spack(xml, rsp->body); if (rtsd_cli_send(ctx->frwder, MSG_SEARCH_WORD_RSP, addr, total_len)) { log_error(ctx->log, "Send response failed! serial:%ld words:%s", head->serial, req->words); } free(addr); } while(0); xml_destroy(xml); return INVT_OK; }
/****************************************************************************** **函数名称: intvd_search_send_and_free **功 能: 从发送搜索结果并释放内存 **输入参数: ** ctx: 上下文 ** xml: 搜索结果信息 ** req: 搜索请求信息 **输出参数: NONE **返 回: 0:成功 !0:失败 **实现描述: 从倒排表中查询结果,并将结果以XML树组织. **注意事项: **作 者: # Qifeng.zou # 2016.01.04 17:35:35 # ******************************************************************************/ static int intvd_search_send_and_free(invtd_cntx_t *ctx, xml_tree_t *xml, mesg_search_word_req_t *req, int dev_orig) { void *addr = NULL; mesg_data_t *rsp; /* 应答 */ int body_len, total_len; if (NULL == xml) { return 0; } /* > 发送搜索应答 */ body_len = xml_pack_len(xml); total_len = mesg_data_total(body_len); do { addr = (char *)calloc(1, total_len); if (NULL == addr) { break; } rsp = (mesg_data_t *)addr; xml_spack(xml, rsp->body); rsp->serial = hton64(req->serial); if (rtrd_send(ctx->rtrd, MSG_SEARCH_WORD_RSP, dev_orig, addr, total_len)) { log_error(ctx->log, "Send response failed! serial:%ld words:%s", req->serial, req->words); } free(addr); } while(0); xml_destroy(xml); return INVT_OK; }