// SPDX-FileCopyrightText: 2022 Enrique M.G. // // SPDX-License-Identifier: LGPL-2.1-or-later #include "filedb.hpp" #include #include #include #include #include #include #include #include #include #include #include #include using namespace lliurex; using namespace edupals; using namespace edupals::variant; using namespace std; namespace stdfs=std::experimental::filesystem; FileDB::FileDB() : db(nullptr) { } FileDB::FileDB(string path,string magic) : path(path), format(DBFormat::Json), db(nullptr), magic(magic) { } FileDB::~FileDB() { close(); } bool FileDB::exists() { const stdfs::path dbpath {path}; return stdfs::exists(dbpath); } bool FileDB::is_open() { return (db != nullptr); } void FileDB::create(DBFormat format,uint32_t mode) { this->format = format; db = fopen(path.c_str(),"wb"); if (!db) { stringstream ss; ss<<"Failed to create FileDB:"< 0) { ss.write((const char*)buffer,len); goto L0; } Variant value; if (format == DBFormat::Json) { value = json::load(ss); } if (format == DBFormat::Bson) { value = bson::load(ss); } if (!value.is_struct()) { throw runtime_error("FileDB read: Expected struct"); } if (value["magic"].get_string() != magic) { throw runtime_error("FileDB read: Bad MAGIC"); } return value["data"]; } void FileDB::write(edupals::variant::Variant data) { stringstream ss(std::stringstream::out | std::stringstream::binary); //std::stringbuf buffer; //std::ostream ss(&buffer); Variant header; header = Variant::create_struct(); header["magic"] = magic; header["data"] = data; if (format == DBFormat::Json) { json::dump(header,ss); } if (format == DBFormat::Bson) { bson::dump(header,ss); } fseek(db,0,SEEK_SET); int fd = fileno(db); ftruncate(fd,0); int status = fwrite(ss.str().c_str(),ss.str().size(),1,db); if (status == 0) { stringstream ss; ss<<"Failed to write FileDB:"<