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

Reply via email to