pgadmin3/dlg/dlgGroup.cpp
levinsv 4af765213c support PG11
Поддержка PostgreSQL 11 только для Windows
2018-10-10 22:59:25 +05:00

221 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
//
// dlgGroup.cpp - PostgreSQL Group Property
//
//////////////////////////////////////////////////////////////////////////
#include "pgAdmin3.h"
// wxWindows headers
#include <wx/wx.h>
// App headers
#include "utils/misc.h"
#include "dlg/dlgGroup.h"
#include "schema/pgGroup.h"
// pointer to controls
#define txtID CTRL_TEXT("txtID")
#define lbUsersNotIn CTRL_LISTBOX("lbUsersNotIn")
#define lbUsersIn CTRL_LISTBOX("lbUsersIn")
#define btnAddUser CTRL_BUTTON("btnAddUser")
#define btnDelUser CTRL_BUTTON("btnDelUser")
dlgProperty *pgGroupFactory::CreateDialog(frmMain *frame, pgObject *node, pgObject *parent)
{
return new dlgGroup(this, frame, (pgGroup *)node);
}
BEGIN_EVENT_TABLE(dlgGroup, dlgProperty)
EVT_LISTBOX_DCLICK(XRCID("lbUsersNotIn"), dlgGroup::OnUserAdd)
EVT_LISTBOX_DCLICK(XRCID("lbUsersIn"), dlgGroup::OnUserRemove)
EVT_BUTTON(XRCID("btnAddUser"), dlgGroup::OnUserAdd)
EVT_BUTTON(XRCID("btnDelUser"), dlgGroup::OnUserRemove)
END_EVENT_TABLE();
dlgGroup::dlgGroup(pgaFactory *f, frmMain *frame, pgGroup *node)
: dlgProperty(f, frame, wxT("dlgGroup"))
{
group = node;
}
pgObject *dlgGroup::GetObject()
{
return group;
}
int dlgGroup::Go(bool modal)
{
pgSet *set = connection->ExecuteSet(wxT("SELECT usename FROM pg_user"));
if (set)
{
while (!set->Eof())
{
wxString userName = set->GetVal(wxT("usename"));
if (group && group->GetUsersIn().Index(userName) >= 0)
lbUsersIn->Append(userName);
else
lbUsersNotIn->Append(userName);
set->MoveNext();
}
delete set;
}
if (group)
{
// Edit Mode
readOnly = !group->GetServer()->GetSuperUser();
txtID->SetValue(NumToStr(group->GetGroupId()));
if (!connection->BackendMinimumVersion(7, 4))
txtName->Disable();
txtID->Disable();
if (readOnly)
{
btnAddUser->Disable();
btnDelUser->Disable();
}
}
else
{
txtID->SetValidator(numericValidator);
}
return dlgProperty::Go(modal);
}
void dlgGroup::CheckChange()
{
if (group)
{
EnableOK(!GetSql().IsEmpty());
}
else
{
wxString name = GetName();
bool enable = true;
CheckValid(enable, !name.IsEmpty(), _("Please specify name."));
EnableOK(enable);
}
}
void dlgGroup::OnUserAdd(wxCommandEvent &ev)
{
if (!readOnly)
{
int pos = lbUsersNotIn->GetSelection();
if (pos >= 0)
{
lbUsersIn->Append(lbUsersNotIn->GetString(pos));
lbUsersNotIn->Delete(pos);
}
CheckChange();
}
}
void dlgGroup::OnUserRemove(wxCommandEvent &ev)
{
if (!readOnly)
{
int pos = lbUsersIn->GetSelection();
if (pos >= 0)
{
lbUsersNotIn->Append(lbUsersIn->GetString(pos));
lbUsersIn->Delete(pos);
}
CheckChange();
}
}
pgObject *dlgGroup::CreateObject(pgCollection *collection)
{
wxString name = GetName();
pgObject *obj = groupFactory.CreateObjects(collection, 0, wxT("\n WHERE groname=") + qtDbString(name));
return obj;
}
wxString dlgGroup::GetSql()
{
wxString sql;
wxString name = GetName();
int cnt, pos;
if (group)
{
// Edit Mode
AppendNameChange(sql);
cnt = lbUsersIn->GetCount();
wxArrayString tmpUsers = group->GetUsersIn();
// check for added users
for (pos = 0 ; pos < cnt ; pos++)
{
wxString userName = lbUsersIn->GetString(pos);
int index = tmpUsers.Index(userName);
if (index >= 0)
tmpUsers.RemoveAt(index);
else
sql += wxT("ALTER GROUP ") + qtIdent(name)
+ wxT("\n ADD USER ") + qtIdent(userName) + wxT(";\n");
}
// check for removed users
for (pos = 0 ; pos < (int)tmpUsers.GetCount() ; pos++)
{
sql += wxT("ALTER GROUP ") + qtIdent(name)
+ wxT("\n DROP USER ") + qtIdent(tmpUsers.Item(pos)) + wxT(";\n");
}
}
else
{
// Create Mode
wxString name = GetName();
long id = StrToLong(txtID->GetValue());
sql = wxT(
"CREATE GROUP ") + qtIdent(name);
if (id)
sql += wxT("\n WITH SYSID ") + NumToStr(id);
cnt = lbUsersIn->GetCount();
if (cnt)
sql += wxT("\n USER ");
for (pos = 0 ; pos < cnt ; pos++)
{
if (pos)
sql += wxT(", ");
sql += qtIdent(lbUsersIn->GetString(pos));
}
sql += wxT(";\n");
}
return sql;
}