forked from qt-creator/qt-creator
Revert "Revert "Merge remote-tracking branch 'origin/4.15'""
This reverts commit f0a86d4510.
Reverting a merge doesn't "undo" it - the changes would be lost
forever even with subsequent merges.
So we need to revert the revert to get the changes.
Change-Id: I65928f876f4dc886561bed17c4b2aa42b388c1e3
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
@@ -1,16 +1,7 @@
|
||||
add_qtc_library(Sqlite
|
||||
PUBLIC_DEFINES
|
||||
BUILD_SQLITE_LIBRARY
|
||||
SQLITE_THREADSAFE=2 SQLITE_ENABLE_FTS5 SQLITE_ENABLE_UNLOCK_NOTIFY
|
||||
SQLITE_ENABLE_JSON1 SQLITE_DEFAULT_FOREIGN_KEYS=1 SQLITE_TEMP_STORE=2
|
||||
SQLITE_DEFAULT_WAL_SYNCHRONOUS=1 SQLITE_MAX_WORKER_THREADS SQLITE_DEFAULT_MEMSTATUS=0
|
||||
SQLITE_OMIT_DEPRECATED SQLITE_OMIT_DECLTYPE
|
||||
SQLITE_MAX_EXPR_DEPTH=0 SQLITE_OMIT_SHARED_CACHE SQLITE_USE_ALLOCA
|
||||
SQLITE_ENABLE_MEMORY_MANAGEMENT SQLITE_ENABLE_NULL_TRIM SQLITE_OMIT_EXPLAIN
|
||||
SQLITE_OMIT_LOAD_EXTENSION SQLITE_OMIT_UTF16 SQLITE_DQS=0
|
||||
SQLITE_ENABLE_STAT4 HAVE_ISNAN HAVE_FDATASYNC HAVE_MALLOC_USABLE_SIZE
|
||||
SQLITE_DEFAULT_MMAP_SIZE=268435456 SQLITE_CORE SQLITE_ENABLE_SESSION SQLITE_ENABLE_PREUPDATE_HOOK
|
||||
SQLITE_LIKE_DOESNT_MATCH_BLOBS
|
||||
SQLITE_CORE
|
||||
DEPENDS Qt5::Core Threads::Threads ${CMAKE_DL_LIBS}
|
||||
PUBLIC_INCLUDES
|
||||
"${CMAKE_CURRENT_LIST_DIR}"
|
||||
@@ -19,6 +10,8 @@ add_qtc_library(Sqlite
|
||||
../3rdparty/sqlite/sqlite3.c
|
||||
../3rdparty/sqlite/sqlite3.h
|
||||
../3rdparty/sqlite/carray.c
|
||||
../3rdparty/sqlite/config.h
|
||||
../3rdparty/sqlite/sqlite.h
|
||||
constraints.h
|
||||
createtablesqlstatementbuilder.cpp createtablesqlstatementbuilder.h
|
||||
lastchangedrowid.h
|
||||
@@ -46,4 +39,13 @@ add_qtc_library(Sqlite
|
||||
utf8stringvector.cpp utf8stringvector.h
|
||||
sqliteblob.h
|
||||
sqlitetimestamp.h
|
||||
sqlitelibraryinitializer.cpp sqlitelibraryinitializer.h
|
||||
)
|
||||
|
||||
extend_qtc_library(Sqlite DEFINES _HAVE_SQLITE_CONFIG_H)
|
||||
|
||||
if (APPLE)
|
||||
extend_qtc_library(Sqlite DEFINES _BSD_SOURCE)
|
||||
elseif (UNIX)
|
||||
extend_qtc_library(Sqlite DEFINES _POSIX_C_SOURCE=200809L _GNU_SOURCE _DEFAULT_SOURCE)
|
||||
endif()
|
||||
|
||||
@@ -248,7 +248,9 @@ void CreateTableSqlStatementBuilder::bindColumnDefinitionsAndTableConstraints()
|
||||
columnDefinitionStrings.reserve(m_columns.size());
|
||||
|
||||
for (const Column &column : m_columns) {
|
||||
Utils::SmallString columnDefinitionString = {column.name, " ", column.typeString()};
|
||||
Utils::SmallString columnDefinitionString = {column.name,
|
||||
SqlStatementBuilder::columnTypeToString(
|
||||
column.type)};
|
||||
|
||||
ContraintsVisiter visiter{columnDefinitionString};
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ SOURCES += \
|
||||
$$PWD/sqlitedatabasebackend.cpp \
|
||||
$$PWD/sqliteexception.cpp \
|
||||
$$PWD/sqliteglobal.cpp \
|
||||
$$PWD/sqlitelibraryinitializer.cpp \
|
||||
$$PWD/sqlitesessionchangeset.cpp \
|
||||
$$PWD/sqlitesessions.cpp \
|
||||
$$PWD/sqlstatementbuilder.cpp \
|
||||
@@ -25,6 +26,7 @@ SOURCES += \
|
||||
HEADERS += \
|
||||
$$PWD/constraints.h \
|
||||
$$PWD/sqliteblob.h \
|
||||
$$PWD/sqlitelibraryinitializer.h \
|
||||
$$PWD/sqlitetimestamp.h \
|
||||
$$PWD/tableconstraints.h \
|
||||
$$PWD/createtablesqlstatementbuilder.h \
|
||||
@@ -50,16 +52,7 @@ HEADERS += \
|
||||
$$PWD/sqliteindex.h \
|
||||
$$PWD/sqlitebasestatement.h
|
||||
|
||||
DEFINES += SQLITE_THREADSAFE=2 SQLITE_ENABLE_FTS5 SQLITE_ENABLE_UNLOCK_NOTIFY \
|
||||
SQLITE_ENABLE_JSON1 SQLITE_DEFAULT_FOREIGN_KEYS=1 SQLITE_TEMP_STORE=2 \
|
||||
SQLITE_DEFAULT_WAL_SYNCHRONOUS=1 SQLITE_MAX_WORKER_THREADS SQLITE_DEFAULT_MEMSTATUS=0 \
|
||||
SQLITE_OMIT_DEPRECATED SQLITE_OMIT_DECLTYPE \
|
||||
SQLITE_MAX_EXPR_DEPTH=0 SQLITE_OMIT_SHARED_CACHE SQLITE_USE_ALLOCA \
|
||||
SQLITE_ENABLE_MEMORY_MANAGEMENT SQLITE_ENABLE_NULL_TRIM SQLITE_OMIT_EXPLAIN \
|
||||
SQLITE_OMIT_LOAD_EXTENSION SQLITE_OMIT_UTF16 SQLITE_DQS=0 \
|
||||
SQLITE_ENABLE_STAT4 HAVE_ISNAN HAVE_FDATASYNC HAVE_MALLOC_USABLE_SIZE \
|
||||
SQLITE_DEFAULT_MMAP_SIZE=268435456 SQLITE_CORE SQLITE_ENABLE_SESSION SQLITE_ENABLE_PREUPDATE_HOOK \
|
||||
SQLITE_LIKE_DOESNT_MATCH_BLOBS
|
||||
DEFINES += _HAVE_SQLITE_CONFIG_H SQLITE_CORE
|
||||
|
||||
CONFIG(debug, debug|release): DEFINES += SQLITE_ENABLE_API_ARMOR
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
#include "sqlitedatabasebackend.h"
|
||||
#include "sqliteexception.h"
|
||||
|
||||
#include "sqlite3.h"
|
||||
#include "sqlite.h"
|
||||
|
||||
#include <condition_variable>
|
||||
#include <mutex>
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
|
||||
#include "sqliteblob.h"
|
||||
#include "sqliteexception.h"
|
||||
#include "sqlitetransaction.h"
|
||||
#include "sqlitevalue.h"
|
||||
|
||||
#include <utils/smallstringvector.h>
|
||||
@@ -38,7 +37,6 @@
|
||||
#include <utils/span.h>
|
||||
|
||||
#include <cstdint>
|
||||
#include <exception>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <tuple>
|
||||
@@ -93,7 +91,6 @@ public:
|
||||
void bind(int index, Utils::span<const char *> values);
|
||||
void bind(int index, Utils::SmallStringView value);
|
||||
void bind(int index, const Value &value);
|
||||
void bind(int index, ValueView value);
|
||||
void bind(int index, BlobView blobView);
|
||||
|
||||
void bind(int index, uint value) { bind(index, static_cast<long long>(value)); }
|
||||
@@ -165,14 +162,13 @@ extern template SQLITE_EXPORT Utils::PathString BaseStatement::fetchValue<Utils:
|
||||
template<typename BaseStatement, int ResultCount>
|
||||
class StatementImplementation : public BaseStatement
|
||||
{
|
||||
struct Resetter;
|
||||
|
||||
public:
|
||||
using BaseStatement::BaseStatement;
|
||||
|
||||
void execute()
|
||||
{
|
||||
Resetter resetter{this};
|
||||
Resetter resetter{*this};
|
||||
BaseStatement::next();
|
||||
resetter.reset();
|
||||
}
|
||||
@@ -182,14 +178,15 @@ public:
|
||||
template<typename... ValueType>
|
||||
void bindValues(const ValueType&... values)
|
||||
{
|
||||
bindValuesByIndex(1, values...);
|
||||
int index = 0;
|
||||
(BaseStatement::bind(++index, values), ...);
|
||||
}
|
||||
|
||||
template<typename... ValueType>
|
||||
void write(const ValueType&... values)
|
||||
{
|
||||
Resetter resetter{this};
|
||||
bindValuesByIndex(1, values...);
|
||||
Resetter resetter{*this};
|
||||
bindValues(values...);
|
||||
BaseStatement::next();
|
||||
resetter.reset();
|
||||
}
|
||||
@@ -197,7 +194,7 @@ public:
|
||||
template<typename ResultType>
|
||||
std::vector<ResultType> values(std::size_t reserveSize)
|
||||
{
|
||||
Resetter resetter{this};
|
||||
Resetter resetter{*this};
|
||||
std::vector<ResultType> resultValues;
|
||||
resultValues.reserve(std::max(reserveSize, m_maximumResultCount));
|
||||
|
||||
@@ -214,7 +211,7 @@ public:
|
||||
template<typename ResultType, typename... QueryTypes>
|
||||
auto values(std::size_t reserveSize, const QueryTypes &...queryValues)
|
||||
{
|
||||
Resetter resetter{this};
|
||||
Resetter resetter{*this};
|
||||
std::vector<ResultType> resultValues;
|
||||
resultValues.reserve(std::max(reserveSize, m_maximumResultCount));
|
||||
|
||||
@@ -233,13 +230,13 @@ public:
|
||||
template<typename ResultType, typename... QueryTypes>
|
||||
auto value(const QueryTypes &...queryValues)
|
||||
{
|
||||
Resetter resetter{this};
|
||||
Resetter resetter{*this};
|
||||
Utils::optional<ResultType> resultValue;
|
||||
|
||||
bindValues(queryValues...);
|
||||
|
||||
if (BaseStatement::next())
|
||||
resultValue = createOptionalValue<Utils::optional<ResultType>>();
|
||||
resultValue = assignValue<Utils::optional<ResultType>>();
|
||||
|
||||
resetter.reset();
|
||||
|
||||
@@ -261,7 +258,7 @@ public:
|
||||
template<typename Callable, typename... QueryTypes>
|
||||
void readCallback(Callable &&callable, const QueryTypes &...queryValues)
|
||||
{
|
||||
Resetter resetter{this};
|
||||
Resetter resetter{*this};
|
||||
|
||||
bindValues(queryValues...);
|
||||
|
||||
@@ -275,10 +272,10 @@ public:
|
||||
resetter.reset();
|
||||
}
|
||||
|
||||
template<typename Container, typename... QueryTypes>
|
||||
template<int ResultTypeCount = 1, typename Container, typename... QueryTypes>
|
||||
void readTo(Container &container, const QueryTypes &...queryValues)
|
||||
{
|
||||
Resetter resetter{this};
|
||||
Resetter resetter{*this};
|
||||
|
||||
bindValues(queryValues...);
|
||||
|
||||
@@ -288,187 +285,39 @@ public:
|
||||
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:
|
||||
~StatementImplementation() = default;
|
||||
|
||||
private:
|
||||
struct Resetter
|
||||
{
|
||||
Resetter(StatementImplementation *statement)
|
||||
Resetter(StatementImplementation &statement)
|
||||
: statement(statement)
|
||||
{}
|
||||
|
||||
Resetter(Resetter &) = delete;
|
||||
Resetter &operator=(Resetter &) = delete;
|
||||
|
||||
Resetter(Resetter &&other)
|
||||
: statement{std::exchange(other.statement, nullptr)}
|
||||
{}
|
||||
|
||||
void reset()
|
||||
{
|
||||
try {
|
||||
if (statement)
|
||||
statement->reset();
|
||||
statement.reset();
|
||||
} catch (...) {
|
||||
statement = nullptr;
|
||||
shouldReset = false;
|
||||
throw;
|
||||
}
|
||||
|
||||
statement = nullptr;
|
||||
shouldReset = false;
|
||||
}
|
||||
|
||||
~Resetter() noexcept
|
||||
{
|
||||
try {
|
||||
if (statement)
|
||||
statement->reset();
|
||||
if (shouldReset)
|
||||
statement.reset();
|
||||
} catch (...) {
|
||||
}
|
||||
}
|
||||
|
||||
StatementImplementation *statement;
|
||||
StatementImplementation &statement;
|
||||
bool shouldReset = true;
|
||||
};
|
||||
|
||||
struct ValueGetter
|
||||
@@ -490,11 +339,6 @@ private:
|
||||
int column;
|
||||
};
|
||||
|
||||
constexpr int resultCount(int localResultCount) const
|
||||
{
|
||||
return ResultCount < 0 ? localResultCount : ResultCount;
|
||||
}
|
||||
|
||||
template<typename ContainerType, int... ColumnIndices>
|
||||
void emplaceBackValues(ContainerType &container, std::integer_sequence<int, ColumnIndices...>)
|
||||
{
|
||||
@@ -507,28 +351,17 @@ private:
|
||||
emplaceBackValues(container, std::make_integer_sequence<int, ResultCount>{});
|
||||
}
|
||||
|
||||
template<typename ResultOptionalType, int... ColumnIndices>
|
||||
ResultOptionalType createOptionalValue(std::integer_sequence<int, ColumnIndices...>)
|
||||
template <typename ResultOptionalType,
|
||||
int... ColumnIndices>
|
||||
ResultOptionalType assignValue(std::integer_sequence<int, ColumnIndices...>)
|
||||
{
|
||||
return ResultOptionalType(Utils::in_place, ValueGetter(*this, ColumnIndices)...);
|
||||
}
|
||||
|
||||
template<typename ResultOptionalType>
|
||||
ResultOptionalType createOptionalValue()
|
||||
ResultOptionalType assignValue()
|
||||
{
|
||||
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>{});
|
||||
return assignValue<ResultOptionalType>(std::make_integer_sequence<int, ResultCount>{});
|
||||
}
|
||||
|
||||
template<typename Callable, int... ColumnIndices>
|
||||
@@ -543,19 +376,6 @@ private:
|
||||
return callCallable(callable, std::make_integer_sequence<int, ResultCount>{});
|
||||
}
|
||||
|
||||
template<typename ValueType>
|
||||
void bindValuesByIndex(int index, const ValueType &value)
|
||||
{
|
||||
BaseStatement::bind(index, value);
|
||||
}
|
||||
|
||||
template<typename ValueType, typename... ValueTypes>
|
||||
void bindValuesByIndex(int index, const ValueType &value, const ValueTypes &...values)
|
||||
{
|
||||
BaseStatement::bind(index, value);
|
||||
bindValuesByIndex(index + 1, values...);
|
||||
}
|
||||
|
||||
void setMaximumResultCount(std::size_t count)
|
||||
{
|
||||
m_maximumResultCount = std::max(m_maximumResultCount, count);
|
||||
|
||||
@@ -39,7 +39,7 @@ public:
|
||||
|
||||
Column(Utils::SmallStringView tableName,
|
||||
Utils::SmallStringView name,
|
||||
ColumnType type,
|
||||
ColumnType type = ColumnType::None,
|
||||
Constraints &&constraints = {})
|
||||
: constraints(std::move(constraints))
|
||||
, name(name)
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
#include <QThread>
|
||||
#include <QDebug>
|
||||
|
||||
#include "sqlite3.h"
|
||||
#include "sqlite.h"
|
||||
|
||||
#include <chrono>
|
||||
#include <thread>
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
namespace Sqlite {
|
||||
|
||||
enum class ColumnType : char { Numeric, Integer, Real, Text, Blob, None };
|
||||
enum class ColumnType : char { None, Numeric, Integer, Real, Text, Blob };
|
||||
|
||||
enum class ConstraintType : char { NoConstraint, PrimaryKey, Unique, ForeignKey };
|
||||
|
||||
|
||||
47
src/libs/sqlite/sqlitelibraryinitializer.cpp
Normal file
47
src/libs/sqlite/sqlitelibraryinitializer.cpp
Normal file
@@ -0,0 +1,47 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2021 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of Qt Creator.
|
||||
**
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "sqlitelibraryinitializer.h"
|
||||
|
||||
#include "sqlitedatabasebackend.h"
|
||||
|
||||
namespace Sqlite {
|
||||
|
||||
void LibraryInitializer::initialize()
|
||||
{
|
||||
static LibraryInitializer initializer;
|
||||
}
|
||||
|
||||
LibraryInitializer::LibraryInitializer()
|
||||
{
|
||||
DatabaseBackend::initializeSqliteLibrary();
|
||||
}
|
||||
|
||||
LibraryInitializer::~LibraryInitializer()
|
||||
{
|
||||
DatabaseBackend::shutdownSqliteLibrary();
|
||||
}
|
||||
|
||||
} // namespace Sqlite
|
||||
42
src/libs/sqlite/sqlitelibraryinitializer.h
Normal file
42
src/libs/sqlite/sqlitelibraryinitializer.h
Normal file
@@ -0,0 +1,42 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2021 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of Qt Creator.
|
||||
**
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "sqliteglobal.h"
|
||||
|
||||
namespace Sqlite {
|
||||
|
||||
class LibraryInitializer
|
||||
{
|
||||
public:
|
||||
SQLITE_EXPORT static void initialize();
|
||||
|
||||
private:
|
||||
LibraryInitializer();
|
||||
~LibraryInitializer();
|
||||
};
|
||||
|
||||
} // namespace Sqlite
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
#include <utils/smallstringio.h>
|
||||
|
||||
#include <sqlite3ext.h>
|
||||
#include <sqlite.h>
|
||||
|
||||
namespace Sqlite {
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
#include "sqlitesessionchangeset.h"
|
||||
#include "sqlitetable.h"
|
||||
|
||||
#include <sqlite3ext.h>
|
||||
#include <sqlite.h>
|
||||
|
||||
#include <memory>
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ public:
|
||||
}
|
||||
|
||||
Column &addColumn(Utils::SmallStringView name,
|
||||
ColumnType type = ColumnType::Numeric,
|
||||
ColumnType type = ColumnType::None,
|
||||
Constraints &&constraints = {})
|
||||
{
|
||||
m_sqliteColumns.emplace_back(m_tableName, name, type, std::move(constraints));
|
||||
|
||||
@@ -179,12 +179,18 @@ bool SqlStatementBuilder::isBuild() const
|
||||
Utils::SmallString SqlStatementBuilder::columnTypeToString(ColumnType columnType)
|
||||
{
|
||||
switch (columnType) {
|
||||
case ColumnType::Numeric: return "NUMERIC";
|
||||
case ColumnType::Integer: return "INTEGER";
|
||||
case ColumnType::Real: return "REAL";
|
||||
case ColumnType::Text: return "TEXT";
|
||||
case ColumnType::Blob: return "BLOB";
|
||||
case ColumnType::None: return {};
|
||||
case ColumnType::Numeric:
|
||||
return " NUMERIC";
|
||||
case ColumnType::Integer:
|
||||
return " INTEGER";
|
||||
case ColumnType::Real:
|
||||
return " REAL";
|
||||
case ColumnType::Text:
|
||||
return " TEXT";
|
||||
case ColumnType::Blob:
|
||||
return " BLOB";
|
||||
case ColumnType::None:
|
||||
return {};
|
||||
}
|
||||
|
||||
Q_UNREACHABLE();
|
||||
|
||||
Reference in New Issue
Block a user