Le 12/03/2011 10:37, Guillaume Lelarge a écrit : > Le 06/03/2011 12:15, Christopher Head a écrit : >> On Sat, 05 Mar 2011 20:30:42 +0100 >> Guillaume Lelarge <guilla...@lelarge.info> wrote: >> >>> Hi, >>> >>> Le 02/03/2011 07:45, Christopher Head a écrit : >>>> [...] >>>> I'd like to request the ability to set hostaddr separately from host >>>> when creating a server connection. This is currently impossible. >>> >>> Could you remind me why this would be interesting? AFAIR, they are >>> pretty much the same thing, aren't they? >>> >> >> Use case: "host" is set to the actual name of the database server so it >> can fully verify an SSL certificate, "hostaddr" is set to the IP >> address of some box acting as a tunnel without which a connection to >> the database server is impossible. I'm sure there are others, but >> that's mine. >> > > OK, I created a ticket to work on it later. >
See patch attached. If you can test it, it would be great. -- Guillaume http://www.postgresql.fr http://dalibo.com
>From e870e09eba8ad3746dc8d701e7e2bdd6fb9fd760 Mon Sep 17 00:00:00 2001 From: Guillaume Lelarge <guilla...@lelarge.info> Date: Sat, 2 Apr 2011 16:59:11 +0200 Subject: [PATCH] Handle hostaddr connection parameter --- pgadmin/db/pgConn.cpp | 10 ++++++++-- pgadmin/dlg/dlgSelectConnection.cpp | 4 ++-- pgadmin/dlg/dlgServer.cpp | 9 ++++++++- pgadmin/frm/frmMain.cpp | 1 + pgadmin/frm/frmStatus.cpp | 6 ++++-- pgadmin/include/db/pgConn.h | 8 ++++++-- pgadmin/include/schema/pgServer.h | 12 ++++++++++-- pgadmin/pgscript/pgsApplication.cpp | 2 +- pgadmin/schema/pgRole.cpp | 1 + pgadmin/schema/pgServer.cpp | 21 ++++++++++++--------- pgadmin/ui/dlgServer.xrc | 14 +++++++++++++- 11 files changed, 66 insertions(+), 22 deletions(-) diff --git a/pgadmin/db/pgConn.cpp b/pgadmin/db/pgConn.cpp index 4bce7ad..60164ae 100644 --- a/pgadmin/db/pgConn.cpp +++ b/pgadmin/db/pgConn.cpp @@ -49,13 +49,14 @@ static void pgNoticeProcessor(void *arg, const char *message) ((pgConn *)arg)->Notice(message); } -pgConn::pgConn(const wxString &server, const wxString &database, const wxString &username, const wxString &password, +pgConn::pgConn(const wxString &server, const wxString &hostaddr, const wxString &database, const wxString &username, const wxString &password, int port, const wxString &rolename, int sslmode, OID oid, const wxString &applicationname, const wxString &sslcert, const wxString &sslkey, const wxString &sslrootcert, const wxString &sslcrl) { wxString msg; save_server = server; + save_hostaddr = hostaddr; save_database = database; save_username = username; save_password = password; @@ -87,6 +88,11 @@ pgConn::pgConn(const wxString &server, const wxString &database, const wxString connstr.Append(wxT(" host=")); connstr.Append(qtConnString(server)); } + if (!hostaddr.IsEmpty()) + { + connstr.Append(wxT(" hostaddr=")); + connstr.Append(qtConnString(hostaddr)); + } if (!database.IsEmpty()) { connstr.Append(wxT(" dbname=")); @@ -330,7 +336,7 @@ bool pgConn::Reconnect() pgConn *pgConn::Duplicate() { - return new pgConn(wxString(save_server), wxString(save_database), wxString(save_username), wxString(save_password), + return new pgConn(wxString(save_server), wxString(save_hostaddr), wxString(save_database), wxString(save_username), wxString(save_password), save_port, save_rolename, save_sslmode, save_oid, save_applicationname, save_sslcert, save_sslkey, save_sslrootcert, save_sslcrl); } diff --git a/pgadmin/dlg/dlgSelectConnection.cpp b/pgadmin/dlg/dlgSelectConnection.cpp index 0427f68..c4cdc0f 100644 --- a/pgadmin/dlg/dlgSelectConnection.cpp +++ b/pgadmin/dlg/dlgSelectConnection.cpp @@ -265,7 +265,7 @@ pgConn *dlgSelectConnection::CreateConn(wxString &applicationname, bool &created pgConn *dlgSelectConnection::CreateConn(wxString &server, wxString &dbname, wxString &username, int port, wxString &rolename, int sslmode, wxString &applicationname, bool writeMRU) { pgConn *newconn; - newconn = new pgConn(server, dbname, username, wxT(""), port, rolename, sslmode, 0, applicationname); + newconn = new pgConn(server, wxEmptyString, dbname, username, wxT(""), port, rolename, sslmode, 0, applicationname); if (newconn->GetStatus() != PGCONN_OK && newconn->GetLastError().Cmp(wxString(PQnoPasswordSupplied, wxConvUTF8)) == 0) { @@ -279,7 +279,7 @@ pgConn *dlgSelectConnection::CreateConn(wxString &server, wxString &dbname, wxSt if (dlg.Go() != wxID_OK) return NULL; - newconn = new pgConn(server, dbname, username, dlg.GetPassword(), port, rolename, sslmode, 0, applicationname); + newconn = new pgConn(server, wxEmptyString, dbname, username, dlg.GetPassword(), port, rolename, sslmode, 0, applicationname); } if (newconn) diff --git a/pgadmin/dlg/dlgServer.cpp b/pgadmin/dlg/dlgServer.cpp index e80512c..17df441 100644 --- a/pgadmin/dlg/dlgServer.cpp +++ b/pgadmin/dlg/dlgServer.cpp @@ -28,6 +28,7 @@ #include "schema/pgDatabase.h" // pointer to controls +#define txtHostAddr CTRL_TEXT("txtHostAddr") #define txtDescription CTRL_TEXT("txtDescription") #define txtService CTRL_TEXT("txtService") #define cbDatabase CTRL_COMBOBOX("cbDatabase") @@ -54,6 +55,7 @@ BEGIN_EVENT_TABLE(dlgServer, dlgProperty) EVT_NOTEBOOK_PAGE_CHANGED(XRCID("nbNotebook"), dlgServer::OnPageSelect) + EVT_TEXT(XRCID("txtHostAddr"), dlgProperty::OnChange) EVT_TEXT(XRCID("txtDescription"), dlgProperty::OnChange) EVT_TEXT(XRCID("txtService"), dlgProperty::OnChange) EVT_TEXT(XRCID("cbDatabase"), dlgProperty::OnChange) @@ -169,6 +171,7 @@ void dlgServer::OnOK(wxCommandEvent &ev) if (server) { server->iSetName(GetName()); + server->iSetHostAddr(txtHostAddr->GetValue()); server->iSetDescription(txtDescription->GetValue()); if (txtService->GetValue() != server->GetServiceID()) { @@ -205,6 +208,7 @@ void dlgServer::OnOK(wxCommandEvent &ev) // Duplicate server object pgServer *newserver = new pgServer( server->GetName(), + server->GetHostAddr(), server->GetDescription(), server->GetDatabaseName(), server->GetUsername(), @@ -372,6 +376,7 @@ int dlgServer::Go(bool modal) { if (cbDatabase->FindString(server->GetDatabaseName()) < 0) cbDatabase->Append(server->GetDatabaseName()); + txtHostAddr->SetValue(server->GetHostAddr()); txtDescription->SetValue(server->GetDescription()); txtService->SetValue(server->GetServiceID()); txtPort->SetValue(NumToStr((long)server->GetPort())); @@ -394,6 +399,7 @@ int dlgServer::Go(bool modal) txtPassword->Disable(); if (connection) { + txtHostAddr->Disable(); txtDescription->Disable(); txtService->Disable(); txtName->Disable(); @@ -438,7 +444,7 @@ pgObject *dlgServer::CreateObject(pgCollection *collection) { wxString name = GetName(); - pgServer *obj = new pgServer(GetName(), txtDescription->GetValue(), cbDatabase->GetValue(), + pgServer *obj = new pgServer(GetName(), txtHostAddr->GetValue(), txtDescription->GetValue(), cbDatabase->GetValue(), txtUsername->GetValue(), StrToLong(txtPort->GetValue()), chkTryConnect->GetValue() && chkStorePwd->GetValue(), txtRolename->GetValue(), chkRestore->GetValue(), cbSSL->GetCurrentSelection(), @@ -476,6 +482,7 @@ void dlgServer::CheckChange() wxString sColour2 = colourPicker->GetColourString(); enable = name != server->GetName() + || txtHostAddr->GetValue() != server->GetHostAddr() || txtDescription->GetValue() != server->GetDescription() || txtService->GetValue() != server->GetServiceID() || StrToLong(txtPort->GetValue()) != server->GetPort() diff --git a/pgadmin/frm/frmMain.cpp b/pgadmin/frm/frmMain.cpp index ea58697..9090a33 100644 --- a/pgadmin/frm/frmMain.cpp +++ b/pgadmin/frm/frmMain.cpp @@ -1108,6 +1108,7 @@ void frmMain::StoreServers() key.Printf(wxT("Servers/%d/"), numServers); settings->Write(key + wxT("Server"), server->GetName()); + settings->Write(key + wxT("HostAddr"), server->GetHostAddr()); settings->Write(key + wxT("Description"), server->GetDescription()); settings->Write(key + wxT("ServiceID"), server->GetServiceID()); settings->Write(key + wxT("DiscoveryID"), server->GetDiscoveryID()); diff --git a/pgadmin/frm/frmStatus.cpp b/pgadmin/frm/frmStatus.cpp index 22c6db3..f711975 100644 --- a/pgadmin/frm/frmStatus.cpp +++ b/pgadmin/frm/frmStatus.cpp @@ -480,7 +480,7 @@ void frmStatus::OnChangeDatabase(wxCommandEvent &ev) delete locks_connection; } - locks_connection = new pgConn(connection->GetHostName(), cbDatabase->GetValue(), + locks_connection = new pgConn(connection->GetHostName(), connection->GetHostAddr(), cbDatabase->GetValue(), connection->GetUser(), connection->GetPassword(), connection->GetPort(), connection->GetRole(), connection->GetSslMode(), 0, connection->GetApplicationName(), connection->GetSSLCert(), connection->GetSSLKey(), connection->GetSSLRootCert(), connection->GetSSLCrl()); @@ -989,7 +989,7 @@ void frmStatus::OnCopyQuery(wxCommandEvent &ev) if (text.Length() > 0 && dbname.Length() > 0 && text.Trim() != wxT("<IDLE>") && text.Trim() != wxT("<IDLE in transaction>")) { - pgConn *conn = new pgConn(connection->GetHostName(), dbname, + pgConn *conn = new pgConn(connection->GetHostName(), connection->GetHostAddr(), dbname, connection->GetUser(), connection->GetPassword(), connection->GetPort(), connection->GetRole(), connection->GetSslMode(), connection->GetDbOid(), connection->GetApplicationName(), @@ -2597,6 +2597,7 @@ void frmStatus::OnCommit(wxCommandEvent &event) if (connection->GetDbname() != xactList->GetText(item, 4)) { pgConn *tmpConn = new pgConn(connection->GetHost(), + connection->GetHostAddr(), xactList->GetText(item, 4), connection->GetUser(), connection->GetPassword(), @@ -2652,6 +2653,7 @@ void frmStatus::OnRollback(wxCommandEvent &event) if (connection->GetDbname() != xactList->GetText(item, 4)) { pgConn *tmpConn = new pgConn(connection->GetHost(), + connection->GetHostAddr(), xactList->GetText(item, 4), connection->GetUser(), connection->GetPassword(), diff --git a/pgadmin/include/db/pgConn.h b/pgadmin/include/db/pgConn.h index 402357a..05661d7 100644 --- a/pgadmin/include/db/pgConn.h +++ b/pgadmin/include/db/pgConn.h @@ -83,7 +83,7 @@ typedef struct pgError class pgConn { public: - pgConn(const wxString &server = wxT(""), const wxString &database = wxT(""), const wxString &username = wxT(""), const wxString &password = wxT(""), + pgConn(const wxString &server = wxT(""), const wxString &hostaddr = wxT(""), const wxString &database = wxT(""), const wxString &username = wxT(""), const wxString &password = wxT(""), int port = 5432, const wxString &rolename = wxT(""), int sslmode = 0, OID oid = 0, const wxString &applicationname = wxT("pgAdmin"), const wxString &sslcert = wxT(""), const wxString &sslkey = wxT(""), const wxString &sslrootcert = wxT(""), const wxString &sslcrl = wxT("")); @@ -125,6 +125,10 @@ public: bool ExecuteVoid(const wxString &sql, bool reportError = true); wxString ExecuteScalar(const wxString &sql); pgSet *ExecuteSet(const wxString &sql); + wxString GetHostAddr() const + { + return save_hostaddr; + } wxString GetUser() const { return wxString(PQuser(conn), *conv); @@ -268,7 +272,7 @@ private: wxString reservedNamespaces; wxString connstr; - wxString save_server, save_database, save_username, save_password, save_rolename, save_applicationname; + wxString save_server, save_hostaddr, save_database, save_username, save_password, save_rolename, save_applicationname; wxString save_sslcert, save_sslkey, save_sslrootcert, save_sslcrl; int save_port, save_sslmode; OID save_oid; diff --git a/pgadmin/include/schema/pgServer.h b/pgadmin/include/schema/pgServer.h index 27bfbdf..9c30dd8 100644 --- a/pgadmin/include/schema/pgServer.h +++ b/pgadmin/include/schema/pgServer.h @@ -41,7 +41,7 @@ extern pgServerFactory serverFactory; class pgServer : public pgObject { public: - pgServer(const wxString &newServer = wxT(""), const wxString &newDescription = wxT(""), const wxString &newDatabase = wxT(""), const wxString &newUsername = wxT(""), int newPort = 5432, bool storePwd = false, const wxString &newRolename = wxT(""), bool restore = true, int sslMode = 0, const wxString &colour = wxT("#FFFFFF"), const wxString &group = wxEmptyString); + pgServer(const wxString &newServer = wxT(""), const wxString &newHostAddr = wxT(""), const wxString &newDescription = wxT(""), const wxString &newDatabase = wxT(""), const wxString &newUsername = wxT(""), int newPort = 5432, bool storePwd = false, const wxString &newRolename = wxT(""), bool restore = true, int sslMode = 0, const wxString &colour = wxT("#FFFFFF"), const wxString &group = wxEmptyString); ~pgServer(); int GetIconId(); @@ -75,6 +75,10 @@ public: wxString GetVersionString(); wxString GetVersionNumber(); OID GetLastSystemOID(); + wxString GetHostAddr() const + { + return hostaddr; + } wxString GetDatabaseName() const { return database; @@ -223,6 +227,10 @@ public: { description = s; } + void iSetHostAddr(const wxString &s) + { + hostaddr = s; + } wxString GetDbRestriction() const { @@ -417,7 +425,7 @@ private: pgConn *conn; long serverIndex; bool connected, passwordValid, autovacuumRunning; - wxString database, username, password, rolename, ver, error; + wxString hostaddr, database, username, password, rolename, ver, error; wxString lastDatabase, lastSchema, description, serviceId, discoveryId; wxDateTime upSince; int port, ssl; diff --git a/pgadmin/pgscript/pgsApplication.cpp b/pgadmin/pgscript/pgsApplication.cpp index 79a4168..f5dcfe8 100644 --- a/pgadmin/pgscript/pgsApplication.cpp +++ b/pgadmin/pgscript/pgsApplication.cpp @@ -19,7 +19,7 @@ pgsApplication::pgsApplication(const wxString &host, const wxString &database, const wxString &user, const wxString &password, int port) : - m_mutex(1, 1), m_stream(1, 1), m_connection(pnew pgConn(host, database, user, + m_mutex(1, 1), m_stream(1, 1), m_connection(pnew pgConn(host, wxEmptyString, database, user, password, port)), m_defined_conn(true), m_thread(0), m_caller(0) { if (m_connection->GetStatus() != PGCONN_OK) diff --git a/pgadmin/schema/pgRole.cpp b/pgadmin/schema/pgRole.cpp index d7d1b8f..2e7c5f4 100644 --- a/pgadmin/schema/pgRole.cpp +++ b/pgadmin/schema/pgRole.cpp @@ -434,6 +434,7 @@ void pgRole::ReassignDropOwnedTo(frmMain *form) { pgConn *conn; conn = new pgConn(GetConnection()->GetHost(), + GetConnection()->GetHostAddr(), rdo.GetDatabase(), GetConnection()->GetUser(), GetConnection()->GetPassword(), diff --git a/pgadmin/schema/pgServer.cpp b/pgadmin/schema/pgServer.cpp index 111a78a..3fa4bdd 100644 --- a/pgadmin/schema/pgServer.cpp +++ b/pgadmin/schema/pgServer.cpp @@ -40,10 +40,11 @@ #define DEFAULT_PG_DATABASE wxT("postgres") -pgServer::pgServer(const wxString &newName, const wxString &newDescription, const wxString &newDatabase, const wxString &newUsername, int newPort, bool _storePwd, const wxString &newRolename, bool _restore, int _ssl, const wxString &_colour, const wxString &_group) +pgServer::pgServer(const wxString &newName, const wxString &newHostAddr, const wxString &newDescription, const wxString &newDatabase, const wxString &newUsername, int newPort, bool _storePwd, const wxString &newRolename, bool _restore, int _ssl, const wxString &_colour, const wxString &_group) : pgObject(serverFactory, newName) { description = newDescription; + hostaddr = newHostAddr; database = newDatabase; username = newUsername; port = newPort; @@ -186,7 +187,7 @@ pgConn *pgServer::CreateConn(wxString dbName, OID oid, wxString applicationname) dbName = GetDatabaseName(); oid = dbOid; } - pgConn *conn = new pgConn(GetName(), dbName, username, password, port, rolename, ssl, oid, applicationname, sslcert, sslkey, sslrootcert, sslcrl); + pgConn *conn = new pgConn(GetName(), hostaddr, dbName, username, password, port, rolename, ssl, oid, applicationname, sslcert, sslkey, sslrootcert, sslcrl); if (conn && conn->GetStatus() != PGCONN_OK) { @@ -663,21 +664,21 @@ int pgServer::Connect(frmMain *form, bool askPassword, const wxString &pwd, bool if (database.IsEmpty()) { - conn = new pgConn(GetName(), DEFAULT_PG_DATABASE, username, password, port, rolename, ssl, 0, appearanceFactory->GetLongAppName() + _(" - Browser"), sslcert, sslkey, sslrootcert, sslcrl); + conn = new pgConn(GetName(), hostaddr, DEFAULT_PG_DATABASE, username, password, port, rolename, ssl, 0, appearanceFactory->GetLongAppName() + _(" - Browser"), sslcert, sslkey, sslrootcert, sslcrl); if (conn->GetStatus() == PGCONN_OK) database = DEFAULT_PG_DATABASE; else if (conn->GetStatus() == PGCONN_BAD && conn->GetLastError().Find( wxT("database \"") DEFAULT_PG_DATABASE wxT("\" does not exist")) >= 0) { delete conn; - conn = new pgConn(GetName(), wxT("template1"), username, password, port, rolename, ssl, 0, appearanceFactory->GetLongAppName() + _(" - Browser"), sslcert, sslkey, sslrootcert, sslcrl); + conn = new pgConn(GetName(), hostaddr, wxT("template1"), username, password, port, rolename, ssl, 0, appearanceFactory->GetLongAppName() + _(" - Browser"), sslcert, sslkey, sslrootcert, sslcrl); if (conn && conn->GetStatus() == PGCONN_OK) database = wxT("template1"); } } else { - conn = new pgConn(GetName(), database, username, password, port, rolename, ssl, 0, appearanceFactory->GetLongAppName() + _(" - Browser"), sslcert, sslkey, sslrootcert, sslcrl); + conn = new pgConn(GetName(), hostaddr, database, username, password, port, rolename, ssl, 0, appearanceFactory->GetLongAppName() + _(" - Browser"), sslcert, sslkey, sslrootcert, sslcrl); if (!conn) { form->EndMsg(false); @@ -985,6 +986,7 @@ void pgServer::ShowTreeDetail(ctlTree *browser, frmMain *form, ctlListView *prop else { properties->AppendItem(_("Hostname"), GetName()); + properties->AppendItem(_("Host Address"), GetHostAddr()); properties->AppendItem(_("Port"), (long)GetPort()); #ifdef SSL if (GetConnected()) @@ -1265,7 +1267,7 @@ pgObject *pgServerFactory::CreateObjects(pgCollection *obj, ctlTree *browser, co long numServers = settings->Read(wxT("Servers/Count"), 0L); long loop, port, ssl = 0; - wxString key, servername, description, database, username, lastDatabase, lastSchema; + wxString key, servername, hostaddr, description, database, username, lastDatabase, lastSchema; wxString storePwd, rolename, restore, serviceID, discoveryID, dbRestriction, colour; wxString group, sslcert, sslkey, sslrootcert, sslcrl; pgServer *server = 0; @@ -1285,6 +1287,7 @@ pgObject *pgServerFactory::CreateObjects(pgCollection *obj, ctlTree *browser, co key.Printf(wxT("Servers/%d/"), loop); settings->Read(key + wxT("Server"), &servername, wxEmptyString); + settings->Read(key + wxT("HostAddr"), &hostaddr, wxEmptyString); settings->Read(key + wxT("ServiceID"), &serviceID, wxEmptyString); settings->Read(key + wxT("DiscoveryID"), &discoveryID, serviceID); settings->Read(key + wxT("Description"), &description, wxEmptyString); @@ -1337,7 +1340,7 @@ pgObject *pgServerFactory::CreateObjects(pgCollection *obj, ctlTree *browser, co } // Add the Server node - server = new pgServer(servername, description, database, username, port, StrToBool(storePwd), rolename, StrToBool(restore), ssl); + server = new pgServer(servername, hostaddr, description, database, username, port, StrToBool(storePwd), rolename, StrToBool(restore), ssl); server->iSetLastDatabase(lastDatabase); server->iSetLastSchema(lastSchema); server->iSetServiceID(serviceID); @@ -1514,7 +1517,7 @@ pgObject *pgServerFactory::CreateObjects(pgCollection *obj, ctlTree *browser, co // Add the item, if it looks sane if (port != 0 && username != wxEmptyString) { - server = new pgServer(servername, description, wxT("postgres"), username, port, false, rolename, 0); + server = new pgServer(servername, wxEmptyString, description, wxT("postgres"), username, port, false, rolename, 0); server->iSetDiscoveryID(cnf->GetPath() + wxT("/") + version); server->iSetDiscovered(true); server->iSetGroup(group); @@ -1567,7 +1570,7 @@ pgObject *pgServerFactory::CreateObjects(pgCollection *obj, ctlTree *browser, co // Add the item, if it looks sane if (port != 0 && username != wxEmptyString) { - server = new pgServer(servername, description, wxT("edb"), username, port, false, rolename, 0); + server = new pgServer(servername, wxEmptyString, description, wxT("edb"), username, port, false, rolename, 0); server->iSetDiscoveryID(cnf->GetPath() + wxT("/") + version); server->iSetDiscovered(true); browser->AppendItem(browser->GetFirstChild(obj->GetId(), groupcookie), server->GetFullName(), server->GetIconId(), -1, server); diff --git a/pgadmin/ui/dlgServer.xrc b/pgadmin/ui/dlgServer.xrc index c8632f2..7b7587f 100644 --- a/pgadmin/ui/dlgServer.xrc +++ b/pgadmin/ui/dlgServer.xrc @@ -17,7 +17,7 @@ <object class="wxPanel" name="pnlProperties"> <object class="wxFlexGridSizer"> <cols>2</cols> - <rows>9</rows> + <rows>10</rows> <vgap>5</vgap> <hgap>5</hgap> <growablecols>1</growablecols> @@ -46,6 +46,18 @@ <border>4</border> </object> <object class="sizeritem"> + <object class="wxStaticText" name="stHostAddr"> + <label>Host Address</label> + </object> + <flag>wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag> + <border>4</border> + </object> + <object class="sizeritem"> + <object class="wxTextCtrl" name="txtHostAddr"/> + <flag>wxEXPAND|wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag> + <border>4</border> + </object> + <object class="sizeritem"> <object class="wxStaticText" name="stPort"> <label>Port</label> </object> -- 1.7.1
-- Sent via pgadmin-support mailing list (pgadmin-support@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgadmin-support