Autocomplite, server status, publications

Добавлен контроль прав доступа на select для таблиц и представления
при ипользовании автодополнения.
Добавлен контроль доступа при пролучении информации о подписках.
Добалена совместимость с более ранними версиями при получении информации
о публикациях.
При получении логов в окне "Статус сервера" добавлена проверка наличия прав на используемые функции при получении файлы логов.
Мелкие правки при работе с автодополнениями в окне запросов.
This commit is contained in:
levinsv 2025-08-18 15:53:25 +05:00
parent f43f341ffd
commit a77fcfcd5a
6 changed files with 207 additions and 111 deletions

View file

@ -189,7 +189,8 @@ pgObject *pgPublicationFactory::CreateObjects(pgCollection *collection, ctlTree
{
wxString sql;
pgPublication *publication = 0;
sql=R"(with rel as (
if (collection->GetDatabase()->BackendMinimumVersion(15, 0)) {
sql = R"(with rel as (
SELECT pr.prpubid,quote_ident(n.nspname)|| '.'||quote_ident(c.relname) fulltable, pg_get_expr(pr.prqual, c.oid) rowfilter, (CASE WHEN pr.prattrs IS NOT NULL THEN
pg_catalog.array_to_string( ARRAY(SELECT attname
FROM
@ -207,6 +208,27 @@ p.pubviaroot,pt.rowfilter,pt.cols,pn.slist from pg_publication p
LEFT JOIN rel pt ON pt.prpubid = p.oid
LEFT JOIN shs pn ON p.oid = pn.pnpubid
)";
}
else {
sql = R"(with rel as (
SELECT pr.prpubid,quote_ident(n.nspname)|| '.'||quote_ident(c.relname) fulltable, ''::text rowfilter, (CASE WHEN pr.prattrs IS NOT NULL THEN
pg_catalog.array_to_string( ARRAY(SELECT attname
FROM
pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s,
pg_catalog.pg_attribute
WHERE attrelid = c.oid AND attnum = prattrs[s]), ', ')
ELSE NULL END) cols
FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid
JOIN (select oid, prpubid, prrelid, ''::text prqual, null::int2vector prattrs from pg_catalog.pg_publication_rel pr ) pr ON c.oid = pr.prrelid
), shs as (
select 0 pnpubid,''::text slist
)
select p.oid,p.pubname,pt.fulltable,pg_get_userbyid(p.pubowner) AS owner, p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, obj_description(p.oid,'pg_publication') AS comment,
p.pubviaroot,pt.rowfilter,pt.cols,pn.slist from pg_publication p
LEFT JOIN rel pt ON pt.prpubid = p.oid
LEFT JOIN shs pn ON p.oid = pn.pnpubid
)";
}
sql = sql + restriction + wxT("\n")
wxT(" ORDER BY p.pubname,pt.fulltable");
pgSet *publications = collection->GetDatabase()->ExecuteSet(sql);

View file

@ -144,46 +144,49 @@ pgObject *pgSubscriptionFactory::CreateObjects(pgCollection *collection, ctlTree
{
wxString sql;
pgSubscription *subscription = 0;
bool superu=collection->GetDatabase()->GetConnection()->IsSuperuser();
//bool superu=collection->GetDatabase()->GetConnection()->IsSuperuser();
bool superu = collection->GetServer()->GetSuperUser();
//wxString dbname=collection->GetDatabase()->GetConnection()->GetDbOid;
OID db=collection->GetDatabase()->GetConnection()->GetDbOid();
sql = wxT("select oid,subname,pg_get_userbyid(subowner) AS \"owner\",subenabled,subconninfo,subslotname,subsynccommit,subpublications,obj_description(oid,'pg_subscription') as comment from pg_subscription where subdbid=")
+NumToStr(db)+ wxT("\n")
+ restriction + wxT("\n");
pgSet *subscriptions = collection->GetDatabase()->ExecuteSet(sql);
if (superu) {
pgSet* subscriptions = collection->GetDatabase()->ExecuteSet(sql);
if (subscriptions)
{
while (!subscriptions->Eof())
if (subscriptions)
{
wxString tmp;
tmp = subscriptions->GetVal(wxT("subpublications"));
tmp.Replace(wxT("{"), wxT(""));
tmp.Replace(wxT("}"), wxT(""));
subscription = new pgSubscription(subscriptions->GetVal(wxT("subname")));
subscription->iSetDatabase(collection->GetDatabase());
subscription->iSetOid(subscriptions->GetOid(wxT("oid")));
subscription->iSetOwner(subscriptions->GetVal(wxT("owner")));
subscription->iSetPubStr(tmp);
subscription->iSetConnInfo(subscriptions->GetVal(wxT("subconninfo")));
subscription->iSetSlotName(subscriptions->GetVal(wxT("subslotname")));
//subscription->iSetName(subscriptions->GetVal(wxT("subname"));
subscription->iSetIsEnabled(subscriptions->GetBool(wxT("subenabled")));
subscription->iSetIsSyncCommit(subscriptions->GetVal(wxT("subsynccommit")));
subscription->iSetComment(subscriptions->GetVal(wxT("comment")));
if (browser)
while (!subscriptions->Eof())
{
browser->AppendObject(collection, subscription);
wxString tmp;
tmp = subscriptions->GetVal(wxT("subpublications"));
tmp.Replace(wxT("{"), wxT(""));
tmp.Replace(wxT("}"), wxT(""));
subscriptions->MoveNext();
subscription = new pgSubscription(subscriptions->GetVal(wxT("subname")));
subscription->iSetDatabase(collection->GetDatabase());
subscription->iSetOid(subscriptions->GetOid(wxT("oid")));
subscription->iSetOwner(subscriptions->GetVal(wxT("owner")));
subscription->iSetPubStr(tmp);
subscription->iSetConnInfo(subscriptions->GetVal(wxT("subconninfo")));
subscription->iSetSlotName(subscriptions->GetVal(wxT("subslotname")));
//subscription->iSetName(subscriptions->GetVal(wxT("subname"));
subscription->iSetIsEnabled(subscriptions->GetBool(wxT("subenabled")));
subscription->iSetIsSyncCommit(subscriptions->GetVal(wxT("subsynccommit")));
subscription->iSetComment(subscriptions->GetVal(wxT("comment")));
if (browser)
{
browser->AppendObject(collection, subscription);
subscriptions->MoveNext();
}
else
break;
}
else
break;
}
delete subscriptions;
delete subscriptions;
}
}
return subscription;
}