Line |
Branch |
Exec |
Source |
1 |
|
|
// SPDX-FileCopyrightText: 2023 Carl Zeiss Microscopy GmbH |
2 |
|
|
// |
3 |
|
|
// SPDX-License-Identifier: MIT |
4 |
|
|
|
5 |
|
|
#pragma once |
6 |
|
|
|
7 |
|
|
#include <limits> |
8 |
|
|
#include <vector> |
9 |
|
|
#include <optional> |
10 |
|
|
#include <memory> |
11 |
|
|
#include <type_traits> |
12 |
|
|
#include <utility> |
13 |
|
|
#include <string> |
14 |
|
|
#include "IDocumentMetadata.h" |
15 |
|
|
#include "../db/IDbStatement.h" |
16 |
|
|
#include "document.h" |
17 |
|
|
|
18 |
|
|
class DocumentMetadataBase |
19 |
|
|
{ |
20 |
|
|
private: |
21 |
|
|
std::shared_ptr<Document> document_; |
22 |
|
|
protected: |
23 |
|
|
constexpr static char kPathDelimiter_ = '/'; |
24 |
|
|
public: |
25 |
|
|
DocumentMetadataBase() = delete; |
26 |
|
|
protected: |
27 |
|
172 |
explicit DocumentMetadataBase(std::shared_ptr<Document> document) : document_(std::move(document)) |
28 |
|
172 |
{} |
29 |
|
|
|
30 |
|
|
/// Values that are used for the field "TypeDiscriminator" in the database table. |
31 |
|
|
enum class DatabaseDataTypeValue : int |
32 |
|
|
{ |
33 |
|
|
invalid = std::numeric_limits< std::underlying_type_t<DatabaseDataTypeValue>>::max(), |
34 |
|
|
null = 0, |
35 |
|
|
int32 = 1, |
36 |
|
|
uint32 = 2, |
37 |
|
|
doublefloat = 3, |
38 |
|
|
singlefloat = 4, |
39 |
|
|
utf8string = 5, |
40 |
|
|
json = 6, |
41 |
|
|
}; |
42 |
|
|
|
43 |
|
|
//void BindAncestorId(const std::shared_ptr<IDbStatement>& database_statement, int binding_index, const std::optional<imgdoc2::dbIndex>& parent); |
44 |
|
|
int BindTypeDiscriminatorAndData(const std::shared_ptr<IDbStatement>& database_statement, int binding_index, DatabaseDataTypeValue type, const imgdoc2::IDocumentMetadata::metadata_item_variant& value); |
45 |
|
|
|
46 |
|
|
static DatabaseDataTypeValue DetermineDatabaseDataTypeValueOrThrow(imgdoc2::DocumentMetadataType type, const imgdoc2::IDocumentMetadata::metadata_item_variant& value); |
47 |
|
|
static DatabaseDataTypeValue DetermineDatabaseDataTypeValue(imgdoc2::DocumentMetadataType type, const imgdoc2::IDocumentMetadata::metadata_item_variant& value); |
48 |
|
|
|
49 |
|
|
/// Parse the path string, i.e. split it at the delimiter '/'. The number of parts is returned in |
50 |
|
|
/// 'count_of_parts_in_path' if it is not null. Then the database is queried, and we return a vector |
51 |
|
|
/// corresponding to the parts of the path. The vector contains the primary key for those nodes. If |
52 |
|
|
/// a part cannot be found, then the query stops at this point (and the vector returned contains less |
53 |
|
|
/// elements than the number of parts in the path). So, only if the complete path can be resolved, the |
54 |
|
|
/// size of the returned vector is equal to the number of parts in the path. |
55 |
|
|
/// |
56 |
|
|
/// \param path The path to be mapped. |
57 |
|
|
/// \param [in,out] count_of_parts_in_path If non-null, the parts as determined by the path string. |
58 |
|
|
/// |
59 |
|
|
/// \returns The primary keys of the nodes which could be mapped. |
60 |
|
|
std::vector<imgdoc2::dbIndex> GetNodeIdsForPath(const std::string& path, size_t* count_of_parts_in_path); |
61 |
|
|
|
62 |
|
|
std::vector<imgdoc2::dbIndex> GetNodeIdsForPathParts(const std::vector<std::string_view>& parts); |
63 |
|
|
|
64 |
|
|
bool TryMapPathAndGetTerminalNode(const std::string& path, std::optional<imgdoc2::dbIndex>* terminal_node_id); |
65 |
|
|
|
66 |
|
15230 |
[[nodiscard]] const std::shared_ptr<Document>& GetDocument() const { return this->document_; } |
67 |
|
|
|
68 |
|
|
/// Splits a the specified path (at the delimiter kPathDelimiter_) into its parts. |
69 |
|
|
/// If there is zero-length part, then an imgdoc2::invalid_path_exception is thrown. |
70 |
|
|
/// |
71 |
|
|
/// \param path The path to be split. |
72 |
|
|
/// |
73 |
|
|
/// \returns A vector containing the parts; |
74 |
|
|
static std::vector<std::string_view> SplitPath(const std::string_view& path); |
75 |
|
|
|
76 |
|
|
bool CheckIfItemExists(imgdoc2::dbIndex primary_key); |
77 |
|
|
private: |
78 |
|
|
std::shared_ptr<IDbStatement> CreateQueryForNodeIdsForPath(const std::vector<std::string_view>& path_parts); |
79 |
|
|
}; |
80 |
|
|
|