From: APTX Date: Sun, 28 Sep 2014 13:48:37 +0000 (+0200) Subject: Add RaiiMyList. X-Git-Url: https://gitweb.aptx.org/?a=commitdiff_plain;h=f7aa73003ed45b3a6e5ac227499d5e43330effa2;p=localmylist.git Add RaiiMyList. RaiiMyList is a "threadsafe" way of using LocalMyList. --- diff --git a/localmylist/include/LocalMyList/MyListNode b/localmylist/include/LocalMyList/MyListNode index 4820d89..a53ff65 100644 --- a/localmylist/include/LocalMyList/MyListNode +++ b/localmylist/include/LocalMyList/MyListNode @@ -1,2 +1 @@ #include "../../mylistnode.h" - diff --git a/localmylist/include/LocalMyList/RaiiMyList b/localmylist/include/LocalMyList/RaiiMyList new file mode 100644 index 0000000..0b0f8ce --- /dev/null +++ b/localmylist/include/LocalMyList/RaiiMyList @@ -0,0 +1 @@ +#include "../../raiimylist.h" diff --git a/localmylist/localmylist.pro b/localmylist/localmylist.pro index 0d67082..dcb3be5 100644 --- a/localmylist/localmylist.pro +++ b/localmylist/localmylist.pro @@ -35,6 +35,7 @@ SOURCES += \ messagehandler.cpp \ asyncquerytask.cpp \ service.cpp \ + raiimylist.cpp \ servicemanager.cpp \ dynamicmodel/data.cpp \ dynamicmodel/node.cpp \ @@ -72,6 +73,7 @@ HEADERS += \ sqlresultiteratorinterface.h \ service.h \ servicemanager.h \ + raiimylist.h \ dynamicmodel/data.h \ dynamicmodel/node.h \ dynamicmodel/model.h \ @@ -100,7 +102,8 @@ CONV_HEADERS += \ include/LocalMyList/UnknownFileLookupTask \ include/LocalMyList/FileLocationCheckTask \ include/LocalMyList/RequestHandler \ - include/LocalMyList/DirectoryWatcher + include/LocalMyList/DirectoryWatcher \ + include/LocalMyList/RaiiMyList !noscript { QT *= script diff --git a/localmylist/raiimylist.cpp b/localmylist/raiimylist.cpp new file mode 100644 index 0000000..36483aa --- /dev/null +++ b/localmylist/raiimylist.cpp @@ -0,0 +1,25 @@ +#include "raiimylist.h" + +namespace LocalMyList { + +RaiiMyList::RaiiMyList() : mutex{}, locker{&mutex}, ok{true}, m_connected{false} +{ + if (MyList::instance()->thread() != QThread::currentThread()) + { + qWarning("MyList instance created from a different thread"); + ok = false; + return; + } + MyList::instance()->loadLocalSettings(); + m_connected = MyList::instance()->database()->connect(); +} + +RaiiMyList::~RaiiMyList() +{ + if (!ok) return; + + MyList::instance()->database()->disconnect(); + MyList::instance()->destroy(); +} + +} // namespace LocalMyList diff --git a/localmylist/raiimylist.h b/localmylist/raiimylist.h new file mode 100644 index 0000000..1e42a61 --- /dev/null +++ b/localmylist/raiimylist.h @@ -0,0 +1,43 @@ +#ifndef RAIIMYLIST_H +#define RAIIMYLIST_H + +#include "localmylist_global.h" +#include +#include +#include +#include "mylist.h" + +namespace LocalMyList { + +/** + * @brief A "threadsafe" way of using LocalMyList in threaded environments where there + * is no control over the thread from which MyList and Database are used. + * + * This is mostly a hack. + * + * Example use: + * { + * RaiiMyList rml; + * if (!rml || !rml.connected()) return ERROR; + * // do something useful here, databaseconnection is open + * } + */ +class LOCALMYLISTSHARED_EXPORT RaiiMyList +{ + public: + RaiiMyList(); + ~RaiiMyList(); + + operator bool() const { return ok; } + bool connected() const { return m_connected; } + + private: + QMutex mutex; + QMutexLocker locker; + bool ok; + bool m_connected; +}; + +} + +#endif // RAIIMYLIST_H