diff options
Diffstat (limited to 'src/libs')
-rw-r--r-- | src/libs/sqlite/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/libs/sqlite/sqlite-lib.pri | 2 | ||||
-rw-r--r-- | src/libs/sqlite/sqlitebasestatement.cpp | 12 | ||||
-rw-r--r-- | src/libs/sqlite/sqlitebasestatement.h | 7 | ||||
-rw-r--r-- | src/libs/sqlite/sqliteblob.h | 100 | ||||
-rw-r--r-- | src/libs/sqlite/sqlitesessionchangeset.cpp | 4 | ||||
-rw-r--r-- | src/libs/sqlite/sqlitesessionchangeset.h | 7 | ||||
-rw-r--r-- | src/libs/sqlite/sqlitesessions.cpp | 2 | ||||
-rw-r--r-- | src/libs/sqlite/sqlitetimestamp.h | 47 | ||||
-rw-r--r-- | src/libs/sqlite/sqlitevalue.h | 5 |
10 files changed, 169 insertions, 19 deletions
diff --git a/src/libs/sqlite/CMakeLists.txt b/src/libs/sqlite/CMakeLists.txt index 30e5edf12fc..f684fa0849f 100644 --- a/src/libs/sqlite/CMakeLists.txt +++ b/src/libs/sqlite/CMakeLists.txt @@ -44,4 +44,6 @@ add_qtc_library(Sqlite tableconstraints.h utf8string.cpp utf8string.h utf8stringvector.cpp utf8stringvector.h + sqliteblob.h + sqlitetimestamp.h ) diff --git a/src/libs/sqlite/sqlite-lib.pri b/src/libs/sqlite/sqlite-lib.pri index 8ded8ca1067..fd02c8801f0 100644 --- a/src/libs/sqlite/sqlite-lib.pri +++ b/src/libs/sqlite/sqlite-lib.pri @@ -27,6 +27,8 @@ SOURCES += \ $$PWD/sqlitebasestatement.cpp HEADERS += \ $$PWD/constraints.h \ + $$PWD/sqliteblob.h \ + $$PWD/sqlitetimestamp.h \ $$PWD/tableconstraints.h \ $$PWD/createtablesqlstatementbuilder.h \ $$PWD/lastchangedrowid.h \ diff --git a/src/libs/sqlite/sqlitebasestatement.cpp b/src/libs/sqlite/sqlitebasestatement.cpp index dc4dd465e7c..1bd7ef62a24 100644 --- a/src/libs/sqlite/sqlitebasestatement.cpp +++ b/src/libs/sqlite/sqlitebasestatement.cpp @@ -191,12 +191,12 @@ void BaseStatement::bind(int index, Utils::SmallStringView text) checkForBindingError(resultCode); } -void BaseStatement::bind(int index, Utils::span<const byte> bytes) +void BaseStatement::bind(int index, BlobView blobView) { int resultCode = sqlite3_bind_blob64(m_compiledStatement.get(), index, - bytes.data(), - static_cast<long long>(bytes.size()), + blobView.data(), + blobView.size(), SQLITE_STATIC); if (resultCode != SQLITE_OK) checkForBindingError(resultCode); @@ -498,7 +498,7 @@ StringType textForColumn(sqlite3_stmt *sqlStatment, int column) return StringType(text, size); } -Utils::span<const byte> blobForColumn(sqlite3_stmt *sqlStatment, int column) +BlobView blobForColumn(sqlite3_stmt *sqlStatment, int column) { const byte *blob = reinterpret_cast<const byte *>(sqlite3_column_blob(sqlStatment, column)); std::size_t size = std::size_t(sqlite3_column_bytes(sqlStatment, column)); @@ -506,7 +506,7 @@ Utils::span<const byte> blobForColumn(sqlite3_stmt *sqlStatment, int column) return {blob, size}; } -Utils::span<const byte> convertToBlobForColumn(sqlite3_stmt *sqlStatment, int column) +BlobView convertToBlobForColumn(sqlite3_stmt *sqlStatment, int column) { int dataType = sqlite3_column_type(sqlStatment, column); if (dataType == SQLITE_BLOB) @@ -571,7 +571,7 @@ double BaseStatement::fetchDoubleValue(int column) const return sqlite3_column_double(m_compiledStatement.get(), column); } -Utils::span<const byte> BaseStatement::fetchBlobValue(int column) const +BlobView BaseStatement::fetchBlobValue(int column) const { return convertToBlobForColumn(m_compiledStatement.get(), column); } diff --git a/src/libs/sqlite/sqlitebasestatement.h b/src/libs/sqlite/sqlitebasestatement.h index bae41665d5c..0b990f7d93b 100644 --- a/src/libs/sqlite/sqlitebasestatement.h +++ b/src/libs/sqlite/sqlitebasestatement.h @@ -27,6 +27,7 @@ #include "sqliteglobal.h" +#include "sqliteblob.h" #include "sqliteexception.h" #include "sqlitevalue.h" @@ -70,7 +71,7 @@ public: double fetchDoubleValue(int column) const; Utils::SmallStringView fetchSmallStringViewValue(int column) const; ValueView fetchValueView(int column) const; - Utils::span<const byte> fetchBlobValue(int column) const; + BlobView fetchBlobValue(int column) const; template<typename Type> Type fetchValue(int column) const; int columnCount() const; @@ -82,7 +83,7 @@ public: void bind(int index, void *pointer); void bind(int index, Utils::SmallStringView fetchValue); void bind(int index, const Value &fetchValue); - void bind(int index, Utils::span<const byte> bytes); + void bind(int index, BlobView blobView); void bind(int index, uint value) { bind(index, static_cast<long long>(value)); } @@ -358,7 +359,7 @@ private: operator long long() { return statement.fetchLongLongValue(column); } operator double() { return statement.fetchDoubleValue(column); } operator Utils::SmallStringView() { return statement.fetchSmallStringViewValue(column); } - operator Utils::span<const Sqlite::byte>() { return statement.fetchBlobValue(column); } + operator BlobView() { return statement.fetchBlobValue(column); } operator ValueView() { return statement.fetchValueView(column); } StatementImplementation &statement; diff --git a/src/libs/sqlite/sqliteblob.h b/src/libs/sqlite/sqliteblob.h new file mode 100644 index 00000000000..17d9426ad04 --- /dev/null +++ b/src/libs/sqlite/sqliteblob.h @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Copyright (C) 2020 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" + +#include <utils/span.h> + +#include <QByteArray> + +#include <algorithm> +#include <cstring> +#include <vector> + +namespace Sqlite { + +class BlobView +{ +public: + BlobView() = default; + + BlobView(const byte *data, std::size_t size) + : m_data(data) + , m_size(size) + {} + + BlobView(const QByteArray &byteArray) + : m_data(reinterpret_cast<const byte *>(byteArray.constData())) + , m_size(static_cast<std::size_t>(byteArray.size())) + {} + + BlobView(const std::vector<Sqlite::byte> &bytes) + : m_data(bytes.data()) + , m_size(static_cast<std::size_t>(bytes.size())) + {} + + const byte *data() const { return m_data; } + const char *cdata() const { return reinterpret_cast<const char *>(m_data); } + std::size_t size() const { return m_size; } + int sisize() const { return static_cast<int>(m_size); } + long long ssize() const { return static_cast<long long>(m_size); } + bool empty() const { return !m_size; } + + friend bool operator==(Sqlite::BlobView first, Sqlite::BlobView second) + { + return first.size() == second.size() + && std::memcmp(first.data(), second.data(), first.size()) == 0; + } + +private: + const byte *m_data{}; + std::size_t m_size{}; +}; + +class Blob +{ +public: + Blob(BlobView blobView) + { + bytes.reserve(blobView.size()); + std::copy_n(blobView.data(), blobView.size(), std::back_inserter(bytes)); + } + + std::vector<Sqlite::byte> bytes; +}; + +class ByteArrayBlob +{ +public: + ByteArrayBlob(BlobView blobView) + : byteArray{blobView.cdata(), blobView.sisize()} + {} + + QByteArray byteArray; +}; + +} // namespace Sqlite diff --git a/src/libs/sqlite/sqlitesessionchangeset.cpp b/src/libs/sqlite/sqlitesessionchangeset.cpp index 3aa43c625f0..430cbae222d 100644 --- a/src/libs/sqlite/sqlitesessionchangeset.cpp +++ b/src/libs/sqlite/sqlitesessionchangeset.cpp @@ -46,7 +46,7 @@ void checkResultCode(int resultCode) } // namespace -SessionChangeSet::SessionChangeSet(Utils::span<const byte> blob) +SessionChangeSet::SessionChangeSet(BlobView blob) : data(sqlite3_malloc64(blob.size())) , size(int(blob.size())) { @@ -64,7 +64,7 @@ SessionChangeSet::~SessionChangeSet() sqlite3_free(data); } -Utils::span<const byte> SessionChangeSet::asSpan() const +BlobView SessionChangeSet::asBlobView() const { return {static_cast<const byte *>(data), static_cast<std::size_t>(size)}; } diff --git a/src/libs/sqlite/sqlitesessionchangeset.h b/src/libs/sqlite/sqlitesessionchangeset.h index 65396622a92..8ea2dba0086 100644 --- a/src/libs/sqlite/sqlitesessionchangeset.h +++ b/src/libs/sqlite/sqlitesessionchangeset.h @@ -25,10 +25,9 @@ #pragma once +#include "sqliteblob.h" #include "sqliteglobal.h" -#include <utils/span.h> - #include <memory> #include <vector> @@ -41,7 +40,7 @@ class Sessions; class SessionChangeSet { public: - SessionChangeSet(Utils::span<const byte> blob); + SessionChangeSet(BlobView blob); SessionChangeSet(Sessions &session); ~SessionChangeSet(); SessionChangeSet(const SessionChangeSet &) = delete; @@ -54,7 +53,7 @@ public: } void operator=(SessionChangeSet &); - Utils::span<const byte> asSpan() const; + BlobView asBlobView() const; friend void swap(SessionChangeSet &first, SessionChangeSet &second) noexcept { diff --git a/src/libs/sqlite/sqlitesessions.cpp b/src/libs/sqlite/sqlitesessions.cpp index e377ef9b72d..69c0e1fe4b2 100644 --- a/src/libs/sqlite/sqlitesessions.cpp +++ b/src/libs/sqlite/sqlitesessions.cpp @@ -103,7 +103,7 @@ void Sessions::commit() if (session && !sqlite3session_isempty(session.get())) { SessionChangeSet changeSet{*this}; - insertSession.write(changeSet.asSpan()); + insertSession.write(changeSet.asBlobView()); } session.reset(); diff --git a/src/libs/sqlite/sqlitetimestamp.h b/src/libs/sqlite/sqlitetimestamp.h new file mode 100644 index 00000000000..f30d71fb299 --- /dev/null +++ b/src/libs/sqlite/sqlitetimestamp.h @@ -0,0 +1,47 @@ +/**************************************************************************** +** +** Copyright (C) 2020 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 + +namespace Sqlite { + +class TimeStamp +{ +public: + TimeStamp() = default; + TimeStamp(long long value) + : value(value) + {} + + friend bool operator==(TimeStamp first, TimeStamp second) + { + return first.value == second.value; + } + +public: + long long value = -1; +}; + +} // namespace Sqlite diff --git a/src/libs/sqlite/sqlitevalue.h b/src/libs/sqlite/sqlitevalue.h index 934db37642e..8ace8a7bf19 100644 --- a/src/libs/sqlite/sqlitevalue.h +++ b/src/libs/sqlite/sqlitevalue.h @@ -23,6 +23,8 @@ ** ****************************************************************************/ +#pragma once + #include "sqliteexception.h" #include <utils/smallstring.h> @@ -32,9 +34,6 @@ #include <cstddef> - -#pragma once - namespace Sqlite { enum class ValueType : unsigned char { Null, Integer, Float, String }; |