示例#1
0
文件: dump.cpp 项目: ownyang/cdp
int process_file(std::string fileName)
{
	int logfd = open(fileName.c_str(), O_RDONLY);
	if(logfd < 0)
	{
		return -1000;
	}	

	//初始化logserver日志读取对象
	msgio_t msgio;
	msgio_init_file(&msgio, logfd);
	int totalLineNum = 0;
	int validLineNum = 0;
	int invalidLineNum = 0;
	// 解析文件
	while (msgio_read(&msgio, -1)>0 )
	{
		//char* temp_str_value = NULL;
		//int32_t src_field_num = msgio_get_fieldno(&msgio);
		uint32_t dataId = msgio_get_id(&msgio);
		time_t src_log_time = msgio_get_time(&msgio);
		//int src_data_len = msgio_get_length(&msgio);

		std::string logTimeStr = Cdpacess::time2Str(src_log_time);
		
		//std::cout<<"["<<src_data_len<<"]"<<src_field_num<<":"<<dataId<<"\t"<<logTimeStr<<"\t";
		std::cout<<"["<<dataId<<":"<<logTimeStr<<"]";

		CCdpConfig* cdpConfig = CAccessConfig::getInstance()->getCdpConfig();
		if (cdpConfig == NULL) {
			totalLineNum++;
			invalidLineNum++;
			printf("=====Line %d invalid======cdp config is null.\n", totalLineNum);
			continue;
		}
		
		CCdpDataConfig* dataConfig = cdpConfig->getConfigData(dataId);		
		if (dataConfig == NULL) {
			totalLineNum++;
			invalidLineNum++;
			printf("=====Line %d invalid======data config is null.\n", totalLineNum);
			continue;
		}

		//开始获取字段配置信息
		CFieldConfig* fields = NULL;
		int8_t fieldNum = 0;
		dataConfig->getFields(&fields, fieldNum);
		if (fields == NULL) 
		{
			totalLineNum++;
			invalidLineNum++;
			printf("=====Line %d invalid======fields config is null.\n", totalLineNum);
			continue;
		}

		char* tep_s_value = NULL;
		for (int i = 0; i < fieldNum; i++) 
		{
			CFieldConfig tmpFieldConf = fields[i];			
			int8_t srcFieldIdx = tmpFieldConf.getIndex();

			//printf("%d -- %d.\n", i, srcFieldIdx);

			//给字段设置值
			switch(tmpFieldConf.getDataType()) {
					case FDT_DATETIME:
					case FDT_DATE:
					case FDT_STRING:
						{tep_s_value = msgio_field_string(&msgio, srcFieldIdx);
						std::string tmpStr = tep_s_value ? tep_s_value : "NULL";
						printf("%s\t", tmpStr.c_str());
						//std::cout<<tmpStr.c_str()<<"\t";
						}break;
					case FDT_INT:
						printf("%d\t", msgio_field_int(&msgio, srcFieldIdx));
						//std::cout<<msgio_field_int(&msgio, srcFieldIdx)<<"\t";
						break;
					case FDT_UINT:
						printf("%u\t", msgio_field_unsigned(&msgio, srcFieldIdx));
						//std::cout<<msgio_field_unsigned(&msgio, srcFieldIdx)<<"\t";
						break;
					case FDT_BIGINT:
						printf("%ld\t", msgio_field_long(&msgio, srcFieldIdx));
						//std::cout<<msgio_field_long(&msgio, srcFieldIdx)<<"\t";
						break;
					case FDT_FLOAT:
					case FDT_DOUBLE:
						printf("%f\t", msgio_field_double(&msgio, srcFieldIdx));
						//std::cout<<msgio_field_double(&msgio, srcFieldIdx)<<"\t";
						break;
					default:
						break;
			}
		}
		/*
		tep_s_value = msgio_field_string(&msgio, 0);
		std::string cgiName = tep_s_value ? tep_s_value : "NULL";
		tep_s_value = msgio_field_string(&msgio, 1);
		std::string ipName = tep_s_value ? tep_s_value : "NULL";
		int i1 = msgio_field_int(&msgio, 2);
		int i2 = msgio_field_int(&msgio, 3);
		double d = msgio_field_double(&msgio, 4);
		printf("%s\t%s\t%d\t%d\t%f\n", cgiName.c_str(), ipName.c_str(), i1, i2, d);
		*/
			
		finishOneSubdata:
		////释放对象		
		if (fields)
		{
			delete []fields;
		}
		std::cout<<std::endl;
		totalLineNum++;
		validLineNum++;
	}

	std::cout<<std::endl<<"total "<<totalLineNum<<" lines; valid "<<validLineNum<<" lines; invalid "<<invalidLineNum<<" lines"<<std::endl;
	close(logfd);

	return 0;
}
示例#2
0
/*
 * -1 means end of connection (EOF) or some other unhandled error. 0 = success
 */
int
qdevice_net_socket_read(struct qdevice_net_instance *instance)
{
	int res;
	int ret_val;
	int orig_skipping_msg;

	orig_skipping_msg = instance->skipping_msg;

	res = msgio_read(instance->socket, &instance->receive_buffer,
	    &instance->msg_already_received_bytes, &instance->skipping_msg);

	if (!orig_skipping_msg && instance->skipping_msg) {
		qdevice_log(LOG_DEBUG, "msgio_read set skipping_msg");
	}

	ret_val = 0;

	switch (res) {
	case 0:
		/*
		 * Partial read
		 */
		break;
	case -1:
		qdevice_log(LOG_DEBUG, "Server closed connection");
		instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_SERVER_CLOSED_CONNECTION;
		ret_val = -1;
		break;
	case -2:
		qdevice_log(LOG_ERR, "Unhandled error when reading from server. "
		    "Disconnecting from server");
		instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_READ_MESSAGE;
		ret_val = -1;
		break;
	case -3:
		qdevice_log(LOG_ERR, "Can't store message header from server. "
		    "Disconnecting from server");
		instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_READ_MESSAGE;
		ret_val = -1;
		break;
	case -4:
		qdevice_log(LOG_ERR, "Can't store message from server. "
		    "Disconnecting from server");
		instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_READ_MESSAGE;
		ret_val = -1;
		break;
	case -5:
		qdevice_log(LOG_WARNING, "Server sent unsupported msg type %u. "
		    "Disconnecting from server", msg_get_type(&instance->receive_buffer));
		instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_UNSUPPORTED_MSG;
		ret_val = -1;
		break;
	case -6:
		qdevice_log(LOG_WARNING,
		    "Server wants to send too long message %u bytes. Disconnecting from server",
		    msg_get_len(&instance->receive_buffer));
		instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_READ_MESSAGE;
		ret_val = -1;
		break;
	case 1:
		/*
		 * Full message received / skipped
		 */
		if (!instance->skipping_msg) {
			if (qdevice_net_msg_received(instance) == -1) {
				ret_val = -1;
			}
		} else {
			qdevice_log(LOG_CRIT, "net_socket_read in skipping msg state");
			exit(1);
		}

		instance->skipping_msg = 0;
		instance->msg_already_received_bytes = 0;
		dynar_clean(&instance->receive_buffer);
		break;
	default:
		qdevice_log(LOG_CRIT, "qdevice_net_socket_read unhandled error %d", res);
		exit(1);
		break;
	}

	return (ret_val);
}