// mc_pack 解包
static bool unpack_data(const char* src_buf, int src_buf_len, int& post_count, u_int64_t* pids, int max_post_count)
{
	const int TMP_BUF_SIZE = 1024 * 1024;
	char tmp_buffer[TMP_BUF_SIZE];
	// mc_pack 处理
	mc_pack_t* pack = mc_pack_open_r(src_buf, src_buf_len, tmp_buffer, sizeof (tmp_buffer));
	if (pack == NULL || MC_PACK_PTR_ERR(pack) != 0)
	{
		UB_LOG_WARNING("mc_pack_open_r error.");
		return false;
	}

	int ret = 0;
	ret = mc_pack_get_int32(pack, "post_count", &post_count);
	if(0 != ret || post_count <= 0)
	{
		UB_LOG_WARNING("post_count[ret=%d, post_count=%d] get error.", ret, post_count);
		return false;
	}

	if (post_count > max_post_count)
	{
		UB_LOG_WARNING("query post_count[%d] is too large[max=%d].", post_count, max_post_count);
		return false;
	}

	mc_pack_t* pid_array = mc_pack_get_array(pack, "postids");
	if (pid_array == NULL || MC_PACK_PTR_ERR(pid_array) != 0)
	{
		UB_LOG_WARNING("recv postids pack[pid_array=%p, PTR_ERR=%d] is not valid.", pid_array, MC_PACK_PTR_ERR(pid_array));
		return false;
	}
	int c = mc_pack_get_item_count(pid_array);
	if (c != post_count)
	{
		UB_LOG_WARNING("mcpack_pid_count[ret=%d, post_count=%d] get error.", c, post_count);
		return false;
	}

	for (int i = 0; i < post_count; i++)
	{
		u_int64_t pid = 0;
		ret = mc_pack_get_uint64_arr(pid_array, i, (mc_uint64_t*)&pid);
		if(0 != ret)
		{
			UB_LOG_WARNING("get the %d(th) pid[ret = %d, pid=%lu] error. ", i, ret, pid);
			return false;
		}
		pids[i] = pid;
	}
	return true;
}
Example #2
0
int main()
{
	char buf[8192], tmp[8192];
	mc_pack_t *mc=(mc_pack_t *)malloc(8192);
	mc_pack_t *p;
	int ret;
	p=mc_pack_create(buf, sizeof(buf));
	if(MC_PACK_PTR_ERR(p)){
		puts("faint");
		return -1;
	}
	ret=mc_pack_putf(p, "cmd:%s", "SET");
	mc_pack_close(p);
	printf("%d\n",mc_pack_get_size(p));
	memcpy(mc, p, mc_pack_get_size(p));
	mc_pack_pack2str(mc, tmp, sizeof(tmp));
	printf("%s\n", tmp);
	return 0;
}
static int pack_data(char* dest_buf, int dest_buf_len, int post_count, const delpost_record_t* records)
{
	const int TMP_BUF_SIZE = 1024 * 1024;
	char tmp_buffer[TMP_BUF_SIZE];
	
	mc_pack_t* res_pack = mc_pack_open_w(1, dest_buf, dest_buf_len, tmp_buffer, sizeof (tmp_buffer));
	if(MC_PACK_PTR_ERR(res_pack) != 0)
	{
		UB_LOG_WARNING("mc_pack_create error");
		return -1;
	}

	int ret = 0;

	ret = mc_pack_put_int32(res_pack, "post_count", post_count);
	if (ret != 0)
	{
		UB_LOG_WARNING("post_count[ret=%d, post_count=%d] put error.", ret, post_count);
		return -1;
	}

	mc_pack_t* res_array = mc_pack_put_array(res_pack, "del_post_info");
	if (res_array == NULL || MC_PACK_PTR_ERR(res_array) != 0)
	{
		UB_LOG_WARNING("mc_pack_put_array del_post_info[ret=%p, MC_PACK_PTR_ERR=%d] error", res_array, MC_PACK_PTR_ERR(res_array));
		return -1;
	}

	for (int i = 0; i < post_count; i++)
	{
		mc_pack_t* obj = mc_pack_put_object(res_array, NULL);
		if (obj == NULL || MC_PACK_PTR_ERR(obj) != 0)
		{
			UB_LOG_WARNING("mc_pack_put_object res_array[ret=%p, MC_PACK_PTR_ERR=%d] error", obj, MC_PACK_PTR_ERR(obj));
			return -1;
		}

		int r = 0;
		r = mc_pack_put_uint64(obj, "post_id", (mc_uint64_t)records[i].post_id);
		if (r != 0)
		{
			UB_LOG_WARNING("mc_pack_put_uint64 post_id[pid=%lu, ret=%d] error", records[i].post_id, r);
			return -1;
		}

		r = mc_pack_put_nstr(obj, "user_name", records[i].username, strlen(records[i].username) + 1);
		if (r != 0)
		{
			UB_LOG_WARNING("mc_pack_put_uint64 user_name[username=%s, ret=%d] error", records[i].username, r);
			return -1;
		}

		r = mc_pack_put_uint32(obj, "del_time", records[i].del_time);
		if (r != 0)
		{
			UB_LOG_WARNING("mc_pack_put_uint64 del_time[del_time=%u, ret=%d] error", records[i].del_time, r);
			return -1;
		}
	}

	mc_pack_close(res_pack);

	return mc_pack_get_size(res_pack);
}
Example #4
0
int cmmsearch_query_handle_t::parse_query(const pointer_t query_cmd,
                                        ts_buffer_t &req_detail,
                                        basic_req_info *basic_info,
                                        vector < ts_terminfo_t > &term_list)
{
    int opret = 0;
    nshead_t *req_nshead = (nshead_t *) query_cmd;

	bsl::ResourcePool rp;
	req_detail.reset();
	mc_pack_t *req_mc = mc_pack_open_w_rp(2, req_detail._buf, req_detail._size, &rp);
	if(MC_PACK_PTR_ERR(req_mc)){
        UB_LOG_WARNING("[function:parse_query>>mc_pack_open_w_rp][ret:][desc:mc_pack_open_w_rp error][intput:]");
        return -2;
    }

    opret = mc_pack_json2pack((char *)(req_nshead+1), req_mc);
    if(opret<0){
        UB_LOG_WARNING("[function:parse_query>>mc_pack_json2pack][ret:][desc:mc_pack_json2pack error][intput:]");
        return -2;
    }
    //cmd
    snprintf(basic_info->cmd_str, TS_CMDSTR_MAXLEN, "%s",  mc_pack_get_str(req_mc, "cmd"));
    if(MC_PACK_PTR_ERR(basic_info->cmd_str))
    {
        return -2;
    }


    //page_no
    opret= mc_pack_get_uint32(req_mc, "page_no", &basic_info->page_no);
    if(opret < 0)
    {
        return -2;
    }
    //num_per_page
    opret= mc_pack_get_uint32(req_mc, "num_per_page", &basic_info->num_per_page );
    if(opret < 0)
    {
        return -2;
    }

    //term_list
    const char *keyword = mc_pack_get_str(req_mc, "query");
    if(MC_PACK_PTR_ERR(keyword))
    {
        return -2;
    }

    const char delimiters[] = " .,;:!-";
    char *running;
    char *token;
    running = strdup(keyword);
    ts_terminfo_t terminfo;
    token = strsep(&running, delimiters);
    while(NULL != token)
    {
        creat_sign_fs64(token, strlen(token), &terminfo.term.sign1,
                        &terminfo.term.sign2);
        term_list.push_back(terminfo);
        UB_LOG_DEBUG("qterm[%s] [%u:%u]",token, terminfo.term.sign1,
                     terminfo.term.sign2);
        token = strsep(&running, delimiters);
    }
	if (running)
		free(running);

    mc_pack_close(req_mc);
    return 0;
}