You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
3.9 KiB
173 lines
3.9 KiB
/******************************************************************************
|
|
* Project: OGR_SCHEMA open options handling
|
|
* Purpose: Class for representing a layer schema override.
|
|
* Author: Alessandro Pasotti, elpaso@itopen.it
|
|
*
|
|
******************************************************************************
|
|
* Copyright (c) 2024, Alessandro Pasotti <elpaso at itopen dot it>
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
****************************************************************************/
|
|
|
|
#ifndef OGR_SCHEMA_OVERRIDE_H_INCLUDED
|
|
#define OGR_SCHEMA_OVERRIDE_H_INCLUDED
|
|
|
|
//! @cond Doxygen_Suppress
|
|
|
|
#include <string>
|
|
#include <map>
|
|
#include <optional>
|
|
#include <ogr_api.h>
|
|
#include <ogr_feature.h>
|
|
#include <cpl_vsi.h>
|
|
#include <cpl_json.h>
|
|
|
|
/** Class that holds the schema override options for a single field */
|
|
class CPL_DLL OGRFieldDefnOverride
|
|
{
|
|
public:
|
|
OGRFieldDefnOverride()
|
|
: m_osName(), m_eType(), m_eSubType(), m_nWidth(), m_nPrecision()
|
|
{
|
|
}
|
|
|
|
void SetFieldName(const std::string &osName)
|
|
{
|
|
m_osName = osName;
|
|
}
|
|
|
|
void SetFieldType(OGRFieldType eType)
|
|
{
|
|
m_eType = eType;
|
|
}
|
|
|
|
void SetFieldSubType(OGRFieldSubType eSubType)
|
|
{
|
|
m_eSubType = eSubType;
|
|
}
|
|
|
|
void SetFieldWidth(int nWidth)
|
|
{
|
|
m_nWidth = nWidth;
|
|
}
|
|
|
|
void SetFieldPrecision(int nPrecision)
|
|
{
|
|
m_nPrecision = nPrecision;
|
|
}
|
|
|
|
std::optional<std::string> GetFieldName() const
|
|
{
|
|
return m_osName;
|
|
}
|
|
|
|
std::optional<OGRFieldType> GetFieldType() const
|
|
{
|
|
return m_eType;
|
|
}
|
|
|
|
std::optional<OGRFieldSubType> GetFieldSubType() const
|
|
{
|
|
return m_eSubType;
|
|
}
|
|
|
|
std::optional<int> GetFieldWidth() const
|
|
{
|
|
return m_nWidth;
|
|
}
|
|
|
|
std::optional<int> GetFieldPrecision() const
|
|
{
|
|
return m_nPrecision;
|
|
}
|
|
|
|
// Considered valid if it carries any change information, otherwise it's considered a no-op
|
|
bool IsValid() const;
|
|
|
|
private:
|
|
std::optional<std::string> m_osName;
|
|
std::optional<OGRFieldType> m_eType;
|
|
std::optional<OGRFieldSubType> m_eSubType;
|
|
std::optional<int> m_nWidth;
|
|
std::optional<int> m_nPrecision;
|
|
};
|
|
|
|
/** Class that holds the schema override options for a single layer */
|
|
class CPL_DLL OGRLayerSchemaOverride
|
|
{
|
|
public:
|
|
OGRLayerSchemaOverride() : m_osLayerName(), m_moFieldOverrides()
|
|
{
|
|
}
|
|
|
|
void SetLayerName(const std::string &osLayerName)
|
|
{
|
|
m_osLayerName = osLayerName;
|
|
}
|
|
|
|
void AddFieldOverride(const std::string &osFieldName,
|
|
const OGRFieldDefnOverride &oFieldOverride)
|
|
{
|
|
m_moFieldOverrides[osFieldName] = oFieldOverride;
|
|
}
|
|
|
|
const std::string &GetLayerName() const
|
|
{
|
|
return m_osLayerName;
|
|
}
|
|
|
|
const std::map<std::string, OGRFieldDefnOverride> &GetFieldOverrides() const
|
|
{
|
|
return m_moFieldOverrides;
|
|
}
|
|
|
|
bool IsFullOverride() const
|
|
{
|
|
return m_bIsFullOverride;
|
|
}
|
|
|
|
void SetFullOverride(bool bIsFullOverride)
|
|
{
|
|
m_bIsFullOverride = bIsFullOverride;
|
|
}
|
|
|
|
bool IsValid() const;
|
|
|
|
private:
|
|
std::string m_osLayerName;
|
|
std::map<std::string, OGRFieldDefnOverride> m_moFieldOverrides;
|
|
bool m_bIsFullOverride = false;
|
|
};
|
|
|
|
/** Class that holds the schema override options for a datasource */
|
|
class CPL_DLL OGRSchemaOverride
|
|
{
|
|
public:
|
|
OGRSchemaOverride() : m_moLayerOverrides()
|
|
{
|
|
}
|
|
|
|
void AddLayerOverride(const std::string &osLayerName,
|
|
const OGRLayerSchemaOverride &oLayerOverride)
|
|
{
|
|
m_moLayerOverrides[osLayerName] = oLayerOverride;
|
|
}
|
|
|
|
bool LoadFromJSON(const std::string &osJSON);
|
|
|
|
const std::map<std::string, OGRLayerSchemaOverride> &
|
|
GetLayerOverrides() const
|
|
{
|
|
return m_moLayerOverrides;
|
|
}
|
|
|
|
bool IsValid() const;
|
|
|
|
private:
|
|
std::map<std::string, OGRLayerSchemaOverride> m_moLayerOverrides;
|
|
};
|
|
|
|
//! @endcond
|
|
|
|
#endif /* ndef OGR_FEATURE_H_INCLUDED */
|