Refactor that fixes a compilation issue in Release mode

Some template specialization were not found, because they were not declared
at the point they were used.

We moved things around, things are less inter-dependant, and also now it
works.
This commit is contained in:
louiz’
2018-04-13 23:35:06 +02:00
parent de8267fa3f
commit 4bd7b6981b
13 changed files with 162 additions and 148 deletions
-49
View File
@@ -1,9 +1,5 @@
#pragma once
#include <database/insert_query.hpp>
#include <database/update_query.hpp>
#include <logger/logger.hpp>
#include <utils/is_one_of.hpp>
#include <type_traits>
@@ -29,52 +25,7 @@ struct Row
return col.value;
}
template <bool Coucou=true>
void save(std::unique_ptr<DatabaseEngine>& db, typename std::enable_if<!is_one_of<Id, T...> && Coucou>::type* = nullptr)
{
this->insert(*db);
}
template <bool Coucou=true>
void save(std::unique_ptr<DatabaseEngine>& db, typename std::enable_if<is_one_of<Id, T...> && Coucou>::type* = nullptr)
{
const Id& id = std::get<Id>(this->columns);
if (id.value == Id::unset_value)
{
this->insert(*db);
if (db->last_inserted_rowid >= 0)
std::get<Id>(this->columns).value = static_cast<Id::real_type>(db->last_inserted_rowid);
}
else
this->update(*db);
}
private:
template <bool Coucou=true>
void insert(DatabaseEngine& db, typename std::enable_if<is_one_of<Id, T...> && Coucou>::type* = nullptr)
{
InsertQuery query(this->table_name, this->columns);
// Ugly workaround for non portable stuff
query.body += db.get_returning_id_sql_string(Id::name);
query.execute(db, this->columns);
}
template <bool Coucou=true>
void insert(DatabaseEngine& db, typename std::enable_if<!is_one_of<Id, T...> && Coucou>::type* = nullptr)
{
InsertQuery query(this->table_name, this->columns);
query.execute(db, this->columns);
}
void update(DatabaseEngine& db)
{
UpdateQuery query(this->table_name, this->columns);
query.execute(db, this->columns);
}
public:
std::tuple<T...> columns;
std::string table_name;
};