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; }
/* * -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); }