Example #1
0
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;
}
Example #2
0
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);
}