Exemple #1
0
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);
	}
}