diff --git a/src/common/db2.h b/src/common/db2.h index e383dcc..4860046 100644 --- a/src/common/db2.h +++ b/src/common/db2.h @@ -207,6 +207,25 @@ struct db2 { } return ja; } + void load_from_json(const path &fn) { + auto ja = nlohmann::json::parse(read_file(fn)); + for (auto &&[tn,t] : ja.items()) { + for (auto &&[vn,v] : t.items()) { + for (auto &&[fn, fv] : v.items()) { + if (0) { + } else if (fv.is_number_integer()) { + m[tn][vn][fn] = fv.get(); + } else if (fv.is_number_float()) { + m[tn][vn][fn] = fv.get(); + } else if (fv.is_string()) { + m[tn][vn][fn] = fv.get(); + } else { + throw std::runtime_error{"bad json type"}; + } + } + } + } + } void save(const path &fn, int codepage = 1251) { auto s_to_char20 = [&](char20 &dst, const std::string &in, int codepage = 1251) { auto s = utf8_to_dbstr(in); diff --git a/src/db_extractor2/db_extractor2.cpp b/src/db_extractor2/db_extractor2.cpp index 6a84bf7..d5d8386 100644 --- a/src/db_extractor2/db_extractor2.cpp +++ b/src/db_extractor2/db_extractor2.cpp @@ -31,15 +31,22 @@ int main(int argc, char *argv[]) { - cl::opt db_fn(cl::Positional, cl::desc(""), cl::Required); + cl::opt db_fn(cl::Positional, cl::desc(""), cl::Required); cl::ParseCommandLineOptions(argc, argv); - db2 db{db_fn}; - auto f = db.open(); - auto m = f.to_map(); - write_file(path{db_fn} += ".json", m.to_json().dump(1)); - m.save(path{db_fn} += "new"); + path fn = db_fn; + fn = fs::absolute(fn); + if (fn.extension() != ".json") { + db2 db{fn}; + auto f = db.open(); + auto m = f.to_map(); + write_file(path{fn} += ".json", m.to_json().dump(1)); + } else { + db2::files::db2_internal db; + db.load_from_json(fn); + db.save(fn.parent_path() / fn.stem()); + } return 0; }