Hi,
Please find the updated patch.
Some thoughts (all minor), in no particular order:
- Let's use 'Collation' and 'Character type' in both the properties
list view and on the dialog for the labels - it'll look much nicer
than COLLATE and CTYPE I think.
Done.
- dlgDatabase needs to have it's sizing fixed - the cell holding the
CTYPE controls is stretching, but it should be the comment cell that
stretches (<growablerows> needs to change to 11 perhaps?).
Changed <growablerows> to 11.
- Entering a new connection limit, and clicking the SQL tab doesn't
show me an SQL statement if the value entered is too large, but does
enable the OK button The easiest fix is probably to limit the number
of characters the control will access. That should still allow a huge
number to entered.
Maximum number allowed will be 2147483647.
Datatype for the datconnlimit is integer.
- Entering a connection limit of -<anything but 1> is silently
converted to 1. We should just ignore anything that isn't 1, rather
than trying to correct it for the user.
Done.
- 'Connection Limit' in the properties list should not have a capital L.
Done.
- This code in dlgDatabase may be uneeded now?
+ // As some of the controls has been made hidden,
+ // Update() will help to rearrange all the other controls properly.
+ this->Update();
Done.
- The COLLATE and CTYPE options should be omitted from the CREATE
DATBASE SQL generated by dlgDatabase, if the user hasn't specified
values.
Done.
- The CONNECTION LIMIT option seems to have an additional space in the indent:
CREATE DATABASE foobar
WITH ENCODING='UTF8'
COLLATE=''
CTYPE=''
CONNECTION LIMIT=99;
Done.
Regards,
Ashesh
Index: include/parser/keywords.h
===================================================================
--- include/parser/keywords.h (revision 7499)
+++ include/parser/keywords.h (working copy)
@@ -437,6 +437,7 @@
POSTFIXOP = 643,
UMINUS = 644,
TYPECAST = 645,
+ CTYPE=646,
/* The following additions are keywords in EnterpriseDB */
CONNECT_EDB = 800,
Index: include/schema/pgDatabase.h
===================================================================
--- include/schema/pgDatabase.h (revision 7499)
+++ include/schema/pgDatabase.h (working copy)
@@ -67,6 +67,12 @@
void iSetEncoding(const wxString& newVal) { encoding = newVal; }
wxString GetSchemaRestriction() { return schemaRestriction; }
void iSetSchemaRestriction(const wxString &s) { schemaRestriction = s; }
+ wxString GetCollate() const { return collate; }
+ void iSetCollate( const wxString& newVal) { collate = newVal; }
+ wxString GetCType() const { return ctype; }
+ void iSetCType( const wxString& newVal) { ctype = newVal; }
+ long GetConnectionLimit() { return connectionLimit; }
+ void iSetConnectionLimit(long newVal) { connectionLimit = newVal; }
wxArrayString& GetVariables() { return variables; }
bool GetAllowConnections() const { return allowConnections; }
@@ -111,10 +117,11 @@
pgConn *conn;
bool connected;
bool useServerConnection;
- wxString searchPath, path, tablespace, defaultTablespace, encoding;
+ wxString searchPath, path, tablespace, defaultTablespace, encoding, collate, ctype;
wxString prettyOption, defaultSchema;
bool allowConnections, createPrivilege;
long missingFKs;
+ long connectionLimit;
wxArrayString variables;
wxString schemaChanges;
Index: include/dlg/dlgDatabase.h
===================================================================
--- include/dlg/dlgDatabase.h (revision 7499)
+++ include/dlg/dlgDatabase.h (working copy)
@@ -46,6 +46,9 @@
void OnVarAdd(wxCommandEvent &ev);
void OnVarRemove(wxCommandEvent &ev);
void OnVarSelChange(wxListEvent &ev);
+ void OnCollateSelChange(wxCommandEvent &ev);
+ void OnCTypeSelChange(wxCommandEvent &ev);
+ void OnConnLimitChange(wxCommandEvent &ev);
void OnVarnameSelChange(wxCommandEvent &ev);
void OnOK(wxCommandEvent &ev);
Index: db/keywords.c
===================================================================
--- db/keywords.c (revision 7499)
+++ db/keywords.c (working copy)
@@ -107,6 +107,7 @@
{"createuser", CREATEUSER, UNRESERVED_KEYWORD},
{"cross", CROSS, TYPE_FUNC_NAME_KEYWORD},
{"csv", CSV, UNRESERVED_KEYWORD},
+ {"ctype", CTYPE, RESERVED_KEYWORD},
{"current", CURRENT_P, UNRESERVED_KEYWORD},
{"current_date", CURRENT_DATE, RESERVED_KEYWORD},
{"current_role", CURRENT_ROLE, RESERVED_KEYWORD},
Index: schema/pgDatabase.cpp
===================================================================
--- schema/pgDatabase.cpp (revision 7499)
+++ schema/pgDatabase.cpp (working copy)
@@ -338,6 +338,11 @@
{
if (sql.IsEmpty())
{
+ // If we can't connect to this database, use the maintenance DB
+ pgConn *myConn = GetConnection();
+ if (!myConn)
+ myConn = GetServer()->GetConnection();
+
sql = wxT("-- Database: ") + GetQuotedFullIdentifier() + wxT("\n\n")
+ wxT("-- DROP DATABASE ") + GetQuotedIdentifier() + wxT(";")
+ wxT("\n\nCREATE DATABASE ") + GetQuotedIdentifier()
@@ -345,7 +350,16 @@
+ wxT("\n ENCODING = ") + qtDbString(GetEncoding());
if (tablespace != defaultTablespace)
sql += wxT("\n TABLESPACE = ") + qtIdent(GetTablespace());
-
+ if (myConn && myConn->BackendMinimumVersion(8, 4))
+ {
+ sql += wxT("\n COLLATE = ") + qtDbString(GetCollate());
+ sql += wxT("\n CTYPE = ") + qtDbString(GetCType());
+ }
+ if (myConn && myConn->BackendMinimumVersion(8, 1))
+ {
+ sql += wxT("\n CONNECTION LIMIT = ");
+ sql << GetConnectionLimit();
+ }
sql += wxT(";\n");
size_t i;
@@ -353,11 +367,6 @@
sql += wxT("ALTER DATABASE ") + GetQuotedFullIdentifier()
+ wxT(" SET ") + variables.Item(i) + wxT(";\n");
- // If we can't connect to this database, use the maintenance DB
- pgConn *myConn = GetConnection();
- if (!myConn)
- myConn = GetServer()->GetConnection();
-
if (myConn)
{
if (!myConn->BackendMinimumVersion(8, 2))
@@ -431,6 +440,12 @@
}
properties->AppendItem(_("Encoding"), GetEncoding());
+ if (GetConnection() && GetConnection()->BackendMinimumVersion(8, 4))
+ {
+ properties->AppendItem(_("Collate"), GetCollate());
+ properties->AppendItem(_("Character type"), GetCType());
+ }
+
if (!defaultSchema.IsEmpty())
properties->AppendItem(_("Default schema"), defaultSchema);
@@ -442,6 +457,12 @@
}
properties->AppendItem(_("Allow connections?"), GetAllowConnections());
properties->AppendItem(_("Connected?"), GetConnected());
+ if (GetConnection() && GetConnection()->BackendMinimumVersion(8, 1))
+ {
+ wxString strConnLimit;
+ strConnLimit.Printf(wxT("%ld"), GetConnectionLimit());
+ properties->AppendItem(_("Connection limit"), strConnLimit);
+ }
properties->AppendItem(_("System database?"), GetSystemObject());
if (GetMissingFKs())
properties->AppendItem(_("Old style FKs"), GetMissingFKs());
@@ -474,6 +495,18 @@
pgSet *databases;
+ wxString datcollate, datctype, datconnlimit;
+
+ if (collection->GetConnection()->BackendMinimumVersion(8, 1))
+ {
+ datconnlimit = wxT(", db.datconnlimit as connectionlimit");
+ }
+ if (collection->GetConnection()->BackendMinimumVersion(8, 4))
+ {
+ datctype = wxT(", db.datctype as ctype");
+ datcollate = wxT(", db.datcollate as collate");
+ }
+
wxString restr=restriction;
if (!collection->GetServer()->GetDbRestriction().IsEmpty())
{
@@ -491,7 +524,8 @@
wxT("pg_encoding_to_char(encoding) AS serverencoding, pg_get_userbyid(datdba) AS datowner,")
wxT("has_database_privilege(db.oid, 'CREATE') as cancreate, \n")
wxT("current_setting('default_tablespace') AS default_tablespace, \n")
- wxT("descr.description\n")
+ wxT("descr.description\n") +
+ datconnlimit + datcollate + datctype +
wxT(" FROM pg_database db\n")
wxT(" LEFT OUTER JOIN pg_tablespace ta ON db.dattablespace=ta.OID\n")
wxT(" LEFT OUTER JOIN ")
@@ -540,6 +574,16 @@
else
database->iSetPath(databases->GetVal(wxT("datpath")));
+ if (collection->GetConnection()->BackendMinimumVersion(8, 1))
+ {
+ database->iSetConnectionLimit(databases->GetLong(wxT("connectionlimit")));
+ }
+ if (collection->GetConnection()->BackendMinimumVersion(8, 4))
+ {
+ database->iSetCollate(databases->GetVal(wxT("collate")));
+ database->iSetCType(databases->GetVal(wxT("ctype")));
+ }
+
if (collection->GetServer()->GetServerIndex())
{
wxString value;
Index: dlg/dlgDatabase.cpp
===================================================================
--- dlg/dlgDatabase.cpp (revision 7499)
+++ dlg/dlgDatabase.cpp (working copy)
@@ -11,6 +11,8 @@
// wxWindows headers
#include <wx/wx.h>
+#include <wx/generic/spinctlg.h>
+#include <wx/spinbutt.h>
// App headers
#include "pgAdmin3.h"
@@ -34,8 +36,10 @@
#define chkValue CTRL_CHECKBOX("chkValue")
#define btnAdd CTRL_BUTTON("wxID_ADD")
#define btnRemove CTRL_BUTTON("wxID_REMOVE")
+#define cbCollate CTRL_COMBOBOX2("cbCollate")
+#define cbCType CTRL_COMBOBOX2("cbCType")
+#define txtConnLimit CTRL_TEXT("txtConnLimit")
-
dlgProperty *pgDatabaseFactory::CreateDialog(frmMain *frame, pgObject *node, pgObject *parent)
{
dlgDatabase *dlg=new dlgDatabase(this, frame, (pgDatabase*)node);
@@ -61,6 +65,9 @@
EVT_TEXT(XRCID("cbVarname"), dlgDatabase::OnVarnameSelChange)
EVT_COMBOBOX(XRCID("cbVarname"), dlgDatabase::OnVarnameSelChange)
EVT_BUTTON(wxID_OK, dlgDatabase::OnOK)
+ EVT_TEXT(XRCID("cbCollate"), dlgDatabase::OnCollateSelChange)
+ EVT_TEXT(XRCID("cbCType"), dlgDatabase::OnCTypeSelChange)
+ EVT_TEXT(XRCID("txtConnLimit"), dlgDatabase::OnConnLimitChange)
#ifdef __WXMAC__
EVT_SIZE( dlgDatabase::OnChangeSize)
#endif
@@ -114,6 +121,19 @@
cbTablespace->Hide();
}
+ if (!connection->BackendMinimumVersion(8,1))
+ {
+ txtConnLimit->Disable();
+ }
+ else
+ txtConnLimit->SetValidator(numericValidator);
+
+ if (!connection->BackendMinimumVersion(8,4))
+ {
+ cbCollate->Disable();
+ cbCType->Disable();
+ }
+
pgSet *set;
if (connection->BackendMinimumVersion(7, 4))
set=connection->ExecuteSet(wxT("SELECT name, vartype, min_val, max_val\n")
@@ -173,8 +193,25 @@
cbEncoding->Append(database->GetEncoding());
cbEncoding->SetSelection(0);
+ if (connection->BackendMinimumVersion(8,1))
+ {
+ wxString strConnLimit;
+ strConnLimit.Printf(wxT("%ld"), database->GetConnectionLimit());
+ txtConnLimit->SetValue(strConnLimit);
+ }
+
+ if (connection->BackendMinimumVersion(8, 4))
+ {
+ cbCollate->Append(database->GetCollate());
+ cbCollate->SetSelection(0);
+ cbCType->Append(database->GetCType());
+ cbCType->SetSelection(0);
+ }
+
cbTemplate->Disable();
cbEncoding->Disable();
+ cbCollate->Disable();
+ cbCType->Disable();
txtSchemaRestr->SetValue(database->GetSchemaRestriction());
}
@@ -194,6 +231,26 @@
FillCombobox(wxT("SELECT datname FROM pg_database ORDER BY datname"), cbTemplate);
cbTemplate->SetSelection(0);
+ if (connection->BackendMinimumVersion(8,4))
+ {
+ FillCombobox(wxT("select DISTINCT(datctype) from pg_database UNION SELECT DISTINCT(datcollate) from pg_database"), cbCollate, cbCType);
+ if (cbCollate->FindString(wxT("C")) < 0)
+ {
+ cbCollate->AppendString(wxT("C"));
+ cbCType->AppendString(wxT("C"));
+ }
+ if (cbCollate->FindString(wxT("POSIX")) < 0)
+ {
+ cbCollate->AppendString(wxT("POSIX"));
+ cbCType->AppendString(wxT("POSIX"));
+ }
+ }
+ if (connection->BackendMinimumVersion(8,1))
+ {
+ txtConnLimit->SetValue(wxT("-1"));
+ }
+
+
long encNo=0;
wxString encStr;
do
@@ -308,11 +365,17 @@
if (database)
{
+ long connLimit;
+ if (!txtConnLimit->GetValue().ToLong(&connLimit))
+ connLimit = database->GetConnectionLimit();
+ if (connLimit < -1)
+ connLimit = -1;
enable = txtSchemaRestr->GetValue() != database->GetSchemaRestriction()
|| txtComment->GetValue() != database->GetComment()
|| txtName->GetValue() != database->GetName()
|| cbOwner->GetValue() != database->GetOwner()
|| cbTablespace->GetValue() != database->GetTablespace()
+ || connLimit != database->GetConnectionLimit()
|| dirtyVars;
}
@@ -330,6 +393,56 @@
SetupVarEditor(sel);
}
+void dlgDatabase::OnCollateSelChange(wxCommandEvent &ev)
+{
+ cbCollate->GuessSelection(ev);
+}
+
+void dlgDatabase::OnCTypeSelChange(wxCommandEvent &ev)
+{
+ cbCType->GuessSelection(ev);
+}
+
+void dlgDatabase::OnConnLimitChange(wxCommandEvent &ev)
+{
+ if (ev.GetEventType() == wxEVT_COMMAND_TEXT_UPDATED)
+ {
+ wxString strConnLimit = txtConnLimit->GetValue();
+ long val = 0;
+ if (strConnLimit.ToLong(&val))
+ {
+ CheckChange();
+ }
+ else if (strConnLimit.Contains(wxT(".")))
+ {
+ double val;
+
+ // Stop Propagation of the event to the parents
+ ev.StopPropagation();
+ if (strConnLimit.ToDouble(&val))
+ {
+ strConnLimit.Printf(wxT("%ld"), (long)val);
+ txtConnLimit->SetValue(strConnLimit);
+ txtConnLimit->SetInsertionPointEnd();
+ return;
+ }
+ }
+ else if (strConnLimit.length() > 9)
+ {
+ // Maximum value support is 2147483647
+ wxString newVal = strConnLimit.substr(0, 10);
+ if (!newVal.ToLong(&val))
+ {
+ newVal = strConnLimit.substr(0,9);
+ }
+ ev.StopPropagation();
+ txtConnLimit->SetValue(newVal);
+ txtConnLimit->SetInsertionPointEnd();
+ return;
+ }
+ }
+}
+
void dlgDatabase::SetupVarEditor(int var)
{
if (var >= 0 && varInfo.Count() > 0)
@@ -438,7 +551,29 @@
+ wxT(" SET TABLESPACE ") + qtIdent(cbTablespace->GetValue())
+ wxT(";\n");
}
+ if (connection->BackendMinimumVersion(8, 1))
+ {
+ long connLimit;
+ if (txtConnLimit->GetValue().IsEmpty())
+ connLimit = -1;
+ else if (!txtConnLimit->GetValue().ToLong(&connLimit))
+ connLimit = database->GetConnectionLimit();
+
+ if (connLimit < -1)
+ connLimit = -1;
+
+ if (connLimit != database->GetConnectionLimit())
+ {
+ wxString strConnLimit;
+ strConnLimit << connLimit;
+ sql += wxT("ALTER DATABASE ") + qtIdent(name)
+ + wxT(" WITH CONNECTION LIMIT = ")
+ + strConnLimit
+ + wxT(";\n");
+ }
+ }
+
if (!connection->BackendMinimumVersion(8, 2))
sql += GetGrant(wxT("CT"), wxT("DATABASE ") + qtIdent(name));
else
@@ -498,6 +633,19 @@
AppendIfFilled(sql, wxT("\n OWNER="), qtIdent(cbOwner->GetValue()));
AppendIfFilled(sql, wxT("\n TEMPLATE="), qtIdent(cbTemplate->GetValue()));
AppendIfFilled(sql, wxT("\n LOCATION="), txtPath->GetValue());
+ if (connection->BackendMinimumVersion(8,4))
+ {
+ wxString strCollate = cbCollate->GetValue();
+ if (!strCollate.IsEmpty())
+ AppendIfFilled(sql, wxT("\n COLLATE="), qtDbString(strCollate));
+ wxString strCType = cbCType->GetValue();
+ if (!strCType.IsEmpty())
+ AppendIfFilled(sql, wxT("\n CTYPE="), qtDbString(strCType));
+ }
+ if (connection->BackendMinimumVersion(8,1))
+ {
+ AppendIfFilled(sql, wxT("\n CONNECTION LIMIT="), (txtConnLimit->GetValue() == wxT("-") ? wxT("-1") : txtConnLimit->GetValue()));
+ }
if (cbTablespace->GetCurrentSelection() > 0 && cbTablespace->GetOIDKey() > 0)
sql += wxT("\n TABLESPACE=") + qtIdent(cbTablespace->GetValue());
Index: ui/dlgDatabase.xrc
===================================================================
--- ui/dlgDatabase.xrc (revision 7499)
+++ ui/dlgDatabase.xrc (working copy)
@@ -2,7 +2,7 @@
<resource>
<object class="wxDialog" name="dlgDatabase">
<title></title>
- <size>218,260d</size>
+ <size>218,280d</size>
<style>wxDEFAULT_DIALOG_STYLE|wxCAPTION|wxSYSTEM_MENU|wxRESIZE_BORDER|wxRESIZE_BOX|wxTHICK_FRAME</style>
<object class="wxFlexGridSizer">
<cols>1</cols>
@@ -17,10 +17,10 @@
<object class="wxPanel" name="pnlProperties">
<object class="wxFlexGridSizer">
<cols>2</cols>
- <rows>9</rows>
+ <rows>11</rows>
<vgap>5</vgap>
<hgap>5</hgap>
- <growablerows>8</growablerows>
+ <growablerows>11</growablerows>
<growablecols>1</growablecols>
<object class="sizeritem">
<object class="wxStaticText" name="stName">
@@ -135,6 +135,51 @@
<border>4</border>
</object>
<object class="sizeritem">
+ <object class="wxStaticText" name="stCollate">
+ <label>Collate</label>
+ </object>
+ <flag>wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+ <border>4</border>
+ </object>
+ <object class="sizeritem">
+ <object class="ctlComboBox" name="cbCollate">
+ <content/>
+ <style>wxCB_DROPDOWN|wxCB_SORT</style>
+ </object>
+ <flag>wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+ <border>4</border>
+ </object>
+ <object class="sizeritem">
+ <object class="wxStaticText" name="stCType">
+ <label>CTYPE</label>
+ </object>
+ <flag>wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+ <border>4</border>
+ </object>
+ <object class="sizeritem">
+ <object class="ctlComboBox" name="cbCType">
+ <content/>
+ <style>wxCB_DROPDOWN|wxCB_SORT</style>
+ </object>
+ <flag>wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+ <border>4</border>
+ </object>
+ <object class="sizeritem">
+ <object class="wxStaticText" name="stConnLimit">
+ <label>Connection Limit</label>
+ </object>
+ <flag>wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+ <border>4</border>
+ </object>
+ <object class="sizeritem">
+ <object class="wxTextCtrl" name="txtConnLimit">
+ <content/>
+ <min>-1</min>
+ </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>
@@ -144,6 +189,7 @@
<object class="sizeritem">
<object class="wxTextCtrl" name="txtComment">
<style>wxTE_MULTILINE</style>
+ <size>60,60d</size>
</object>
<flag>wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL</flag>
<border>4</border>
--
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers