Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ca0e9294f1 | ||
|
|
cb16ebb812 | ||
|
|
2c1df5e9e4 | ||
|
|
c3873d05ac | ||
|
|
4fca0ca0c5 | ||
|
|
c02f369a0f |
No files matched your search
+3
-41
@@ -10,10 +10,6 @@ class QSqlDatabase;
|
|||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QFuture>
|
#include <QFuture>
|
||||||
#include <QFutureWatcher>
|
|
||||||
#include <QSqlQuery>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QThread>
|
|
||||||
#include <QSharedDataPointer>
|
#include <QSharedDataPointer>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@@ -23,9 +19,6 @@ class QSqlDatabase;
|
|||||||
|
|
||||||
#include "asyncdatabase_p.h"
|
#include "asyncdatabase_p.h"
|
||||||
|
|
||||||
using Row = std::vector<QVariant>;
|
|
||||||
using Rows = std::vector<Row>;
|
|
||||||
|
|
||||||
struct DatabaseConfigurationPrivate;
|
struct DatabaseConfigurationPrivate;
|
||||||
|
|
||||||
///
|
///
|
||||||
@@ -66,37 +59,6 @@ private:
|
|||||||
///
|
///
|
||||||
const QString DATABASE_TYPE_SQLITE = QStringLiteral("QSQLITE");
|
const QString DATABASE_TYPE_SQLITE = QStringLiteral("QSQLITE");
|
||||||
|
|
||||||
///
|
|
||||||
/// Parse the row into a tuple of the given types.
|
|
||||||
/// The types need to be deserializable from QVariant.
|
|
||||||
///
|
|
||||||
template <typename RowTypesTuple>
|
|
||||||
auto parseRow(const Row &row) -> RowTypesTuple
|
|
||||||
{
|
|
||||||
auto tuple = RowTypesTuple();
|
|
||||||
int i = 0;
|
|
||||||
asyncdatabase_private::iterate_tuple(tuple, [&](auto &elem) {
|
|
||||||
elem = row.at(i).value<std::decay_t<decltype(elem)>>();
|
|
||||||
i++;
|
|
||||||
});
|
|
||||||
return tuple;
|
|
||||||
}
|
|
||||||
|
|
||||||
///
|
|
||||||
/// Parse the rows into a list of tuples of the given types.
|
|
||||||
/// The types need to be deserializable from QVariant.
|
|
||||||
///
|
|
||||||
template <typename RowTypesTuple>
|
|
||||||
auto parseRows(const Rows &rows) -> std::vector<RowTypesTuple> {
|
|
||||||
std::vector<RowTypesTuple> parsedRows;
|
|
||||||
parsedRows.reserve(rows.size());
|
|
||||||
for (const auto &row : rows) {
|
|
||||||
parsedRows.push_back(parseRow<RowTypesTuple>(row));
|
|
||||||
}
|
|
||||||
|
|
||||||
return parsedRows;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
concept FromSql = requires(T v, typename T::ColumnTypes row)
|
concept FromSql = requires(T v, typename T::ColumnTypes row)
|
||||||
{
|
{
|
||||||
@@ -123,7 +85,7 @@ public:
|
|||||||
/// \return
|
/// \return
|
||||||
///
|
///
|
||||||
template <typename ...Args>
|
template <typename ...Args>
|
||||||
requires std::conjunction_v<std::is_convertible<Args, Args>...>
|
requires std::conjunction_v<std::is_convertible<Args, QVariant>...>
|
||||||
auto execute(const QString &sqlQuery, Args... args) -> QFuture<void> {
|
auto execute(const QString &sqlQuery, Args... args) -> QFuture<void> {
|
||||||
return db().execute(sqlQuery, args...);
|
return db().execute(sqlQuery, args...);
|
||||||
}
|
}
|
||||||
@@ -151,7 +113,7 @@ public:
|
|||||||
/// and a `static T fromSql(ColumnTypes tuple)` deserialization method.
|
/// and a `static T fromSql(ColumnTypes tuple)` deserialization method.
|
||||||
///
|
///
|
||||||
template <typename T, typename ...Args>
|
template <typename T, typename ...Args>
|
||||||
requires FromSql<T> && std::conjunction_v<std::is_convertible<Args, Args>...>
|
requires FromSql<T> && std::conjunction_v<std::is_convertible<Args, QVariant>...>
|
||||||
auto getResults(const QString &sqlQuery, Args... args) -> QFuture<std::vector<T>> {
|
auto getResults(const QString &sqlQuery, Args... args) -> QFuture<std::vector<T>> {
|
||||||
return db().getResults<T, Args...>(sqlQuery, args...);
|
return db().getResults<T, Args...>(sqlQuery, args...);
|
||||||
}
|
}
|
||||||
@@ -160,7 +122,7 @@ public:
|
|||||||
/// \brief Like getResults, but for retrieving just one row.
|
/// \brief Like getResults, but for retrieving just one row.
|
||||||
///
|
///
|
||||||
template <typename T, typename ...Args>
|
template <typename T, typename ...Args>
|
||||||
requires FromSql<T> && std::conjunction_v<std::is_convertible<Args, Args>...>
|
requires FromSql<T> && std::conjunction_v<std::is_convertible<Args, QVariant>...>
|
||||||
auto getResult(const QString &sqlQuery, Args... args) -> QFuture<std::optional<T>> {
|
auto getResult(const QString &sqlQuery, Args... args) -> QFuture<std::optional<T>> {
|
||||||
return db().getResult<T, Args...>(sqlQuery, args...);
|
return db().getResult<T, Args...>(sqlQuery, args...);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,6 +60,26 @@ void connectFuture(const QFuture<T> &future, QObjectDerivedType *self, const Fun
|
|||||||
using Row = std::vector<QVariant>;
|
using Row = std::vector<QVariant>;
|
||||||
using Rows = std::vector<Row>;
|
using Rows = std::vector<Row>;
|
||||||
|
|
||||||
|
template <typename RowTypesTuple>
|
||||||
|
auto parseRow(const Row &row) -> RowTypesTuple
|
||||||
|
{
|
||||||
|
auto tuple = RowTypesTuple();
|
||||||
|
int i = 0;
|
||||||
|
asyncdatabase_private::iterate_tuple(tuple, [&](auto &elem) {
|
||||||
|
elem = row.at(i).value<std::decay_t<decltype(elem)>>();
|
||||||
|
i++;
|
||||||
|
});
|
||||||
|
return tuple;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename RowTypesTuple>
|
||||||
|
auto parseRows(const Rows &rows) -> std::vector<RowTypesTuple> {
|
||||||
|
std::vector<RowTypesTuple> parsedRows;
|
||||||
|
parsedRows.reserve(rows.size());
|
||||||
|
std::ranges::transform(rows, std::back_inserter(parsedRows), parseRow<RowTypesTuple>);
|
||||||
|
return parsedRows;
|
||||||
|
}
|
||||||
|
|
||||||
void runDatabaseMigrations(QSqlDatabase &database, const QString &migrationDirectory);
|
void runDatabaseMigrations(QSqlDatabase &database, const QString &migrationDirectory);
|
||||||
|
|
||||||
void printSqlError(const QSqlQuery &query);
|
void printSqlError(const QSqlQuery &query);
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ Item {
|
|||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
color: Qt.rgba(25, 25, 30, 1)
|
color: Qt.rgba(25, 25, 30, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
Image {
|
Image {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
@@ -171,7 +171,7 @@ Item {
|
|||||||
height: 512
|
height: 512
|
||||||
}
|
}
|
||||||
|
|
||||||
fillMode: Image.PreserveAspectFit
|
fillMode: Image.PreserveAspectCrop
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ Item {
|
|||||||
Rectangle {
|
Rectangle {
|
||||||
id: miniProgressBar
|
id: miniProgressBar
|
||||||
z: 1
|
z: 1
|
||||||
visible: root.isWidescreen
|
visible: !root.isWidescreen
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
height: root.progressBarHeight
|
height: root.progressBarHeight
|
||||||
@@ -65,6 +65,8 @@ Item {
|
|||||||
Image {
|
Image {
|
||||||
id: mainIcon
|
id: mainIcon
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
|
visible: !loadingIndicator.visible
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
mipmap: true
|
mipmap: true
|
||||||
|
|
||||||
@@ -72,7 +74,15 @@ Item {
|
|||||||
|
|
||||||
sourceSize.width: 512
|
sourceSize.width: 512
|
||||||
sourceSize.height: 512
|
sourceSize.height: 512
|
||||||
fillMode: Image.PreserveAspectFit
|
fillMode: Image.PreserveAspectCrop
|
||||||
|
}
|
||||||
|
|
||||||
|
BusyIndicator {
|
||||||
|
id: loadingIndicator
|
||||||
|
anchors.centerIn: parent
|
||||||
|
visible: UserPlaylistModel.loading
|
||||||
|
Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
|
||||||
|
Kirigami.Theme.inherit: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user