diff --git a/src/bakatools.h b/src/bakatools.h index b519a87..d8b3f41 100644 --- a/src/bakatools.h +++ b/src/bakatools.h @@ -13,9 +13,13 @@ #include #endif #ifdef BKMOD_JSON - #include - #include - #include + #include + #include + #include + #include + #define BKMOD_CONTAINER + #define BKMOD_STRING + #define BKMOD_FILESYSTEM #endif #ifdef BKMOD_STRING #include diff --git a/src/bakatools/json/fs_manager.cpp b/src/bakatools/json/fs_manager.cpp new file mode 100644 index 0000000..aa7834a --- /dev/null +++ b/src/bakatools/json/fs_manager.cpp @@ -0,0 +1,187 @@ +#include "fs_manager.h" + +namespace Bk::Json +{ + FsManager::FsManager(std::string path) + : path(path) + { + auto dir = Directory(path); + if (dir.exists()) + { + File f_conf(path + "/collection.json"); + if (f_conf.exists()) + { + config = Parser(f_conf).parse(); + write_config(); + } + else + { + Pointer node(new Node()); + node->set_null(); + config = node; + } + } + else + { + Pointer node(new Node()); + node->set_null(); + config = node; + } + } + + void FsManager::config_init(int page_size) + { + auto dir = Directory(path); + std::string s_config = "\n" + "{\n" + " \"name\": \"" + dir.name() + "\",\n" + " \"id_count\": 0,\n" + " \"page_size\": " + std::to_string(page_size) + "\n" + "}"; + config = Parser(s_config).parse(); + write_config(); + } + + void FsManager::init(bool force, int page_size) + { + auto dir = Directory(path); + if (dir.exists() && force) dir = dir.remove(); + if (!dir.exists()) + { + Directory::create(dir.path()); + config_init(page_size); + } + else + { + File f_conf(path + "/collection.json"); + if (!f_conf.exists()) + { + config_init(page_size); + } + } + } + + void FsManager::set_config(Object* object) + { + config->set_object(object); + + write_config(); + } + + void FsManager::write(File file, Pointer& node) + { + Type::DataStream data; + auto raw = node->to_string(); + data.push(raw.c_str(), raw.length()); + file.write(data); + } + + void FsManager::write_config() + { + if (!config->is_null()) + { + File f_config = File(path + "/collection.json"); + write(f_config, config); + } + } + + void FsManager::insert(Object* object) + { + if (!config->is_null()) + { + Object* conf_obj = config->get_p_object(); + (*object)["id"] = Pointer(new Node()); + (*object)["id"]->set_int((*conf_obj)["id_count"]->get_int()); + auto f_list = File(Tools::string_format("%s/%d.json", path, get_page((*conf_obj)["id_count"]->get_int()))); + if(f_list.exists()) + { + auto ls = Parser(f_list).parse(); + auto new_node = Pointer(new Node()); + new_node->set_object(object); + ls->get_p_list()->push_back(new_node); + write(f_list, ls); + } + else + { + auto ls = Pointer(new Node()); + auto new_node = new Node(); + new_node->set_object(object); + auto new_ls = new List(); + new_ls->push_back(Pointer(new_node)); + ls->set_list(new_ls); + write(f_list, ls); + } + (*conf_obj)["id_count"]->set_float((*conf_obj)["id_count"]->get_int() + 1); + set_config(conf_obj); + } + } + + void FsManager::update(Object* object) + { + if (object->find("id") != object->end()) + { + int id = (*object)["id"]->get_int(); + auto f_list = File(Tools::string_format("%s/%d.json", path, get_page(id))); + if (f_list.exists()) + { + auto ls = Parser(f_list).parse(); + for (int i = 0; i < ls->get_list().size(); i++) + { + auto node = ls->get_p_list()->at(i); + if (node->get_object().find("id") != node->get_object().end()) + { + if (node->get_object()["id"]->get_int() == id) + { + ls->get_p_list()->at(i)->set_object(object); + } + } + } + write(f_list, ls); + } + } + } + + void FsManager::remove(int id) + { + auto f_path = Tools::string_format("%s/%d.json", path, get_page(id)); + auto f_list = File(f_path); + if (f_list.exists()) + { + auto ls = Parser(f_list).parse(); + for (int i = 0; i < ls->get_list().size(); i++) + { + auto node = ls->get_p_list()->at(i); + if (node->get_object().find("id") != node->get_object().end()) + { + if (node->get_object()["id"]->get_int() == id) + { + ls->get_p_list()->erase(ls->get_p_list()->begin() + i); + } + } + } + write(f_list, ls); + } + } + + Object FsManager::findby_id(int id) + { + auto f_path = Tools::string_format("%s/%d.json", path, get_page(id)); + auto f_list = File(f_path); + if (f_list.exists()) + { + auto ls = Parser(f_list).parse(); + for (int i = 0; i < ls->get_list().size(); i++) + { + auto node = ls->get_p_list()->at(i); + if (node->get_object().find("id") != node->get_object().end()) + { + if (node->get_object()["id"]->get_int() == id) + { + return node->get_object(); + } + } + } + } + return Object(); + } +} \ No newline at end of file diff --git a/src/bakatools/json/fs_manager.h b/src/bakatools/json/fs_manager.h new file mode 100644 index 0000000..db03bc2 --- /dev/null +++ b/src/bakatools/json/fs_manager.h @@ -0,0 +1,28 @@ +#include +#include "parser.h" + +namespace Bk::Json +{ + class FsManager + { + std::string path; + Pointer config; + public: + FsManager(std::string path); + + void init(bool force = false, int page_size = 100); + void config_init(int page_size); + bool exists() { return File(path + "/collection.json").exists(); } + + void set_config(Object* object); + void write(File file, Pointer& node); + void write_config(); + Object get_config() { return config->get_object(); } + int get_page(float id) { return (int)(id/100.0f); } + + void insert(Object* object); + void update(Object* object); + void remove(int id); + Object findby_id(int id); + }; +} \ No newline at end of file diff --git a/src/bakatools/json/json_lexer.cpp b/src/bakatools/json/lexer.cpp similarity index 99% rename from src/bakatools/json/json_lexer.cpp rename to src/bakatools/json/lexer.cpp index de3a9bd..ed5506a 100644 --- a/src/bakatools/json/json_lexer.cpp +++ b/src/bakatools/json/lexer.cpp @@ -1,4 +1,4 @@ -#include "json_lexer.h" +#include "lexer.h" namespace Bk::Json { diff --git a/src/bakatools/json/json_lexer.h b/src/bakatools/json/lexer.h similarity index 97% rename from src/bakatools/json/json_lexer.h rename to src/bakatools/json/lexer.h index 45e5999..4220947 100644 --- a/src/bakatools/json/json_lexer.h +++ b/src/bakatools/json/lexer.h @@ -4,7 +4,7 @@ #include #include #include -#include "json_node.h" +#include "node.h" namespace Bk::Json { diff --git a/src/bakatools/json/json_node.cpp b/src/bakatools/json/node.cpp similarity index 99% rename from src/bakatools/json/json_node.cpp rename to src/bakatools/json/node.cpp index 42122be..6f5af4c 100644 --- a/src/bakatools/json/json_node.cpp +++ b/src/bakatools/json/node.cpp @@ -1,4 +1,4 @@ -#include "json_node.h" +#include "node.h" namespace Bk::Json { std::string Node::to_string(int indent) diff --git a/src/bakatools/json/json_node.h b/src/bakatools/json/node.h similarity index 100% rename from src/bakatools/json/json_node.h rename to src/bakatools/json/node.h diff --git a/src/bakatools/json/json_parser.cpp b/src/bakatools/json/parser.cpp similarity index 99% rename from src/bakatools/json/json_parser.cpp rename to src/bakatools/json/parser.cpp index 9fd5e3b..6f3d8c7 100644 --- a/src/bakatools/json/json_parser.cpp +++ b/src/bakatools/json/parser.cpp @@ -1,4 +1,4 @@ -#include "json_parser.h" +#include "parser.h" namespace Bk::Json { diff --git a/src/bakatools/json/json_parser.h b/src/bakatools/json/parser.h similarity index 96% rename from src/bakatools/json/json_parser.h rename to src/bakatools/json/parser.h index c01c877..4c9f95a 100644 --- a/src/bakatools/json/json_parser.h +++ b/src/bakatools/json/parser.h @@ -1,7 +1,7 @@ #pragma once #include -#include "json_lexer.h" +#include "lexer.h" namespace Bk::Json {