pgadmin3/slony/dlgRepSubscription.cpp
2025-09-23 16:20:12 +05:00

182 lines
5 KiB
C++

//////////////////////////////////////////////////////////////////////////
//
// pgAdmin III - PostgreSQL Tools
//
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// dlgRepSubscription.cpp - PostgreSQL Slony-I Subscription Property
//
//////////////////////////////////////////////////////////////////////////
// wxWindows headers
#include <wx/wx.h>
// App headers
#include "pgAdmin3.h"
#include "slony/dlgRepSubscription.h"
#include "slony/slCluster.h"
#include "slony/slSubscription.h"
#include "slony/slSet.h"
// pointer to controls
#define txtOrigin CTRL_TEXT("txtOrigin")
#define stReceiver CTRL_STATIC("stReceiver")
#define txtReceiver CTRL_TEXT("txtReceiver")
#define cbProvider CTRL_COMBOBOX("cbProvider")
#define stProvider CTRL_TEXT("stProvider")
#define chkForward CTRL_CHECKBOX("chkForward")
BEGIN_EVENT_TABLE(dlgRepSubscription, dlgProperty)
EVT_COMBOBOX(XRCID("cbProvider"), dlgRepSubscription::OnChange)
EVT_CHECKBOX(XRCID("chkForward"), dlgRepSubscription::OnChange)
END_EVENT_TABLE();
dlgProperty *slSubscriptionFactory::CreateDialog(frmMain *frame, pgObject *node, pgObject *parent)
{
return new dlgRepSubscription(this, frame, (slSubscription *)node, (slSet *)parent);
}
dlgRepSubscription::dlgRepSubscription(pgaFactory *f, frmMain *frame, slSubscription *sub, slSet *s)
: dlgRepProperty(f, frame, s->GetCluster(), wxT("dlgRepSubscription"))
{
subscription = sub;
set = s;
}
pgObject *dlgRepSubscription::GetObject()
{
return subscription;
}
int dlgRepSubscription::Go(bool modal)
{
txtOrigin->SetValue(NumToStr(set->GetOriginId()));
if (subscription)
{
// edit mode
chkForward->SetValue(subscription->GetForward());
txtReceiver->SetValue(IdAndName(subscription->GetReceiverId(), subscription->GetReceiverNode()));
}
else
{
// create mode
txtReceiver->SetValue(IdAndName(cluster->GetLocalNodeID(), cluster->GetLocalNodeName()));
if (cluster->ClusterMinimumVersion(1, 1))
{
// This is very ugly: starting with Slony-I 1.1, this must be called on the provider,
// not on the receiver.
stProvider->SetLabel(_("Receiver"));
stReceiver->SetLabel(_("Provider"));
}
}
if (set->GetOriginId() == cluster->GetLocalNodeID() && subscription)
{
chkForward->SetValue(subscription->GetForward());
cbProvider->Append(IdAndName(subscription->GetProviderId(), subscription->GetProviderNode()));
cbProvider->SetSelection(0);
cbProvider->Disable();
chkForward->Disable();
EnableOK(false);
}
else
{
pgSet *sets = connection->ExecuteSet(
wxT("SELECT no_id, no_comment\n")
wxT(" FROM ") + cluster->GetSchemaPrefix() + wxT("sl_node\n")
wxT(" WHERE no_active AND no_id <> ") + NumToStr(cluster->GetLocalNodeID()));
if (sets)
{
while (!sets->Eof())
{
cbProvider->Append(IdAndName(sets->GetLong(wxT("no_id")), sets->GetVal(wxT("no_comment"))),
(void *)sets->GetLong(wxT("no_id")));
if (subscription && sets->GetLong(wxT("no_id")) == subscription->GetProviderId())
cbProvider->SetSelection(cbProvider->GetCount() - 1);
sets->MoveNext();
}
delete sets;
}
}
if (!subscription && cbProvider->GetCount())
{
cbProvider->SetSelection(0);
EnableOK(true);
}
return dlgProperty::Go(modal);
}
pgObject *dlgRepSubscription::CreateObject(pgCollection *collection)
{
pgObject *obj = slsubscriptionFactory.CreateObjects(collection, 0,
wxT(" WHERE set_id = ") + NumToStr(set->GetSlId()) +
wxT(" AND sub_receiver = ") + NumToStr(cluster->GetLocalNodeID()));
return obj;
}
void dlgRepSubscription::CheckChange()
{
if (subscription)
{
int sel = cbProvider->GetCurrentSelection();
EnableOK(sel >= 0 && (chkForward->GetValue() != subscription->GetForward()
|| (long long)cbProvider->wxItemContainer::GetClientData(sel) != subscription->GetProviderId()));
}
else
{
bool enable = true;
EnableOK(enable);
}
}
wxString dlgRepSubscription::GetSql()
{
wxString sql;
sql = wxT("SELECT ") + cluster->GetSchemaPrefix() + wxT("subscribeset(")
+ NumToStr(set->GetSlId()) + wxT(", ");
if (cluster && cluster->ClusterMinimumVersion(1, 1))
{
// Actually, provider and receiver are exchanged here.
sql += NumToStr(cluster->GetLocalNodeID()) + wxT(", ")
+ NumToStr((long long)cbProvider->wxItemContainer::GetClientData(cbProvider->GetCurrentSelection()));
}
else
{
sql += NumToStr((long long)cbProvider->wxItemContainer::GetClientData(cbProvider->GetCurrentSelection())) + wxT(", ")
+ NumToStr(cluster->GetLocalNodeID());
}
sql += wxT(", ")
+ BoolToStr(chkForward->GetValue());
// Omit copy?
if (cluster && cluster->ClusterMinimumVersion(2, 0) &&
cluster->GetClusterVersion() != wxT("2.0.0") &&
cluster->GetClusterVersion() != wxT("2.0.1") &&
cluster->GetClusterVersion() != wxT("2.0.2"))
sql += wxT(", false");
sql += wxT(");");
return sql;
}