int DocEngine::Command(struct mile_message_header* msg_head, struct data_buffer* rbuf, struct data_buffer* sbuf) { MEM_POOL_PTR mem_pool; void* parsed_packet; void* result; int32_t result_code = 0; uint16_t msg_type = msg_head->message_type; switch (msg_type) { case MT_MD_EXE_GET_KVS: mem_pool = mem_pool_init(MB_SIZE); parsed_packet = parse_get_kvs_packet(mem_pool, rbuf); result = GetKvs((struct get_kvs_packet*) parsed_packet, mem_pool); if(NULL == result){ result_code = ERROR_QUERY_BY_ROWID; }else{ gen_query_result_packet((ResultSet*) result, msg_head, sbuf); } mem_pool_destroy(mem_pool); break; case MT_CD_EXE_COMPRESS: mem_pool = mem_pool_init(KB_SIZE); parsed_packet = parse_compress_packet(mem_pool, rbuf); log_debug( "接收到compress命令:%s", ((struct compress_packet*)parsed_packet)->table_name); db_read_lock(); result_code = db_compress( ((struct compress_packet*) parsed_packet)->table_name, mem_pool); db_read_unlock(); gen_dc_response_packet(result_code, msg_head, sbuf); mem_pool_destroy(mem_pool); break; case MT_CD_EXE_INDEX: mem_pool = mem_pool_init(KB_SIZE); parsed_packet = parse_ensure_index_packet(mem_pool, rbuf); log_debug( "接收到ensure_index命令 %s %s %u %u", ((struct ensure_index_packet*)parsed_packet)->table_name, ((struct ensure_index_packet*)parsed_packet)->field_name, ((struct ensure_index_packet*)parsed_packet)->index_type, ((struct ensure_index_packet*)parsed_packet)->data_type); db_read_lock(); result_code = db_ensure_index( ((struct ensure_index_packet*) parsed_packet)->table_name, ((struct ensure_index_packet*) parsed_packet)->field_name, ((struct ensure_index_packet*) parsed_packet)->index_type, ((struct ensure_index_packet*) parsed_packet)->data_type, mem_pool); db_read_unlock(); gen_dc_response_packet(result_code, msg_head, sbuf); mem_pool_destroy(mem_pool); break; case MT_CD_EXE_UNINDEX: mem_pool = mem_pool_init(KB_SIZE); parsed_packet = parse_del_index_packet(mem_pool, rbuf); log_debug( "接收到del_index命令 %s %s %u", ((struct del_index_packet*)parsed_packet)->table_name, ((struct del_index_packet*)parsed_packet)->field_name, ((struct del_index_packet*)parsed_packet)->index_type); db_read_lock(); result_code = db_del_index( ((struct del_index_packet*) parsed_packet)->table_name, ((struct del_index_packet*) parsed_packet)->field_name, ((struct del_index_packet*) parsed_packet)->index_type, mem_pool); db_read_unlock(); gen_dc_response_packet(result_code, msg_head, sbuf); mem_pool_destroy(mem_pool); break; case MT_CD_EXE_LOAD: mem_pool = mem_pool_init(KB_SIZE); parsed_packet = parse_load_segment_packet(mem_pool, rbuf); log_debug( "接收到load_segment命令 %s %u %s", ((struct load_segment_packet*)parsed_packet)->table_name, ((struct load_segment_packet*)parsed_packet)->sid, ((struct load_segment_packet*)parsed_packet)->segment_dir); db_read_lock(); result_code = db_load_segment( ((struct load_segment_packet*) parsed_packet)->table_name, ((struct load_segment_packet*) parsed_packet)->sid, ((struct load_segment_packet*) parsed_packet)->segment_dir, mem_pool); db_read_unlock(); gen_dc_response_packet(result_code, msg_head, sbuf); mem_pool_destroy(mem_pool); break; case MT_CD_EXE_REPLACE: mem_pool = mem_pool_init(KB_SIZE); parsed_packet = parse_replace_segment_packet(mem_pool, rbuf); log_debug( "接收到replace segments命令 %s %s", ((struct replace_segment_packet*)parsed_packet)->table_name, ((struct replace_segment_packet*)parsed_packet)->segment_dir); db_read_lock(); result_code = db_replace_all_segments( ((struct replace_segment_packet*) parsed_packet)->table_name, ((struct replace_segment_packet*) parsed_packet)->segment_dir, mem_pool); db_read_unlock(); gen_dc_response_packet(result_code, msg_head, sbuf); mem_pool_destroy(mem_pool); break; case MT_CD_EXE_UNLOAD: mem_pool = mem_pool_init(KB_SIZE); parsed_packet = parse_unload_segment_packet(mem_pool, rbuf); log_debug( "接收到unload_segment命令 %s %u", ((struct unload_segment_packet*)parsed_packet)->table_name, ((struct unload_segment_packet*)parsed_packet)->sid); db_read_lock(); result_code = db_unload_segment( ((struct unload_segment_packet*) parsed_packet)->table_name, ((struct unload_segment_packet*) parsed_packet)->sid, mem_pool); db_read_unlock(); gen_dc_response_packet(result_code, msg_head, sbuf); mem_pool_destroy(mem_pool); break; case MT_CD_EXE_CP: log_debug( "get checkpoint command"); db_checkpoint(); gen_dc_response_packet(0, msg_head, sbuf); break; case MT_CD_STAT: mem_pool = mem_pool_init(MB_SIZE); parsed_packet = parse_doc_stat_packet(mem_pool, rbuf); log_debug( "接收到stat命令 %s %u", ((struct doc_stat_packet*)parsed_packet)->table_name, ((struct doc_stat_packet*)parsed_packet)->type); if (((struct doc_stat_packet*) parsed_packet)->type == 1) { uint16_t max_segment_num = 0; struct segment_meta_data* result = NULL; db_read_lock(); result = db_query_segment_stat( ((struct doc_stat_packet*) parsed_packet)->table_name, &max_segment_num, mem_pool); db_read_unlock(); gen_dc_segment_stat_packet(result, max_segment_num, msg_head, sbuf); } if (((struct doc_stat_packet*) parsed_packet)->type == 2) { uint16_t index_field_count = 0; struct index_field_meta* result = NULL; db_read_lock(); result = db_query_index_stat( ((struct doc_stat_packet*) parsed_packet)->table_name, &index_field_count, mem_pool); db_read_unlock(); gen_dc_index_stat_packet(result, index_field_count, msg_head, sbuf); } mem_pool_destroy(mem_pool); break; default: log_error("unsupported command, packet type %d", msg_type); result_code = ERROR_UNSUPPORTED_SQL_TYPE; break; } return result_code; }
int add_inst(LEXER *lp, char *inst_name) { enum {START,NUM1,NUM2,NUM3,NUM4,END} state = START; double x1, y1; // pick value double x2, y2; // pick value double x3, y3; // pick value double xold=0.0, yold=0.0; // previous pick value to suppress double pics int numpicks=0; // number of picks int done=0; TOKEN token; OPTS opts; char *word; int debug=0; struct db_inst *ip; DB_TAB *ed_rep; XFORM *xp; double xx, yy; opt_set_defaults(&opts); // rl_saveprompt(); rl_setprompt("ADD_INST> "); if (debug) printf("currep = %s\n", currep->name); if (debug) printf("adding inst %s\n", inst_name); /* don't destroy it if it's already in memory */ if (debug) printf("calling db_lookup with %s\n", inst_name); if (loadrep(inst_name) == 0) { printf("warning: you can't add a null instance: %s\n", inst_name); token_flush_EOL(lp); done++; } if ((ed_rep = db_lookup(inst_name)) == 0) { printf("ADD INST: instance not found: %s\n", inst_name ); return(-1); } bb_xmin=ed_rep->minx; bb_xmax=ed_rep->maxx; bb_ymin=ed_rep->miny; bb_ymax=ed_rep->maxy; if (debug) printf("currep = %s\n", currep->name); if (strcmp(currep->name, inst_name) == 0 || db_contains(inst_name, currep->name)) { printf("ADD INST: Sorry, to do that would cause a recursive definition\n" ); return(-1); } while (!done) { token = token_look(lp, &word); if (debug) printf("got %s: %s state: %d\n", tok2str(token), word, state); if (token==CMD) { state=END; } switch(state) { case START: /* get option or first xy pair */ db_checkpoint(lp); rubber_set_callback(draw_inst_bb); if (token == OPT ) { token_get(lp, &word); if (opt_parse(word, INST_OPTS, &opts) == -1) { state = END; } else { /* an option may have scaled the bounding box */ /* clear callback, recompute and then restart */ rubber_clear_callback(draw_inst_bb); xp = matrix_from_opts(&opts); bb_xmin = bb_xmax = bb_ymin = bb_ymax = 0.0; xx = ed_rep->minx; yy = ed_rep->miny; xform_point(xp, &xx, &yy); if (xx < bb_xmin) bb_xmin = xx; if (yy < bb_ymin) bb_ymin = yy; if (xx > bb_xmax) bb_xmax = xx; if (yy > bb_ymax) bb_ymax = yy; xx = ed_rep->maxx; yy = ed_rep->maxy; xform_point(xp, &xx, &yy); if (xx < bb_xmin) bb_xmin = xx; if (yy < bb_ymin) bb_ymin = yy; if (xx > bb_xmax) bb_xmax = xx; if (yy > bb_ymax) bb_ymax = yy; xx = ed_rep->maxx; yy = ed_rep->miny; xform_point(xp, &xx, &yy); if (xx < bb_xmin) bb_xmin = xx; if (yy < bb_ymin) bb_ymin = yy; if (xx > bb_xmax) bb_xmax = xx; if (yy > bb_ymax) bb_ymax = yy; xx = ed_rep->minx; yy = ed_rep->maxy; xform_point(xp, &xx, &yy); if (xx < bb_xmin) bb_xmin = xx; if (yy < bb_ymin) bb_ymin = yy; if (xx > bb_xmax) bb_xmax = xx; if (yy > bb_ymax) bb_ymax = yy; free(xp); state = START; rubber_set_callback(draw_inst_bb); if (opts.stepflag) { rl_setprompt("ARRAY ORIGIN> "); rubber_clear_callback(); } } } else if (token == NUMBER) { if (opts.stepflag) { state = NUM2; } else { state = NUM1; } } else if (token == EOL) { token_get(lp, &word); /* just eat it up */ state = START; } else if (token == EOC || token == CMD) { state = END; } else { token_err("INST", lp, "expected OPT or NUMBER", token); state = END; } break; case NUM1: /* get pair of xy coordinates */ if (token == NUMBER) { if (getnum(lp, "INST", &x1, &y1)) { // supress double clicks if (debug) printf("%d %g %g %g %g\n", numpicks, x1, y1, xold, yold); if (numpicks==0 || ((xold != x1) || (yold != y1))) { db_add_inst(currep, ed_rep, opt_copy(&opts), x1, y1); rubber_clear_callback(); need_redraw++; rubber_set_callback(draw_inst_bb); } numpicks++; xold=x1; yold=y1; state = START; } else { state = END; } } else if (token == EOL) { token_get(lp, &word); } else if (token == EOC || token == CMD) { state = END; } else { token_err("INST", lp, "expected NUMBER", token); state = END; } break; case NUM2: /* get column end coordinate */ rubber_clear_callback(); if (token == NUMBER) { if (getnum(lp, "INST", &x1, &y1)) { rl_setprompt("COLUMN EXTENT> "); state = NUM3; } else { state = END; } } else if (token == EOL) { token_get(lp, &word); } else if (token == EOC || token == CMD) { state = END; } else { token_err("INST", lp, "expected NUMBER", token); state = END; } break; case NUM3: /* get column end coordinate */ if (token == NUMBER) { if (getnum(lp, "INST", &x3, &y3)) { rl_setprompt("ROW EXTENT> "); state = NUM4; } else { state = END; } } else if (token == EOL) { token_get(lp, &word); } else if (token == EOC || token == CMD) { state = END; } else { token_err("INST", lp, "expected NUMBER", token); state = END; } break; case NUM4: /* get column end coordinate */ if (token == NUMBER) { if (getnum(lp, "INST", &x2, &y2)) { if (debug) printf("%g %g %g %g %g %g\n", x1, y1, x2, y2, x3, y3); ip = db_add_inst(currep, ed_rep, opt_copy(&opts), x1, y1); ip->colx = x3; ip->coly = y3; ip->rowx = x2; ip->rowy = y2; rubber_clear_callback(); need_redraw++; state = END; } else { state = END; } } else if (token == EOL) { token_get(lp, &word); } else if (token == EOC || token == CMD) { state = END; } else { token_err("INST", lp, "expected NUMBER", token); state = END; } break; case END: default: if (token == EOC || token == CMD) { ; } else { token_flush_EOL(lp); } done++; break; } } rubber_clear_callback(); rl_restoreprompt(); return(1); }