Hi,

This new column replaces the attdistinct one. So I add to undo my
previous patch (see http://code.pgadmin.org/trac/ticket/95) and work on
the new syntax.

AFAICT, it works well on Linux. The behaviour should be the same on
other platforms.

Comments?


-- 
Guillaume.
 http://www.postgresqlfr.org
 http://dalibo.com
diff --git a/pgadmin/dlg/dlgColumn.cpp b/pgadmin/dlg/dlgColumn.cpp
index e9f65c2..8f607ab 100644
--- a/pgadmin/dlg/dlgColumn.cpp
+++ b/pgadmin/dlg/dlgColumn.cpp
@@ -31,7 +31,12 @@
 #define txtDefault          CTRL_TEXT("txtDefault")
 #define chkNotNull          CTRL_CHECKBOX("chkNotNull")
 #define txtAttstattarget    CTRL_TEXT("txtAttstattarget")
-#define txtAttdistinct      CTRL_TEXT("txtAttdistinct")
+#define lstVariables        CTRL_LISTVIEW("lstVariables")
+#define cbVarname           CTRL_COMBOBOX2("cbVarname")
+#define txtValue            CTRL_TEXT("txtValue")
+#define btnAdd              CTRL_BUTTON("wxID_ADD")
+#define btnRemove           CTRL_BUTTON("wxID_REMOVE")
+
 
 BEGIN_EVENT_TABLE(dlgColumn, dlgTypeProperty)
     EVT_TEXT(XRCID("txtLength"),                    dlgProperty::OnChange)
@@ -39,11 +44,16 @@ BEGIN_EVENT_TABLE(dlgColumn, dlgTypeProperty)
     EVT_TEXT(XRCID("txtDefault"),                   dlgProperty::OnChange)
     EVT_CHECKBOX(XRCID("chkNotNull"),               dlgProperty::OnChange)
     EVT_TEXT(XRCID("txtAttstattarget"),             dlgProperty::OnChange)
-    EVT_TEXT(XRCID("txtAttdistinct"),             dlgProperty::OnChange)
     EVT_TEXT(XRCID("cbDatatype"),                   dlgColumn::OnSelChangeTyp)
     EVT_COMBOBOX(XRCID("cbDatatype"),               dlgColumn::OnSelChangeTyp)
     EVT_BUTTON(CTL_ADDPRIV,                         dlgColumn::OnAddPriv)
     EVT_BUTTON(CTL_DELPRIV,                         dlgColumn::OnDelPriv)
+    EVT_LIST_ITEM_SELECTED(XRCID("lstVariables"),   dlgColumn::OnVarSelChange)
+    EVT_BUTTON(wxID_ADD,                            dlgColumn::OnVarAdd)
+    EVT_BUTTON(wxID_REMOVE,                         dlgColumn::OnVarRemove)
+    EVT_TEXT(XRCID("cbVarname"),                    dlgColumn::OnVarnameSelChange)
+    EVT_COMBOBOX(XRCID("cbVarname"),                dlgColumn::OnVarnameSelChange)
+
 #ifdef __WXMAC__
     EVT_SIZE(                                       dlgColumn::OnChangeSize)
 #endif
@@ -64,8 +74,8 @@ dlgColumn::dlgColumn(pgaFactory *f, frmMain *frame, pgColumn *node, pgTable *par
     wxASSERT(!table || (table->GetMetaType() == PGM_TABLE || table->GetMetaType() == PGM_VIEW || table->GetMetaType() == GP_EXTTABLE || table->GetMetaType() == GP_PARTITION));
 
     txtAttstattarget->SetValidator(numericValidator);
-    if (connection && connection->BackendMinimumVersion(8, 5))
-        txtAttdistinct->SetValidator(numericValidator);
+
+    lstVariables->CreateColumns(0, _("Variable"), _("Value"));
 
     /* Column Level Privileges */
     securityChanged=false;
@@ -199,6 +209,20 @@ int dlgColumn::Go(bool modal)
         securityPage->lbPrivileges->GetParent()->Layout();
     }
     
+    if (connection->BackendMinimumVersion(8, 5))
+    {
+        cbVarname->Append(wxT("n_distinct"));
+        cbVarname->Append(wxT("n_distinct_inherited"));
+        cbVarname->SetSelection(0);
+    }
+    else
+    {
+        lstVariables->Enable(false);
+        btnAdd->Enable(false);
+        btnRemove->Enable(false);
+        cbVarname->Enable(false);
+        txtValue->Enable(false);
+    }
 
     if (column)
     {
@@ -210,8 +234,6 @@ int dlgColumn::Go(bool modal)
         txtDefault->SetValue(column->GetDefault());
         chkNotNull->SetValue(column->GetNotNull());
         txtAttstattarget->SetValue(NumToStr(column->GetAttstattarget()));
-        if (connection && connection->BackendMinimumVersion(8, 5))
-            txtAttdistinct->SetValue(NumToStr(column->GetAttdistinct()));
 
         wxString fullType = column->GetRawTypename();
         if (column->GetIsArray())
@@ -259,7 +281,6 @@ int dlgColumn::Go(bool modal)
             txtLength->Disable();
             cbDatatype->Disable();
             txtAttstattarget->Disable();
-            txtAttdistinct->Disable();
         }
         else if (column->GetTable()->GetMetaType() == PGM_VIEW) // Disable controls not valid for view columns
         {
@@ -268,7 +289,6 @@ int dlgColumn::Go(bool modal)
             txtLength->Disable();
             cbDatatype->Disable();
             txtAttstattarget->Disable();
-            txtAttdistinct->Disable();
         }
          else if (column->GetTable()->GetMetaType() == GP_EXTTABLE) // Disable controls not valid for external table columns
         {
@@ -277,9 +297,16 @@ int dlgColumn::Go(bool modal)
             txtLength->Disable();
             cbDatatype->Disable();
             txtAttstattarget->Disable();
-            txtAttdistinct->Disable();
             txtDefault->Disable();
         }
+
+        size_t i;
+        for (i=0 ; i < column->GetVariables().GetCount() ; i++)
+        {
+            wxString item=column->GetVariables().Item(i);
+            lstVariables->AppendItem(0, item.BeforeFirst('='), item.AfterFirst('='));
+        }
+
     }
     else
     {
@@ -297,7 +324,6 @@ int dlgColumn::Go(bool modal)
         }
 
         txtAttstattarget->Disable();
-        txtAttdistinct->Disable();
         txtComment->Disable();
     }
     return dlgTypeProperty::Go(modal);
@@ -399,19 +425,49 @@ wxString dlgColumn::GetSql()
                     sql += wxT(" SET STATISTICS ") + txtAttstattarget->GetValue();
                 sql += wxT(";\n");
             }
-            if (connection->BackendMinimumVersion(8, 5))
+
+            wxArrayString vars;
+            size_t index;
+
+            for (index = 0 ; index < column->GetVariables().GetCount() ; index++)
+                vars.Add(column->GetVariables().Item(index));
+
+            int cnt=lstVariables->GetItemCount();
+            int pos;
+
+            // check for changed or added vars
+            for (pos=0 ; pos < cnt ; pos++)
             {
-                if (txtAttdistinct->GetValue() != NumToStr(column->GetAttdistinct()))
+                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 TABLE ") + table->GetQuotedFullIdentifier()
-                        +  wxT("\n   ALTER COLUMN ") + qtIdent(name);
-                    if (txtAttdistinct->GetValue().IsEmpty())
-                        sql += wxT(" SET STATISTICS DISTINCT 0");
-                    else
-                        sql += wxT(" SET STATISTICS DISTINCT ") + txtAttdistinct->GetValue();
-                    sql += wxT(";\n");
+                        +  wxT("\n   ALTER COLUMN ") + qtIdent(name)
+                        +  wxT("\n   SET (") + newVar +  wxT("=") + newVal + wxT(");\n");
                 }
             }
+            
+            // check for removed vars
+            for (pos=0 ; pos < (int)vars.GetCount() ; pos++)
+            {
+                sql += wxT("ALTER TABLE ") + table->GetQuotedFullIdentifier()
+                    +  wxT("\n   ALTER COLUMN ") + qtIdent(name)
+                    +  wxT("\n   RESET (") + vars.Item(pos).BeforeFirst('=') + wxT(");\n");
+            }
         }
         else
         {
@@ -433,13 +489,13 @@ wxString dlgColumn::GetSql()
                     + wxT(" SET STATISTICS ") + txtAttstattarget->GetValue()
                     + wxT(";\n");
 
-            if (connection->BackendMinimumVersion(8, 5))
+            // check for added vars
+            for (int pos=0 ; pos < lstVariables->GetItemCount() ; pos++)
             {
-                if (!txtAttdistinct->GetValue().IsEmpty())
-                    sql += wxT("ALTER TABLE ") + table->GetQuotedFullIdentifier()
-                        + wxT("\n   ALTER COLUMN ") + qtIdent(name)
-                        + wxT(" SET DISTINCT ") + txtAttdistinct->GetValue()
-                        + wxT(";\n");
+                sql += wxT("ALTER TABLE ") + table->GetQuotedFullIdentifier()
+                    +  wxT("\n   ALTER COLUMN ") + qtIdent(name)
+                    +  wxT("\n   SET (") + lstVariables->GetText(pos) +  wxT("=")
+                    +  lstVariables->GetText(pos, 1)+  wxT(");\n");
             }
         }
 
@@ -527,7 +583,7 @@ void dlgColumn::CheckChange()
                     || (isVarLen && varlen != column->GetLength())
                     || (isVarPrec && varprec != column->GetPrecision())
                     || txtAttstattarget->GetValue() != NumToStr(column->GetAttstattarget())
-                    || txtAttdistinct->GetValue() != NumToStr(column->GetAttdistinct());
+                    || dirtyVars;
 
         EnableOK(enable | securityChanged);
     }
@@ -565,3 +621,55 @@ void dlgColumn::OnDelPriv(wxCommandEvent &ev)
     CheckChange();
 }
 
+void dlgColumn::OnVarnameSelChange(wxCommandEvent &ev)
+{
+    int sel=cbVarname->GuessSelection(ev);
+}
+
+void dlgColumn::OnVarSelChange(wxListEvent &ev)
+{
+    long pos=lstVariables->GetSelection();
+    if (pos >= 0)
+    {
+        wxString value=lstVariables->GetText(pos, 1);
+        cbVarname->SetValue(lstVariables->GetText(pos));
+        int sel = cbVarname->FindString(lstVariables->GetText(pos));
+        txtValue->SetValue(value);
+    }
+}
+
+
+void dlgColumn::OnVarAdd(wxCommandEvent &ev)
+{
+    wxString name = cbVarname->GetValue();
+    wxString 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 dlgColumn::OnVarRemove(wxCommandEvent &ev)
+{
+    if (lstVariables->GetSelection() >= 0)
+    {
+        lstVariables->DeleteCurrentItem();
+        dirtyVars = true;
+        CheckChange();
+    }
+}
+
diff --git a/pgadmin/include/dlg/dlgColumn.h b/pgadmin/include/dlg/dlgColumn.h
index 6c59e21..c9faa70 100644
--- a/pgadmin/include/dlg/dlgColumn.h
+++ b/pgadmin/include/dlg/dlgColumn.h
@@ -57,9 +57,18 @@ protected:
     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);
+
 private:
     pgColumn *column;
     pgTable *table;
+    wxArrayString varInfo; 
+    bool dirtyVars; 
+
     void OnSelChangeTyp(wxCommandEvent &ev);
  
     wxString previousDefinition;
diff --git a/pgadmin/include/schema/pgColumn.h b/pgadmin/include/schema/pgColumn.h
index 070783d..a8273f8 100644
--- a/pgadmin/include/schema/pgColumn.h
+++ b/pgadmin/include/schema/pgColumn.h
@@ -83,14 +83,13 @@ public:
     void iSetAttTypId(const OID o) { attTypId =o; }
     long GetAttstattarget() const { return attstattarget; }
     void iSetAttstattarget(const long l) { attstattarget=l; }
-    long GetAttdistinct() const { return attdistinct; }
-    void iSetAttdistinct(const long l) { attdistinct=l; }
     wxString GetSerialSequence() const { return serialSequence; }
     void iSetSerialSequence(const wxString &s) { serialSequence=s; }
     wxString GetSerialSchema() const { return serialSchema; }
     void iSetSerialSchema(const wxString &s) { serialSchema=s; }
     void iSetPkCols(const wxString &s) { pkCols = s; }
     void iSetIsFK(const bool b) { isFK = b; }
+    wxArrayString& GetVariables() { return variables; }
 
     bool DropObject(wxFrame *frame, ctlTree *browser, bool cascaded);
     bool GetSystemObject() const { return colNumber < 0; }
@@ -110,11 +109,12 @@ public:
 private:
     wxString varTypename, quotedTypename, defaultVal, tableName, quotedFullTable, storage, rawTypename;
     wxString serialSequence, serialSchema, pkCols, inheritedTableName;
-    long colNumber, length, precision, statistics, attstattarget, attdistinct;
+    long colNumber, length, precision, statistics, attstattarget;
     long typlen, typmod, inheritedCount;
     bool isPK, isFK, notNull, isArray, isLocal;
     OID attTypId;
     int isReferenced;
+    wxArrayString variables;
 };
 
 #endif
diff --git a/pgadmin/schema/pgColumn.cpp b/pgadmin/schema/pgColumn.cpp
index ea88c91..b04fdd7 100644
--- a/pgadmin/schema/pgColumn.cpp
+++ b/pgadmin/schema/pgColumn.cpp
@@ -120,10 +120,12 @@ wxString pgColumn::GetSql(ctlTree *browser)
                     sql += wxT("ALTER TABLE ") + GetQuotedFullTable()
                         + wxT(" ALTER COLUMN ") + GetQuotedIdentifier()
                         + wxT(" SET STATISTICS ") + NumToStr(GetAttstattarget()) + wxT(";\n");
-                if (database->BackendMinimumVersion(8, 5) && GetAttdistinct() >= 0)
+
+                size_t i;
+                for (i=0 ; i < variables.GetCount() ; i++)
                     sql += wxT("ALTER TABLE ") + GetQuotedFullTable()
                         + wxT(" ALTER COLUMN ") + GetQuotedIdentifier()
-                        + wxT(" SET STATISTICS DISTINCT ") + NumToStr(GetAttdistinct()) + wxT(";\n");
+                        + wxT(" SET (") + variables.Item(i) + wxT(");\n");
 
                 sql += GetCommentSql();
 
@@ -318,10 +320,12 @@ void pgColumn::ShowTreeDetail(ctlTree *browser, frmMain *form, ctlListView *prop
                     properties->AppendItem(_("Inherited"), false);
                 }
                 properties->AppendItem(_("Statistics"), GetAttstattarget());
-                if (database->BackendMinimumVersion(8, 5))
-                    properties->AppendItem(_("Distincts"), GetAttdistinct());
-
-
+                size_t i;
+                for (i=0 ; i < variables.GetCount() ; i++)
+                {
+                    wxString item=variables.Item(i);
+                    properties->AppendItem(item.BeforeFirst('='), item.AfterFirst('='));
+                }
                 properties->AppendItem(_("System column?"), GetSystemObject());
             }
         }
@@ -387,7 +391,7 @@ pgObject *pgColumnFactory::CreateObjects(pgCollection *coll, ctlTree *browser, c
     if (database->BackendMinimumVersion(8, 5))
         sql += 
             wxT(",\n")
-            wxT("  attdistinct");
+            wxT("  attoptions");
     if (database->BackendMinimumVersion(7, 4))
         sql += 
             wxT(",\n")
@@ -464,7 +468,11 @@ pgObject *pgColumnFactory::CreateObjects(pgCollection *coll, ctlTree *browser, c
             column->iSetIsLocal(columns->GetBool(wxT("attislocal")));
             column->iSetAttstattarget(columns->GetLong(wxT("attstattarget")));
             if (database->BackendMinimumVersion(8, 5))
-                column->iSetAttdistinct(columns->GetLong(wxT("attdistinct")));
+            {
+                wxString str=columns->GetVal(wxT("attoptions"));
+                if (!str.IsEmpty())
+                    FillArray(column->GetVariables(), str.Mid(1, str.Length()-2));
+            }
             if (database->BackendMinimumVersion(8, 4))
                 column->iSetAcl(columns->GetVal(wxT("attacl")));
 
diff --git a/pgadmin/ui/dlgColumn.xrc b/pgadmin/ui/dlgColumn.xrc
index a0a0983..7400e77 100644
--- a/pgadmin/ui/dlgColumn.xrc
+++ b/pgadmin/ui/dlgColumn.xrc
@@ -117,19 +117,6 @@
                   <border>4</border>
                 </object>
                 <object class="sizeritem">
-                  <object class="wxStaticText" name="stAttdistinct">
-                    <label>Distincts</label>
-                  </object>
-                  <flag>wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
-                  <border>4</border>
-                </object>
-                <object class="sizeritem">
-                  <object class="wxTextCtrl" name="txtAttdistinct">
-                  </object>
-                  <flag>wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
-                  <border>4</border>
-                </object>
-                <object class="sizeritem">
                   <object class="wxStaticText" name="stComment">
                     <label>Comment</label>
                   </object>
@@ -161,6 +148,88 @@
               </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="wxTextCtrl" name="txtValue">
+                      </object>
+                      <flag>wxEXPAND|wxALIGN_CENTER_VERTICAL</flag>
+                    </object>
+                  </object>
+                  <flag>wxGROW</flag>
+                </object>
+              </object>
+            </object>
+          </object>
         </object>
         <flag>wxEXPAND|wxALIGN_CENTRE|wxALL</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