192 lines
3.5 KiB
C++
192 lines
3.5 KiB
C++
#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;
|
|
|
|
}
|