diff options
Diffstat (limited to 'src/database')
-rw-r--r-- | src/database/database.cpp | 87 | ||||
-rw-r--r-- | src/database/database.hpp | 53 |
2 files changed, 140 insertions, 0 deletions
diff --git a/src/database/database.cpp b/src/database/database.cpp new file mode 100644 index 0000000..61e1b47 --- /dev/null +++ b/src/database/database.cpp @@ -0,0 +1,87 @@ +#include "biboumi.h" +#ifdef USE_DATABASE + +#include <database/database.hpp> +#include <logger/logger.hpp> +#include <string> + +using namespace std::string_literals; + +std::unique_ptr<db::BibouDB> Database::db; + +void Database::open(const std::string& filename, const std::string& db_type) +{ + try + { + auto new_db = std::make_unique<db::BibouDB>(db_type, + "database="s + filename); + if (new_db->needsUpgrade()) + new_db->upgrade(); + Database::db.reset(new_db.release()); + } catch (const litesql::DatabaseError& e) { + log_error("Failed to open database ", filename, ". ", e.what()); + throw; + } +} + +void Database::set_verbose(const bool val) +{ + Database::db->verbose = val; +} + +db::IrcServerOptions Database::get_irc_server_options(const std::string& owner, + const std::string& server) +{ + try { + auto options = litesql::select<db::IrcServerOptions>(*Database::db, + db::IrcServerOptions::Owner == owner && + db::IrcServerOptions::Server == server).one(); + return options; + } catch (const litesql::NotFound& e) { + db::IrcServerOptions options(*Database::db); + options.owner = owner; + options.server = server; + // options.update(); + return options; + } +} + +db::IrcChannelOptions Database::get_irc_channel_options(const std::string& owner, + const std::string& server, + const std::string& channel) +{ + try { + auto options = litesql::select<db::IrcChannelOptions>(*Database::db, + db::IrcChannelOptions::Owner == owner && + db::IrcChannelOptions::Server == server && + db::IrcChannelOptions::Channel == channel).one(); + return options; + } catch (const litesql::NotFound& e) { + db::IrcChannelOptions options(*Database::db); + options.owner = owner; + options.server = server; + options.channel = channel; + return options; + } +} + +db::IrcChannelOptions Database::get_irc_channel_options_with_server_default(const std::string& owner, + const std::string& server, + const std::string& channel) +{ + auto coptions = Database::get_irc_channel_options(owner, server, channel); + auto soptions = Database::get_irc_server_options(owner, server); + if (coptions.encodingIn.value().empty()) + coptions.encodingIn = soptions.encodingIn; + if (coptions.encodingOut.value().empty()) + coptions.encodingOut = soptions.encodingOut; + + return coptions; +} + +void Database::close() +{ + Database::db.reset(nullptr); +} + +#endif diff --git a/src/database/database.hpp b/src/database/database.hpp new file mode 100644 index 0000000..7173bcd --- /dev/null +++ b/src/database/database.hpp @@ -0,0 +1,53 @@ +#pragma once + + +#include <biboumi.h> +#ifdef USE_DATABASE + +#include "biboudb.hpp" + +#include <memory> + +#include <litesql.hpp> + +class Database +{ +public: + Database() = default; + ~Database() = default; + + Database(const Database&) = delete; + Database(Database&&) = delete; + Database& operator=(const Database&) = delete; + Database& operator=(Database&&) = delete; + + static void set_verbose(const bool val); + + template<typename PersistentType> + static size_t count() + { + return litesql::select<PersistentType>(*Database::db).count(); + } + /** + * Return the object from the db. Create it beforehand (with all default + * values) if it is not already present. + */ + static db::IrcServerOptions get_irc_server_options(const std::string& owner, + const std::string& server); + static db::IrcChannelOptions get_irc_channel_options(const std::string& owner, + const std::string& server, + const std::string& channel); + static db::IrcChannelOptions get_irc_channel_options_with_server_default(const std::string& owner, + const std::string& server, + const std::string& channel); + + static void close(); + static void open(const std::string& filename, const std::string& db_type="sqlite3"); + + +private: + static std::unique_ptr<db::BibouDB> db; +}; +#endif /* USE_DATABASE */ + + |