Ejemplo n.º 1
0
/******************************************************************************
 **函数名称: 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;
}
Ejemplo n.º 2
0
/******************************************************************************
 **函数名称: 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;
}
Ejemplo n.º 3
0
/******************************************************************************
 **函数名称: 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;
}
Ejemplo n.º 4
0
/******************************************************************************
 **函数名称: 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;
}