/** * Fills the give from number with the string from * the board file. * * This function fills the board object at the given * rowNum with the contents of toParse * * @param[in] int::rowNum The row number to fill * @param[in] str::toParse The string to parse for entries * * @returns None */ void sudokuBoardReader::fillRow(int rowNum, std::string toParse) { std::vector<char> entries; std::stringstream rowStream(toParse); char entry; while(rowStream >> entry){ entries.push_back(entry); } if (entries.size() != n) { std::cout << "Bad N. Expected: " << n << " and got " << entries.size() << " \n"; } this->board.push_back(entries); }
void Matrix::initializeFrom(FileReader& r){ if (ns_debug::trace) cout << "Matrix::initializeFrom(): Reading a rank-" << rank() << " matrix.\n"; // Consume and ignore the "matrix:" line. auto_ptr<string> ignore = r.getLine_ignoreComments(); if (ns_debug::trace) cout << "Matrix::initializeFrom(): Ignoring line: [" << *ignore << "].\n"; // Read in the lines. for(size_t i=0; i<this->rank(); i++){ if (ns_debug::trace) cout << "Matrix::initializeFrom(): About to read row #" << i << "...\n"; // Get the next line as a string. auto_ptr<string> rowString = r.getLine_ignoreComments(); if (ns_debug::trace) cout << "Matrix::initializeFrom(): The row text is: [" << *rowString << "].\n"; // Convert it to a stream so we can use >> on it. istringstream rowStream(*rowString); // Get the complex numbers for each entry in the row. for(size_t j=0; j<rank(); j++){ if (ns_debug::trace) cout << "Matrix::initializeFrom(): About to read entry #" << j << " on row #" << i << ".\n"; rows.at(i)[j].getFrom(rowStream); if (ns_debug::trace) { cout << "Matrix::initializeFrom(): Read the complex number: "; rows.at(i)[j].putTo(cout); cout << ".\n"; } } if (ns_debug::trace) { cout << "Matrix::initializeFrom(): row #" << i << " has " << rows[i].indices_of_nz_elems().size() << " nonzero elements.\n"; cout << "Matrix::initializeFrom(): The nonzero elements in row #" << i << " have the following indices: "; for(size_t j=0; j<rows[i].indices_of_nz_elems().size(); j++){ cout << rows[i].indices_of_nz_elems().at(j); if (j<rows[i].indices_of_nz_elems().size()-1) cout<<","; } cout << ".\n"; } } // Initialize the column representation. initColumns(); }
/** * loop over table columns and template to get the IPFIX values in correct order to store in database * The result is written into row, the firstSwitched time is returned in flowstartsec */ string& IpfixDbWriter::getInsertString(string& row, time_t& flowstartsec, const IpfixRecord::SourceID& sourceID, TemplateInfo& dataTemplateInfo,uint16_t length, IpfixRecord::Data* data) { uint64_t intdata = 0; uint64_t intdata2 = 0; uint32_t k; bool notfound, notfound2; bool first = true; ostringstream rowStream(row); flowstartsec = 0; rowStream << "("; /**loop over the columname and loop over the IPFIX_TYPEID of the record to get the corresponding data to store and make insert statement*/ for(vector<Column>::iterator col = tableColumns.begin(); col != tableColumns.end(); col++) { if (col->ipfixId == EXPORTERID) { // if this is the same source ID as last time, we get the exporter id from currentExporter if ((currentExporter != NULL) && equalExporter(sourceID, currentExporter->sourceID)) { DPRINTF("Exporter is same as last time (ODID=%d, id=%d)", sourceID.observationDomainId, currentExporter->id); intdata = (uint64_t)currentExporter->id; } else { // lookup exporter buffer to get exporterID from sourcID and expIp intdata = (uint64_t)getExporterID(sourceID); } } else { notfound = true; // try to gather data required for the field if(dataTemplateInfo.fieldCount > 0) { // look inside the ipfix record for(k=0; k < dataTemplateInfo.fieldCount; k++) { if(dataTemplateInfo.fieldInfo[k].type.enterprise == col->enterprise && dataTemplateInfo.fieldInfo[k].type.id == col->ipfixId) { notfound = false; intdata = getData(dataTemplateInfo.fieldInfo[k].type,(data+dataTemplateInfo.fieldInfo[k].offset)); DPRINTF("IpfixDbWriter::getData: really saw ipfix id %d in packet with intdata %llX, type %d, length %d and offset %X", col->ipfixId, intdata, dataTemplateInfo.fieldInfo[k].type.id, dataTemplateInfo.fieldInfo[k].type.length, dataTemplateInfo.fieldInfo[k].offset); break; } } } if( dataTemplateInfo.dataCount > 0 && notfound) { // look in static data fields of template for data for(k=0; k < dataTemplateInfo.dataCount; k++) { if(dataTemplateInfo.fieldInfo[k].type.enterprise == col->enterprise && dataTemplateInfo.dataInfo[k].type.id == col->ipfixId) { notfound = false; intdata = getData(dataTemplateInfo.dataInfo[k].type,(dataTemplateInfo.data+dataTemplateInfo.dataInfo[k].offset)); break; } } } if(notfound) { notfound2 = true; // for some Ids, we have an alternative if(col->enterprise == 0) { switch (col->ipfixId) { case IPFIX_TYPEID_flowStartSeconds: if(dataTemplateInfo.fieldCount > 0) { for(k=0; k < dataTemplateInfo.fieldCount; k++) { // look for alternative (flowStartMilliSeconds/1000) if(dataTemplateInfo.fieldInfo[k].type.id == IPFIX_TYPEID_flowStartMilliSeconds) { intdata = getData(dataTemplateInfo.fieldInfo[k].type,(data+dataTemplateInfo.fieldInfo[k].offset)) / 1000; notfound = false; break; } // if no flow start time is available, maybe this is is from a netflow from Cisco // then - as a last alternative - use flowStartSysUpTime as flow start time if(dataTemplateInfo.fieldInfo[k].type.id == IPFIX_TYPEID_flowStartSysUpTime) { intdata2 = getData(dataTemplateInfo.fieldInfo[k].type,(data+dataTemplateInfo.fieldInfo[k].offset)); notfound2 = false; } } if(notfound && !notfound2) { intdata = intdata2; notfound = false; } } break; //TODO: replace by enterprise number (Gerhard 12/2009) case IPFIX_ETYPEID_revFlowStartSeconds: // look for alternative (revFlowStartMilliSeconds/1000) if(dataTemplateInfo.fieldCount > 0) { for(k=0; k < dataTemplateInfo.fieldCount; k++) { if(dataTemplateInfo.fieldInfo[k].type.id == IPFIX_ETYPEID_revFlowStartMilliSeconds) { intdata = getData(dataTemplateInfo.fieldInfo[k].type,(data+dataTemplateInfo.fieldInfo[k].offset)) / 1000; notfound = false; break; } } } break; case IPFIX_TYPEID_flowEndSeconds: if(dataTemplateInfo.fieldCount > 0) { for(k=0; k < dataTemplateInfo.fieldCount; k++) { // look for alternative (flowEndMilliSeconds/1000) if(dataTemplateInfo.fieldInfo[k].type.id == IPFIX_TYPEID_flowEndMilliSeconds) { intdata = getData(dataTemplateInfo.fieldInfo[k].type,(data+dataTemplateInfo.fieldInfo[k].offset)) / 1000; notfound = false; break; } // if no flow end time is available, maybe this is is from a netflow from Cisco // then use flowEndSysUpTime as flow start time if(dataTemplateInfo.fieldInfo[k].type.id == IPFIX_TYPEID_flowEndSysUpTime) { intdata2 = getData(dataTemplateInfo.fieldInfo[k].type,(data+dataTemplateInfo.fieldInfo[k].offset)); notfound2 = false; } } if(notfound && !notfound2) { intdata = intdata2; notfound = false; } } break; //TODO: replace by enterprise number (Gerhard 12/2009) case IPFIX_ETYPEID_revFlowEndSeconds: // look for alternative (revFlowEndMilliSeconds/1000) if(dataTemplateInfo.fieldCount > 0) { for(k=0; k < dataTemplateInfo.fieldCount; k++) { if(dataTemplateInfo.fieldInfo[k].type.id == IPFIX_ETYPEID_revFlowEndMilliSeconds) { intdata = getData(dataTemplateInfo.fieldInfo[k].type,(data+dataTemplateInfo.fieldInfo[k].offset)) / 1000; notfound = false; break; } } } break; } } // if still not found, get default value if(notfound) intdata = col->defaultValue; } // we need extra treatment for timing related fields if(col->enterprise == 0 ) { switch (col->ipfixId) { case IPFIX_TYPEID_flowStartSeconds: // save time for table access if (flowstartsec==0) flowstartsec = intdata; break; case IPFIX_TYPEID_flowEndSeconds: break; case IPFIX_TYPEID_flowStartMilliSeconds: // if flowStartSeconds is not stored in one of the columns, but flowStartMilliSeconds is, // then we use flowStartMilliSeconds for table access // This is realized by storing this value only if flowStartSeconds has not yet been seen. // A later appearing flowStartSeconds will override this value. if (flowstartsec==0) flowstartsec = intdata/1000; case IPFIX_TYPEID_flowEndMilliSeconds: //TODO: replace by enterprise number (Gerhard 12/2009) case IPFIX_ETYPEID_revFlowStartMilliSeconds: case IPFIX_ETYPEID_revFlowEndMilliSeconds: // in the database the millisecond entry is counted from last second intdata %= 1000; break; } } } DPRINTF("saw ipfix id %d in packet with intdata %llX", col->ipfixId, intdata); if(first) rowStream << intdata; else rowStream << "," << intdata; first = false; } rowStream << ")"; if (flowstartsec == 0) { msg(MSG_ERROR, "IpfixDbWriter: Failed to get timing data from record. Will be saved in default table."); } row = rowStream.str(); DPRINTF("Insert row: %s", row.c_str()); return row; }