diff --git a/include/backends/backend_loader.hpp b/include/backends/backend_loader.hpp index 70bb592..7795d0c 100644 --- a/include/backends/backend_loader.hpp +++ b/include/backends/backend_loader.hpp @@ -42,6 +42,8 @@ namespace dindb { Backend& backend ( void ); const Backend& backend ( void ) const; bool is_loaded ( void ) const; + int backend_interface_version ( void ) const; + int max_supported_interface_version ( void ) const; BackendPlugin& operator= ( BackendPlugin&& ) = default; @@ -51,6 +53,7 @@ namespace dindb { SoHandle m_lib; BackendPtr m_backend; boost::string_ref m_name; + int m_iface_ver; }; std::string backend_name ( const std::string& parSOPath ); diff --git a/include/backends/backend_version.hpp b/include/backends/backend_version.hpp new file mode 100644 index 0000000..8b31e82 --- /dev/null +++ b/include/backends/backend_version.hpp @@ -0,0 +1,25 @@ +/* Copyright 2015, 2016, Michele Santullo + * This file is part of "dindexer". + * + * "dindexer" is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * "dindexer" is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with "dindexer". If not, see . + */ + +#ifndef idAA27B58429DB41C2AF53204CC5010E94 +#define idAA27B58429DB41C2AF53204CC5010E94 + +namespace dindb { + constexpr const int g_current_iface_version = 1; +} //namespace dindb + +#endif diff --git a/include/backends/exposed_functions.hpp b/include/backends/exposed_functions.hpp index a1b21e9..ef174d3 100644 --- a/include/backends/exposed_functions.hpp +++ b/include/backends/exposed_functions.hpp @@ -29,5 +29,6 @@ namespace dindb { extern "C" dindb::Backend* dindexer_create_backend ( const YAML::Node* parConfig ); extern "C" void dindexer_destroy_backend ( dindb::Backend* parDele ); extern "C" const char* dindexer_backend_name ( void ); +extern "C" int dindexer_backend_iface_version ( void ); #endif diff --git a/src/backends/backend_loader.cpp b/src/backends/backend_loader.cpp index a6eba27..3aa8547 100644 --- a/src/backends/backend_loader.cpp +++ b/src/backends/backend_loader.cpp @@ -20,6 +20,7 @@ #include "backends/backend_loader.hpp" #include "backends/exposed_functions.hpp" +#include "backends/backend_version.hpp" #include #include #include @@ -50,6 +51,13 @@ namespace dindb { void nop_destroy (Backend*) { } + + int backend_iface_version (void* parSOHandle) { + typedef decltype(&dindexer_backend_iface_version) GetVersionFun; + + auto get_version = reinterpret_cast(dlsym(parSOHandle, "dindexer_backend_iface_version")); + return get_version(); + } } //unnamed namespace std::string backend_name (const std::string& parSOPath) { @@ -70,8 +78,13 @@ namespace dindb { BackendPlugin::BackendPlugin (const std::string& parSOPath, const YAML::Node* parConfig) : m_lib(dlopen(parSOPath.c_str(), RTLD_LAZY), &dlclose), m_backend(load_backend(m_lib.get(), parConfig)), - m_name(backend_name(m_lib.get())) + m_name(backend_name(m_lib.get())), + m_iface_ver(backend_iface_version(m_lib.get())) { + if (g_current_iface_version != m_iface_ver) { + m_backend.reset(); + m_lib.reset(); + } } BackendPlugin::~BackendPlugin() noexcept { @@ -104,4 +117,12 @@ namespace dindb { bool BackendPlugin::is_loaded() const { return static_cast(m_backend); } + + int BackendPlugin::backend_interface_version() const { + return m_iface_ver; + } + + int BackendPlugin::max_supported_interface_version() const { + return g_current_iface_version; + } } //namespace dindb diff --git a/src/backends/postgresql/backend_postgresql.cpp b/src/backends/postgresql/backend_postgresql.cpp index 95e6332..68577ec 100644 --- a/src/backends/postgresql/backend_postgresql.cpp +++ b/src/backends/postgresql/backend_postgresql.cpp @@ -17,6 +17,7 @@ #include "backend_postgresql.hpp" #include "backends/exposed_functions.hpp" +#include "backends/backend_version.hpp" #include "tag.hpp" #include "delete.hpp" #include "scan.hpp" @@ -179,3 +180,7 @@ extern "C" void dindexer_destroy_backend (dindb::Backend* parDele) { extern "C" const char* dindexer_backend_name() { return "postgresql"; } + +extern "C" int dindexer_backend_iface_version() { + return dindb::g_current_iface_version; +}