diff --git a/pglablib/codebuilder/CodeBuilder.cpp b/pglablib/codebuilder/CodeBuilder.cpp index ac0527f..4d1e858 100644 --- a/pglablib/codebuilder/CodeBuilder.cpp +++ b/pglablib/codebuilder/CodeBuilder.cpp @@ -80,7 +80,7 @@ QString CodeBuilder::columnNameToVariableName(QString column_name) const return m_configuration->columnNameToFieldName(column_name); } -QString CodeBuilder::getTypeName(Oid dbtype) const +TypeMappingResult CodeBuilder::getTypeName(Oid dbtype) const { return m_configuration->getTypeName(dbtype); } @@ -97,10 +97,11 @@ void CodeBuilder::genFieldRetrieval(QTextStream &q, const ColumnDataList &column void CodeBuilder::genFieldDeclaration(QTextStream &q, const QString &format, const QString &field_name, Oid column_type) const { - QString type_name = getTypeName(column_type); + TypeMappingResult type_name = getTypeName(column_type); FormatToStream(q, format, [&] (QTextStream &out, QString var) { - if (var == "typename") out << type_name; + if (var == "typename") out << type_name.codeType(); else if (var == "varname") out << field_name; + else if (var == "dbtype") out << type_name.dbType(); }); } diff --git a/pglablib/codebuilder/CodeBuilder.h b/pglablib/codebuilder/CodeBuilder.h index 01694e7..9519e64 100644 --- a/pglablib/codebuilder/CodeBuilder.h +++ b/pglablib/codebuilder/CodeBuilder.h @@ -4,6 +4,7 @@ #include "Pgsql_declare.h" #include #include +#include "TypeMappings.h" class LanguageConfig; class QTextStream; @@ -33,7 +34,7 @@ public: // - Code for processing a single row // - Declaration of struct for holding single row result QString columnNameToVariableName(QString column_name) const; - QString getTypeName(Oid dbtype) const; + TypeMappingResult getTypeName(Oid dbtype) const; private: std::shared_ptr m_configuration; diff --git a/pglablib/codebuilder/DefaultConfigs.cpp b/pglablib/codebuilder/DefaultConfigs.cpp index 4806aec..9510c2e 100644 --- a/pglablib/codebuilder/DefaultConfigs.cpp +++ b/pglablib/codebuilder/DefaultConfigs.cpp @@ -18,11 +18,11 @@ std::shared_ptr GetPglabCppTypeMappings(std::shared_ptr; )__"; - t->m_fieldTemplate = "/%typename%/ /%varname%/;"; + t->m_fieldTemplate = "/%typename%/ /%varname%/; // /%dbtype%/"; //st_templ->m_fieldSeparator; return t; diff --git a/pglablib/codebuilder/LanguageConfig.cpp b/pglablib/codebuilder/LanguageConfig.cpp index 2fa4b74..6d18ba2 100644 --- a/pglablib/codebuilder/LanguageConfig.cpp +++ b/pglablib/codebuilder/LanguageConfig.cpp @@ -9,7 +9,7 @@ QString LanguageConfig::columnNameToFieldName(const QString& column_name) const return m_varNaming->transform(column_name); } -QString LanguageConfig::getTypeName(Oid dbtype) const +TypeMappingResult LanguageConfig::getTypeName(Oid dbtype) const { return m_typeMappings->getTypeForOid(dbtype); } diff --git a/pglablib/codebuilder/LanguageConfig.h b/pglablib/codebuilder/LanguageConfig.h index 8631a99..036d684 100644 --- a/pglablib/codebuilder/LanguageConfig.h +++ b/pglablib/codebuilder/LanguageConfig.h @@ -3,9 +3,9 @@ #include #include "Pgsql_oids.h" +#include "TypeMappings.h" class NameManglingRules; -class TypeMappings; class StructureTemplate; class IndentationConfig; class ResultLoopTemplate; @@ -17,7 +17,7 @@ public: LanguageConfig(); QString columnNameToFieldName(const QString& column_name) const; - QString getTypeName(Oid dbtype) const; + TypeMappingResult getTypeName(Oid dbtype) const; void setNameManglingRules(std::shared_ptr name_mangling_rules); std::shared_ptr typeMappings() const; diff --git a/pglablib/codebuilder/TypeMappings.cpp b/pglablib/codebuilder/TypeMappings.cpp index 44fc40a..f0c9c55 100644 --- a/pglablib/codebuilder/TypeMappings.cpp +++ b/pglablib/codebuilder/TypeMappings.cpp @@ -20,11 +20,17 @@ TypeMappings::TypeMappings(std::shared_ptr types, std::in m_typeMap.insert(mappings.begin(), mappings.end()); } -QString TypeMappings::getTypeForOid(Oid oid) const +TypeMappingResult TypeMappings::getTypeForOid(Oid oid) const { auto res = m_typeMap.find(oid); if (res != m_typeMap.end()) { - return res->second; + QString dbtypename; + if (m_types) { + PgType type = m_types->getByKey(oid); + dbtypename = type.name; + } + + return { res->second, dbtypename }; } if (m_types) { @@ -35,6 +41,7 @@ QString TypeMappings::getTypeForOid(Oid oid) const // for the language config. If that isn't right the end user should create a specific mapping for // that array type. res = m_typeMap.find(type.elem); + PgType elem_type = m_types->getByKey(type.elem); QString type_string; if (res == m_typeMap.end()) { type_string = m_defaultStringType; @@ -42,10 +49,17 @@ QString TypeMappings::getTypeForOid(Oid oid) const else { type_string = res->second; } - return QString(m_defaultContainerType).arg(type_string); + return { + QString(m_defaultContainerType).arg(type_string), + elem_type.name + "[]" + }; + } + else { + return { m_defaultStringType, type.name }; } } - return m_defaultStringType; + // We shouldn't get here unless m_types is empty + return { m_defaultStringType, QString() }; } void TypeMappings::setTypes(std::shared_ptr types) diff --git a/pglablib/codebuilder/TypeMappings.h b/pglablib/codebuilder/TypeMappings.h index e5de106..3ff556d 100644 --- a/pglablib/codebuilder/TypeMappings.h +++ b/pglablib/codebuilder/TypeMappings.h @@ -8,6 +8,20 @@ class PgTypeContainer; +class TypeMappingResult { +public: + TypeMappingResult(QString codetype, QString dbtype) + : m_codeType(codetype) + , m_dbType(dbtype) + {} + + const QString& codeType() const { return m_codeType; } + const QString& dbType() const { return m_dbType; } +private: + QString m_codeType; + QString m_dbType; +}; + class TypeMappings { public: using TypeMap = std::unordered_map; @@ -17,7 +31,7 @@ public: TypeMappings(std::shared_ptr types, std::initializer_list mappings); - QString getTypeForOid(Oid oid) const; + TypeMappingResult getTypeForOid(Oid oid) const; const TypeMap& typeMap() const { return m_typeMap; } diff --git a/tests/pglabtests/tst_TypeMappings.cpp b/tests/pglabtests/tst_TypeMappings.cpp index 4f7a372..083635a 100644 --- a/tests/pglabtests/tst_TypeMappings.cpp +++ b/tests/pglabtests/tst_TypeMappings.cpp @@ -36,20 +36,20 @@ protected: TEST_F(TypeMappingsTest, defStringType) { - QString result = tm.getTypeForOid(Pgsql::float4_oid); + QString result = tm.getTypeForOid(Pgsql::float4_oid).codeType(); ASSERT_EQ(result, def_str_type); } TEST_F(TypeMappingsTest, int4Type) { - QString result = tm.getTypeForOid(Pgsql::int4_oid); + QString result = tm.getTypeForOid(Pgsql::int4_oid).codeType(); ASSERT_EQ(result, int4str); } TEST_F(TypeMappingsTest, int4overideType) { tm.set(Pgsql::int4_oid, "QString"); - QString result = tm.getTypeForOid(Pgsql::int4_oid); + QString result = tm.getTypeForOid(Pgsql::int4_oid).codeType(); ASSERT_EQ(result, "QString"); } @@ -65,7 +65,7 @@ TEST_F(TypeMappingsTest, int4arrayType) tm.setTypes(types); - QString result = tm.getTypeForOid(Pgsql::int4_array_oid); + QString result = tm.getTypeForOid(Pgsql::int4_array_oid).codeType(); ASSERT_EQ(result, "std::vector"); }