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 // dlgTextSearchTemplate.cpp - PostgreSQL Text Search Template Property
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 "utils/pgDefs.h"
19 
20 #include "dlg/dlgTextSearchTemplate.h"
21 #include "schema/pgSchema.h"
22 #include "schema/pgTextSearchTemplate.h"
23 #include "schema/pgDatatype.h"
24 
25 
26 // pointer to controls
27 #define cbInit              CTRL_COMBOBOX2("cbInit")
28 #define cbLexize            CTRL_COMBOBOX2("cbLexize")
29 
30 
31 BEGIN_EVENT_TABLE(dlgTextSearchTemplate, dlgTypeProperty)
32 	EVT_TEXT(XRCID("cbInit"),                   dlgTextSearchTemplate::OnChange)
33 	EVT_COMBOBOX(XRCID("cbInit"),               dlgTextSearchTemplate::OnChange)
34 	EVT_TEXT(XRCID("cbLexize"),                 dlgTextSearchTemplate::OnChange)
35 	EVT_COMBOBOX(XRCID("cbLexize"),             dlgTextSearchTemplate::OnChange)
36 END_EVENT_TABLE();
37 
38 
39 
CreateDialog(frmMain * frame,pgObject * node,pgObject * parent)40 dlgProperty *pgTextSearchTemplateFactory::CreateDialog(frmMain *frame, pgObject *node, pgObject *parent)
41 {
42 	return new dlgTextSearchTemplate(this, frame, (pgTextSearchTemplate *)node, (pgSchema *)parent);
43 }
44 
dlgTextSearchTemplate(pgaFactory * f,frmMain * frame,pgTextSearchTemplate * node,pgSchema * sch)45 dlgTextSearchTemplate::dlgTextSearchTemplate(pgaFactory *f, frmMain *frame, pgTextSearchTemplate *node, pgSchema *sch)
46 	: dlgTypeProperty(f, frame, wxT("dlgTextSearchTemplate"))
47 {
48 	schema = sch;
49 	tmpl = node;
50 }
51 
52 
GetObject()53 pgObject *dlgTextSearchTemplate::GetObject()
54 {
55 	return tmpl;
56 }
57 
58 
Go(bool modal)59 int dlgTextSearchTemplate::Go(bool modal)
60 {
61 	wxString qry;
62 	pgSet *set;
63 
64 	cbInit->Append(wxT(""));
65 
66 	qry = wxT("SELECT proname, nspname\n")
67 	      wxT("  FROM pg_proc\n")
68 	      wxT("  JOIN pg_namespace n ON n.oid=pronamespace\n")
69 	      wxT("  WHERE prorettype=2281 and proargtypes='2281'\n")
70 	      wxT("  ORDER BY proname\n");
71 
72 	set = connection->ExecuteSet(qry);
73 	if (set)
74 	{
75 		while (!set->Eof())
76 		{
77 			wxString procname = database->GetSchemaPrefix(set->GetVal(wxT("nspname"))) + set->GetVal(wxT("proname"));
78 			cbInit->Append(procname);
79 			set->MoveNext();
80 		}
81 		delete set;
82 	}
83 
84 	qry = wxT("SELECT proname, nspname\n")
85 	      wxT("  FROM pg_proc\n")
86 	      wxT("  JOIN pg_namespace n ON n.oid=pronamespace\n")
87 	      wxT("  WHERE prorettype=2281 and proargtypes='2281 2281 2281 2281'\n")
88 	      wxT("  ORDER BY proname\n");
89 
90 	set = connection->ExecuteSet(qry);
91 	if (set)
92 	{
93 		while (!set->Eof())
94 		{
95 			wxString procname = database->GetSchemaPrefix(set->GetVal(wxT("nspname"))) + set->GetVal(wxT("proname"));
96 			cbLexize->Append(procname);
97 			set->MoveNext();
98 		}
99 		delete set;
100 	}
101 
102 	if (tmpl)
103 	{
104 		// edit mode
105 		cbSchema->Enable(connection->BackendMinimumVersion(9, 1));
106 		cbInit->SetValue(tmpl->GetInit());
107 		cbInit->Disable();
108 		cbLexize->SetValue(tmpl->GetLexize());
109 		cbLexize->Disable();
110 	}
111 	else
112 	{
113 		// create mode
114 	}
115 
116 	cbOwner->Disable();
117 
118 	return dlgProperty::Go(modal);
119 }
120 
121 
CreateObject(pgCollection * collection)122 pgObject *dlgTextSearchTemplate::CreateObject(pgCollection *collection)
123 {
124 	pgObject *obj = textSearchTemplateFactory.CreateObjects(collection, 0,
125 	                wxT("\n   AND tmpl.tmplname=") + qtDbString(GetName()) +
126 	                wxT("\n   AND tmpl.tmplnamespace=") + schema->GetOidStr());
127 
128 	return obj;
129 }
130 
131 
CheckChange()132 void dlgTextSearchTemplate::CheckChange()
133 {
134 	if (tmpl)
135 	{
136 		EnableOK(txtName->GetValue() != tmpl->GetName()
137 		         || cbSchema->GetValue() != tmpl->GetSchema()->GetName()
138 		         || txtComment->GetValue() != tmpl->GetComment());
139 	}
140 	else
141 	{
142 		wxString name = GetName();
143 		bool enable = true;
144 		CheckValid(enable, !name.IsEmpty(), _("Please specify name."));
145 		CheckValid(enable, cbLexize->GetGuessedSelection() > 0 , _("Please select a lexize function."));
146 
147 		EnableOK(enable);
148 	}
149 }
150 
151 
OnChange(wxCommandEvent & ev)152 void dlgTextSearchTemplate::OnChange(wxCommandEvent &ev)
153 {
154 	CheckChange();
155 }
156 
157 
GetSql()158 wxString dlgTextSearchTemplate::GetSql()
159 {
160 	wxString sql;
161 	wxString objname;
162 
163 	if (tmpl)
164 	{
165 		// edit mode
166 		objname = schema->GetQuotedPrefix() + qtIdent(GetName());
167 		AppendNameChange(sql, wxT("TEXT SEARCH TEMPLATE ") + tmpl->GetQuotedFullIdentifier());
168 		AppendSchemaChange(sql, wxT("TEXT SEARCH TEMPLATE ") + objname);
169 	}
170 	else
171 	{
172 		// create mode
173 		objname = qtIdent(cbSchema->GetValue()) + wxT(".") + qtIdent(GetName());
174 		sql = wxT("CREATE TEXT SEARCH TEMPLATE ")
175 		      + objname
176 		      + wxT(" (");
177 
178 		AppendIfFilled(sql, wxT("\n   INIT="), cbInit->GetValue());
179 		if (cbInit->GetValue().Length() > 0)
180 			sql += wxT(",");
181 		AppendIfFilled(sql, wxT("\n   LEXIZE="), cbLexize->GetValue());
182 
183 		sql += wxT("\n);\n");
184 
185 	}
186 
187 	AppendComment(sql, wxT("TEXT SEARCH TEMPLATE ") + qtIdent(cbSchema->GetValue()) + wxT(".") + qtIdent(GetName()), tmpl);
188 
189 	return sql;
190 }
191