45
45
#define lstLabels CTRL_LISTVIEW("lstLabels")
46
46
#define txtLabel CTRL_TEXT("txtLabel")
47
47
#define btnAddMember CTRL_BUTTON("btnAddMember")
48
#define btnChangeMember CTRL_BUTTON("btnChangeMember")
48
49
#define btnRemoveMember CTRL_BUTTON("btnRemoveMember")
49
#define btnAddLabel CTRL_BUTTON("btnAddLabel")
50
#define btnAddAfterLabel CTRL_BUTTON("btnAddAfterLabel")
51
#define btnAddBeforeLabel CTRL_BUTTON("btnAddBeforeLabel")
50
52
#define btnRemoveLabel CTRL_BUTTON("btnRemoveLabel")
51
53
#define pnlDefinition CTRL_PANEL("pnlDefinition")
52
54
#define pnlDefinitionExtern CTRL_PANEL("pnlDefinitionExtern")
53
55
#define pnlDefinitionComposite CTRL_PANEL("pnlDefinitionComposite")
54
56
#define pnlDefinitionEnum CTRL_PANEL("pnlDefinitionEnum")
57
#define chkCollatable CTRL_CHECKBOX("chkCollatable")
58
#define cbCollation CTRL_COMBOBOX("cbCollation")
57
61
BEGIN_EVENT_TABLE(dlgType, dlgTypeProperty)
58
EVT_RADIOBOX(XRCID("rdbType"), dlgType::OnTypeChange)
60
EVT_TEXT(XRCID("cbInput"), dlgProperty::OnChange)
61
EVT_COMBOBOX(XRCID("cbInput"), dlgProperty::OnChange)
62
EVT_TEXT(XRCID("cbOutput"), dlgProperty::OnChange)
63
EVT_COMBOBOX(XRCID("cbOutput"), dlgProperty::OnChange)
64
EVT_TEXT(XRCID("txtIntLength"), dlgProperty::OnChange)
65
EVT_CHECKBOX(XRCID("chkVariable"), dlgProperty::OnChange)
67
EVT_BUTTON(XRCID("btnAddMember"), dlgType::OnMemberAdd)
68
EVT_BUTTON(XRCID("btnRemoveMember"), dlgType::OnMemberRemove)
69
EVT_BUTTON(XRCID("btnAddLabel"), dlgType::OnLabelAdd)
70
EVT_BUTTON(XRCID("btnRemoveLabel"), dlgType::OnLabelRemove)
71
EVT_LIST_ITEM_SELECTED(XRCID("lstMembers"), dlgType::OnMemberSelChange)
72
EVT_LIST_ITEM_SELECTED(XRCID("lstLabels"), dlgType::OnLabelSelChange)
73
EVT_TEXT(XRCID("cbDatatype"), dlgType::OnSelChangeTyp)
74
EVT_COMBOBOX(XRCID("cbDatatype"), dlgType::OnSelChangeTyp)
75
EVT_TEXT(XRCID("txtMembername"), dlgType::OnChangeMember)
76
EVT_TEXT(XRCID("txtLength"), dlgType::OnSelChangeTypOrLen)
77
EVT_TEXT(XRCID("txtPrecision"), dlgType::OnSelChangeTypOrLen)
62
EVT_RADIOBOX(XRCID("rdbType"), dlgType::OnTypeChange)
64
EVT_TEXT(XRCID("cbInput"), dlgProperty::OnChange)
65
EVT_COMBOBOX(XRCID("cbInput"), dlgProperty::OnChange)
66
EVT_TEXT(XRCID("cbOutput"), dlgProperty::OnChange)
67
EVT_COMBOBOX(XRCID("cbOutput"), dlgProperty::OnChange)
68
EVT_TEXT(XRCID("txtIntLength"), dlgProperty::OnChange)
69
EVT_CHECKBOX(XRCID("chkVariable"), dlgProperty::OnChange)
71
EVT_BUTTON(XRCID("btnAddMember"), dlgType::OnMemberAdd)
72
EVT_BUTTON(XRCID("btnChangeMember"), dlgType::OnMemberChange)
73
EVT_BUTTON(XRCID("btnRemoveMember"), dlgType::OnMemberRemove)
74
EVT_BUTTON(XRCID("btnAddBeforeLabel"), dlgType::OnLabelAddBefore)
75
EVT_BUTTON(XRCID("btnAddAfterLabel"), dlgType::OnLabelAddAfter)
76
EVT_BUTTON(XRCID("btnRemoveLabel"), dlgType::OnLabelRemove)
77
EVT_LIST_ITEM_SELECTED(XRCID("lstMembers"), dlgType::OnMemberSelChange)
78
EVT_LIST_ITEM_SELECTED(XRCID("lstLabels"), dlgType::OnLabelSelChange)
79
EVT_TEXT(XRCID("cbDatatype"), dlgType::OnSelChangeTyp)
80
EVT_COMBOBOX(XRCID("cbDatatype"), dlgType::OnSelChangeTyp)
81
EVT_TEXT(XRCID("txtMembername"), dlgType::OnChangeMember)
82
EVT_TEXT(XRCID("txtLength"), dlgType::OnSelChangeTypOrLen)
83
EVT_TEXT(XRCID("txtPrecision"), dlgType::OnSelChangeTypOrLen)
81
87
dlgProperty *pgTypeFactory::CreateDialog(frmMain *frame, pgObject *node, pgObject *parent)
83
return new dlgType(this, frame, (pgType*)node, (pgSchema*)parent);
89
return new dlgType(this, frame, (pgType *)node, (pgSchema *)parent);
87
93
dlgType::dlgType(pgaFactory *f, frmMain *frame, pgType *node, pgSchema *sch)
88
: dlgTypeProperty(f, frame, wxT("dlgType"))
94
: dlgTypeProperty(f, frame, wxT("dlgType"))
92
lstMembers->CreateColumns(0, _("Member"), _("Data type"), -1);
93
lstLabels->InsertColumn(0, _("Label"), wxLIST_FORMAT_LEFT, GetClientSize().GetWidth());
98
lstMembers->CreateColumns(0, _("Member"), _("Data type"), _("Collation"), -1);
99
lstLabels->InsertColumn(0, _("Label"), wxLIST_FORMAT_LEFT, GetClientSize().GetWidth());
101
cbStorage->Append(wxT("PLAIN"));
102
cbStorage->Append(wxT("MAIN"));
103
cbStorage->Append(wxT("EXTERNAL"));
104
cbStorage->Append(wxT("EXTENDED"));
106
queriesToBeSplitted = false;
100
113
void dlgType::OnChangeMember(wxCommandEvent &ev)
102
btnAddMember->Enable(!type
103
&& !txtMembername->GetValue().Strip(wxString::both).IsEmpty()
104
&& cbDatatype->GetGuessedSelection() >= 0);
115
btnAddMember->Enable(
116
((type && connection->BackendMinimumVersion(9, 1)) || !type)
117
&& !txtMembername->GetValue().Strip(wxString::both).IsEmpty()
118
&& cbDatatype->GetGuessedSelection() >= 0);
119
btnChangeMember->Enable(true);
107
122
void dlgType::showDefinition(int panel)
109
pnlDefinitionExtern->Show(false);
110
pnlDefinitionComposite->Show(false);
111
pnlDefinitionEnum->Show(false);
116
pnlDefinitionComposite->Show(true);
119
pnlDefinitionEnum->Show(true);
122
pnlDefinitionExtern->Show(true);
126
pnlDefinitionComposite->GetParent()->Layout();
127
// we don't need to call GetParent()->Layout() for all three panels
128
// because they all share the same parent
124
pnlDefinitionExtern->Show(false);
125
pnlDefinitionComposite->Show(false);
126
pnlDefinitionEnum->Show(false);
131
pnlDefinitionComposite->Show(true);
134
pnlDefinitionEnum->Show(true);
137
pnlDefinitionExtern->Show(true);
141
pnlDefinitionComposite->GetParent()->Layout();
142
// we don't need to call GetParent()->Layout() for all three panels
143
// because they all share the same parent
132
147
void dlgType::OnTypeChange(wxCommandEvent &ev)
134
showDefinition(rdbType->GetSelection());
149
showDefinition(rdbType->GetSelection());
140
155
pgObject *dlgType::GetObject()
146
161
int dlgType::Go(bool modal)
150
FillDatatype(cbDatatype, cbElement);
156
rdbType->SetSelection(type->GetTypeClass());
159
showDefinition(type->GetTypeClass());
161
cbInput->Append(type->GetInputFunction()); cbInput->SetSelection(0); cbInput->Disable();
162
cbOutput->Append(type->GetOutputFunction()); cbOutput->SetSelection(0); cbOutput->Disable();
163
cbReceive->Append(type->GetReceiveFunction()); cbReceive->SetSelection(0); cbReceive->Disable();
164
cbSend->Append(type->GetSendFunction()); cbSend->SetSelection(0); cbSend->Disable();
165
cbTypmodin->Append(type->GetTypmodinFunction()); cbTypmodin->SetSelection(0); cbTypmodin->Disable();
166
cbTypmodout->Append(type->GetTypmodoutFunction()); cbTypmodout->SetSelection(0); cbTypmodout->Disable();
168
chkVariable->SetValue(type->GetInternalLength() < 0); chkVariable->Disable();
169
if (type->GetInternalLength() > 0)
170
txtIntLength->SetValue(NumToStr(type->GetInternalLength()));
171
txtIntLength->Disable();
172
txtDefault->SetValue(type->GetDefault()); txtDefault->Disable();
173
cbElement->Append(type->GetElement()); cbElement->SetSelection(0); cbElement->Disable();
174
txtDelimiter->SetValue(type->GetDelimiter()); txtDelimiter->Disable();
175
chkByValue->SetValue(type->GetPassedByValue()); chkByValue->Disable();
176
cbAlignment->SetValue(type->GetAlignment()); cbAlignment->Disable();
177
cbStorage->SetValue(type->GetStorage()); cbStorage->Disable();
179
txtMembername->Disable();
180
btnAddMember->Disable();
181
btnRemoveMember->Disable();
184
btnAddLabel->Disable();
185
btnRemoveLabel->Disable();
187
wxArrayString elements=type->GetTypesArray();
188
wxString fullType, typeName, typeLength, typePrecision;
191
for (i=0 ; i < elements.GetCount() ; i+=2)
193
lstMembers->AppendItem(0, elements.Item(i), elements.Item(i+1));
195
fullType = elements.Item(i+1);
197
typeLength = wxEmptyString;
198
typePrecision = wxEmptyString;
200
if (fullType.Find(wxT("(")) > 0)
202
// there is at least a length
203
typeName = fullType.BeforeFirst('(');
204
if (fullType.Find(wxT(",")) > 0)
206
// there is also a precision
207
typeLength = fullType.AfterFirst('(').BeforeFirst(',');
208
typePrecision = fullType.AfterFirst(',').BeforeFirst(')');
211
typeLength = fullType.AfterFirst('(').BeforeFirst(')');
214
for (pos = 0; pos < cbDatatype->GetCount() - 1; pos++)
216
if (cbDatatype->GetString(pos) == typeName)
218
memberTypes.Add(GetTypeInfo(pos));
222
memberLengths.Add(typeLength);
223
memberPrecisions.Add(typePrecision);
226
cbDatatype->Disable();
227
txtLength->Disable();
229
// Load the enum labels
230
elements=type->GetLabelArray();
231
for (i=0 ; i < elements.GetCount() ; i++)
232
lstLabels->AppendItem(0, elements.Item(i));
234
if (!connection->BackendMinimumVersion(7, 5))
240
cbOwner->Append(wxEmptyString);
243
bool hasSendRcv = connection->BackendMinimumVersion(7, 4);
244
bool hasTypmod = connection->BackendMinimumVersion(8, 3);
248
cbReceive->Append(wxEmptyString);
249
cbSend->Append(wxEmptyString);
253
cbReceive->Disable();
259
cbTypmodin->Append(wxEmptyString);
260
cbTypmodout->Append(wxEmptyString);
264
cbTypmodin->Disable();
265
cbTypmodout->Disable();
268
if (!connection->BackendMinimumVersion(8, 3))
269
rdbType->Enable(TYPE_ENUM, false);
271
set = connection->ExecuteSet(
272
wxT("SELECT proname, nspname\n")
274
wxT(" SELECT proname, nspname, max(proargtypes[0]) AS arg0, max(proargtypes[1]) AS arg1\n")
275
wxT(" FROM pg_proc p\n")
276
wxT(" JOIN pg_namespace n ON n.oid=pronamespace\n")
277
wxT(" GROUP BY proname, nspname\n")
278
wxT(" HAVING count(proname) = 1 ) AS uniquefunc\n")
279
wxT(" WHERE arg0 <> 0 AND arg1 = 0"));
285
wxString pn = database->GetSchemaPrefix(set->GetVal(wxT("nspname"))) + set->GetVal(wxT("proname"));
288
cbOutput->Append(pn);
291
cbReceive->Append(pn);
296
cbTypmodin->Append(pn);
297
cbTypmodout->Append(pn);
306
set = connection->ExecuteSet(
307
wxT("SELECT proname, nspname\n")
308
wxT(" FROM pg_proc p\n")
309
wxT(" JOIN pg_namespace n ON n.oid=pronamespace\n")
310
wxT(" WHERE prorettype=(SELECT oid FROM pg_type WHERE typname='int4')")
311
wxT(" AND proargtypes[0]=(SELECT oid FROM pg_type WHERE typname='_cstring')")
312
wxT(" AND proargtypes[1] IS NULL")
313
wxT(" ORDER BY nspname, proname"));
319
wxString pn = database->GetSchemaPrefix(set->GetVal(wxT("nspname"))) + set->GetVal(wxT("proname"));
321
cbTypmodin->Append(pn);
327
set = connection->ExecuteSet(
328
wxT("SELECT proname, nspname\n")
329
wxT(" FROM pg_proc p\n")
330
wxT(" JOIN pg_namespace n ON n.oid=pronamespace\n")
331
wxT(" WHERE prorettype=(SELECT oid FROM pg_type WHERE typname='cstring')")
332
wxT(" AND proargtypes[0]=(SELECT oid FROM pg_type WHERE typname='int4')")
333
wxT(" AND proargtypes[1] IS NULL")
334
wxT(" ORDER BY nspname, proname"));
340
wxString pn = database->GetSchemaPrefix(set->GetVal(wxT("nspname"))) + set->GetVal(wxT("proname"));
342
cbTypmodout->Append(pn);
349
txtLength->SetValidator(numericValidator);
351
return dlgTypeProperty::Go(modal);
165
FillDatatype(cbDatatype, cbElement);
167
if (connection->BackendMinimumVersion(9, 1))
169
// fill collation combobox
170
cbCollation->Append(wxEmptyString);
171
set = connection->ExecuteSet(
172
wxT("SELECT nspname, collname\n")
173
wxT(" FROM pg_collation c, pg_namespace n\n")
174
wxT(" WHERE c.collnamespace=n.oid\n")
175
wxT(" ORDER BY nspname, collname"));
180
wxString name = qtIdent(set->GetVal(wxT("nspname"))) + wxT(".") + qtIdent(set->GetVal(wxT("collname")));
181
cbCollation->Append(name);
186
cbCollation->SetSelection(0);
193
rdbType->SetSelection(type->GetTypeClass());
196
showDefinition(type->GetTypeClass());
198
cbInput->Append(type->GetInputFunction());
199
cbInput->SetSelection(0);
201
cbOutput->Append(type->GetOutputFunction());
202
cbOutput->SetSelection(0);
204
cbReceive->Append(type->GetReceiveFunction());
205
cbReceive->SetSelection(0);
206
cbReceive->Disable();
207
cbSend->Append(type->GetSendFunction());
208
cbSend->SetSelection(0);
210
cbTypmodin->Append(type->GetTypmodinFunction());
211
cbTypmodin->SetSelection(0);
212
cbTypmodin->Disable();
213
cbTypmodout->Append(type->GetTypmodoutFunction());
214
cbTypmodout->SetSelection(0);
215
cbTypmodout->Disable();
217
chkVariable->SetValue(type->GetInternalLength() < 0);
218
chkVariable->Disable();
219
if (type->GetInternalLength() > 0)
220
txtIntLength->SetValue(NumToStr(type->GetInternalLength()));
221
txtIntLength->Disable();
222
txtDefault->SetValue(type->GetDefault());
223
txtDefault->Disable();
224
cbElement->Append(type->GetElement());
225
cbElement->SetSelection(0);
226
cbElement->Disable();
227
txtDelimiter->SetValue(type->GetDelimiter());
228
txtDelimiter->Disable();
229
chkByValue->SetValue(type->GetPassedByValue());
230
chkByValue->Disable();
231
cbAlignment->SetValue(type->GetAlignment());
232
cbAlignment->Disable();
233
cbStorage->SetValue(type->GetStorage());
234
cbStorage->Disable();
235
chkCollatable->SetValue(type->GetCollatable());
236
chkCollatable->Disable();
238
bool changeok = connection->BackendMinimumVersion(9, 1);
239
txtMembername->Enable(changeok);
240
cbCollation->Enable(changeok);
241
btnAddMember->Enable(changeok);
242
btnChangeMember->Enable(false);
243
btnRemoveMember->Enable(false);
245
txtLabel->Enable(connection->BackendMinimumVersion(9, 1));
246
btnAddBeforeLabel->Enable(connection->BackendMinimumVersion(9, 1));
247
btnAddAfterLabel->Enable(connection->BackendMinimumVersion(9, 1));
248
btnRemoveLabel->Disable();
250
wxArrayString elements = type->GetTypesArray();
251
wxString fullType, typeName, typeLength, typePrecision;
254
for (i = 0 ; i < elements.GetCount() ; i += 3)
256
lstMembers->AppendItem(0, elements.Item(i), elements.Item(i + 1), elements.Item(i + 2));
258
fullType = elements.Item(i + 1);
260
typeLength = wxEmptyString;
261
typePrecision = wxEmptyString;
263
if (fullType.Find(wxT("(")) > 0)
265
// there is at least a length
266
typeName = fullType.BeforeFirst('(');
267
if (fullType.Find(wxT(",")) > 0)
269
// there is also a precision
270
typeLength = fullType.AfterFirst('(').BeforeFirst(',');
271
typePrecision = fullType.AfterFirst(',').BeforeFirst(')');
274
typeLength = fullType.AfterFirst('(').BeforeFirst(')');
277
for (pos = 0; pos < cbDatatype->GetCount() - 1; pos++)
279
if (cbDatatype->GetString(pos) == typeName)
281
memberTypes.Add(GetTypeInfo(pos));
285
memberLengths.Add(typeLength);
286
memberPrecisions.Add(typePrecision);
287
memberCollations.Add(elements.Item(i + 2));
290
cbDatatype->Enable(changeok);
291
txtLength->Enable(changeok);
293
// Load the enum labels
294
elements = type->GetLabelArray();
295
for (i = 0 ; i < elements.GetCount() ; i++)
296
lstLabels->AppendItem(0, elements.Item(i));
298
if (!connection->BackendMinimumVersion(7, 5))
304
cbOwner->Append(wxEmptyString);
307
bool hasSendRcv = connection->BackendMinimumVersion(7, 4);
308
bool hasTypmod = connection->BackendMinimumVersion(8, 3);
312
cbReceive->Append(wxEmptyString);
313
cbSend->Append(wxEmptyString);
317
cbReceive->Disable();
323
cbTypmodin->Append(wxEmptyString);
324
cbTypmodout->Append(wxEmptyString);
328
cbTypmodin->Disable();
329
cbTypmodout->Disable();
332
if (!connection->BackendMinimumVersion(8, 3))
333
rdbType->Enable(TYPE_ENUM, false);
335
chkCollatable->Enable(connection->BackendMinimumVersion(9, 1));
336
cbCollation->Enable(connection->BackendMinimumVersion(9, 1));
338
set = connection->ExecuteSet(
339
wxT("SELECT proname, nspname\n")
341
wxT(" SELECT proname, nspname, max(proargtypes[0]) AS arg0, max(proargtypes[1]) AS arg1\n")
342
wxT(" FROM pg_proc p\n")
343
wxT(" JOIN pg_namespace n ON n.oid=pronamespace\n")
344
wxT(" GROUP BY proname, nspname\n")
345
wxT(" HAVING count(proname) = 1 ) AS uniquefunc\n")
346
wxT(" WHERE arg0 <> 0 AND arg1 = 0"));
352
wxString pn = database->GetSchemaPrefix(set->GetVal(wxT("nspname"))) + set->GetVal(wxT("proname"));
355
cbOutput->Append(pn);
358
cbReceive->Append(pn);
363
cbTypmodin->Append(pn);
364
cbTypmodout->Append(pn);
373
set = connection->ExecuteSet(
374
wxT("SELECT proname, nspname\n")
375
wxT(" FROM pg_proc p\n")
376
wxT(" JOIN pg_namespace n ON n.oid=pronamespace\n")
377
wxT(" WHERE prorettype=(SELECT oid FROM pg_type WHERE typname='int4')")
378
wxT(" AND proargtypes[0]=(SELECT oid FROM pg_type WHERE typname='_cstring')")
379
wxT(" AND proargtypes[1] IS NULL")
380
wxT(" ORDER BY nspname, proname"));
386
wxString pn = database->GetSchemaPrefix(set->GetVal(wxT("nspname"))) + set->GetVal(wxT("proname"));
388
cbTypmodin->Append(pn);
394
set = connection->ExecuteSet(
395
wxT("SELECT proname, nspname\n")
396
wxT(" FROM pg_proc p\n")
397
wxT(" JOIN pg_namespace n ON n.oid=pronamespace\n")
398
wxT(" WHERE prorettype=(SELECT oid FROM pg_type WHERE typname='cstring')")
399
wxT(" AND proargtypes[0]=(SELECT oid FROM pg_type WHERE typname='int4')")
400
wxT(" AND proargtypes[1] IS NULL")
401
wxT(" ORDER BY nspname, proname"));
407
wxString pn = database->GetSchemaPrefix(set->GetVal(wxT("nspname"))) + set->GetVal(wxT("proname"));
409
cbTypmodout->Append(pn);
417
txtLength->SetValidator(numericValidator);
419
return dlgTypeProperty::Go(modal);
355
423
void dlgType::OnSelChangeTyp(wxCommandEvent &ev)
357
txtLength->SetValue(wxEmptyString);
358
txtPrecision->SetValue(wxEmptyString);
359
cbDatatype->GuessSelection(ev);
360
OnSelChangeTypOrLen(ev);
425
txtLength->SetValue(wxEmptyString);
426
txtPrecision->SetValue(wxEmptyString);
427
cbDatatype->GuessSelection(ev);
428
cbCollation->SetValue(wxEmptyString);
429
OnSelChangeTypOrLen(ev);
364
433
void dlgType::OnSelChangeTypOrLen(wxCommandEvent &ev)
369
txtLength->Enable(isVarLen);
370
txtPrecision->Enable(isVarPrec);
435
if ((type && connection->BackendMinimumVersion(9, 1)) || !type)
438
txtLength->Enable(isVarLen);
439
txtPrecision->Enable(isVarPrec);
440
cbCollation->Enable(connection->BackendMinimumVersion(9, 1));
377
447
void dlgType::CheckChange()
381
EnableOK(txtComment->GetValue() != type->GetComment()
382
|| cbOwner->GetValue() != type->GetOwner());
386
wxString name=GetName();
389
CheckValid(enable, !name.IsEmpty(), _("Please specify name."));
390
CheckValid(enable, !name.StartsWith(wxT("_")), _("Name may not start with '_'."));
392
if (rdbType->GetSelection() == TYPE_COMPOSITE)
394
CheckValid(enable, lstMembers->GetItemCount() > 1, _("Please specify at least two members."));
396
else if (rdbType->GetSelection() == TYPE_ENUM)
398
CheckValid(enable, lstLabels->GetItemCount() >= 1, _("Please specify at least one label."));
402
txtLength->Enable(!chkVariable->GetValue());
403
CheckValid(enable, cbInput->GetCurrentSelection() >= 0, _("Please specify input conversion function."));
404
CheckValid(enable, cbOutput->GetCurrentSelection() >= 0, _("Please specify output conversion function."));
405
CheckValid(enable, chkVariable->GetValue() || StrToLong(txtLength->GetValue()) > 0, _("Please specify internal storage length."));
451
EnableOK(txtComment->GetValue() != type->GetComment()
452
|| cbOwner->GetValue() != type->GetOwner()
453
|| (rdbType->GetSelection() == TYPE_COMPOSITE && GetSqlForTypes() != wxEmptyString)
454
|| (GetSql().Length() > 0 && connection->BackendMinimumVersion(9, 1)));
458
wxString name = GetName();
461
CheckValid(enable, !name.IsEmpty(), _("Please specify name."));
462
CheckValid(enable, !name.StartsWith(wxT("_")), _("Name may not start with '_'."));
464
if (rdbType->GetSelection() == TYPE_COMPOSITE)
466
CheckValid(enable, lstMembers->GetItemCount() > 1, _("Please specify at least two members."));
468
else if (rdbType->GetSelection() == TYPE_ENUM)
470
CheckValid(enable, lstLabels->GetItemCount() >= 1, _("Please specify at least one label."));
474
txtLength->Enable(!chkVariable->GetValue());
475
CheckValid(enable, cbInput->GetCurrentSelection() >= 0, _("Please specify input conversion function."));
476
CheckValid(enable, cbOutput->GetCurrentSelection() >= 0, _("Please specify output conversion function."));
477
CheckValid(enable, chkVariable->GetValue() || StrToLong(txtLength->GetValue()) > 0, _("Please specify internal storage length."));
412
484
void dlgType::OnMemberSelChange(wxListEvent &ev)
414
long pos=lstMembers->GetSelection();
417
txtMembername->SetValue(lstMembers->GetText(pos));
418
cbDatatype->SetValue(memberTypes.Item(pos).AfterFirst(':'));
419
txtLength->SetValue(memberLengths.Item(pos));
420
txtLength->Enable(!type && !txtLength->GetValue().IsEmpty());
421
txtPrecision->SetValue(memberPrecisions.Item(pos));
422
txtPrecision->Enable(!type && !txtPrecision->GetValue().IsEmpty());
486
long pos = lstMembers->GetSelection();
489
txtMembername->SetValue(lstMembers->GetText(pos));
490
cbDatatype->SetValue(memberTypes.Item(pos).AfterFirst(':'));
491
txtLength->SetValue(memberLengths.Item(pos));
492
txtLength->Enable(((type && connection->BackendMinimumVersion(9, 1)) || !type) && !txtLength->GetValue().IsEmpty());
493
txtPrecision->SetValue(memberPrecisions.Item(pos));
494
txtPrecision->Enable(((type && connection->BackendMinimumVersion(9, 1)) || !type) && !txtPrecision->GetValue().IsEmpty());
495
cbCollation->SetValue(memberCollations.Item(pos));
496
cbCollation->Enable(connection->BackendMinimumVersion(9, 1));
497
btnChangeMember->Enable((type && connection->BackendMinimumVersion(9, 1)) || !type);
498
btnRemoveMember->Enable((type && connection->BackendMinimumVersion(9, 1)) || !type);
427
503
void dlgType::OnMemberAdd(wxCommandEvent &ev)
429
wxString name = txtMembername->GetValue().Strip(wxString::both);
430
wxString type = cbDatatype->GetValue();
431
wxString length = wxEmptyString;
432
wxString precision = wxEmptyString;
434
if (txtLength->GetValue() != wxT("") && txtLength->IsEnabled())
435
length = txtLength->GetValue();
436
if (txtPrecision->GetValue() != wxT("") && txtPrecision->IsEnabled())
437
precision = txtPrecision->GetValue();
439
if (!length.IsEmpty())
441
type += wxT("(") + length;
442
if (!precision.IsEmpty())
443
type += wxT(", ") + precision;
449
long pos=lstMembers->FindItem(-1, name);
452
pos = lstMembers->GetItemCount();
453
lstMembers->InsertItem(pos, name, 0);
454
memberTypes.Add(GetTypeInfo(cbDatatype->GetGuessedSelection()));
455
memberLengths.Add(length);
456
memberPrecisions.Add(precision);
460
memberTypes.Insert(GetTypeInfo(cbDatatype->GetGuessedSelection()), pos);
461
memberLengths.Insert(length, pos);
462
memberPrecisions.Insert(precision, pos);
463
memberTypes.RemoveAt(pos+1);
464
memberLengths.RemoveAt(pos+1);
465
memberPrecisions.RemoveAt(pos+1);
467
lstMembers->SetItem(pos, 1, type);
505
wxString name = txtMembername->GetValue().Strip(wxString::both);
506
wxString type = cbDatatype->GetValue();
507
wxString length = wxEmptyString;
508
wxString precision = wxEmptyString;
509
wxString collation = wxEmptyString;
511
if (txtLength->GetValue() != wxT("") && txtLength->IsEnabled())
512
length = txtLength->GetValue();
513
if (txtPrecision->GetValue() != wxT("") && txtPrecision->IsEnabled())
514
precision = txtPrecision->GetValue();
515
if (cbCollation->GetValue() != wxT("") && cbCollation->IsEnabled())
516
collation = cbCollation->GetValue();
518
if (!length.IsEmpty())
520
type += wxT("(") + length;
521
if (!precision.IsEmpty())
522
type += wxT(",") + precision;
528
size_t pos = lstMembers->GetItemCount();
529
lstMembers->InsertItem(pos, name, 0);
530
lstMembers->SetItem(pos, 1, type);
531
lstMembers->SetItem(pos, 2, collation);
532
memberTypes.Add(GetTypeInfo(cbDatatype->GetGuessedSelection()));
533
memberLengths.Add(length);
534
memberPrecisions.Add(precision);
535
memberCollations.Add(collation);
542
void dlgType::OnMemberChange(wxCommandEvent &ev)
544
wxString name = txtMembername->GetValue().Strip(wxString::both);
545
wxString type = cbDatatype->GetValue();
546
wxString length = wxEmptyString;
547
wxString precision = wxEmptyString;
548
wxString collation = wxEmptyString;
550
if (txtLength->GetValue() != wxT("") && txtLength->IsEnabled())
551
length = txtLength->GetValue();
552
if (txtPrecision->GetValue() != wxT("") && txtPrecision->IsEnabled())
553
precision = txtPrecision->GetValue();
554
if (cbCollation->GetValue() != wxT("") && cbCollation->IsEnabled())
555
collation = cbCollation->GetValue();
557
if (!length.IsEmpty())
559
type += wxT("(") + length;
560
if (!precision.IsEmpty())
561
type += wxT(",") + precision;
567
long pos = lstMembers->GetFirstSelected();
570
lstMembers->SetItem(pos, 0, name);
571
lstMembers->SetItem(pos, 1, type);
572
lstMembers->SetItem(pos, 2, collation);
573
memberTypes.Insert(GetTypeInfo(cbDatatype->GetGuessedSelection()), pos);
574
memberLengths.Insert(length, pos);
575
memberPrecisions.Insert(precision, pos);
576
memberCollations.Insert(collation, pos);
577
memberTypes.RemoveAt(pos + 1);
578
memberLengths.RemoveAt(pos + 1);
579
memberPrecisions.RemoveAt(pos + 1);
580
memberCollations.RemoveAt(pos + 1);
474
588
void dlgType::OnMemberRemove(wxCommandEvent &ev)
476
long pos=lstMembers->GetSelection();
590
long pos = lstMembers->GetSelection();
480
lstMembers->DeleteItem(pos);
481
memberTypes.RemoveAt(pos);
482
memberLengths.RemoveAt(pos);
483
memberPrecisions.RemoveAt(pos);
594
lstMembers->DeleteItem(pos);
595
memberTypes.RemoveAt(pos);
596
memberLengths.RemoveAt(pos);
597
memberPrecisions.RemoveAt(pos);
598
memberCollations.RemoveAt(pos);
489
604
void dlgType::OnLabelSelChange(wxListEvent &ev)
491
long pos=lstLabels->GetSelection();
494
txtLabel->SetValue(lstLabels->GetText(pos));
499
void dlgType::OnLabelAdd(wxCommandEvent &ev)
501
wxString label=txtLabel->GetValue().Strip(wxString::both);
503
if (!label.IsEmpty())
505
long pos=lstLabels->FindItem(-1, label);
508
pos = lstLabels->GetItemCount();
509
lstLabels->InsertItem(pos, label, 0);
512
txtLabel->SetValue(wxEmptyString);
606
long pos = lstLabels->GetSelection();
609
txtLabel->SetValue(lstLabels->GetText(pos));
614
void dlgType::OnLabelAddBefore(wxCommandEvent &ev)
616
wxString label = txtLabel->GetValue().Strip(wxString::both);
618
if (!label.IsEmpty())
620
long pos = lstLabels->FindItem(-1, label);
623
if (lstLabels->GetFirstSelected() >= 0)
624
pos = lstLabels->GetFirstSelected();
627
lstLabels->InsertItem(pos, label, 0);
630
txtLabel->SetValue(wxEmptyString);
635
void dlgType::OnLabelAddAfter(wxCommandEvent &ev)
637
wxString label = txtLabel->GetValue().Strip(wxString::both);
639
if (!label.IsEmpty())
641
long pos = lstLabels->FindItem(-1, label);
644
if (lstLabels->GetFirstSelected() >= 0)
645
pos = lstLabels->GetFirstSelected() + 1;
647
pos = lstLabels->GetItemCount();
648
lstLabels->InsertItem(pos, label, 0);
651
txtLabel->SetValue(wxEmptyString);
517
656
void dlgType::OnLabelRemove(wxCommandEvent &ev)
519
long pos=lstLabels->GetSelection();
522
lstLabels->DeleteItem(pos);
658
long pos = lstLabels->GetSelection();
661
lstLabels->DeleteItem(pos);
528
667
pgObject *dlgType::CreateObject(pgCollection *collection)
530
wxString name=GetName();
669
wxString name = GetName();
532
pgObject *obj=0; //pgType::ReadObjects(collection, 0, wxT("\n WHERE usename=") + qtDbString(name));
671
pgObject *obj = 0; //pgType::ReadObjects(collection, 0, wxT("\n WHERE usename=") + qtDbString(name));
537
676
wxString dlgType::GetSql()
544
AppendOwnerChange(sql, wxT("TYPE ") + type->GetQuotedFullIdentifier());
549
sql = wxT("CREATE TYPE ") + schema->GetQuotedPrefix() + qtIdent(GetName());
551
if (rdbType->GetSelection() == TYPE_COMPOSITE)
553
sql += wxT(" AS\n (");
556
for (i=0 ; i < lstMembers->GetItemCount() ; i++)
560
sql += qtIdent(lstMembers->GetItemText(i)) + wxT(" ")
561
+ GetFullTypeName(i);
564
else if (rdbType->GetSelection() == TYPE_ENUM)
566
sql += wxT(" AS ENUM\n (");
569
for (i=0 ; i < lstLabels->GetItemCount() ; i++)
573
sql += connection->qtDbString(lstLabels->GetItemText(i));
578
sql += wxT("\n (INPUT=");
579
AppendQuoted(sql, cbInput->GetValue());
580
sql += wxT(", OUTPUT=");
581
AppendQuoted(sql, cbOutput->GetValue());
583
if (connection->BackendMinimumVersion(7, 4))
585
if (cbReceive->GetCurrentSelection() > 0 || cbSend->GetCurrentSelection() > 0)
587
if (cbReceive->GetCurrentSelection() > 0)
589
sql += wxT(",\n RECEIVE=");
590
AppendQuoted(sql, cbReceive->GetValue());
591
if (cbSend->GetCurrentSelection() > 0)
593
sql += wxT(", SEND=");
594
AppendQuoted(sql, cbSend->GetValue());
599
sql += wxT(",\n SEND=");
600
AppendQuoted(sql, cbSend->GetValue());
605
if (connection->BackendMinimumVersion(8, 3))
607
if (cbTypmodin->GetCurrentSelection() > 0 || cbTypmodout->GetCurrentSelection() > 0)
609
if (cbTypmodin->GetCurrentSelection() > 0)
611
sql += wxT(",\n TYPMOD_IN=");
612
AppendQuoted(sql, cbTypmodin->GetValue());
613
if (cbTypmodout->GetCurrentSelection() > 0)
615
sql += wxT(", TYPMOD_OUT=");
616
AppendQuoted(sql, cbTypmodout->GetValue());
621
sql += wxT(",\n TYPMOD_OUT=");
622
AppendQuoted(sql, cbTypmodout->GetValue());
627
sql += wxT(",\n INTERNALLENGTH=");
628
if (chkVariable->GetValue())
629
sql += wxT("VARIABLE");
631
sql += txtLength->GetValue();
632
AppendIfFilled(sql, wxT(",\n DEFAULT="), txtDefault->GetValue());
633
if (!cbElement->GetValue().IsEmpty())
635
sql += wxT(",\n ELEMENT=");
636
AppendQuoted(sql, cbElement->GetValue());
637
AppendIfFilled(sql, wxT(", DELIMITER="), qtDbString(txtDelimiter->GetValue().Strip(wxString::both)));
639
if (chkByValue->GetValue())
640
sql += wxT(",\n PASSEDBYVALUE");
641
AppendIfFilled(sql, wxT(",\n ALIGNMENT="), cbAlignment->GetValue());
642
AppendIfFilled(sql, wxT(",\n STORAGE="), cbStorage->GetValue());
647
AppendComment(sql, wxT("TYPE"), schema, type);
678
wxString sql, direction;
679
size_t existingitems_index, listitems_index, offset;
684
AppendOwnerChange(sql, wxT("TYPE ") + type->GetQuotedFullIdentifier());
685
sql += GetSqlForTypes();
686
if (rdbType->GetSelection() == TYPE_ENUM && connection->BackendMinimumVersion(9, 1))
688
wxArrayString elements = type->GetLabelArray();
689
existingitems_index = 0;
690
for (listitems_index = 0 ; listitems_index < (size_t)lstLabels->GetItemCount() ; listitems_index++)
692
if (existingitems_index >= elements.GetCount() || lstLabels->GetItemText(listitems_index) != elements.Item(existingitems_index))
694
queriesToBeSplitted = true;
695
if (listitems_index == 0)
697
direction = wxT("BEFORE");
702
direction = wxT("AFTER");
706
sql += wxT("ALTER TYPE ") + type->GetQuotedFullIdentifier()
707
+ wxT(" ADD VALUE ") + connection->qtDbString(lstLabels->GetItemText(listitems_index))
708
+ wxT(" ") + direction + wxT(" ")
709
+ connection->qtDbString(elements.Item(existingitems_index + offset))
713
existingitems_index++;
720
sql = wxT("CREATE TYPE ") + schema->GetQuotedPrefix() + qtIdent(GetName());
722
if (rdbType->GetSelection() == TYPE_COMPOSITE)
724
sql += wxT(" AS\n (");
727
for (i = 0 ; i < lstMembers->GetItemCount() ; i++)
731
sql += qtIdent(lstMembers->GetItemText(i)) + wxT(" ")
732
+ GetFullTypeName(i);
735
else if (rdbType->GetSelection() == TYPE_ENUM)
737
sql += wxT(" AS ENUM\n (");
740
for (i = 0 ; i < lstLabels->GetItemCount() ; i++)
744
sql += connection->qtDbString(lstLabels->GetItemText(i));
749
sql += wxT("\n (INPUT=");
750
AppendQuoted(sql, cbInput->GetValue());
751
sql += wxT(", OUTPUT=");
752
AppendQuoted(sql, cbOutput->GetValue());
754
if (connection->BackendMinimumVersion(7, 4))
756
if (cbReceive->GetCurrentSelection() > 0 || cbSend->GetCurrentSelection() > 0)
758
if (cbReceive->GetCurrentSelection() > 0)
760
sql += wxT(",\n RECEIVE=");
761
AppendQuoted(sql, cbReceive->GetValue());
762
if (cbSend->GetCurrentSelection() > 0)
764
sql += wxT(", SEND=");
765
AppendQuoted(sql, cbSend->GetValue());
770
sql += wxT(",\n SEND=");
771
AppendQuoted(sql, cbSend->GetValue());
776
if (connection->BackendMinimumVersion(8, 3))
778
if (cbTypmodin->GetCurrentSelection() > 0 || cbTypmodout->GetCurrentSelection() > 0)
780
if (cbTypmodin->GetCurrentSelection() > 0)
782
sql += wxT(",\n TYPMOD_IN=");
783
AppendQuoted(sql, cbTypmodin->GetValue());
784
if (cbTypmodout->GetCurrentSelection() > 0)
786
sql += wxT(", TYPMOD_OUT=");
787
AppendQuoted(sql, cbTypmodout->GetValue());
792
sql += wxT(",\n TYPMOD_OUT=");
793
AppendQuoted(sql, cbTypmodout->GetValue());
798
sql += wxT(",\n INTERNALLENGTH=");
799
if (chkVariable->GetValue())
800
sql += wxT("VARIABLE");
802
sql += txtLength->GetValue();
803
AppendIfFilled(sql, wxT(",\n DEFAULT="), txtDefault->GetValue());
804
if (!cbElement->GetValue().IsEmpty())
806
sql += wxT(",\n ELEMENT=");
807
AppendQuoted(sql, cbElement->GetValue());
808
AppendIfFilled(sql, wxT(", DELIMITER="), qtDbString(txtDelimiter->GetValue().Strip(wxString::both)));
810
if (chkByValue->GetValue())
811
sql += wxT(",\n PASSEDBYVALUE");
812
AppendIfFilled(sql, wxT(",\n ALIGNMENT="), cbAlignment->GetValue());
813
AppendIfFilled(sql, wxT(",\n STORAGE="), cbStorage->GetValue());
814
if (connection->BackendMinimumVersion(9, 1) && chkCollatable->GetValue())
815
sql += wxT(",\n COLLATABLE=true");
820
AppendComment(sql, wxT("TYPE"), schema, type);
652
825
wxString dlgType::GetFullTypeName(int type)
654
wxString typname = memberTypes.Item(type).AfterFirst(':');
656
if (!memberLengths.Item(type).IsEmpty())
658
typname += wxT("(") + memberLengths.Item(type);
659
if (!memberPrecisions.Item(type).IsEmpty())
660
typname += wxT(", ") + memberPrecisions.Item(type);
827
wxString typname = memberTypes.Item(type).AfterFirst(':');
829
if (!memberLengths.Item(type).IsEmpty())
831
typname += wxT("(") + memberLengths.Item(type);
832
if (!memberPrecisions.Item(type).IsEmpty())
833
typname += wxT(",") + memberPrecisions.Item(type);
836
if (!memberPrecisions.Item(type).IsEmpty() && memberPrecisions.Item(type) != wxT("pg_catalog.\"default\""))
837
typname += wxT(" COLLATE ") + memberCollations.Item(type);
842
wxString dlgType::GetSqlForTypes()
844
wxString sql = wxEmptyString;
845
wxString old_name, old_type, old_collation, new_name, new_type, new_collation;
846
wxArrayString elements = type->GetTypesArray();
847
bool modified = lstMembers->GetItemCount() * 3 != (int)elements.GetCount();
850
// Check if there is a change
851
for (int i = 0 ; i < lstMembers->GetItemCount() && !modified; i++)
853
old_name = elements.Item(i * 3);
854
old_type = elements.Item(i * 3 + 1);
855
old_collation = elements.Item(i * 3 + 2);
856
new_name = lstMembers->GetItemText(i);
857
new_type = GetFullTypeName(i);
858
new_collation = memberCollations.Item(i);
859
modified = modified || old_name != new_name
860
|| old_type != new_type
861
|| old_collation != new_collation;
866
// Drop all old attributes
867
for (i = 0 ; i < elements.GetCount() ; i += 3)
869
old_name = elements.Item(i);
870
sql += wxT("ALTER TYPE ") + type->GetName() + wxT(" DROP ATTRIBUTE ") + old_name + wxT(";\n");
873
// Add all new attributes
874
for (int i = 0 ; i < lstMembers->GetItemCount() ; i++)
876
new_name = lstMembers->GetItemText(i);
877
new_type = GetFullTypeName(i);
878
new_collation = memberCollations.Item(i);
879
sql += wxT("ALTER TYPE ") + type->GetName() + wxT(" ADD ATTRIBUTE ")
880
+ new_name + wxT(" ") + new_type;
881
if (!new_collation.IsEmpty() && new_collation != wxT("pg_catalog.\"default\""))
882
sql += wxT(" COLLATE ") + new_collation;