pgadmin3/dlg/dlgPackage.cpp
2020-07-07 22:19:12 +05:00

183 lines
4.3 KiB
C++

//////////////////////////////////////////////////////////////////////////
//
// pgAdmin III - PostgreSQL Tools
//
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// dlgPackage.cpp - EnterpriseDB package Property
//
//////////////////////////////////////////////////////////////////////////
// wxWindows headers
#include <wx/wx.h>
// App headers
#include "pgAdmin3.h"
#include "utils/misc.h"
#include "dlg/dlgPackage.h"
#include "schema/edbPackage.h"
// pointer to controls
#define txtName CTRL_TEXT("txtName")
#define txtComment CTRL_TEXT("txtComment")
#define txtHeader CTRL_SQLBOX("txtHeader")
#define txtBody CTRL_SQLBOX("txtBody")
dlgProperty *edbPackageFactory::CreateDialog(frmMain *frame, pgObject *node, pgObject *parent)
{
return new dlgPackage(this, frame, (edbPackage *)node, (pgSchema *)parent);
}
BEGIN_EVENT_TABLE(dlgPackage, dlgSecurityProperty)
EVT_STC_MODIFIED(XRCID("txtHeader"), dlgProperty::OnChangeStc)
EVT_STC_MODIFIED(XRCID("txtBody"), dlgProperty::OnChangeStc)
END_EVENT_TABLE();
dlgPackage::dlgPackage(pgaFactory *f, frmMain *frame, edbPackage *node, pgSchema *sch)
: dlgSecurityProperty(f, frame, node, wxT("dlgPackage"), wxT("EXECUTE"), "X")
{
schema = sch;
package = node;
bool bVal;
settings->Read(wxT("frmQuery/ShowLineNumber"), &bVal, false);
if (!bVal)
{
txtHeader->SetMarginType(1, wxSTC_MARGIN_NUMBER);
txtHeader->SetMarginWidth(1, ConvertDialogToPixels(wxPoint(16, 0)).x);
txtBody->SetMarginType(1, wxSTC_MARGIN_NUMBER);
txtBody->SetMarginWidth(1, ConvertDialogToPixels(wxPoint(16, 0)).x);
}
}
pgObject *dlgPackage::GetObject()
{
return package;
}
int dlgPackage::Go(bool modal)
{
if (!connection->EdbMinimumVersion(8, 2))
txtComment->Disable();
cbOwner->Disable();
if (package)
{
// edit mode
txtName->Disable();
txtHeader->SetText(package->GetHeaderInner());
txtBody->SetText(package->GetBodyInner());
}
else
{
// create mode
}
return dlgSecurityProperty::Go(modal);
}
pgObject *dlgPackage::CreateObject(pgCollection *collection)
{
pgObject *obj;
if (collection->GetConnection()->EdbMinimumVersion(8, 2))
obj = packageFactory.CreateObjects(collection, 0,
wxT(" AND nspname = ") + qtDbString(GetName()));
else
obj = packageFactory.CreateObjects(collection, 0,
wxT(" AND pkgname = ") + qtDbString(GetName()));
return obj;
}
#ifdef __WXMAC__
void dlgPackage::OnChangeSize(wxSizeEvent &ev)
{
SetPrivilegesLayout();
if (GetAutoLayout())
{
Layout();
}
}
#endif
void dlgPackage::CheckChange()
{
bool enable = true;
CheckValid(enable, !txtName->GetValue().IsEmpty(), _("Please specify name."));
CheckValid(enable, !txtHeader->GetText().IsEmpty(), _("Please specify package header."));
if (package)
{
if (!(txtBody->GetText() != package->GetBodyInner() ||
txtHeader->GetText() != package->GetHeaderInner()))
enable = false;
if (txtComment->GetValue() != package->GetComment())
enable = true;
}
EnableOK(enable);
}
bool dlgPackage::IsUpToDate()
{
if (package && !package->IsUpToDate())
return false;
else
return true;
}
wxString dlgPackage::GetSql()
{
wxString sql;
wxString qtName = schema->GetQuotedSchemaPrefix(schema->GetName()) + qtIdent(txtName->GetValue());
if (!package || (package && txtHeader->GetText() != package->GetHeaderInner()))
{
if (package)
sql = wxT("DROP PACKAGE BODY ") + qtName + wxT(";\n\n");
sql += wxT("CREATE OR REPLACE PACKAGE ") + qtName + wxT("\nIS\n");
sql += txtHeader->GetText();
sql += wxT("\nEND ") + qtIdent(txtName->GetValue()) + wxT(";\n\n");
}
if (!package || (package && txtBody->GetText() != package->GetBodyInner())
|| (package && txtHeader->GetText() != package->GetHeaderInner()))
{
if (!txtBody->GetText().Trim().IsEmpty())
{
sql += wxT("CREATE OR REPLACE PACKAGE BODY ") + qtName + wxT("\nIS\n");
sql += txtBody->GetText().Trim().Trim(false);
sql += wxT("\nEND ") + qtIdent(txtName->GetValue()) + wxT(";\n\n");
}
else
{
if (package && !package->GetBodyInner().Trim().IsEmpty())
sql = wxT("DROP PACKAGE BODY ") + qtName + wxT(";\n\n");
}
}
sql += GetGrant(wxT("X"), wxT("PACKAGE ") + qtName);
AppendComment(sql, wxT("PACKAGE"), schema, package);
return sql;
}