added sqlite connection class (progress)

This commit is contained in:
2023-11-09 19:48:29 +01:00
parent 715f4dff8f
commit 8b5859d858
13 changed files with 227 additions and 25 deletions
+8 -4
View File
@@ -9,7 +9,8 @@ set(SQL_SOURCES
sql/record.cpp
sql/connection_info.cpp
sql/connection_impl.cpp
sql/session.cpp)
sql/session.cpp
sql/backend_provider.cpp)
set(SQL_HEADER
../include/matador/sql/dialect.hpp
@@ -27,19 +28,22 @@ set(SQL_HEADER
../include/matador/sql/connection_impl.hpp
../include/matador/sql/connection_info.hpp
../include/matador/sql/connection_pool.hpp
../include/matador/sql/session.hpp)
../include/matador/sql/session.hpp
../include/matador/sql/backend_provider.hpp)
set(UTILS_HEADER
../include/matador/utils/field_attributes.hpp
../include/matador/utils/string.hpp
../include/matador/utils/constraints.hpp
../include/matador/utils/library.hpp)
../include/matador/utils/library.hpp
../include/matador/utils/os.hpp)
set(UTILS_SOURCES
utils/field_attributes.cpp
utils/string.cpp
sql/condition.cpp
utils/library.cpp)
utils/library.cpp
utils/os.cpp)
add_library(matador STATIC ${SQL_SOURCES} ${SQL_HEADER} ${UTILS_SOURCES} ${UTILS_HEADER})
target_include_directories(matador PUBLIC ${PROJECT_SOURCE_DIR}/include)
+46
View File
@@ -0,0 +1,46 @@
#include "matador/sql/backend_provider.hpp"
#include <cstdint>
#include <stdexcept>
#include <utility>
namespace matador::sql {
backend_provider::backend_provider(std::string backends_path)
: backends_path_(std::move(backends_path)) {}
connection_impl *backend_provider::create_connection(const std::string &connection_type)
{
auto it = backends_.find(connection_type);
if (it == backends_.end()) {
it = backends_.emplace(connection_type, backend_context{connection_type, backends_path_}).first;
}
return (*it->second.create_connection)();
}
const dialect &backend_provider::connection_dialect(const std::string &connection_type)
{
auto it = backends_.find(connection_type);
if (it == backends_.end()) {
it = backends_.emplace(connection_type, backend_context{connection_type, backends_path_}).first;
}
return *(*it->second.get_dialect)();
}
backend_provider::backend_context::backend_context(const std::string &connection_type,
const std::string &backends_path)
{
if (!lib.load(backends_path + "matador-" + connection_type)) {
throw std::runtime_error("couldn't load library '" + connection_type + "'");
}
create_connection = reinterpret_cast<create_func>(reinterpret_cast<std::uintptr_t>(lib.function("create_database")));
destroy_connection = reinterpret_cast<destroy_func>(reinterpret_cast<std::uintptr_t>(lib.function("destroy_database")));
get_dialect = reinterpret_cast<dialect_func >(reinterpret_cast<std::uintptr_t>(lib.function("get_dialect")));
}
backend_provider::backend_context::~backend_context()
{
lib.unload();
}
}
+20
View File
@@ -3,6 +3,26 @@
#include "matador/utils/string.hpp"
namespace matador::sql {
dialect::dialect(const dialect::token_to_string_map &token_replace_map, const dialect::data_type_to_string_map &data_type_replace_map)
{
for (const auto &token : token_replace_map) {
tokens_[token.first] = token.second;
}
for (const auto &data_type : data_type_replace_map) {
data_types_[data_type.first] = data_type.second;
}
}
dialect::dialect(const dialect::data_type_to_string_map &data_type_replace_map)
: dialect({}, data_type_replace_map)
{}
dialect::dialect(const dialect::token_to_string_map &token_replace_map)
: dialect(token_replace_map, {})
{}
const std::string& dialect::token_at(dialect::token_t token) const
{
return tokens_.at(token);
+24
View File
@@ -0,0 +1,24 @@
#include "matador/utils/os.hpp"
#include <stdexcept>
namespace matador::utils::os {
std::string getenv(const char *name) {
#ifdef _WIN32
char var[1024];
size_t len{};
const auto error = getenv_s(&len, var, 1024, name);
if (error > 0) {
throw std::logic_error("failed to get environment variable");
};
return var;
#else
return ::getenv(name);
#endif
}
[[maybe_unused]] std::string getenv(const std::string &name) {
return getenv(name.c_str());
}
}