WSJT-X/qt_db_helpers.hpp
Bill Somerville db51726da2 Move Fox log reset action to Fox log window context menu and allow deletes of QSOs
Move to OnRowChange edit strategy for log tables so that deletes from
view can be implemented cleanly.

Improve layout of log view tables by resizing to contents.
2018-11-25 22:19:41 +00:00

96 lines
2.0 KiB
C++

#ifndef QT_DB_HELPERS_HPP_
#define QT_DB_HELPERS_HPP_
#include <utility>
#include <stdexcept>
#include <QString>
#include <QSqlError>
#include <QSqlTableModel>
template<typename T, typename Func, typename... Args>
void SQL_error_check (T&& object, Func func, Args&&... args)
{
if (!(std::forward<T> (object).*func) (std::forward<Args> (args)...))
{
auto error = object.lastError ();
if (QSqlError::NoError != error.type ())
{
throw std::runtime_error {("Database Error: " + error.text ()).toStdString ()};
}
}
}
class ConditionalTransaction final
: private boost::noncopyable
{
public:
explicit ConditionalTransaction (QSqlTableModel& model)
: model_ (model)
, submitted_ {false}
{
model_.database ().transaction ();
}
bool submit (bool throw_on_error = true)
{
bool ok {true};
if (throw_on_error)
{
SQL_error_check (model_
, QSqlTableModel::OnManualSubmit == model_.editStrategy ()
? &QSqlTableModel::submitAll
: &QSqlTableModel::submit);
}
else
{
ok = QSqlTableModel::OnManualSubmit == model_.editStrategy ()
? model_.submitAll () : model_.submit ();
}
submitted_ = submitted_ || ok;
return ok;
}
void revert ()
{
if (QSqlTableModel::OnManualSubmit == model_.editStrategy ())
{
model_.revertAll ();
}
else
{
model_.revert ();
}
}
~ConditionalTransaction ()
{
if (model_.isDirty ())
{
// abandon un-submitted changes to the model
if (QSqlTableModel::OnManualSubmit == model_.editStrategy ())
{
model_.revertAll ();
}
else
{
model_.revert ();
}
}
auto database = model_.database ();
if (submitted_)
{
SQL_error_check (database, &QSqlDatabase::commit);
}
else
{
database.rollback ();
}
}
private:
QSqlTableModel& model_;
bool submitted_;
};
#endif