GCC Code Coverage Report


Directory: libimgdoc2/
File: libimgdoc2/src/db/utilities.h
Date: 2025-02-03 12:41:04
Exec Total Coverage
Lines: 4 4 100.0%
Functions: 2 2 100.0%
Branches: 0 0 -%

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 <string>
8 #include <variant>
9 #include <cstdint>
10 #include <tuple>
11 #include <vector>
12 #include "IDimCoordinateQueryClause.h"
13 #include "ITIleInfoQueryClause.h"
14 #include "database_configuration.h"
15 #include "IDbConnection.h"
16 #include "IDbStatement.h"
17
18 class Utilities
19 {
20 public:
21 struct DataBindInfo
22 {
23 94 explicit DataBindInfo(int v) : value(v)
24 94 {}
25
26 explicit DataBindInfo(std::int64_t v) : value(v)
27 {}
28
29 98 explicit DataBindInfo(double v) : value(v)
30 98 {}
31
32 std::variant<int, std::int64_t, double> value;
33 };
34 public:
35 static std::tuple<std::string, std::vector<DataBindInfo>> CreateWhereStatement(const imgdoc2::IDimCoordinateQueryClause* dim_coordinate_query_clause, const imgdoc2::ITileInfoQueryClause* tileInfo_query_clause, const DatabaseConfiguration2D& database_configuration);
36 static std::tuple<std::string, std::vector<DataBindInfo>> CreateWhereStatement(const imgdoc2::IDimCoordinateQueryClause* dim_coordinate_query_clause, const imgdoc2::ITileInfoQueryClause* tileInfo_query_clause, const DatabaseConfiguration3D& database_configuration);
37
38 static std::tuple<std::string, std::vector<DataBindInfo>> CreateWhereConditionForDimQueryClause(const imgdoc2::IDimCoordinateQueryClause* clause, const std::function<void(imgdoc2::Dimension, std::string&)>& funcGetColumnNameForDimension);
39
40 static std::tuple<std::string, std::vector<DataBindInfo>> CreateWhereConditionForTileInfoQueryClause(const imgdoc2::ITileInfoQueryClause* clause, const std::string& column_name_pyramidlevel);
41
42 /// Attempts to read from the table with the specified name the value of the column 'value_common_name' from the row
43 /// where the value in 'key_column_name' is equal to 'key'. If successful, the string (from column 'value_common_name') is put
44 /// into 'output' (if 'output' is non-null) and true is returned. If the key is not found, the method returns false.
45 /// It is not checked whether there are multiple hits, in such case an arbitrary hit is returned.
46 /// Note that in case of a database-error, this method will throw an exception.
47 ///
48 /// \param [in] db_connection The database connection.
49 /// \param table_name Name of the table.
50 /// \param key_column_name Name of the key column.
51 /// \param value_column_name Name of the value column.
52 /// \param key The key to search for.
53 /// \param [out] output If non-null and successful, the result is put here.
54 ///
55 /// \returns True if it succeeds, false if it fails.
56 [[nodiscard]] static bool TryReadStringFromPropertyBag(IDbConnection* db_connection, const std::string& table_name, const std::string& key_column_name, const std::string& value_column_name, const std::string& key, std::string* output);
57
58 static void WriteStringIntoPropertyBag(IDbConnection* db_connection, const std::string& table_name, const std::string& key_column_name, const std::string& value_column_name, const std::string& key, const std::string& value);
59
60 static void DeleteItemFromPropertyBag(IDbConnection* db_connection, const std::string& table_name, const std::string& key_column_name, const std::string& value_column_name, const std::string& key);
61
62 /// <summary>
63 /// Creates a condition-clause for "does the tile intersect with the specified plane". The condition is constructed for
64 /// the tiles-info-table. Note that this condition does **not** leverage the spatial index (so - this clause is to be used
65 /// if there is no spatial-index available).
66 /// </summary>
67 /// <param name="plane"> The plane. </param>
68 /// <param name="database_configuration"> The database configuration. </param>
69 /// <returns> SQL-fragment containing the conditional clause, and the corresponding data-binding-values. </returns>
70 static std::tuple<std::string, std::vector<DataBindInfo>> CreateWhereConditionForIntersectingWithPlaneClause(const imgdoc2::Plane_NormalAndDistD& plane, const DatabaseConfiguration3D& database_configuration);
71
72 /// <summary>
73 /// Add the data from the specified 'data_bind_info'-list to the specified Db-statement, starting with the index given
74 /// with 'binding_index'. The method returns the index of the next free binding-index (or - it returns the binding-index
75 /// for the next parameter, in other words "binding-index + data_bind_info.size()").
76 /// </summary>
77 /// <param name="data_bind_info"> Information describing the data bind. </param>
78 /// <param name="db_statement"> [in] The database statement where the data is to be bound to. </param>
79 /// <param name="binding_index"> The index where to start the binding. </param>
80 /// <returns> The index for the next binding, or - the specified 'binding_index' incremented as many times as we bound data. </returns>
81 static int AddDataBindInfoListToDbStatement(const std::vector<DataBindInfo>& data_bind_info, IDbStatement* db_statement, int binding_index);
82 private:
83 static const char* ComparisonOperatorToString(imgdoc2::ComparisonOperation comparison_operator);
84 static const char* LogicalOperatorToString(imgdoc2::LogicalOperator logical_operator);
85
86 static bool ProcessRangeClause(const std::string& column_name_for_dimension, const imgdoc2::IDimCoordinateQueryClause::RangeClause& rangeClause, std::vector<Utilities::DataBindInfo>& databind_info, std::ostringstream& string_stream);
87
88 struct CreateWhereInfo
89 {
90 std::string dimension_column_prefix;
91 std::string column_name_pyramid_level;
92 };
93 static std::tuple<std::string, std::vector<DataBindInfo>> CreateWhereStatement(
94 const imgdoc2::IDimCoordinateQueryClause* dim_coordinate_query_clause,
95 const imgdoc2::ITileInfoQueryClause* tileInfo_query_clause,
96 const CreateWhereInfo& create_where_info);
97 };
98
99