OSDN Git Service

divide idx to sub directories for preventing from scanning all files.
[fukui-no-namari/dialektos.git] / src / thread_idx.cxx
index a5ae829..d9f09c8 100644 (file)
 #include "thread_idx.hxx"
 
 #include <boost/archive/xml_iarchive.hpp>
+#include <boost/archive/xml_oarchive.hpp>
 #include <boost/serialization/nvp.hpp>
-#include <boost/exception.hpp>
 #include <boost/format.hpp>
 #include <boost/filesystem.hpp>
 #include <fstream>
 #include <string>
 #include <iostream>
+#include "misc.hxx"
 
 
 namespace dialektos {
 
+ThreadIdx::ThreadIdx() : title_(), line_count_(0), last_modified_(), etag_()
+{}
 
-ThreadIdx ThreadIdx::from_xml(const boost::filesystem::path& xml) {
+void ThreadIdx::to_xml(const boost::filesystem::path& _xml) {
+  const std::string prefix = _xml.filename().substr(0, 3);
+  const boost::filesystem::path xml =
+    _xml.parent_path() / prefix / _xml.filename();
+
+  if (!misc::create_directories(xml.parent_path())) return;
+  std::ofstream ofs(xml.file_string().c_str());
+  try {
+    boost::archive::xml_oarchive oa(ofs);
+    oa << boost::serialization::make_nvp("ThreadIdx", *this);
+  } catch (const boost::archive::archive_exception& e) {
+    std::cerr << e.what() << " " << xml.file_string() << std::endl;
+  }
+  ofs.close();
+}
+
+ThreadIdx ThreadIdx::from_xml(const boost::filesystem::path& _xml) {
   ThreadIdx idx;
 
+  const std::string prefix = _xml.filename().substr(0, 3);
+  const boost::filesystem::path xml =
+    _xml.parent_path() / prefix / _xml.filename();
+
+  if (!boost::filesystem::exists(xml) ||
+      !boost::filesystem::is_regular_file(xml))
+    return idx;
+
   std::ifstream ifs(xml.file_string().c_str());
   try {
     boost::archive::xml_iarchive ia(ifs);
     ia >> boost::serialization::make_nvp("ThreadIdx", idx);
-  } catch (const boost::exception& e) {
-    // TODO thread safety.
-    std::cerr << boost::format("cannot read %1%") % xml.file_string() << std::endl;
+  } catch (const boost::archive::archive_exception& e) {
+    std::cerr << e.what() << " " << xml.file_string() << std::endl;
     return ThreadIdx();
   }
   ifs.close();