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