From c324daa75b902981d12cc3c8f58148323d53f18e Mon Sep 17 00:00:00 2001 From: eelke Date: Tue, 19 Dec 2017 19:33:22 +0100 Subject: [PATCH] The global function for getting a typename from an oid now supports passing the typmod of a column. This is used by the list of columns for a table. Works for char, varchar, text and numeric. --- pglab/ColumnTableModel.cpp | 2 +- pglab/PgDatabaseCatalog.cpp | 27 ++++++++++++++++++++++++--- pglab/PgDatabaseCatalog.h | 2 +- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/pglab/ColumnTableModel.cpp b/pglab/ColumnTableModel.cpp index d198542..20bcfe1 100644 --- a/pglab/ColumnTableModel.cpp +++ b/pglab/ColumnTableModel.cpp @@ -133,7 +133,7 @@ QVariant ColumnTableModel::getData(const QModelIndex &index) const s = t.name; break; case TypeCol: - s = getTypeDisplayString(*m_catalog, t.typid); + s = getTypeDisplayString(*m_catalog, t.typid, t.typmod); break; case NullCol: s = QString::fromStdU16String(t.notnull ? u"\u2713" : u""); diff --git a/pglab/PgDatabaseCatalog.cpp b/pglab/PgDatabaseCatalog.cpp index d640b96..10f0375 100644 --- a/pglab/PgDatabaseCatalog.cpp +++ b/pglab/PgDatabaseCatalog.cpp @@ -8,7 +8,9 @@ #include "PgNamespaceContainer.h" #include "PgTypeContainer.h" #include "Pgsql_Connection.h" +#include "Pgsql_oids.h" +using namespace Pgsql; QString getRoleNameFromOid(const PgDatabaseCatalog &cat, Oid oid) { @@ -53,18 +55,37 @@ QString getTablespaceDisplayString(const PgDatabaseCatalog &cat, Oid oid) return QString("ts %1").arg(oid); } -QString getTypeDisplayString(const PgDatabaseCatalog &cat, Oid oid) +QString getTypeDisplayString(const PgDatabaseCatalog &cat, Oid oid, int32_t typmod) { auto tc = cat.types(); auto t = tc->getByKey(oid); QString s; if (t.category == TypCategory::Array) { - auto et = tc->getByKey(t.elem); - s = et.name; +// auto et = tc->getByKey(t.elem); +// s = et.name; + s = getTypeDisplayString(cat, t.elem, typmod); s += "[]"; } else { s = t.name; + switch (oid) { + case varchar_oid: + case char_oid: + case text_oid: + if (typmod > 4) + s += QString::asprintf("(%d)", typmod-4); + break; + case numeric_oid: + if (typmod > 4) { + int prec = (typmod - 4) / 65536; + int scale = (typmod - 4) % 65536; + if (scale > 0) + s += QString::asprintf("(%d,%d)", prec, scale); + else + s += QString::asprintf("(%d)", prec); + } + break; + } } return s; } diff --git a/pglab/PgDatabaseCatalog.h b/pglab/PgDatabaseCatalog.h index ae745a5..1c93cd0 100644 --- a/pglab/PgDatabaseCatalog.h +++ b/pglab/PgDatabaseCatalog.h @@ -67,7 +67,7 @@ QString getRoleNameFromOid(const PgDatabaseCatalog &cat, Oid oid); QString getRoleDisplayString(const PgDatabaseCatalog &cat, Oid oid); QString getNamespaceDisplayString(const PgDatabaseCatalog &cat, Oid oid); QString getTablespaceDisplayString(const PgDatabaseCatalog &cat, Oid oid); -QString getTypeDisplayString(const PgDatabaseCatalog &cat, Oid oid); +QString getTypeDisplayString(const PgDatabaseCatalog &cat, Oid oid, int32_t typmod = -1); #endif // PGSQLDATABASECATALOGUE_H