Fix build after merge

Change-Id: I424cb312d7ede82890d46cd9b09260babb11f62f
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Eike Ziller
2021-05-07 10:26:56 +02:00
parent bf5b1d714c
commit 448446bd7e
2 changed files with 190 additions and 26 deletions

View File

@@ -29,6 +29,7 @@
#include "sqliteblob.h" #include "sqliteblob.h"
#include "sqliteexception.h" #include "sqliteexception.h"
#include "sqlitetransaction.h"
#include "sqlitevalue.h" #include "sqlitevalue.h"
#include <utils/smallstringvector.h> #include <utils/smallstringvector.h>
@@ -37,6 +38,7 @@
#include <utils/span.h> #include <utils/span.h>
#include <cstdint> #include <cstdint>
#include <exception>
#include <functional> #include <functional>
#include <memory> #include <memory>
#include <tuple> #include <tuple>
@@ -91,6 +93,7 @@ public:
void bind(int index, Utils::span<const char *> values); void bind(int index, Utils::span<const char *> values);
void bind(int index, Utils::SmallStringView value); void bind(int index, Utils::SmallStringView value);
void bind(int index, const Value &value); void bind(int index, const Value &value);
void bind(int index, ValueView value);
void bind(int index, BlobView blobView); void bind(int index, BlobView blobView);
void bind(int index, uint value) { bind(index, static_cast<long long>(value)); } void bind(int index, uint value) { bind(index, static_cast<long long>(value)); }
@@ -162,13 +165,14 @@ extern template SQLITE_EXPORT Utils::PathString BaseStatement::fetchValue<Utils:
template<typename BaseStatement, int ResultCount> template<typename BaseStatement, int ResultCount>
class StatementImplementation : public BaseStatement class StatementImplementation : public BaseStatement
{ {
struct Resetter;
public: public:
using BaseStatement::BaseStatement; using BaseStatement::BaseStatement;
void execute() void execute()
{ {
Resetter resetter{*this}; Resetter resetter{this};
BaseStatement::next(); BaseStatement::next();
resetter.reset(); resetter.reset();
} }
@@ -185,7 +189,7 @@ public:
template<typename... ValueType> template<typename... ValueType>
void write(const ValueType&... values) void write(const ValueType&... values)
{ {
Resetter resetter{*this}; Resetter resetter{this};
bindValues(values...); bindValues(values...);
BaseStatement::next(); BaseStatement::next();
resetter.reset(); resetter.reset();
@@ -194,7 +198,7 @@ public:
template<typename ResultType> template<typename ResultType>
std::vector<ResultType> values(std::size_t reserveSize) std::vector<ResultType> values(std::size_t reserveSize)
{ {
Resetter resetter{*this}; Resetter resetter{this};
std::vector<ResultType> resultValues; std::vector<ResultType> resultValues;
resultValues.reserve(std::max(reserveSize, m_maximumResultCount)); resultValues.reserve(std::max(reserveSize, m_maximumResultCount));
@@ -211,7 +215,7 @@ public:
template<typename ResultType, typename... QueryTypes> template<typename ResultType, typename... QueryTypes>
auto values(std::size_t reserveSize, const QueryTypes &...queryValues) auto values(std::size_t reserveSize, const QueryTypes &...queryValues)
{ {
Resetter resetter{*this}; Resetter resetter{this};
std::vector<ResultType> resultValues; std::vector<ResultType> resultValues;
resultValues.reserve(std::max(reserveSize, m_maximumResultCount)); resultValues.reserve(std::max(reserveSize, m_maximumResultCount));
@@ -230,13 +234,13 @@ public:
template<typename ResultType, typename... QueryTypes> template<typename ResultType, typename... QueryTypes>
auto value(const QueryTypes &...queryValues) auto value(const QueryTypes &...queryValues)
{ {
Resetter resetter{*this}; Resetter resetter{this};
Utils::optional<ResultType> resultValue; Utils::optional<ResultType> resultValue;
bindValues(queryValues...); bindValues(queryValues...);
if (BaseStatement::next()) if (BaseStatement::next())
resultValue = assignValue<Utils::optional<ResultType>>(); resultValue = createOptionalValue<Utils::optional<ResultType>>();
resetter.reset(); resetter.reset();
@@ -258,7 +262,7 @@ public:
template<typename Callable, typename... QueryTypes> template<typename Callable, typename... QueryTypes>
void readCallback(Callable &&callable, const QueryTypes &...queryValues) void readCallback(Callable &&callable, const QueryTypes &...queryValues)
{ {
Resetter resetter{*this}; Resetter resetter{this};
bindValues(queryValues...); bindValues(queryValues...);
@@ -272,10 +276,10 @@ public:
resetter.reset(); resetter.reset();
} }
template<int ResultTypeCount = 1, typename Container, typename... QueryTypes> template<typename Container, typename... QueryTypes>
void readTo(Container &container, const QueryTypes &...queryValues) void readTo(Container &container, const QueryTypes &...queryValues)
{ {
Resetter resetter{*this}; Resetter resetter{this};
bindValues(queryValues...); bindValues(queryValues...);
@@ -285,39 +289,187 @@ public:
resetter.reset(); resetter.reset();
} }
template<typename ResultType, typename... QueryTypes>
auto range(const QueryTypes &...queryValues)
{
return SqliteResultRange<ResultType>{*this, queryValues...};
}
template<typename ResultType, typename... QueryTypes>
auto rangeWithTransaction(const QueryTypes &...queryValues)
{
return SqliteResultRangeWithTransaction<ResultType>{*this, queryValues...};
}
template<typename ResultType>
class BaseSqliteResultRange
{
public:
class SqliteResultIteratator
{
public:
using iterator_category = std::input_iterator_tag;
using difference_type = int;
using value_type = ResultType;
using pointer = ResultType *;
using reference = ResultType &;
SqliteResultIteratator(StatementImplementation &statement)
: m_statement{statement}
, m_hasNext{m_statement.next()}
{}
SqliteResultIteratator(StatementImplementation &statement, bool hasNext)
: m_statement{statement}
, m_hasNext{hasNext}
{}
SqliteResultIteratator &operator++()
{
m_hasNext = m_statement.next();
return *this;
}
void operator++(int) { m_hasNext = m_statement.next(); }
friend bool operator==(const SqliteResultIteratator &first,
const SqliteResultIteratator &second)
{
return first.m_hasNext == second.m_hasNext;
}
friend bool operator!=(const SqliteResultIteratator &first,
const SqliteResultIteratator &second)
{
return !(first == second);
}
value_type operator*() const { return m_statement.createValue<ResultType>(); }
private:
StatementImplementation &m_statement;
bool m_hasNext = false;
};
using value_type = ResultType;
using iterator = SqliteResultIteratator;
using const_iterator = iterator;
template<typename... QueryTypes>
BaseSqliteResultRange(StatementImplementation &statement, const QueryTypes &...queryValues)
: m_statement{statement}
{
statement.bindValues(queryValues...);
}
BaseSqliteResultRange(BaseSqliteResultRange &) = delete;
BaseSqliteResultRange &operator=(BaseSqliteResultRange &) = delete;
BaseSqliteResultRange(BaseSqliteResultRange &&other)
: m_statement{std::move(other.resetter)}
{}
BaseSqliteResultRange &operator=(BaseSqliteResultRange &&) = delete;
iterator begin() & { return iterator{m_statement}; }
iterator end() & { return iterator{m_statement, false}; }
const_iterator begin() const & { return iterator{m_statement}; }
const_iterator end() const & { return iterator{m_statement, false}; }
private:
StatementImplementation &m_statement;
};
template<typename ResultType>
class SqliteResultRange : public BaseSqliteResultRange<ResultType>
{
public:
template<typename... QueryTypes>
SqliteResultRange(StatementImplementation &statement, const QueryTypes &...queryValues)
: BaseSqliteResultRange<ResultType>{statement}
, resetter{&statement}
{
statement.bindValues(queryValues...);
}
~SqliteResultRange()
{
if (!std::uncaught_exceptions())
resetter.reset();
}
private:
Resetter resetter;
};
template<typename ResultType>
class SqliteResultRangeWithTransaction : public BaseSqliteResultRange<ResultType>
{
public:
template<typename... QueryTypes>
SqliteResultRangeWithTransaction(StatementImplementation &statement,
const QueryTypes &...queryValues)
: BaseSqliteResultRange<ResultType>{statement}
, m_transaction{statement.database()}
, resetter{&statement}
{
statement.bindValues(queryValues...);
}
~SqliteResultRangeWithTransaction()
{
if (!std::uncaught_exceptions()) {
resetter.reset();
m_transaction.commit();
}
}
private:
DeferredTransaction m_transaction;
Resetter resetter;
};
protected: protected:
~StatementImplementation() = default; ~StatementImplementation() = default;
private: private:
struct Resetter struct Resetter
{ {
Resetter(StatementImplementation &statement) Resetter(StatementImplementation *statement)
: statement(statement) : statement(statement)
{} {}
Resetter(Resetter &) = delete;
Resetter &operator=(Resetter &) = delete;
Resetter(Resetter &&other)
: statement{std::exchange(other.statement, nullptr)}
{}
void reset() void reset()
{ {
try { try {
statement.reset(); if (statement)
statement->reset();
} catch (...) { } catch (...) {
shouldReset = false; statement = nullptr;
throw; throw;
} }
shouldReset = false; statement = nullptr;
} }
~Resetter() noexcept ~Resetter() noexcept
{ {
try { try {
if (shouldReset) if (statement)
statement.reset(); statement->reset();
} catch (...) { } catch (...) {
} }
} }
StatementImplementation &statement; StatementImplementation *statement;
bool shouldReset = true;
}; };
struct ValueGetter struct ValueGetter
@@ -351,17 +503,28 @@ private:
emplaceBackValues(container, std::make_integer_sequence<int, ResultCount>{}); emplaceBackValues(container, std::make_integer_sequence<int, ResultCount>{});
} }
template <typename ResultOptionalType, template<typename ResultOptionalType, int... ColumnIndices>
int... ColumnIndices> ResultOptionalType createOptionalValue(std::integer_sequence<int, ColumnIndices...>)
ResultOptionalType assignValue(std::integer_sequence<int, ColumnIndices...>)
{ {
return ResultOptionalType(Utils::in_place, ValueGetter(*this, ColumnIndices)...); return ResultOptionalType(Utils::in_place, ValueGetter(*this, ColumnIndices)...);
} }
template<typename ResultOptionalType> template<typename ResultOptionalType>
ResultOptionalType assignValue() ResultOptionalType createOptionalValue()
{ {
return assignValue<ResultOptionalType>(std::make_integer_sequence<int, ResultCount>{}); return createOptionalValue<ResultOptionalType>(std::make_integer_sequence<int, ResultCount>{});
}
template<typename ResultType, int... ColumnIndices>
ResultType createValue(std::integer_sequence<int, ColumnIndices...>)
{
return ResultType{ValueGetter(*this, ColumnIndices)...};
}
template<typename ResultType>
ResultType createValue()
{
return createValue<ResultType>(std::make_integer_sequence<int, ResultCount>{});
} }
template<typename Callable, int... ColumnIndices> template<typename Callable, int... ColumnIndices>

View File

@@ -213,8 +213,7 @@ QmlDesignerPlugin::~QmlDesignerPlugin()
bool QmlDesignerPlugin::initialize(const QStringList & /*arguments*/, QString *errorMessage/* = 0*/) bool QmlDesignerPlugin::initialize(const QStringList & /*arguments*/, QString *errorMessage/* = 0*/)
{ {
Sqlite::LibraryInitializer::initialize(); Sqlite::LibraryInitializer::initialize();
QDir{}.mkpath(Core::ICore::cacheResourcePath().toString());
QDir{}.mkpath(Core::ICore::cacheResourcePath());
if (!Utils::HostOsInfo::canCreateOpenGLContext(errorMessage)) if (!Utils::HostOsInfo::canCreateOpenGLContext(errorMessage))
return false; return false;
@@ -222,8 +221,10 @@ bool QmlDesignerPlugin::initialize(const QStringList & /*arguments*/, QString *e
if (DesignerSettings::getValue(DesignerSettingsKey::STANDALONE_MODE).toBool()) if (DesignerSettings::getValue(DesignerSettingsKey::STANDALONE_MODE).toBool())
GenerateResource::generateMenuEntry(); GenerateResource::generateMenuEntry();
QString fontPath = Core::ICore::resourcePath() + const QString fontPath
QStringLiteral("/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/icons.ttf"); = Core::ICore::resourcePath(
"qmldesigner/propertyEditorQmlSources/imports/StudioTheme/icons.ttf")
.toString();
if (QFontDatabase::addApplicationFont(fontPath) < 0) if (QFontDatabase::addApplicationFont(fontPath) < 0)
qCWarning(qmldesignerLog) << "Could not add font " << fontPath << "to font database"; qCWarning(qmldesignerLog) << "Could not add font " << fontPath << "to font database";