// 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; }
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); }
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; }