Coverage Report

Created: 2025-06-22 06:59

/src/gdal/ogr/ogr_schema_override.h
Line
Count
Source (jump to first uncovered line)
1
/******************************************************************************
2
 * Project:  OGR_SCHEMA open options handling
3
 * Purpose:  Class for representing a layer schema override.
4
 * Author:   Alessandro Pasotti, elpaso@itopen.it
5
 *
6
 ******************************************************************************
7
 * Copyright (c) 2024, Alessandro Pasotti <elpaso at itopen dot it>
8
 *
9
 * SPDX-License-Identifier: MIT
10
 ****************************************************************************/
11
12
#ifndef OGR_SCHEMA_OVERRIDE_H_INCLUDED
13
#define OGR_SCHEMA_OVERRIDE_H_INCLUDED
14
15
//! @cond Doxygen_Suppress
16
17
#include <string>
18
#include <map>
19
#include <optional>
20
#include <ogr_api.h>
21
#include <ogr_feature.h>
22
#include <cpl_vsi.h>
23
#include <cpl_json.h>
24
25
/** Class that holds the schema override options for a single field */
26
class CPL_DLL OGRFieldDefnOverride
27
{
28
  public:
29
    OGRFieldDefnOverride()
30
0
        : m_osName(), m_eType(), m_eSubType(), m_nWidth(), m_nPrecision()
31
0
    {
32
0
    }
33
34
    void SetFieldName(const std::string &osName)
35
0
    {
36
0
        m_osName = osName;
37
0
    }
38
39
    void SetFieldType(OGRFieldType eType)
40
0
    {
41
0
        m_eType = eType;
42
0
    }
43
44
    void SetFieldSubType(OGRFieldSubType eSubType)
45
0
    {
46
0
        m_eSubType = eSubType;
47
0
    }
48
49
    void SetFieldWidth(int nWidth)
50
0
    {
51
0
        m_nWidth = nWidth;
52
0
    }
53
54
    void SetFieldPrecision(int nPrecision)
55
0
    {
56
0
        m_nPrecision = nPrecision;
57
0
    }
58
59
    std::optional<std::string> GetFieldName() const
60
0
    {
61
0
        return m_osName;
62
0
    }
63
64
    std::optional<OGRFieldType> GetFieldType() const
65
0
    {
66
0
        return m_eType;
67
0
    }
68
69
    std::optional<OGRFieldSubType> GetFieldSubType() const
70
0
    {
71
0
        return m_eSubType;
72
0
    }
73
74
    std::optional<int> GetFieldWidth() const
75
0
    {
76
0
        return m_nWidth;
77
0
    }
78
79
    std::optional<int> GetFieldPrecision() const
80
0
    {
81
0
        return m_nPrecision;
82
0
    }
83
84
    // Considered valid if it carries any change information, otherwise it's considered a no-op
85
    bool IsValid() const;
86
87
  private:
88
    std::optional<std::string> m_osName;
89
    std::optional<OGRFieldType> m_eType;
90
    std::optional<OGRFieldSubType> m_eSubType;
91
    std::optional<int> m_nWidth;
92
    std::optional<int> m_nPrecision;
93
};
94
95
/** Class that holds the schema override options for a single layer */
96
class CPL_DLL OGRLayerSchemaOverride
97
{
98
  public:
99
0
    OGRLayerSchemaOverride() : m_osLayerName(), m_moFieldOverrides()
100
0
    {
101
0
    }
102
103
    void SetLayerName(const std::string &osLayerName)
104
0
    {
105
0
        m_osLayerName = osLayerName;
106
0
    }
107
108
    void AddFieldOverride(const std::string &osFieldName,
109
                          const OGRFieldDefnOverride &oFieldOverride)
110
0
    {
111
0
        m_moFieldOverrides[osFieldName] = oFieldOverride;
112
0
    }
113
114
    const std::string &GetLayerName() const
115
0
    {
116
0
        return m_osLayerName;
117
0
    }
118
119
    const std::map<std::string, OGRFieldDefnOverride> &GetFieldOverrides() const
120
0
    {
121
0
        return m_moFieldOverrides;
122
0
    }
123
124
    bool IsFullOverride() const
125
0
    {
126
0
        return m_bIsFullOverride;
127
0
    }
128
129
    void SetFullOverride(bool bIsFullOverride)
130
0
    {
131
0
        m_bIsFullOverride = bIsFullOverride;
132
0
    }
133
134
    bool IsValid() const;
135
136
  private:
137
    std::string m_osLayerName;
138
    std::map<std::string, OGRFieldDefnOverride> m_moFieldOverrides;
139
    bool m_bIsFullOverride = false;
140
};
141
142
/** Class that holds the schema override options for a datasource */
143
class CPL_DLL OGRSchemaOverride
144
{
145
  public:
146
0
    OGRSchemaOverride() : m_moLayerOverrides()
147
0
    {
148
0
    }
149
150
    void AddLayerOverride(const std::string &osLayerName,
151
                          const OGRLayerSchemaOverride &oLayerOverride)
152
0
    {
153
0
        m_moLayerOverrides[osLayerName] = oLayerOverride;
154
0
    }
155
156
    bool LoadFromJSON(const std::string &osJSON);
157
158
    const std::map<std::string, OGRLayerSchemaOverride> &
159
    GetLayerOverrides() const
160
0
    {
161
0
        return m_moLayerOverrides;
162
0
    }
163
164
    bool IsValid() const;
165
166
  private:
167
    std::map<std::string, OGRLayerSchemaOverride> m_moLayerOverrides;
168
};
169
170
//! @endcond
171
172
#endif /* ndef OGR_FEATURE_H_INCLUDED */