void level2_execution_engine::send_order(const ats::stop_order& order)
	{
		auto it = sim_books_.find(order.symbol());
		const ats::exchange_order_book& book = it->second.get_order_book();

		on_order_status_changed(ats::order_status_pending_new_message(order.id(), current_time()));

		if (order.side() == ats::order_side::Buy || order.side() == ats::order_side::BuyCover)
		{
			if (!book.asks().empty() && order.price() <= book.best_ask()->price)
				on_order_status_changed(ats::order_status_filled_message(order.id(), current_time(), book.best_ask()->price, order.quantity()));
			else
			{
				stops_buy_.insert(std::make_pair(order.price(), order));
				add_order(order);
//				orders_.insert(std::make_pair(order.id(), std::make_shared<ats::stop_order>(order)));
			}
		}
		else
		{
			if (!book.bids().empty() && order.price() >= book.best_bid()->price)
				on_order_status_changed(ats::order_status_filled_message(order.id(), current_time(), book.best_bid()->price, order.quantity()));
			else
			{
				stops_sell_.insert(std::make_pair(order.price(), order));
				add_order(order);
//				orders_.insert(std::make_pair(order.id(), std::make_shared<ats::stop_order>(order)));
			}
		}
	}
	void level2_execution_engine::send_order(const ats::limit_order& order)
	{
		auto it = sim_books_.find(order.symbol());
		if (it != sim_books_.cend())
		{
			add_order(order);
			it->second.add_order(order);
		}
	}
Exemple #3
0
/**
 * check_buttons:
 *
 * Checks all UI buttons and updates the order queue.
 *
 * Returns: 1 if new orders are present, or 0.
 *
 */
int ui_check_buttons(void) {
    for (int button = 0; button < N_BUTTONS; button++) {
      for (int floor = 0; floor < N_FLOORS; floor++) {
          if (elev_get_button_signal(button, floor)) {
              elev_set_button_lamp(button, floor, 1);
              add_order(button, floor);
          }
        }
    }
}
int p_add_order(request *rqt, int client_sockfd){
    response rsp;
    memset(&rsp, '\0', sizeof(response));

    if(add_order(&rqt->u, &rqt->t))
        rsp.rs = rs_success;
    else
        rsp.rs = rs_failure;

    srv_send_response(&rsp, client_sockfd);
}
Exemple #5
0
int Student::add_order(const Order &new_order){
	bool found = false;
	for (auto order : my_orders){
		if(order == new_order){
			found = true;
			continue;
		}
	}
	if(!found){
		my_orders.push_back(new_order);
		if(new_order.get_required() != nullptr)
			add_order(*(new_order.get_required()));
	}
	return my_orders.size();
}
Exemple #6
0
void book_t::handle_message(const std::string & msg)
{
	int timestamp;
	char msg_type; // 'A' for add or 'R' for reduce
	std::string id_str;
	order_id_t id;
	int size; // number of shares

	std::stringstream is(msg); // input stream

	is >> timestamp >> msg_type >> id_str;

	if (timestamp < 0)
	{
		throw invalid_timestamp(timestamp);
	}

	id = order_id_from_str(id_str);
	if (id < 0)
	{
		throw invalid_order_id(timestamp, id);
	}

	if ('A' == msg_type)
	{
		char ch; // side character 'B' or 'S'
		price_t price;

		is >> ch >> price >> size;

		if ('B' != ch && 'S' != ch)
		{
			throw invalid_side(timestamp, ch);
		}
		if (price <= 0)
		{
			throw invalid_price(timestamp, price);
		}
		if (size <= 0)
		{
			throw invalid_size(timestamp, size);
		}

		side_t side = side_from_char(ch);
		add_order(timestamp, id, side, price, size);
	}
Exemple #7
0
struct order_info *read_order(FILE *ifp){
	
	char *full = NULL;
	char *title = NULL;
	char *price = NULL;
	char *customer = NULL;
	char *category = NULL;
	size_t len = 0;
	struct order_info *s;
	
	
	if (!feof(ifp))
	{
		getline(&full, &len, ifp);
		full = strtok(full, "\n");
		
		char *temp;
		temp = full;
		
		title = strtok(temp, "|");
		price = strtok(NULL, "|");
		customer = strtok(NULL, "|");
		category = strtok(NULL, "|");
		
		add_order(title, price, customer, category);
	}
	else return NULL;
	
	
	s = malloc(sizeof(struct customer_info));
	
	s->title = malloc(strlen(title) + 1);
	strcpy(s->title, title);
	s->price = atof(price);
	s->customer = malloc(strlen(customer) + 1);
	strcpy(s->customer, customer);
	s->category = malloc(strlen(category) + 1);
	strcpy(s->category, category);
	s->next = NULL;
	return s;
	
}
Exemple #8
0
 inline bool
 Depth<SIZE>::replace_order(
     Price current_price,
     Price new_price,
     Quantity current_qty,
     Quantity new_qty,
     bool is_bid
 )
 {
     bool erased = false;
     // If the price is unchanged, modify this level only
     if (current_price == new_price) {
         int32_t qty_delta = ((int32_t)new_qty) - current_qty;
         // Only change order qty.  If this closes order, a cancel callback will also be fired
         change_qty_order(current_price, qty_delta, is_bid);
         // Else this is a price change
     } else {
         // Add the new order quantity first, and possibly insert a new level
         add_order(new_price, new_qty, is_bid);
         // Remove the old order quantity, and possibly erase a level
         erased = close_order(current_price, current_qty, is_bid);
     }
     return erased;
 }
Exemple #9
0
/*
 * Constructor calls its parent class Process constructor
 * to set highest priority. This ensure Batch will be first
 * at chef_fac queue.
 */
Batch::Batch(Order *ord): Process(HIGHEST_PRIORITY)
{
    id = all_batch_cntr++;
    add_order(ord);
}
Exemple #10
0
// 显示车次信息页面
static void traininfo_menu(int num){
	int index=1;
	int i_traininfo=0;
	int order_result=0;
	int ticket_result=0;
	char t_num[20];
	char ticket_num[10];
	char commend[1];
	time_t now;
	erase();
	cbreak();
	noecho();
	mvprintw(3, 25, "%s", "欢迎访问模拟铁路订票系统!");
	mvprintw(5, 1, "%s", "火车编号");
	mvprintw(5, 11, "%s", "日期");
	mvprintw(5, 21, "%s", "车次号");
	mvprintw(5, 29, "%s", "出发站");
	mvprintw(5, 37, "%s", "到达站");
	mvprintw(5, 45, "%s", "出发时间");
	mvprintw(5, 55, "%s", "到达时间");
	mvprintw(5, 65, "%s", "票价");
	mvprintw(5, 71, "%s", "余票张数");
	for(;num!=0;num--){
		mvprintw(num+5, 1, "%d", static_traininfo[num-1].tid);
		mvprintw(num+5, 11, "%d/%d/%d", static_message.ticket_data.departure_date.tm_year+1900, static_message.ticket_data.departure_date.tm_mon+1, static_message.ticket_data.departure_date.tm_mday);
		mvprintw(num+5, 21, "%s", static_traininfo[num-1].t_num);
		mvprintw(num+5, 29, "%s", static_traininfo[num-1].originator);
		mvprintw(num+5, 37, "%s", static_traininfo[num-1].terminal);
		mvprintw(num+5, 45, "%d:%d:%d", static_traininfo[num-1].departure_time.tm_hour, static_traininfo[num-1].departure_time.tm_min, static_traininfo[num-1].departure_time.tm_sec);
		mvprintw(num+5, 55, "%d:%d:%d", static_traininfo[num-1].arrival_time.tm_hour, static_traininfo[num-1].arrival_time.tm_min, static_traininfo[num-1].arrival_time.tm_sec);
		static_message.ticket_data=get_ticket(static_traininfo[num-1].tid, &(static_message.ticket_data.departure_date));
		static_ticket[num-1]=static_message.ticket_data;
		mvprintw(num+5, 65, "%d", static_ticket[num-1].price);
		mvprintw(num+5, 71, "%d", static_ticket[num-1].num);
	}
	mvprintw(20, 30, "%s", "1. 订票");
	mvprintw(20, 50, "%s", "2. 返回上一页");
	refresh();
	while(index){
		commend[0]=getch();
		switch(commend[0]){
			case '1':
				echo();
				nocbreak();
				mvprintw(21, 30, "请输入车次号:");
				getstr(t_num);
				mvprintw(22, 30, "请输入张数:");
				getstr(ticket_num);
				static_message.order_data.num=atoi(ticket_num);
				while(strcmp(static_traininfo[i_traininfo].t_num, t_num))
					i_traininfo++;
				static_message.order_data.uid=static_message.userinfo_data.uid;
				static_message.order_data.tid=static_traininfo[i_traininfo].tid;
				static_message.order_data.departure_date=static_message.ticket_data.departure_date;
				static_message.order_data.price=static_ticket[i_traininfo].price*static_message.order_data.num;
				time(&now);
				static_message.order_data.rise_time=*(localtime(&now));
				static_message.order_data.state=STATE_BEFORE_PAYMENT;
				static_ticket[i_traininfo].num-=static_message.order_data.num;
				order_result=add_order(static_message.order_data);
				ticket_result=modify_ticket(static_ticket[i_traininfo]);
				if(order_result&&ticket_result){
					mvprintw(23, 30, "%s", "订票成功,返回主界面中...!");
				}else{
					mvprintw(23, 30, "%s", "订票失败,返回主界面中...!");
				}
				refresh();
				sleep(3);
				main_menu();
				index=0;
				break;
			case '2':
				echo();
				nocbreak();
				main_menu();
				index=0;
				break;
			default: mvprintw(23, 30, "%s", "无效的命令!"); break;
		}
	}
}
Exemple #11
0
int
main(int argc, char *argv[])
{
	int	 cflag = 0, fflag = 0, Cflag = 0;
	char	 *domain, *host = NULL, *srcdomain = NULL;
	char	 *tid = NULL, *prog = NULL, *ipadd = NULL;
	char	 *port = NULL, *map = NULL;
	int	 status, xfr_status, ch, srvport;
	u_int32_t ordernum, new_ordernum;
	struct	 ypall_callback callback;
	CLIENT   *client = NULL;
	extern	 char *optarg;

	yp_get_default_domain(&domain);

	while ((ch = getopt(argc, argv, "cd:fh:s:C:")) != -1)
		switch (ch) {
		case 'c':
			cflag++;
			break;
		case 'd':
			if (strchr(optarg, '/')) /* Ha ha, we are not listening */
				break;
			domain = optarg;
			break;
		case 'f':
			fflag++;
			break;
		case 'h':
			host = optarg;
			break;
		case 's':
			if (strchr(optarg, '/')) /* Ha ha, we are not listening */
				break;
			srcdomain = optarg;
			break;
		case 'C':
			if (optind + 3 >= argc)
				usage();
			Cflag++;
			tid = optarg;
			prog = argv[optind++];
			ipadd = argv[optind++];
			port = argv[optind++];
			break;
		default:
			usage();
			break;
		}

	status = YPPUSH_SUCC;

	if (optind + 1 != argc)
		usage();

	map = argv[optind];

	if (status > 0) {
		ypopenlog();

		yplog("ypxfr: Arguments:");
		yplog("YP clear to local: %s", (cflag) ? "no" : "yes");
		yplog("   Force transfer: %s", (fflag) ? "yes" : "no");
		yplog("           domain: %s", domain);
		yplog("             host: %s", host);
		yplog("    source domain: %s", srcdomain);
		yplog("          transid: %s", tid);
		yplog("             prog: %s", prog);
		yplog("             port: %s", port);
		yplog("            ipadd: %s", ipadd);
		yplog("              map: %s", map);

		if (fflag != 0) {
			ordernum = 0;
		} else {
			status = get_local_ordernum(domain, map, &ordernum);
		}
	}

	if (status > 0) {
		yplog("Get Master");

		if (host == NULL) {
			if (srcdomain == NULL) {
				status = yp_master(domain, map, &host);
			} else {
				status = yp_master(srcdomain, map, &host);
			}
			if (status == 0) {
				status = YPPUSH_SUCC;
			} else {
				status = -status;
			}
		}
	}

	/* XXX this is raceable if portmap has holes! */
	if (status > 0) {
		yplog("Check for reserved port on host: %s", host);

		srvport = getrpcport(host, YPPROG, YPVERS, IPPROTO_TCP);
		if (srvport >= IPPORT_RESERVED)
			status = YPPUSH_REFUSED;
	}

	if (status > 0) {
		yplog("Connect host: %s", host);

		client = yp_bind_host(host, YPPROG, YPVERS, 0, 1);

		status = get_remote_ordernum(client, domain, map,
		    ordernum, &new_ordernum);
	}

	if (status == YPPUSH_SUCC) {
		char	tmpmapname[MAXPATHLEN];
		int	fd;

		/* Create temporary db */
		snprintf(tmpmapname, sizeof tmpmapname,
		    "%s/%s/ypdbXXXXXXXXXX", YP_DB_PATH, domain);
		fd = mkstemp(tmpmapname);
		if (fd == -1)
			status = YPPUSH_DBM;
		else
			close(fd);

		if (status > 0) {
			db = create_db(domain, map, tmpmapname);
			if (db == NULL)
				status = YPPUSH_DBM;
		}

		/* Add ORDER */
		if (status > 0)
			status = add_order(db, new_ordernum);

		/* Add MASTER */
		if (status > 0)
			status = add_master(client, domain, map, db);

		/* Add INTERDOMAIN */
		if (status > 0)
			status = add_interdomain(client, domain, map, db);

		/* Add SECURE */
		if (status > 0)
			status = add_secure(client, domain, map, db);

		if (status > 0) {
			callback.foreach = ypxfr_foreach;
			status = get_map(client, domain, map, &callback);
		}

		/* Close db */
		if (db != NULL)
			ypdb_close(db);

		/* Rename db */
		if (status > 0) {
			status = install_db(domain, map, tmpmapname);
		} else {
			unlink(tmpmapname);
			status = YPPUSH_SUCC;
		}
	}

	xfr_status = status;

	if (client != NULL)
		clnt_destroy(client);

	/* YP_CLEAR */

	if (!cflag) {
		client = yp_bind_local(YPPROG, YPVERS);
		status = send_clear(client);
		clnt_destroy(client);
	}

	if (Cflag > 0) {
		/* Send Response */
		client = yp_bind_host(ipadd, atoi(prog), 1, atoi(port), 0);
		status = send_reply(client, xfr_status, atoi(tid));
		clnt_destroy(client);
	}
	return (0);
}
//定义所有客户端请求命令的处理函数
void exec_request(const message_data message_request){
	message_data message_response;
	int end_index=0;
	char log[250];
	message_response=message_request;
	message_response.response=s_success;
	switch(message_request.request){
		case c_add_userinfo:
			if(!add_userinfo(message_request.userinfo_data)){
				message_response.response=s_failure;
				sprintf(log, " 用户 %s 注册失败.", message_request.userinfo_data.u_name);
				sys_log(log);
			}else{
				sprintf(log, " 用户 %s 注册成功.", message_request.userinfo_data.u_name);
				sys_log(log);
			}
			break;
		case c_get_userinfo:
			message_response.userinfo_data=get_userinfo(message_request.userinfo_data.u_name, message_request.userinfo_data.pwd);
			userinfo userinfo_cmp;
			memset(&userinfo_cmp, 0, sizeof(userinfo_cmp));
			if(!memcmp(&userinfo_cmp, &(message_response.userinfo_data), sizeof(userinfo)))
			{
				message_response.response=s_failure;
				sprintf(log, "获取用户 %s 资料失败.", message_request.userinfo_data.u_name);
				sys_log(log);
			}else{
				sprintf(log, " 获取用户 %s 资料成功.", message_request.userinfo_data.u_name);
				sys_log(log);
			}
			break;
		case c_modify_userinfo:
			if(!modify_userinfo(message_request.userinfo_data))
			{
				message_response.response=s_failure;
				sprintf(log, "修改用户 %s 资料失败.", message_request.userinfo_data.u_name);
				sys_log(log);
			}else{
				sprintf(log, " 修改用户 %s 资料成功.", message_request.userinfo_data.u_name);
				sys_log(log);
			}
				break;
		case c_get_traininfo_by_t_num:
			message_response.traininfo_data=get_traininfo_by_t_num(message_request.traininfo_data.t_num);
			traininfo traininfo_cmp;
			memset(&traininfo_cmp, 0, sizeof(traininfo_cmp));
			if(!memcmp(&traininfo_cmp, &(message_response.traininfo_data), sizeof(traininfo))){
				message_response.response=s_failure;
				sprintf(log, "用户 %s 获取车次 %s 信息失败.", message_request.userinfo_data.u_name, message_request.traininfo_data.t_num);
				sys_log(log);
			}else{
				sprintf(log, "用户 %s 获取车次 %s 信息成功.", message_request.userinfo_data.u_name, message_request.traininfo_data.t_num);
				sys_log(log);
			}
			break;
		case c_get_traininfo_by_o_and_t:
			while(!end_index){
				message_response.traininfo_data=get_traininfo_by_o_and_t(message_request.traininfo_data.originator, message_request.traininfo_data.terminal);
				traininfo traininfo_cmp;
				memset(&traininfo_cmp, 0, sizeof(traininfo_cmp));
				if(!memcmp(&traininfo_cmp, &(message_response.traininfo_data), sizeof(traininfo))){
					message_response.response=s_failure;
					end_index=1;
				}else{
					if(!send_response_to_client(message_response)){
						fprintf(stderr, "Server Warning: fail to response to %d. \n", message_response.client_pid);
						sprintf(log, "用户 %s 获取车次 %s 信息失败.", message_request.userinfo_data.u_name, message_response.traininfo_data.t_num);
						sys_log(log);
					}else{
						sprintf(log, "用户 %s 获取车次 %s 信息成功.", message_request.userinfo_data.u_name, message_response.traininfo_data.t_num);
						sys_log(log);
					}
				}
			}
			break;
		case c_get_ticket:
			message_response.ticket_data=get_ticket(message_request.ticket_data.tid, &(message_request.ticket_data.departure_date));
			ticket ticket_cmp;
			memset(&ticket_cmp, 0, sizeof(ticket_cmp));
			if(!memcmp(&ticket_cmp, &(message_response.ticket_data), sizeof(ticket)))
				message_response.response=s_failure;
			break;
		case c_modify_ticket:
			if(!modify_ticket(message_request.ticket_data))
				message_response.response=s_failure;
			break;
		case c_add_order:
			if(!add_order(message_request.order_data)){
				message_response.response=s_failure;
				sprintf(log, "用户 %s 购买 Tid 为 %d 的车次火车票 %d 张失败.", message_request.userinfo_data.u_name, message_request.order_data.tid, message_request.order_data.num);
				sys_log(log);
			}else{
				sprintf(log, "用户 %s 购买 Tid 为 %d 的车次火车票 %d 张成功.", message_request.userinfo_data.u_name, message_request.order_data.tid, message_request.order_data.num);
				sys_log(log);
			}
			break;
		case c_get_orders:
			while(!end_index){
				message_response.order_data=get_orders(message_request.order_data.uid);
				orders order_cmp;
				memset(&order_cmp, 0, sizeof(order_cmp));
				if(!memcmp(&order_cmp, &(message_response.order_data), sizeof(orders))){
					message_response.response=s_failure;
					end_index=1;
				}else{
					if(!send_response_to_client(message_response)){
						fprintf(stderr, "Server Warning: fail to response to %d. \n", message_response.client_pid);
						sprintf(log, "获取用户 %s 订单 %d 信息失败.", message_request.userinfo_data.u_name, message_response.order_data.oid);
						sys_log(log);
					}else{
						sprintf(log, "获取用户 %s 订单 %d 信息成功.", message_request.userinfo_data.u_name, message_response.order_data.oid);
						sys_log(log);
					}
				}
			}
			break;
		case c_modify_order:
			if(!modify_order(message_request.order_data)){
				message_response.response=s_failure;
				sprintf(log, "修改用户 %s 订单 %d 信息失败.", message_request.userinfo_data.u_name, message_request.order_data.oid);
				sys_log(log);
			}else{
				sprintf(log, "修改用户 %s 订单 %d 信息成功.", message_request.userinfo_data.u_name, message_request.order_data.oid);
				sys_log(log);
			}
			break;
		default:
			message_response.response=s_failure;
			break;
	}
	if(!send_response_to_client(message_response)){
		fprintf(stderr, "Server Warning: fail to response to %d. \n", message_response.client_pid);
		return;
	}
	return;
}