int ObStatManager::get_scanner(ObNewScanner &scanner) const
    {
      int ret = OB_SUCCESS;
      int64_t last_used_mod = OB_INVALID_ID;
      char ipbuf[OB_IP_STR_BUFF] = {0};
      server_.ip_to_string(ipbuf, sizeof (ipbuf));
      ObString ipstr = ObString::make_string(ipbuf);
      const int32_t port = server_.get_port();
      ObString server_name = ObString::make_string(print_role(get_server_type()));
      int64_t total_stat_cnt = 0;
      /* create row_desc */
      ObRowDesc row_desc;
      int32_t column_id = OB_APP_MIN_COLUMN_ID;
      row_desc.add_column_desc(OB_ALL_SERVER_STAT_TID, column_id++);
      row_desc.add_column_desc(OB_ALL_SERVER_STAT_TID, column_id++);
      row_desc.add_column_desc(OB_ALL_SERVER_STAT_TID, column_id++);
      row_desc.add_column_desc(OB_ALL_SERVER_STAT_TID, column_id++);
      row_desc.add_column_desc(OB_ALL_SERVER_STAT_TID, column_id++);
      row_desc.set_rowkey_cell_count(4);
      ObRow row;
      ObObj obj;

      // drop mod id info
      for (int32_t mod = 0; mod < OB_MAX_MOD_NUMBER; mod++)
      {
        ObStat stat;
        total_stat_cnt += stat_cnt_[mod];
        // drop table id info
        for (int32_t i = 0; i < table_stats_[mod].get_array_index(); i++)
        {
          for (int32_t j = 0; j < stat_cnt_[mod]; j++)
          {
            stat.inc(j, table_stats_[mod].at(i)->get_value(j));
          }
        }
        for (int32_t i = 0; i < stat_cnt_[mod]; i++)
        {
          column_id = OB_APP_MIN_COLUMN_ID;
          row.set_row_desc(row_desc);
          row.reset(false, ObRow::DEFAULT_NULL);
          /* server type */
          obj.set_type(ObVarcharType);
          obj.set_varchar(server_name);
          row.set_cell(OB_ALL_SERVER_STAT_TID, column_id++, obj);
          /* server ip */
          obj.set_type(ObVarcharType);
          obj.set_varchar(ipstr);
          row.set_cell(OB_ALL_SERVER_STAT_TID, column_id++, obj);
          /* port */
          obj.set_type(ObIntType);
          obj.set_int(port);
          row.set_cell(OB_ALL_SERVER_STAT_TID, column_id++, obj);
          /* key */
          obj.set_type(ObVarcharType);
          obj.set_varchar(ObString::make_string(get_name(mod, i)));
          row.set_cell(OB_ALL_SERVER_STAT_TID, column_id++, obj);
          /* value */
          obj.set_type(ObIntType);
          obj.set_int(stat.get_value(i));
          row.set_cell(OB_ALL_SERVER_STAT_TID, column_id++, obj);

          scanner.add_row(row);
          // for last rowkey
          last_used_mod = mod;
        }
      }
      /* last rowkey */
      if (total_stat_cnt > 0)
      {
        static ObObj rk_objs[4];
        rk_objs[0].set_type(ObVarcharType);
        rk_objs[0].set_varchar(server_name);
        rk_objs[1].set_type(ObVarcharType);
        rk_objs[1].set_varchar(ipstr);
        rk_objs[2].set_type(ObIntType);
        rk_objs[2].set_int(port);
        rk_objs[3].set_type(ObVarcharType);
        rk_objs[3].set_varchar(ObString::make_string(get_name(last_used_mod, stat_cnt_[last_used_mod] - 1)));
        ObRowkey rowkey(rk_objs, 4);
        scanner.set_last_row_key(rowkey);
      }

      /* fullfilled */
      scanner.set_is_req_fullfilled(true, total_stat_cnt);

      return ret;
    }
Example #2
0
STATIC int
set_game_type_value(server_type *gametype, int key, char *value)
{
	switch (key) {
	case CK_NAME:
		gametype->game_name = strdup(value);
		break;

	case CK_FLAGS:
	{
		int flags = parse_server_flags(value);
		if (flags == -1) {
			return (-1);
		}
		gametype->flags = flags;
	}
	break;

	case CK_DEFAULT_PORT:
	{
		unsigned short port;
		if (sscanf(value, "%hu", &port) != 1) {
			REPORT_ERROR((stderr, "Syntax error on port.  Should be a number between 1 and 65535."));
			return (-1);
		}
		gametype->default_port = port;
		break;
	}

	case CK_GAME_RULE:
		gametype->game_rule = strdup(value);
		break;

	case CK_TEMPLATE_VAR:
		gametype->template_var = strdup(value);
		force_upper_case(gametype->template_var);
		break;

	case CK_MASTER_PROTOCOL:
		if (!gametype->master) {
			REPORT_ERROR((stderr, "Cannot set master protocol on non-master game type\n"));
			return (-1);
		}
		if (value) {
			gametype->master_protocol = strdup(value);
		} else {
			gametype->master_protocol = NULL;
		}
		break;

	case CK_MASTER_QUERY:
		if (!gametype->master) {
			REPORT_ERROR((stderr, "Cannot set master query on non-master game type\n"));
			return (-1);
		}
		if (value) {
			gametype->master_query = strdup(value);
		} else {
			gametype->master_query = NULL;
		}
		break;

	case CK_MASTER_TYPE:
	{
		server_type *type;
		if (!gametype->master) {
			REPORT_ERROR((stderr, "Cannot set master type on non-master game type\n"));
			return (-1);
		}
		force_lower_case(value);
		type = get_server_type(value);
		if (type == NULL) {
			REPORT_ERROR((stderr, "Unknown server type \"%s\"\n", value));
			return (-1);
		}
		gametype->master = type->id;
	}
	break;

	case CK_MASTER_PACKET:
		if (!gametype->master) {
			REPORT_ERROR((stderr, "Cannot set master packet on non-master game type"));
			return (-1);
		}
		if ((value == NULL) || (value[0] == '\0')) {
			REPORT_ERROR((stderr, "Empty master packet"));
			return (-1);
		}
		gametype->master_packet = memdup(value, value_len);
		gametype->master_len = value_len;
		break;

	case CK_STATUS_PACKET:
		return (set_packet_value(gametype, value, "status",
		       &gametype->status_packet, &gametype->status_len));

	case CK_STATUS2_PACKET:
		return (set_packet_value(gametype, value, "status2",
		       &gametype->rule_packet, &gametype->rule_len));

	case CK_PLAYER_PACKET:
		return (set_packet_value(gametype, value, "player",
		       &gametype->player_packet, &gametype->player_len));

	case CK_RULE_PACKET:
		return (set_packet_value(gametype, value, "rule",
		       &gametype->rule_packet, &gametype->rule_len));

	case CK_PORT_OFFSET:
	{
		short port;
		if (sscanf(value, "%hd", &port) != 1) {
			REPORT_ERROR((stderr, "Syntax error on port.  Should be a number between 32767 and -32768."));
			return (-1);
		}
		gametype->port_offset = port;
		break;
	}
	}

	return (0);
}
Example #3
0
STATIC int
modify_game_type_value(server_type *gametype, int key, char *value)
{
	switch (key) {
	case CK_FLAGS:
	{
		int flags = parse_server_flags(value);
		if (flags == -1) {
			return (-1);
		}
		gametype->flags = flags;
	}
	break;

	case CK_MASTER_PROTOCOL:
		if (!gametype->master) {
			REPORT_ERROR((stderr, "Cannot set master protocol on non-master game type"));
			return (-1);
		}
		if (value) {
			gametype->master_protocol = strdup(value);
		} else {
			gametype->master_protocol = NULL;
		}
		break;

	case CK_MASTER_QUERY:
		if (!gametype->master) {
			REPORT_ERROR((stderr, "Cannot set master query on non-master game type"));
			return (-1);
		}
		if (value) {
			gametype->master_query = strdup(value);
		} else {
			gametype->master_query = NULL;
		}
		break;

	case CK_MASTER_PACKET:
		if (!gametype->master) {
			REPORT_ERROR((stderr, "Cannot set master packet on non-master game type"));
			return (-1);
		}
		if ((value == NULL) || (value[0] == '\0')) {
			REPORT_ERROR((stderr, "Empty master packet"));
			return (-1);
		}
		gametype->master_packet = memdup(value, value_len);
		gametype->master_len = value_len;
		break;

	case CK_MASTER_TYPE:
	{
		server_type *type;
		if (!gametype->master) {
			REPORT_ERROR((stderr, "Cannot set master type on non-master game type\n"));
			return (-1);
		}
		force_lower_case(value);
		type = get_server_type(value);
		if (type == NULL) {
			REPORT_ERROR((stderr, "Unknown server type \"%s\"\n", value));
			return (-1);
		}
		gametype->master = type->id;
	}
	break;
	}
	return (0);
}
Example #4
0
/* Top level
 *   Keywords: gametype
 */
STATIC int
pf_top_level(char *text, void *_context)
{
	GameTypeContext *context;
	server_type *extend;
	char *token, *game_type, *extend_type;

	token = first_token(text);
	if (token == NULL) {
		return (0);
	}

	if (strcmp(token, "gametype") != 0) {
		REPORT_ERROR((stderr, "Unknown config command \"%s\"", token));
		return (-1);
	}

	game_type = next_token_dup();
	if (game_type == NULL) {
		REPORT_ERROR((stderr, "Missing game type"));
		return (-1);
	}

	force_lower_case(game_type);

	token = next_token();
	if (token == NULL) {
		REPORT_ERROR((stderr, "Expecting \"new\" or \"modify\""));
		return (-1);
	}

	if (strcmp(token, "new") == 0) {
		parse_func = pf_gametype_new;
	} else if (strcmp(token, "modify") == 0) {
		parse_func = pf_gametype_modify;
	} else {
		REPORT_ERROR((stderr, "Expecting \"new\" or \"modify\""));
		return (-1);
	}

	context = (GameTypeContext *)malloc(sizeof(GameTypeContext));
	context->type = game_type;
	context->extend_type = NULL;
	context->gametype = NULL;

	token = next_token();

	if (parse_func == pf_gametype_modify) {
		if (token != NULL) {
			REPORT_ERROR((stderr, "Extra text after gametype modify"));
			return (-1);
		}
		context->gametype = get_server_type(game_type);
		if (context->gametype == NULL) {
			REPORT_ERROR((stderr, "Unknown game type \"%s\"", game_type));
			free(context);
			return (-1);
		}
		parse_context = context;
		return (0);
	}

	if ((token == NULL) || (strcmp(token, "extend") != 0)) {
		REPORT_ERROR((stderr, "Expecting \"extend\""));
		return (-1);
	}

	extend_type = next_token();

	if (extend_type == NULL) {
		REPORT_ERROR((stderr, "Missing extend game type"));
		return (-1);
	}

	force_lower_case(extend_type);

	if (strcasecmp(extend_type, game_type) == 0) {
		REPORT_ERROR((stderr, "Identical game type and extend type"));
		return (-1);
	}

	context->extend_type = extend_type;
	extend = get_server_type(extend_type);
	if (extend == NULL) {
		REPORT_ERROR((stderr, "Unknown extend game type \"%s\"", extend_type));
		return (-1);
	}

	/* Over-write a previous gametype new */
	context->gametype = get_config_type(game_type);
	if (context->gametype == NULL) {
		context->gametype = (server_type *)malloc(sizeof(server_type));
	}
	copy_server_type(context->gametype, extend);

	/* Set flag for new type-id if not re-defining previous config type */
	if (get_config_type(game_type) == NULL) {
		context->gametype->id = 0;
	}

	context->gametype->type_string = game_type;
	context->gametype->type_prefix = strdup(game_type);
	force_upper_case(context->gametype->type_prefix);
	context->gametype->type_option = (char *)malloc(strlen(game_type) + 2);
	context->gametype->type_option[0] = '-';
	strcpy(&context->gametype->type_option[1], game_type);

	parse_context = context;

	return (0);
}