pgLab/pgsql/Pgsql_oids.cpp

193 lines
3.5 KiB
C++
Raw Normal View History

2017-12-16 21:43:51 +01:00
#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;
}