diff --git a/pglab/PgIndex.cpp b/pglab/PgIndex.cpp new file mode 100644 index 0000000..e9d6531 --- /dev/null +++ b/pglab/PgIndex.cpp @@ -0,0 +1,6 @@ +#include "PgIndex.h" + +PgIndex::PgIndex() +{ + +} diff --git a/pglab/PgIndex.h b/pglab/PgIndex.h new file mode 100644 index 0000000..487f36f --- /dev/null +++ b/pglab/PgIndex.h @@ -0,0 +1,34 @@ +#ifndef PGINDEX_H +#define PGINDEX_H + +#include "Pgsql_declare.h" +#include +#include + +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 indkey; + std::vector indcollation; + std::vector indclass; + std::vector indoption; + QString indexprs; + QString indpred; + + PgIndex(); +}; + +#endif // PGINDEX_H diff --git a/pglab/pglab.pro b/pglab/pglab.pro index f3a4dcc..837103a 100644 --- a/pglab/pglab.pro +++ b/pglab/pglab.pro @@ -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 \ diff --git a/pglablib/pglablib.pro b/pglablib/pglablib.pro index e6249fb..b95943f 100644 --- a/pglablib/pglablib.pro +++ b/pglablib/pglablib.pro @@ -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 diff --git a/pgsql/Pgsql_oids.cpp b/pgsql/Pgsql_oids.cpp new file mode 100644 index 0000000..6f6f9b2 --- /dev/null +++ b/pgsql/Pgsql_oids.cpp @@ -0,0 +1,192 @@ +#include "Pgsql_oids.h" +#include +#include +#include + +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 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 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; + +} diff --git a/pgsql/Pgsql_oids.h b/pgsql/Pgsql_oids.h new file mode 100644 index 0000000..4367683 --- /dev/null +++ b/pgsql/Pgsql_oids.h @@ -0,0 +1,146 @@ +#ifndef PGSQL_OIDS_H +#define PGSQL_OIDS_H + +#include + +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 diff --git a/pgsql/pgsql.pro b/pgsql/pgsql.pro index a8d563c..6030e66 100644 --- a/pgsql/pgsql.pro +++ b/pgsql/pgsql.pro @@ -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 += diff --git a/tests/PgsqlTests/tst_Pgsql_oids.cpp b/tests/PgsqlTests/tst_Pgsql_oids.cpp new file mode 100644 index 0000000..40f8572 --- /dev/null +++ b/tests/PgsqlTests/tst_Pgsql_oids.cpp @@ -0,0 +1,20 @@ +#include +#include +#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); +} +