void FileLogAppender::compressionDayBeforeLogFile() { namespace FS = std::tr2::sys; namespace ZIP = libzippp; date::year_month_day dayBefore(date::floor<date::days>(date::sys_days::clock::now() - date::days{ 1 })); std::wostringstream ostr; ostr << dayBefore; auto dayBeforeLogPath = ostr.str(); std::tr2::sys::path dayBeforePath(logFilePath_ + dayBeforeLogPath); auto dayBeforeZipFullFilePath = dayBeforePath.wstring() + L".zip"; if (FS::exists(dayBeforePath)) { return; } // 將前一天的資料夾壓縮 ZIP::ZipArchive zipFile(utils::formUtf16(dayBeforeZipFullFilePath)); zipFile.open(ZIP::ZipArchive::OpenMode::NEW); platform::MemoryMappedFile mappedFile(utils::formUtf16(dayBeforePath.wstring() + L"\\" + logFileName_)); // libzippp只支援'/'(Unix)資料路徑格式所以要轉換 zipFile.addData(utils::formUtf16(dayBeforeLogPath) + "/" + utils::formUtf16(logFileName_), mappedFile.data(), mappedFile.getFileSize()); }
GraphEdgeCostsIF * InputUtils::impl::RAM::GR::readCosts( char const * const filename, std::string const & scenarioName) throw (IOExceptions::FileNotFountException) { GraphEdgeCostsIF * graphCosts { }; EdgeCount numberOfEdgeCosts { }; std::size_t fileSize { }; char buffer[IOUtils::impl::BUFFER_SIZE] { }; try { boost::interprocess::file_mapping mappedFile(filename, boost::interprocess::read_only); boost::interprocess::mapped_region mappedRegionOfFile(mappedFile, boost::interprocess::read_only); fileSize = mappedRegionOfFile.get_size(); boost::interprocess::bufferstream input_stream( static_cast<char*>(mappedRegionOfFile.get_address()), fileSize); while (!input_stream.eof()) { switch (input_stream.get()) { case IOUtils::impl::GR::COMMENT_LINE_NUMERIC: INFO_NOARG(logger, LogBundleKey::IOU_IGNORING_COMMENT_LINE_WHILE_READING) ; input_stream.ignore(IOUtils::impl::MAX_STREAM_SIZE, '\n'); break; case IOUtils::impl::GR::PROBLEM_DEF_LINE_NUMERIC: input_stream.getline(buffer, IOUtils::impl::MAX_CHARS_IN_LINE); numberOfEdgeCosts = InputUtils::impl::RAM::GR::getNumberOfEdgeCosts(buffer); graphCosts = new GraphEdgeCostsImpl { numberOfEdgeCosts, scenarioName, false }; break; case IOUtils::impl::GR::ARC_DEF_LINE_NUMERIC: input_stream.getline(buffer, IOUtils::impl::MAX_CHARS_IN_LINE); graphCosts->push_back( InputUtils::impl::RAM::GR::getCost(buffer)); break; default: WARN_NOARG(logger, LogBundleKey::IOU_IGNORING_UNRECOGNISED_LINE_WHILE_READING) ; break; } } INFO(logger, LogBundleKey::IOU_END_OF_READ_COSTS, filename, LogStringUtils::edgeCostSetDescription(graphCosts, "\t").c_str()); return graphCosts; } catch (boost::interprocess::interprocess_exception& e) { throw IOExceptions::FileNotFountException(filename); } }
GraphIF * InputUtils::impl::RAM::VA::readGraph(char const * const filename) throw (IOExceptions::FileNotFountException) { GraphIF * graph { }; EdgeCount idxEdgeCounter { }; std::size_t fileSize { }; char* buffer { }; rapidjson::Document jsonDoc { }; rapidjson::Value::MemberIterator vertexList { }; rapidjson::Value::MemberIterator edgeList { }; rapidjson::Value::MemberIterator endValue { }; rapidjson::Value::ConstMemberIterator it { }; try { boost::interprocess::file_mapping mappedFile(filename, boost::interprocess::read_only); boost::interprocess::mapped_region mappedRegionOfFile(mappedFile, boost::interprocess::read_only); fileSize = mappedRegionOfFile.get_size(); boost::interprocess::bufferstream input_stream( static_cast<char*>(mappedRegionOfFile.get_address()), fileSize); jsonDoc.Parse(input_stream.buffer().first); endValue = jsonDoc.MemberEnd(); vertexList = jsonDoc.FindMember(IOUtils::impl::VA::VERTEX_LIST_KEY); if (vertexList != endValue) { edgeList = jsonDoc.FindMember(IOUtils::impl::VA::EDGE_LIST_KEY); if (edgeList != endValue) { graph = InputUtils::impl::RAM::VA::createGraph( vertexList->value, edgeList->value.MemberCount()); idxEdgeCounter = 0; it = edgeList->value.MemberEnd(); for (rapidjson::Value::ConstMemberIterator itBegin = edgeList->value.MemberBegin(); itBegin != it; ++itBegin) { InputUtils::impl::RAM::VA::addEdge(idxEdgeCounter, itBegin, graph); idxEdgeCounter += 1; } } } INFO(logger, LogBundleKey::IOU_END_OF_READ, filename, LogStringUtils::graphDescription(graph, "\t").c_str()); return graph; } catch (boost::interprocess::interprocess_exception& e) { throw IOExceptions::FileNotFountException(filename); } }
GraphIF * InputUtils::impl::RAM::GR::readGraph(char const * const filename) throw (IOExceptions::FileNotFountException) { GraphIF * graph { }; EdgeCount idxEdgeCounter { }; std::size_t fileSize { }; char buffer[IOUtils::impl::BUFFER_SIZE] { }; try { boost::interprocess::file_mapping mappedFile(filename, boost::interprocess::read_only); boost::interprocess::mapped_region mappedRegionOfFile(mappedFile, boost::interprocess::read_only); fileSize = mappedRegionOfFile.get_size(); boost::interprocess::bufferstream input_stream( static_cast<char*>(mappedRegionOfFile.get_address()), fileSize); while (!input_stream.eof()) { switch (input_stream.get()) { case IOUtils::impl::GR::COMMENT_LINE_NUMERIC: INFO_NOARG(logger, LogBundleKey::IOU_IGNORING_COMMENT_LINE_WHILE_READING) ; input_stream.ignore(IOUtils::impl::MAX_STREAM_SIZE, '\n'); break; case IOUtils::impl::GR::PROBLEM_DEF_LINE_NUMERIC: input_stream.getline(buffer, IOUtils::impl::MAX_CHARS_IN_LINE); graph = InputUtils::impl::RAM::GR::createGraph(buffer); idxEdgeCounter = 0; break; case IOUtils::impl::GR::ARC_DEF_LINE_NUMERIC: input_stream.getline(buffer, IOUtils::impl::MAX_CHARS_IN_LINE); InputUtils::impl::RAM::GR::addEdge(idxEdgeCounter, buffer, graph); idxEdgeCounter += 1; break; default: WARN_NOARG(logger, LogBundleKey::IOU_IGNORING_UNRECOGNISED_LINE_WHILE_READING) ; break; } } INFO(logger, LogBundleKey::IOU_END_OF_READ, filename, LogStringUtils::graphDescription(graph, "\t").c_str()); return graph; } catch (boost::interprocess::interprocess_exception& e) { throw IOExceptions::FileNotFountException(filename); } }
GraphEdgeCostsIF * InputUtils::impl::RAM::VA::readCosts( char const * const filename, std::string const & scenarioName) throw (IOExceptions::FileNotFountException) { GraphEdgeCostsIF * graphCosts { }; std::size_t fileSize { }; char* buffer { }; rapidjson::Document jsonDoc { }; rapidjson::Value::MemberIterator edgeList { }; rapidjson::Value::MemberIterator endValue { }; rapidjson::Value::ConstMemberIterator it { }; try { boost::interprocess::file_mapping mappedFile(filename, boost::interprocess::read_only); boost::interprocess::mapped_region mappedRegionOfFile(mappedFile, boost::interprocess::read_only); fileSize = mappedRegionOfFile.get_size(); boost::interprocess::bufferstream input_stream( static_cast<char*>(mappedRegionOfFile.get_address()), fileSize); jsonDoc.Parse(input_stream.buffer().first); edgeList = jsonDoc.FindMember(IOUtils::impl::VA::EDGE_LIST_KEY); if (edgeList != endValue) { graphCosts = new GraphEdgeCostsImpl { (EdgeCount) edgeList->value.MemberCount(), scenarioName, false }; it = edgeList->value.MemberEnd(); for (rapidjson::Value::ConstMemberIterator itBegin = edgeList->value.MemberBegin(); itBegin != it; ++itBegin) { graphCosts->push_back( InputUtils::impl::RAM::VA::getCost(itBegin)); } } INFO(logger, LogBundleKey::IOU_END_OF_READ_COSTS, filename, LogStringUtils::edgeCostSetDescription(graphCosts, "\t").c_str()); return graphCosts; } catch (boost::interprocess::interprocess_exception& e) { throw IOExceptions::FileNotFountException(filename); } }