1 //////////////////////////////////////////////////////////////////////////
2 //
3 // pgAdmin III - PostgreSQL Tools
4 //
5 // Copyright (C) 2002 - 2016, The pgAdmin Development Team
6 // This software is released under the PostgreSQL Licence
7 //
8 // slListen.cpp PostgreSQL Slony-I listen
9 //
10 //////////////////////////////////////////////////////////////////////////
11 
12 // wxWindows headers
13 #include <wx/wx.h>
14 
15 // App headers
16 #include "pgAdmin3.h"
17 #include "utils/misc.h"
18 #include "schema/pgObject.h"
19 #include "slony/slListen.h"
20 #include "slony/slNode.h"
21 #include "slony/slCluster.h"
22 #include "frm/frmMain.h"
23 
24 
slListen(slNode * n,const wxString & newName)25 slListen::slListen(slNode *n, const wxString &newName)
26 	: slNodeObject(n, listenFactory, newName)
27 {
28 }
29 
DropObject(wxFrame * frame,ctlTree * browser,bool cascaded)30 bool slListen::DropObject(wxFrame *frame, ctlTree *browser, bool cascaded)
31 {
32 	return GetDatabase()->ExecuteVoid(
33 	           wxT("SELECT ") + GetCluster()->GetSchemaPrefix()
34 	           + wxT("droplisten(") + NumToStr(GetSlId())
35 	           + wxT(", ") + NumToStr(GetProviderId())
36 	           + wxT(", ") + NumToStr(GetNode()->GetSlId())
37 	           + wxT(");\n"));
38 }
39 
40 
GetTranslatedMessage(int kindOfMessage) const41 wxString slListen::GetTranslatedMessage(int kindOfMessage) const
42 {
43 	wxString message = wxEmptyString;
44 
45 	switch (kindOfMessage)
46 	{
47 		case RETRIEVINGDETAILS:
48 			message = _("Retrieving details on Slony listen");
49 			message += wxT(" ") + GetName();
50 			break;
51 		case REFRESHINGDETAILS:
52 			message = _("Refreshing Slony listen");
53 			message += wxT(" ") + GetName();
54 			break;
55 		case DROPINCLUDINGDEPS:
56 			message = wxString::Format(_("Are you sure you wish to drop Slony listen \"%s\" including all objects that depend on it?"),
57 			                           GetFullIdentifier().c_str());
58 			break;
59 		case DROPEXCLUDINGDEPS:
60 			message = wxString::Format(_("Are you sure you wish to drop Slony listen \"%s\"?"),
61 			                           GetFullIdentifier().c_str());
62 			break;
63 		case DROPCASCADETITLE:
64 			message = _("Drop Slony listen cascaded?");
65 			break;
66 		case DROPTITLE:
67 			message = _("Drop Slony listen?");
68 			break;
69 		case PROPERTIESREPORT:
70 			message = _("Slony listen properties report");
71 			message += wxT(" - ") + GetName();
72 			break;
73 		case PROPERTIES:
74 			message = _("Slony listen properties");
75 			break;
76 		case DDLREPORT:
77 			message = _("Slony listen DDL report");
78 			message += wxT(" - ") + GetName();
79 			break;
80 		case DDL:
81 			message = _("Slony listen DDL");
82 			break;
83 		case DEPENDENCIESREPORT:
84 			message = _("Slony listen dependencies report");
85 			message += wxT(" - ") + GetName();
86 			break;
87 		case DEPENDENCIES:
88 			message = _("Slony listen dependencies");
89 			break;
90 		case DEPENDENTSREPORT:
91 			message = _("Slony listen dependents report");
92 			message += wxT(" - ") + GetName();
93 			break;
94 		case DEPENDENTS:
95 			message = _("Slony listen dependents");
96 			break;
97 	}
98 
99 	return message;
100 }
101 
GetSql(ctlTree * browser)102 wxString slListen::GetSql(ctlTree *browser)
103 {
104 	if (sql.IsNull())
105 	{
106 		sql = wxT("-- Node  will listen to ") + GetProviderName()
107 		      + wxT(" for replication data from ") + GetOriginName() + wxT(".\n\n")
108 
109 		      wxT("SELECT ") + GetCluster()->GetSchemaPrefix()
110 		      + wxT("storelisten(") + NumToStr(GetSlId())
111 		      + wxT(", ") + NumToStr(GetProviderId())
112 		      + wxT(", ") + NumToStr(GetNode()->GetSlId())
113 		      + wxT(");\n");
114 	}
115 	return sql;
116 }
117 
118 
ShowTreeDetail(ctlTree * browser,frmMain * form,ctlListView * properties,ctlSQLBox * sqlPane)119 void slListen::ShowTreeDetail(ctlTree *browser, frmMain *form, ctlListView *properties, ctlSQLBox *sqlPane)
120 {
121 	if (!expandedKids)
122 	{
123 		expandedKids = true;
124 
125 		browser->RemoveDummyChild(this);
126 	}
127 
128 
129 	if (properties)
130 	{
131 		CreateListColumns(properties);
132 
133 		properties->AppendItem(_("Origin"), GetOriginName());
134 		properties->AppendItem(_("Origin ID"), GetSlId());
135 		properties->AppendItem(_("Provider"), GetProviderName());
136 		properties->AppendItem(_("Provider ID"), GetProviderId());
137 	}
138 }
139 
140 
141 
Refresh(ctlTree * browser,const wxTreeItemId item)142 pgObject *slListen::Refresh(ctlTree *browser, const wxTreeItemId item)
143 {
144 	pgObject *listen = 0;
145 	pgCollection *coll = browser->GetParentCollection(item);
146 	if (coll)
147 		listen = listenFactory.CreateObjects(coll, 0,
148 		                                     wxT(" WHERE li_origin =") + NumToStr(GetSlId()) +
149 		                                     wxT("   AND li_provider = ") + NumToStr(GetProviderId()) +
150 		                                     wxT("   AND li_receiver = ") + NumToStr(GetNode()->GetSlId()) +
151 		                                     wxT("\n"));
152 
153 	return listen;
154 }
155 
156 
157 
CreateObjects(pgCollection * coll,ctlTree * browser,const wxString & restr)158 pgObject *slListenFactory::CreateObjects(pgCollection *coll, ctlTree *browser, const wxString &restr)
159 {
160 	slNodeObjCollection *collection = (slNodeObjCollection *)coll;
161 	slListen *listen = 0;
162 	wxString restriction;
163 	if (restr.IsEmpty())
164 		restriction = wxT(" WHERE li_receiver = ") + NumToStr(collection->GetSlId());
165 	else
166 		restriction = restr;
167 
168 	pgSet *listens = collection->GetDatabase()->ExecuteSet(
169 	                     wxT("SELECT li_origin, li_provider, li_receiver, no.no_comment as origin_name, np.no_comment as provider_name\n")
170 	                     wxT("  FROM ") + collection->GetCluster()->GetSchemaPrefix() + wxT("sl_listen\n")
171 	                     wxT("  JOIN ") + collection->GetCluster()->GetSchemaPrefix() + wxT("sl_node no ON no.no_id=li_origin\n")
172 	                     wxT("  JOIN ") + collection->GetCluster()->GetSchemaPrefix() + wxT("sl_node np ON np.no_id=li_provider\n")
173 	                     + restriction +
174 	                     wxT(" ORDER BY li_origin, li_provider"));
175 
176 	if (listens)
177 	{
178 		while (!listens->Eof())
179 		{
180 			wxString orgName = listens->GetVal(wxT("origin_name")).BeforeFirst('\n');
181 			wxString provName = listens->GetVal(wxT("provider_name")).BeforeFirst('\n');
182 
183 			listen = new slListen(collection->GetNode(), orgName + wxT(" (") + provName + wxT(")"));
184 			listen->iSetSlId(listens->GetLong(wxT("li_origin")));
185 			listen->iSetProviderId(listens->GetLong(wxT("li_provider")));
186 			listen->iSetOriginName(orgName);
187 			listen->iSetProviderName(provName);
188 
189 			if (browser)
190 			{
191 				browser->AppendObject(collection, listen);
192 				listens->MoveNext();
193 			}
194 			else
195 				break;
196 		}
197 
198 		delete listens;
199 	}
200 	return listen;
201 }
202 
203 
GetTranslatedMessage(int kindOfMessage) const204 wxString slListenCollection::GetTranslatedMessage(int kindOfMessage) const
205 {
206 	wxString message = wxEmptyString;
207 
208 	switch (kindOfMessage)
209 	{
210 		case RETRIEVINGDETAILS:
211 			message = _("Retrieving details on Slony listens");
212 			break;
213 		case REFRESHINGDETAILS:
214 			message = _("Refreshing Slony listens");
215 			break;
216 		case OBJECTSLISTREPORT:
217 			message = _("Slony listens list report");
218 			break;
219 	}
220 
221 	return message;
222 }
223 
224 
225 ///////////////////////////////////////////////////
226 
227 #include "images/sllisten.pngc"
228 #include "images/sllistens.pngc"
229 
slListenFactory()230 slListenFactory::slListenFactory()
231 	: slNodeObjFactory(__("Listen"), __("New Listen"), __("Create a new Listen."), sllisten_png_img)
232 {
233 	metaType = SLM_LISTEN;
234 }
235 
236 
CreateCollection(pgObject * obj)237 pgCollection *slListenFactory::CreateCollection(pgObject *obj)
238 {
239 	return new slListenCollection(GetCollectionFactory(), (slNode *)obj);
240 }
241 
242 
243 slListenFactory listenFactory;
244 static pgaCollectionFactory cf(&listenFactory, __("listens"), sllistens_png_img);
245