mirror of https://github.com/Icinga/icinga2.git
db_ido: Add idoutils 1.x schema, check required 1.10.0 version.
fixes #4766
This commit is contained in:
parent
518f050544
commit
e8bd81bddc
|
@ -24,6 +24,7 @@
|
||||||
#include "db_ido/dbtype.h"
|
#include "db_ido/dbtype.h"
|
||||||
#include "db_ido/dbvalue.h"
|
#include "db_ido/dbvalue.h"
|
||||||
#include "db_ido_mysql/idomysqlconnection.h"
|
#include "db_ido_mysql/idomysqlconnection.h"
|
||||||
|
#include <boost/exception/diagnostic_information.hpp>
|
||||||
#include <boost/tuple/tuple.hpp>
|
#include <boost/tuple/tuple.hpp>
|
||||||
#include <boost/smart_ptr/make_shared.hpp>
|
#include <boost/smart_ptr/make_shared.hpp>
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
|
@ -37,6 +38,7 @@ void IdoMysqlConnection::Start(void)
|
||||||
DbConnection::Start();
|
DbConnection::Start();
|
||||||
|
|
||||||
m_Connected = false;
|
m_Connected = false;
|
||||||
|
m_RequiredSchemaVersion = "1.10.0";
|
||||||
|
|
||||||
m_TxTimer = boost::make_shared<Timer>();
|
m_TxTimer = boost::make_shared<Timer>();
|
||||||
m_TxTimer->SetInterval(5);
|
m_TxTimer->SetInterval(5);
|
||||||
|
@ -112,6 +114,20 @@ void IdoMysqlConnection::ReconnectTimerHandler(void)
|
||||||
|
|
||||||
m_Connected = true;
|
m_Connected = true;
|
||||||
|
|
||||||
|
String dbVersionName = "idoutils";
|
||||||
|
Array::Ptr version_rows = Query("SELECT version FROM " + GetTablePrefix() + "dbversion WHERE name='" + Escape(dbVersionName) + "'");
|
||||||
|
|
||||||
|
if (version_rows->GetLength() == 0)
|
||||||
|
BOOST_THROW_EXCEPTION(std::runtime_error("Schema does not provide any valid version! Verify your schema installation."));
|
||||||
|
|
||||||
|
Dictionary::Ptr version_row = version_rows->Get(0);
|
||||||
|
String version = version_row->Get("version");
|
||||||
|
|
||||||
|
if (Utility::CompareVersion(m_RequiredSchemaVersion, version) < 0) {
|
||||||
|
BOOST_THROW_EXCEPTION(std::runtime_error("Schema version '" + version + "' does not match the required version '" +
|
||||||
|
m_RequiredSchemaVersion + "'! Please check the upgrade documentation."));
|
||||||
|
}
|
||||||
|
|
||||||
String instanceName = "default";
|
String instanceName = "default";
|
||||||
|
|
||||||
if (!m_InstanceName.IsEmpty())
|
if (!m_InstanceName.IsEmpty())
|
||||||
|
@ -128,7 +144,7 @@ void IdoMysqlConnection::ReconnectTimerHandler(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
std::ostringstream msgbuf;
|
std::ostringstream msgbuf;
|
||||||
msgbuf << "MySQL IDO instance id: " << static_cast<long>(m_InstanceID);
|
msgbuf << "MySQL IDO instance id: " << static_cast<long>(m_InstanceID) << " (schema version: '" + version + "')";
|
||||||
Log(LogInformation, "db_ido_mysql", msgbuf.str());
|
Log(LogInformation, "db_ido_mysql", msgbuf.str());
|
||||||
|
|
||||||
ClearConfigTables();
|
ClearConfigTables();
|
||||||
|
|
|
@ -68,6 +68,8 @@ private:
|
||||||
bool m_Connected;
|
bool m_Connected;
|
||||||
MYSQL m_Connection;
|
MYSQL m_Connection;
|
||||||
|
|
||||||
|
String m_RequiredSchemaVersion;
|
||||||
|
|
||||||
Timer::Ptr m_ReconnectTimer;
|
Timer::Ptr m_ReconnectTimer;
|
||||||
Timer::Ptr m_TxTimer;
|
Timer::Ptr m_TxTimer;
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -26,6 +26,8 @@
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
#include <boost/function.hpp>
|
#include <boost/function.hpp>
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
|
#include <boost/algorithm/string/split.hpp>
|
||||||
|
#include <boost/algorithm/string/classification.hpp>
|
||||||
|
|
||||||
#if HAVE_GCC_ABI_DEMANGLE
|
#if HAVE_GCC_ABI_DEMANGLE
|
||||||
# include <cxxabi.h>
|
# include <cxxabi.h>
|
||||||
|
@ -562,3 +564,25 @@ unsigned long Utility::SDBM(const String& str)
|
||||||
|
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Utility::CompareVersion(const String& v1, const String& v2)
|
||||||
|
{
|
||||||
|
std::vector<String> tokensv1, tokensv2;
|
||||||
|
boost::algorithm::split(tokensv1, v1, boost::is_any_of("."));
|
||||||
|
boost::algorithm::split(tokensv2, v2, boost::is_any_of("."));
|
||||||
|
|
||||||
|
for (int i = 0; i < tokensv2.size() - tokensv1.size(); i++)
|
||||||
|
tokensv1.push_back("0");
|
||||||
|
|
||||||
|
for (int i = 0; i < tokensv1.size() - tokensv2.size(); i++)
|
||||||
|
tokensv2.push_back("0");
|
||||||
|
|
||||||
|
for (size_t i = 0; i < tokensv1.size(); i++) {
|
||||||
|
if (Convert::ToLong(tokensv2[i]) > Convert::ToLong(tokensv1[i]))
|
||||||
|
return 1;
|
||||||
|
else if (Convert::ToLong(tokensv2[i]) < Convert::ToLong(tokensv1[i]))
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -97,6 +97,8 @@ public:
|
||||||
|
|
||||||
static unsigned long SDBM(const String& str);
|
static unsigned long SDBM(const String& str);
|
||||||
|
|
||||||
|
static int CompareVersion(const String& v1, const String& v2);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Utility(void);
|
Utility(void);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue