Hi,
Quick patch to handle the new parameters for tablespace
(random_page_cost and seq_page_cost). I copied/pasted the database code
that does exactly the same, but I restricted the parameters to the two
allowed ones.
Comments?
PS: sorry for that many messages/patches, I'm just getting bored in my
hotel room... and it will last one week :/
--
Guillaume.
http://www.postgresqlfr.org
http://dalibo.com
diff --git a/pgadmin/dlg/dlgTablespace.cpp b/pgadmin/dlg/dlgTablespace.cpp
index 6625688..facb217 100644
--- a/pgadmin/dlg/dlgTablespace.cpp
+++ b/pgadmin/dlg/dlgTablespace.cpp
@@ -25,6 +25,12 @@
// pointer to controls
#define txtLocation CTRL_TEXT("txtLocation")
+#define lstVariables CTRL_LISTVIEW("lstVariables")
+#define cbVarname CTRL_COMBOBOX2("cbVarname")
+#define txtValue CTRL_TEXT("txtValue")
+#define chkValue CTRL_CHECKBOX("chkValue")
+#define btnAdd CTRL_BUTTON("wxID_ADD")
+#define btnRemove CTRL_BUTTON("wxID_REMOVE")
dlgProperty *pgTablespaceFactory::CreateDialog(frmMain *frame, pgObject *node, pgObject *parent)
{
@@ -33,7 +39,12 @@ dlgProperty *pgTablespaceFactory::CreateDialog(frmMain *frame, pgObject *node, p
BEGIN_EVENT_TABLE(dlgTablespace, dlgSecurityProperty)
- EVT_TEXT(XRCID("txtLocation"), dlgProperty::OnChange)
+ EVT_TEXT(XRCID("txtLocation"), dlgProperty::OnChange)
+ EVT_LIST_ITEM_SELECTED(XRCID("lstVariables"), dlgTablespace::OnVarSelChange)
+ EVT_BUTTON(wxID_ADD, dlgTablespace::OnVarAdd)
+ EVT_BUTTON(wxID_REMOVE, dlgTablespace::OnVarRemove)
+ EVT_TEXT(XRCID("cbVarname"), dlgTablespace::OnVarnameSelChange)
+ EVT_COMBOBOX(XRCID("cbVarname"), dlgTablespace::OnVarnameSelChange)
END_EVENT_TABLE();
@@ -42,6 +53,8 @@ dlgTablespace::dlgTablespace(pgaFactory *f, frmMain *frame, pgTablespace *node)
: dlgSecurityProperty(f, frame, node, wxT("dlgTablespace"), wxT("CREATE"), "C")
{
tablespace=node;
+ lstVariables->CreateColumns(0, _("Variable"), _("Value"));
+ chkValue->Hide();
btnOK->Disable();
}
@@ -52,6 +65,14 @@ pgObject *dlgTablespace::GetObject()
}
+wxString dlgTablespace::GetHelpPage() const
+{
+ if (nbNotebook->GetSelection() == 1)
+ return wxT("pg/runtime-config");
+ return dlgSecurityProperty::GetHelpPage();
+}
+
+
int dlgTablespace::Go(bool modal)
{
if (!tablespace)
@@ -59,6 +80,27 @@ int dlgTablespace::Go(bool modal)
AddGroups();
AddUsers(cbOwner);
+ pgSet *set;
+ if (connection->BackendMinimumVersion(8, 5))
+ {
+ set=connection->ExecuteSet(wxT("SELECT name, vartype, min_val, max_val\n")
+ wxT(" FROM pg_settings WHERE name IN ('seq_page_cost', 'random_page_cost')"));
+ if (set)
+ {
+ while (!set->Eof())
+ {
+ cbVarname->Append(set->GetVal(0));
+ varInfo.Add(set->GetVal(wxT("vartype")) + wxT(" ") +
+ set->GetVal(wxT("min_val")) + wxT(" ") +
+ set->GetVal(wxT("max_val")));
+ set->MoveNext();
+ }
+ delete set;
+
+ cbVarname->SetSelection(0);
+ }
+ }
+
if (tablespace)
{
// Edit Mode
@@ -67,6 +109,13 @@ int dlgTablespace::Go(bool modal)
txtComment->SetValue(tablespace->GetComment());
txtLocation->Disable();
+
+ size_t i;
+ for (i=0 ; i < tablespace->GetVariables().GetCount() ; i++)
+ {
+ wxString item=tablespace->GetVariables().Item(i);
+ lstVariables->AppendItem(0, item.BeforeFirst('='), item.AfterFirst('='));
+ }
}
else
{
@@ -98,7 +147,8 @@ void dlgTablespace::CheckChange()
{
EnableOK(txtComment->GetValue() != tablespace->GetComment()
|| GetName() != tablespace->GetName()
- || cbOwner->GetValue() != tablespace->GetOwner());
+ || cbOwner->GetValue() != tablespace->GetOwner()
+ || dirtyVars);
}
else
{
@@ -135,6 +185,51 @@ wxString dlgTablespace::GetSql()
sql += GetGrant(wxT("C"), wxT("TABLESPACE ") + qtIdent(name));
AppendComment(sql, wxT("TABLESPACE"), 0, tablespace);
+
+ wxArrayString vars;
+
+ size_t index;
+
+ for (index = 0 ; index < tablespace->GetVariables().GetCount() ; index++)
+ vars.Add(tablespace->GetVariables().Item(index));
+
+ int cnt=lstVariables->GetItemCount();
+ int pos;
+
+ // check for changed or added vars
+ for (pos=0 ; pos < cnt ; pos++)
+ {
+ wxString newVar=lstVariables->GetText(pos);
+ wxString newVal=lstVariables->GetText(pos, 1);
+
+ wxString oldVal;
+
+ for (index=0 ; index < vars.GetCount() ; index++)
+ {
+ wxString var=vars.Item(index);
+ if (var.BeforeFirst('=').IsSameAs(newVar, false))
+ {
+ oldVal = var.Mid(newVar.Length()+1);
+ vars.RemoveAt(index);
+ break;
+ }
+ }
+ if (oldVal != newVal)
+ {
+ sql += wxT("ALTER TABLESPACE ") + qtIdent(name)
+ + wxT(" SET (") + newVar
+ + wxT("=") + newVal
+ + wxT(");\n");
+ }
+ }
+
+ // check for removed vars
+ for (pos=0 ; pos < (int)vars.GetCount() ; pos++)
+ {
+ sql += wxT("ALTER TABLESPACE ") + qtIdent(name)
+ + wxT(" RESET (") + vars.Item(pos).BeforeFirst('=')
+ + wxT(");\n");
+ }
}
else
{
@@ -158,8 +253,108 @@ wxString dlgTablespace::GetSql2()
{
sql += GetGrant(wxT("C"), wxT("TABLESPACE ") + qtIdent(name));
AppendComment(sql, wxT("TABLESPACE"), 0, tablespace);
+
+ // check for changed or added vars
+ for (int pos=0 ; pos < lstVariables->GetItemCount() ; pos++)
+ {
+ sql += wxT("ALTER TABLESPACE ") + qtIdent(name)
+ + wxT(" SET (") + lstVariables->GetText(pos)
+ + wxT("=") + lstVariables->GetText(pos, 1)
+ + wxT(");\n");
+ }
}
return sql;
}
+void dlgTablespace::OnVarnameSelChange(wxCommandEvent &ev)
+{
+ int sel=cbVarname->GuessSelection(ev);
+
+ SetupVarEditor(sel);
+}
+
+void dlgTablespace::SetupVarEditor(int var)
+{
+ if (var >= 0 && varInfo.Count() > 0)
+ {
+ wxStringTokenizer vals(varInfo.Item(var));
+ wxString typ=vals.GetNextToken();
+
+ if (typ == wxT("bool"))
+ {
+ txtValue->Hide();
+ chkValue->Show();
+ chkValue->SetSize(wxDefaultCoord, wxDefaultCoord,
+ cbVarname->GetSize().GetWidth(), cbVarname->GetSize().GetHeight());
+ }
+ else
+ {
+ chkValue->Hide();
+ txtValue->Show();
+ if (typ == wxT("string"))
+ txtValue->SetValidator(wxTextValidator());
+ else
+ txtValue->SetValidator(numericValidator);
+ txtValue->SetSize(wxDefaultCoord, wxDefaultCoord,
+ cbVarname->GetSize().GetWidth(), cbVarname->GetSize().GetHeight());
+ }
+ }
+}
+
+void dlgTablespace::OnVarSelChange(wxListEvent &ev)
+{
+ long pos=lstVariables->GetSelection();
+ if (pos >= 0)
+ {
+ wxString value=lstVariables->GetText(pos, 1);
+ cbVarname->SetValue(lstVariables->GetText(pos));
+
+ // We used to raise an OnVarnameSelChange() event here, but
+ // at this point the combo box hasn't necessarily updated.
+ int sel = cbVarname->FindString(lstVariables->GetText(pos));
+ SetupVarEditor(sel);
+
+ txtValue->SetValue(value);
+ chkValue->SetValue(value == wxT("on"));
+ }
+}
+
+
+void dlgTablespace::OnVarAdd(wxCommandEvent &ev)
+{
+ wxString name=cbVarname->GetValue();
+ wxString value;
+ if (chkValue->IsShown())
+ value = chkValue->GetValue() ? wxT("on") : wxT("off");
+ else
+ value = txtValue->GetValue().Strip(wxString::both);
+
+ if (value.IsEmpty())
+ value = wxT("DEFAULT");
+
+ if (!name.IsEmpty())
+ {
+ long pos=lstVariables->FindItem(-1, name);
+ if (pos < 0)
+ {
+ pos = lstVariables->GetItemCount();
+ lstVariables->InsertItem(pos, name, 0);
+ }
+ lstVariables->SetItem(pos, 1, value);
+ }
+ dirtyVars = true;
+ CheckChange();
+}
+
+
+void dlgTablespace::OnVarRemove(wxCommandEvent &ev)
+{
+ if (lstVariables->GetSelection() >= 0)
+ {
+ lstVariables->DeleteCurrentItem();
+ dirtyVars = true;
+ CheckChange();
+ }
+}
+
diff --git a/pgadmin/include/dlg/dlgTablespace.h b/pgadmin/include/dlg/dlgTablespace.h
index ce5eb22..8d152a5 100644
--- a/pgadmin/include/dlg/dlgTablespace.h
+++ b/pgadmin/include/dlg/dlgTablespace.h
@@ -27,16 +27,25 @@ public:
wxString GetSql2();
pgObject *CreateObject(pgCollection *collection);
pgObject *GetObject();
+ wxString GetHelpPage() const;
int Go(bool modal);
private:
pgTablespace *tablespace;
+ wxArrayString varInfo;
+ bool dirtyVars;
#ifdef __WXMAC__
void OnChangeSize(wxSizeEvent &ev);
#endif
+ void OnVarAdd(wxCommandEvent &ev);
+ void OnVarRemove(wxCommandEvent &ev);
+ void OnVarSelChange(wxListEvent &ev);
+ void OnVarnameSelChange(wxCommandEvent &ev);
+ void SetupVarEditor(int var);
+
DECLARE_EVENT_TABLE()
};
diff --git a/pgadmin/include/schema/pgTablespace.h b/pgadmin/include/schema/pgTablespace.h
index 3c62c29..d777444 100644
--- a/pgadmin/include/schema/pgTablespace.h
+++ b/pgadmin/include/schema/pgTablespace.h
@@ -37,6 +37,7 @@ public:
wxString GetLocation() const { return location; };
void iSetLocation(const wxString& newVal) { location = newVal; }
+ wxArrayString& GetVariables() { return variables; }
bool DropObject(wxFrame *frame, ctlTree *browser, bool cascaded);
bool RequireDropConfirm() { return true; }
@@ -51,6 +52,7 @@ public:
private:
wxString location;
+ wxArrayString variables;
};
diff --git a/pgadmin/schema/pgTablespace.cpp b/pgadmin/schema/pgTablespace.cpp
index 33c0005..75e0dd6 100644
--- a/pgadmin/schema/pgTablespace.cpp
+++ b/pgadmin/schema/pgTablespace.cpp
@@ -97,6 +97,11 @@ wxString pgTablespace::GetSql(ctlTree *browser)
+ wxT(";\n");
sql += GetCommentSql();
+ size_t i;
+ for (i=0 ; i < variables.GetCount() ; i++)
+ sql += wxT("ALTER TABLESPACE ") + GetQuotedFullIdentifier()
+ + wxT(" SET (") + variables.Item(i) + wxT(");\n");
+
}
return sql;
}
@@ -117,6 +122,12 @@ void pgTablespace::ShowTreeDetail(ctlTree *browser, frmMain *form, ctlListView *
properties->AppendItem(_("OID"), GetOid());
properties->AppendItem(_("Owner"), GetOwner());
properties->AppendItem(_("Location"), GetLocation());
+ size_t i;
+ for (i=0 ; i < variables.GetCount() ; i++)
+ {
+ wxString item=variables.Item(i);
+ properties->AppendItem(item.BeforeFirst('='), item.AfterFirst('='));
+ }
properties->AppendItem(_("ACL"), GetAcl());
properties->AppendItem(_("Comment"), firstLineOnly(GetComment()));
}
@@ -171,7 +182,11 @@ pgObject *pgTablespaceFactory::CreateObjects(pgCollection *collection, ctlTree *
wxString tabname;
pgSet *tablespaces;
- if (collection->GetConnection()->BackendMinimumVersion(8, 2))
+ if (collection->GetConnection()->BackendMinimumVersion(8, 5))
+ tablespaces = collection->GetServer()->ExecuteSet(
+ wxT("SELECT ts.oid, spcname, spclocation, spcoptions, pg_get_userbyid(spcowner) as spcuser, spcacl, pg_catalog.shobj_description(oid, 'pg_tablespace') AS description FROM pg_tablespace ts\n")
+ + restriction + wxT(" ORDER BY spcname"));
+ else if (collection->GetConnection()->BackendMinimumVersion(8, 2))
tablespaces = collection->GetServer()->ExecuteSet(
wxT("SELECT ts.oid, spcname, spclocation, pg_get_userbyid(spcowner) as spcuser, spcacl, pg_catalog.shobj_description(oid, 'pg_tablespace') AS description FROM pg_tablespace ts\n")
+ restriction + wxT(" ORDER BY spcname"));
@@ -193,6 +208,12 @@ pgObject *pgTablespaceFactory::CreateObjects(pgCollection *collection, ctlTree *
tablespace->iSetAcl(tablespaces->GetVal(wxT("spcacl")));
if (collection->GetConnection()->BackendMinimumVersion(8, 2))
tablespace->iSetComment(tablespaces->GetVal(wxT("description")));
+ if (collection->GetConnection()->BackendMinimumVersion(8, 5))
+ {
+ wxString str=tablespaces->GetVal(wxT("spcoptions"));
+ if (!str.IsEmpty())
+ FillArray(tablespace->GetVariables(), str.Mid(1, str.Length()-2));
+ }
if (browser)
{
diff --git a/pgadmin/ui/dlgTablespace.xrc b/pgadmin/ui/dlgTablespace.xrc
index d722cb7..ed544f9 100644
--- a/pgadmin/ui/dlgTablespace.xrc
+++ b/pgadmin/ui/dlgTablespace.xrc
@@ -88,6 +88,106 @@
</object>
</object>
</object>
+ <object class="notebookpage">
+ <label>Variables</label>
+ <object class="wxPanel" name="pnlVariables">
+ <object class="wxFlexGridSizer">
+ <cols>1</cols>
+ <vgap>4</vgap>
+ <hgap>5</hgap>
+ <growablerows>0</growablerows>
+ <growablecols>0</growablecols>
+ <object class="sizeritem">
+ <object class="wxListCtrl" name="lstVariables">
+ <pos>5,6d</pos>
+ <style>wxLC_REPORT|wxLC_SINGLE_SEL</style>
+ </object>
+ <flag>wxALL|wxGROW|wxALIGN_CENTRE</flag>
+ <border>4</border>
+ </object>
+ <object class="sizeritem">
+ <object class="wxFlexGridSizer">
+ <cols>3</cols>
+ <growablecols>0</growablecols>
+ <object class="spacer">
+ <pos>0,0d</pos>
+ </object>
+ <object class="sizeritem">
+ <object class="wxButton" name="wxID_ADD">
+ <label>Add/Change</label>
+ </object>
+ <flag>wxALIGN_CENTER_VERTICAL|wxALL</flag>
+ <border>4</border>
+ </object>
+ <object class="sizeritem">
+ <object class="wxButton" name="wxID_REMOVE">
+ <label>Remove</label>
+ </object>
+ <flag>wxALIGN_CENTER_VERTICAL|wxALL</flag>
+ <border>4</border>
+ </object>
+ </object>
+ <flag>wxALL|wxGROW|wxALIGN_CENTRE</flag>
+ <border>3</border>
+ </object>
+ <object class="sizeritem">
+ <object class="wxFlexGridSizer">
+ <cols>2</cols>
+ <rows>2</rows>
+ <vgap>5</vgap>
+ <hgap>5</hgap>
+ <growablecols>1</growablecols>
+ <object class="sizeritem">
+ <object class="wxStaticText" name="stVarname">
+ <label>Variable Name</label>
+ </object>
+ <flag>wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+ <border>4</border>
+ </object>
+ <object class="sizeritem">
+ <object class="ctlComboBox" name="cbVarname">
+ <content/>
+ <style>wxCB_DROPDOWN</style>
+ </object>
+ <flag>wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+ <border>4</border>
+ </object>
+ <object class="sizeritem">
+ <object class="wxStaticText" name="stValue">
+ <label>Variable Value</label>
+ </object>
+ <flag>wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+ <border>4</border>
+ </object>
+ <object class="sizeritem">
+ <object class="wxFlexGridSizer">
+ <cols>2</cols>
+ <rows>1</rows>
+ <vgap>5</vgap>
+ <hgap>5</hgap>
+ <growablecols>0,1</growablecols>
+ <object class="sizeritem">
+ <object class="wxTextCtrl" name="txtValue">
+ </object>
+ <flag>wxEXPAND|wxALIGN_CENTER_VERTICAL</flag>
+ </object>
+ <object class="sizeritem">
+ <object class="wxCheckBox" name="chkValue">
+ <label></label>
+ </object>
+ <flag>wxEXPAND|wxALIGN_CENTER_VERTICAL</flag>
+ </object>
+ <flag>wxEXPAND|wxALIGN_CENTER_VERTICAL</flag>
+ </object>
+ <flag>wxALL|wxGROW|wxALIGN_CENTRE</flag>
+ <border>4</border>
+ </object>
+ </object>
+ <flag>wxGROW</flag>
+ </object>
+ </object>
+ </object>
+ </object>
</object>
<flag>wxALL|wxGROW|wxALIGN_CENTRE</flag>
<border>3</border>
--
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers