This commit is contained in:
eelke 2017-12-16 21:43:51 +01:00
parent 8f1ba8130c
commit 1fe7d3c56d
8 changed files with 410 additions and 4 deletions

6
pglab/PgIndex.cpp Normal file
View file

@ -0,0 +1,6 @@
#include "PgIndex.h"
PgIndex::PgIndex()
{
}

34
pglab/PgIndex.h Normal file
View file

@ -0,0 +1,34 @@
#ifndef PGINDEX_H
#define PGINDEX_H
#include "Pgsql_declare.h"
#include <QString>
#include <vector>
class PgIndex {
public:
Oid indexrelid;
Oid indrelid;
int16_t indnatts;
bool indisunique;
bool indisprimary;
bool indisexclusion;
bool indimmediate;
bool indisclustered;
bool indisvalid;
bool indcheckxmin;
bool indisready;
bool indislive;
bool indisreplident;
std::vector<int16_t> indkey;
std::vector<Oid> indcollation;
std::vector<Oid> indclass;
std::vector<int16_t> indoption;
QString indexprs;
QString indpred;
PgIndex();
};
#endif // PGINDEX_H

View file

@ -9,6 +9,8 @@ QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets sql
QMAKE_CXXFLAGS += /std:c++17
TARGET = pglab
TEMPLATE = app
@ -76,7 +78,8 @@ SOURCES += main.cpp\
ColumnTableModel.cpp \
PgAttribute.cpp \
PgContainer.cpp \
PgAttributeContainer.cpp
PgAttributeContainer.cpp \
PgIndex.cpp
HEADERS += \
QueryResultModel.h \
@ -126,7 +129,8 @@ HEADERS += \
PgNamespaceContainer.h \
ColumnTableModel.h \
PgAttribute.h \
PgAttributeContainer.h
PgAttributeContainer.h \
PgIndex.h
FORMS += mainwindow.ui \
DatabaseWindow.ui \

View file

@ -10,6 +10,8 @@ TARGET = pglablib
TEMPLATE = lib
CONFIG += staticlib
QMAKE_CXXFLAGS += /std:c++17
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the

192
pgsql/Pgsql_oids.cpp Normal file
View file

@ -0,0 +1,192 @@
#include "Pgsql_oids.h"
#include <stdexcept>
#include <algorithm>
#include <vector>
namespace {
/*
SELECT
'constexpr Oid ' || t1.typname || '_oid = ' || t1.oid::varchar || ';',
'constexpr Oid ' || t1.typname || '_array_oid = ' || t2.oid::text || ';',
' { ' || t1.oid::text || ', ' || t2.oid::text || ' },'
FROM pg_type t1
JOIN pg_type t2 ON (t1.typarray=t2.oid)
WHERE t1.typtype IN ('b', 'e', 'r') AND t1.typcategory <> 'A'
ORDER BY t1.oid
*/
struct ElemArray {
Oid elem;
Oid array;
};
std::vector<ElemArray> g_ElemToArray = {
{ 16, 1000 },
{ 17, 1001 },
{ 18, 1002 },
{ 19, 1003 },
{ 20, 1016 },
{ 21, 1005 },
{ 23, 1007 },
{ 24, 1008 },
{ 25, 1009 },
{ 26, 1028 },
{ 27, 1010 },
{ 28, 1011 },
{ 29, 1012 },
{ 114, 199 },
{ 142, 143 },
{ 600, 1017 },
{ 601, 1018 },
{ 602, 1019 },
{ 603, 1020 },
{ 604, 1027 },
{ 628, 629 },
{ 650, 651 },
{ 700, 1021 },
{ 701, 1022 },
{ 702, 1023 },
{ 703, 1024 },
{ 704, 1025 },
{ 718, 719 },
{ 790, 791 },
{ 829, 1040 },
{ 869, 1041 },
{ 1033, 1034 },
{ 1042, 1014 },
{ 1043, 1015 },
{ 1082, 1182 },
{ 1083, 1183 },
{ 1114, 1115 },
{ 1184, 1185 },
{ 1186, 1187 },
{ 1266, 1270 },
{ 1560, 1561 },
{ 1562, 1563 },
{ 1700, 1231 },
{ 1790, 2201 },
{ 2202, 2207 },
{ 2203, 2208 },
{ 2204, 2209 },
{ 2205, 2210 },
{ 2206, 2211 },
{ 2950, 2951 },
{ 2970, 2949 },
{ 3220, 3221 },
{ 3614, 3643 },
{ 3615, 3645 },
{ 3642, 3644 },
{ 3734, 3735 },
{ 3769, 3770 },
{ 3802, 3807 },
{ 3904, 3905 },
{ 3906, 3907 },
{ 3908, 3909 },
{ 3910, 3911 },
{ 3912, 3913 },
{ 3926, 3927 },
{ 4089, 4090 },
{ 4096, 4097 }
};
std::vector<ElemArray> g_ArrayToElem = {
{ 142, 143 },
{ 114, 199 },
{ 628, 629 },
{ 650, 651 },
{ 718, 719 },
{ 790, 791 },
{ 16, 1000 },
{ 17, 1001 },
{ 18, 1002 },
{ 19, 1003 },
{ 21, 1005 },
{ 23, 1007 },
{ 24, 1008 },
{ 25, 1009 },
{ 27, 1010 },
{ 28, 1011 },
{ 29, 1012 },
{ 1042, 1014 },
{ 1043, 1015 },
{ 20, 1016 },
{ 600, 1017 },
{ 601, 1018 },
{ 602, 1019 },
{ 603, 1020 },
{ 700, 1021 },
{ 701, 1022 },
{ 702, 1023 },
{ 703, 1024 },
{ 704, 1025 },
{ 604, 1027 },
{ 26, 1028 },
{ 1033, 1034 },
{ 829, 1040 },
{ 869, 1041 },
{ 1114, 1115 },
{ 1082, 1182 },
{ 1083, 1183 },
{ 1184, 1185 },
{ 1186, 1187 },
{ 1700, 1231 },
{ 1266, 1270 },
{ 1560, 1561 },
{ 1562, 1563 },
{ 1790, 2201 },
{ 2202, 2207 },
{ 2203, 2208 },
{ 2204, 2209 },
{ 2205, 2210 },
{ 2206, 2211 },
{ 2970, 2949 },
{ 2950, 2951 },
{ 3220, 3221 },
{ 3614, 3643 },
{ 3642, 3644 },
{ 3615, 3645 },
{ 3734, 3735 },
{ 3769, 3770 },
{ 3802, 3807 },
{ 3904, 3905 },
{ 3906, 3907 },
{ 3908, 3909 },
{ 3910, 3911 },
{ 3912, 3913 },
{ 3926, 3927 },
{ 4089, 4090 },
{ 4096, 4097 }
};
}
Oid Pgsql::ElemOidFromArrayOid(Oid oid)
{
auto iter = std::lower_bound(g_ArrayToElem.begin(), g_ArrayToElem.end(),
ElemArray{oid, oid},
[] (auto l, auto r) -> bool
{
return l.array < r.array;
});
if (iter == g_ArrayToElem.end())
throw std::runtime_error("ElemOidFromArrayOid Oid not found");
return iter->elem;
}
Oid Pgsql::ArrayOidFromElemOid(Oid oid)
{
auto iter = std::lower_bound(g_ElemToArray.begin(), g_ElemToArray.end(),
ElemArray{oid, oid},
[] (auto l, auto r) -> bool
{
return l.elem < r.elem;
});
if (iter == g_ElemToArray.end())
throw std::runtime_error("ElemOidFromArrayOid Oid not found");
return iter->array;
}

146
pgsql/Pgsql_oids.h Normal file
View file

@ -0,0 +1,146 @@
#ifndef PGSQL_OIDS_H
#define PGSQL_OIDS_H
#include <libpq-fe.h>
namespace Pgsql {
constexpr Oid bool_oid = 16;
constexpr Oid bytea_oid = 17;
constexpr Oid char_oid = 18;
constexpr Oid name_oid = 19;
constexpr Oid int8_oid = 20;
constexpr Oid int2_oid = 21;
constexpr Oid int4_oid = 23;
constexpr Oid regproc_oid = 24;
constexpr Oid text_oid = 25;
constexpr Oid oid_oid = 26;
constexpr Oid tid_oid = 27;
constexpr Oid xid_oid = 28;
constexpr Oid cid_oid = 29;
constexpr Oid json_oid = 114;
constexpr Oid xml_oid = 142;
constexpr Oid point_oid = 600;
constexpr Oid lseg_oid = 601;
constexpr Oid path_oid = 602;
constexpr Oid box_oid = 603;
constexpr Oid polygon_oid = 604;
constexpr Oid line_oid = 628;
constexpr Oid cidr_oid = 650;
constexpr Oid float4_oid = 700;
constexpr Oid float8_oid = 701;
constexpr Oid abstime_oid = 702;
constexpr Oid reltime_oid = 703;
constexpr Oid tinterval_oid = 704;
constexpr Oid circle_oid = 718;
constexpr Oid money_oid = 790;
constexpr Oid macaddr_oid = 829;
constexpr Oid inet_oid = 869;
constexpr Oid aclitem_oid = 1033;
constexpr Oid bpchar_oid = 1042;
constexpr Oid varchar_oid = 1043;
constexpr Oid date_oid = 1082;
constexpr Oid time_oid = 1083;
constexpr Oid timestamp_oid = 1114;
constexpr Oid timestamptz_oid = 1184;
constexpr Oid interval_oid = 1186;
constexpr Oid timetz_oid = 1266;
constexpr Oid bit_oid = 1560;
constexpr Oid varbit_oid = 1562;
constexpr Oid numeric_oid = 1700;
constexpr Oid refcursor_oid = 1790;
constexpr Oid regprocedure_oid = 2202;
constexpr Oid regoper_oid = 2203;
constexpr Oid regoperator_oid = 2204;
constexpr Oid regclass_oid = 2205;
constexpr Oid regtype_oid = 2206;
constexpr Oid uuid_oid = 2950;
constexpr Oid txid_snapshot_oid = 2970;
constexpr Oid pg_lsn_oid = 3220;
constexpr Oid tsvector_oid = 3614;
constexpr Oid tsquery_oid = 3615;
constexpr Oid gtsvector_oid = 3642;
constexpr Oid regconfig_oid = 3734;
constexpr Oid regdictionary_oid = 3769;
constexpr Oid jsonb_oid = 3802;
constexpr Oid int4range_oid = 3904;
constexpr Oid numrange_oid = 3906;
constexpr Oid tsrange_oid = 3908;
constexpr Oid tstzrange_oid = 3910;
constexpr Oid daterange_oid = 3912;
constexpr Oid int8range_oid = 3926;
constexpr Oid regnamespace_oid = 4089;
constexpr Oid regrole_oid = 4096;
constexpr Oid bool_array_oid = 1000;
constexpr Oid bytea_array_oid = 1001;
constexpr Oid char_array_oid = 1002;
constexpr Oid name_array_oid = 1003;
constexpr Oid int8_array_oid = 1016;
constexpr Oid int2_array_oid = 1005;
constexpr Oid int4_array_oid = 1007;
constexpr Oid regproc_array_oid = 1008;
constexpr Oid text_array_oid = 1009;
constexpr Oid oid_array_oid = 1028;
constexpr Oid tid_array_oid = 1010;
constexpr Oid xid_array_oid = 1011;
constexpr Oid cid_array_oid = 1012;
constexpr Oid json_array_oid = 199;
constexpr Oid xml_array_oid = 143;
constexpr Oid point_array_oid = 1017;
constexpr Oid lseg_array_oid = 1018;
constexpr Oid path_array_oid = 1019;
constexpr Oid box_array_oid = 1020;
constexpr Oid polygon_array_oid = 1027;
constexpr Oid line_array_oid = 629;
constexpr Oid cidr_array_oid = 651;
constexpr Oid float4_array_oid = 1021;
constexpr Oid float8_array_oid = 1022;
constexpr Oid abstime_array_oid = 1023;
constexpr Oid reltime_array_oid = 1024;
constexpr Oid tinterval_array_oid = 1025;
constexpr Oid circle_array_oid = 719;
constexpr Oid money_array_oid = 791;
constexpr Oid macaddr_array_oid = 1040;
constexpr Oid inet_array_oid = 1041;
constexpr Oid aclitem_array_oid = 1034;
constexpr Oid bpchar_array_oid = 1014;
constexpr Oid varchar_array_oid = 1015;
constexpr Oid date_array_oid = 1182;
constexpr Oid time_array_oid = 1183;
constexpr Oid timestamp_array_oid = 1115;
constexpr Oid timestamptz_array_oid = 1185;
constexpr Oid interval_array_oid = 1187;
constexpr Oid timetz_array_oid = 1270;
constexpr Oid bit_array_oid = 1561;
constexpr Oid varbit_array_oid = 1563;
constexpr Oid numeric_array_oid = 1231;
constexpr Oid refcursor_array_oid = 2201;
constexpr Oid regprocedure_array_oid = 2207;
constexpr Oid regoper_array_oid = 2208;
constexpr Oid regoperator_array_oid = 2209;
constexpr Oid regclass_array_oid = 2210;
constexpr Oid regtype_array_oid = 2211;
constexpr Oid uuid_array_oid = 2951;
constexpr Oid txid_snapshot_array_oid = 2949;
constexpr Oid pg_lsn_array_oid = 3221;
constexpr Oid tsvector_array_oid = 3643;
constexpr Oid tsquery_array_oid = 3645;
constexpr Oid gtsvector_array_oid = 3644;
constexpr Oid regconfig_array_oid = 3735;
constexpr Oid regdictionary_array_oid = 3770;
constexpr Oid jsonb_array_oid = 3807;
constexpr Oid int4range_array_oid = 3905;
constexpr Oid numrange_array_oid = 3907;
constexpr Oid tsrange_array_oid = 3909;
constexpr Oid tstzrange_array_oid = 3911;
constexpr Oid daterange_array_oid = 3913;
constexpr Oid int8range_array_oid = 3927;
constexpr Oid regnamespace_array_oid = 4090;
constexpr Oid regrole_array_oid = 4097;
Oid ElemOidFromArrayOid(Oid oid);
Oid ArrayOidFromElemOid(Oid oid);
} // end of namespace Pgsql
#endif // PGSQL_OIDS_H

View file

@ -38,7 +38,8 @@ SOURCES += Pgsql_Connection.cpp \
Pgsql_Row.cpp \
Pgsql_Value.cpp \
Pgsql_Col.cpp \
ArrayParser.cpp
ArrayParser.cpp \
Pgsql_oids.cpp
HEADERS += Pgsql_Connection.h \
Pgsql_Params.h \
@ -47,7 +48,8 @@ HEADERS += Pgsql_Connection.h \
Pgsql_Value.h \
Pgsql_declare.h \
Pgsql_Col.h \
ArrayParser.h
ArrayParser.h \
Pgsql_oids.h
#FORMS +=

View file

@ -0,0 +1,20 @@
#include <gtest/gtest.h>
#include <gmock/gmock-matchers.h>
#include "Pgsql_oids.h"
#include "PrintTo_Qt.h"
using namespace testing;
using namespace Pgsql;
TEST(Pgsql_Oids, ElemOidFromArrayOid)
{
Oid elem = ElemOidFromArrayOid(varchar_array_oid);
ASSERT_EQ(elem, varchar_oid);
}
TEST(Pgsql_Oids, ArrayOidFromElemOid)
{
Oid elem = ArrayOidFromElemOid(timestamptz_oid);
ASSERT_EQ(elem, timestamptz_array_oid);
}