Log Message:
-----------
preliminary connection interrupt code
Modified Files:
--------------
pgadmin3/src/db:
pgConn.cpp (r1.45 -> r1.46)
pgadmin3/src/include:
pgConn.h (r1.22 -> r1.23)
pgDatabase.h (r1.31 -> r1.32)
pgadmin3/src/schema:
pgDatabase.cpp (r1.51 -> r1.52)
Index: pgConn.cpp
===================================================================
RCS file: /projects/pgadmin3/src/db/pgConn.cpp,v
retrieving revision 1.45
retrieving revision 1.46
diff -Lsrc/db/pgConn.cpp -Lsrc/db/pgConn.cpp -u -w -r1.45 -r1.46
--- src/db/pgConn.cpp
+++ src/db/pgConn.cpp
@@ -191,7 +191,7 @@
bool pgConn::IsSSLconnected()
{
- return (PQstatus(conn) == CONNECTION_OK && PQgetssl(conn) != NULL);
+ return (conn && PQstatus(conn) == CONNECTION_OK && PQgetssl(conn) != NULL);
}
#endif
@@ -225,6 +225,9 @@
bool pgConn::ExecuteVoid(const wxString& sql)
{
+ if (GetStatus() != PGCONN_OK)
+ return false;
+
// Execute the query and get the status.
PGresult *qryRes;
@@ -236,7 +239,7 @@
if (res != PGRES_TUPLES_OK &&
res != PGRES_COMMAND_OK)
{
- wxLogError(wxT("%s"), wxString(PQerrorMessage(conn), *conv).c_str());
+ LogError();
}
// Cleanup & exit
@@ -258,6 +261,10 @@
wxString pgConn::ExecuteScalar(const wxString& sql)
{
+ wxString result;
+
+ if (GetStatus() == PGCONN_OK)
+ {
// Execute the query and get the status.
PGresult *qryRes;
wxLogSql(wxT("Scalar query (%s:%d): %s"), this->GetHost().c_str(),
this->GetPort(), sql.c_str());
@@ -266,7 +273,7 @@
// Check for errors
if (PQresultStatus(qryRes) != PGRES_TUPLES_OK)
{
- wxLogError(wxT("%s"), wxString(PQerrorMessage(conn), *conv).c_str());
+ LogError();
PQclear(qryRes);
return wxEmptyString;
}
@@ -280,19 +287,22 @@
}
// Retrieve the query result and return it.
- wxString result;
result=wxString(PQgetvalue(qryRes, 0, 0), *conv);
wxLogSql(wxT("Query result: %s"), result.c_str());
// Cleanup & exit
PQclear(qryRes);
+ }
+
return result;
}
pgSet *pgConn::ExecuteSet(const wxString& sql)
{
// Execute the query and get the status.
+ if (GetStatus() == PGCONN_OK)
+ {
PGresult *qryRes;
wxLogSql(wxT("Set query (%s:%d): %s"), this->GetHost().c_str(), this->GetPort(),
sql.c_str());
qryRes = PQexec(conn, sql.mb_str(*conv));
@@ -301,7 +311,7 @@
if (status == PGRES_TUPLES_OK || status == PGRES_COMMAND_OK)
{
- pgSet *set = new pgSet(qryRes, conn, *conv, needColQuoting);
+ pgSet *set = new pgSet(qryRes, this, *conv, needColQuoting);
if (!set)
{
wxLogError(__("Couldn't create a pgSet object!"));
@@ -311,10 +321,10 @@
}
else
{
- wxLogError(wxT("%s"), wxString(PQerrorMessage(conn), *conv).c_str());
+ LogError();
PQclear(qryRes);
}
-
+ }
return 0;
}
@@ -322,13 +332,32 @@
// Info
//////////////////////////////////////////////////////////////////////////
+
+void pgConn::LogError()
+{
+ if (conn)
+ {
+ wxLogError(wxT("%s"), wxString(PQerrorMessage(conn), *conv).c_str());
+
+ ConnStatusType status = PQstatus(conn);
+ if (status == CONNECTION_BAD)
+ {
+ PQfinish(conn);
+ conn=0;
+ }
+ }
+}
+
+
int pgConn::GetStatus() const
{
- if(resolvedIP) {
- return PQstatus(conn);
- } else {
+ if(!resolvedIP)
return PGCONN_DNSERR;
- }
+
+ if (!conn)
+ return PGCONN_BAD;
+ else
+ return PQstatus(conn);
}
Index: pgConn.h
===================================================================
RCS file: /projects/pgadmin3/src/include/pgConn.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -Lsrc/include/pgConn.h -Lsrc/include/pgConn.h -u -w -r1.22 -r1.23
--- src/include/pgConn.h
+++ src/include/pgConn.h
@@ -69,6 +69,9 @@
bool BackendMinimumVersion(int major, int minor);
void RegisterNoticeProcessor(PQnoticeProcessor proc, void *arg);
wxString SystemNamespaceRestriction(const wxString &nsp);
+
+ void LogError();
+
#ifdef SSL
bool IsSSLconnected();
#endif
Index: pgDatabase.h
===================================================================
RCS file: /projects/pgadmin3/src/include/pgDatabase.h,v
retrieving revision 1.31
retrieving revision 1.32
diff -Lsrc/include/pgDatabase.h -Lsrc/include/pgDatabase.h -u -w -r1.31 -r1.32
--- src/include/pgDatabase.h
+++ src/include/pgDatabase.h
@@ -36,9 +36,9 @@
static pgObject *ReadObjects(pgCollection *collection, wxTreeCtrl *browser, const
wxString &restriction=wxT(""));
static void ShowStatistics(pgCollection *collection, ctlListView *statistics);
- pgSet *ExecuteSet(const wxString& sql) { return conn->ExecuteSet(sql); }
- wxString ExecuteScalar(const wxString& sql) { return conn->ExecuteScalar(sql); }
- bool ExecuteVoid(const wxString& sql) { return conn->ExecuteVoid(sql); }
+ pgSet *ExecuteSet(const wxString& sql);
+ wxString ExecuteScalar(const wxString& sql);
+ bool ExecuteVoid(const wxString& sql);
wxString GetPrettyOption() const { return prettyOption; }
@@ -55,7 +55,7 @@
wxString GetSearchPath() const { return searchPath; }
wxString GetSchemaPrefix(const wxString &schemaname) const;
wxString GetQuotedSchemaPrefix(const wxString &schemaname) const;
- bool GetConnected() const { return connected; }
+ bool GetConnected() const { return conn != 0; }
bool GetSystemObject() const;
long GetMissingFKs() const { return missingFKs; }
@@ -64,6 +64,7 @@
bool RequireDropConfirm() { return true; }
pgConn *connection() { return conn; }
int Connect();
+ void Disconnect();
void AppendSchemaChange(const wxString &sql);
wxString GetSchemaChanges() { return schemaChanges; }
void ClearSchemaChanges() { schemaChanges=wxEmptyString; }
@@ -76,7 +77,7 @@
pgConn *conn;
wxString searchPath, path, encoding, variables;
wxString prettyOption;
- bool allowConnections, connected, createPrivilege;
+ bool allowConnections, createPrivilege;
long missingFKs;
wxString schemaChanges;
Index: pgDatabase.cpp
===================================================================
RCS file: /projects/pgadmin3/src/schema/pgDatabase.cpp,v
retrieving revision 1.51
retrieving revision 1.52
diff -Lsrc/schema/pgDatabase.cpp -Lsrc/schema/pgDatabase.cpp -u -w -r1.51 -r1.52
--- src/schema/pgDatabase.cpp
+++ src/schema/pgDatabase.cpp
@@ -28,7 +28,6 @@
wxLogInfo(wxT("Creating a pgDatabase object"));
allowConnections = TRUE;
- connected = FALSE;
conn = NULL;
}
@@ -60,7 +59,7 @@
if (!allowConnections)
return PGCONN_REFUSED;
- if (connected)
+ if (conn)
return conn->GetStatus();
else
{
@@ -68,7 +67,6 @@
if (conn->GetStatus() == PGCONN_OK)
{
// Now we're connected.
- connected = TRUE;
iSetComment(conn->ExecuteScalar(wxT("SELECT description FROM
pg_description WHERE objoid=") + GetOidStr()));
// check for extended ruleutils with pretty-print option
@@ -82,6 +80,8 @@
}
else
{
+ delete conn;
+ conn=0;
wxLogError(wxT("%s"), conn->GetLastError().c_str());
return PGCONN_BAD;
}
@@ -89,6 +89,55 @@
}
+void pgDatabase::Disconnect()
+{
+#if 0
+ if (conn)
+ delete conn;
+ conn=0;
+#endif
+}
+
+
+pgSet *pgDatabase::ExecuteSet(const wxString& sql)
+{
+ pgSet *set=0;
+ if (conn)
+ {
+ set=conn->ExecuteSet(sql);
+ if (!set && conn->GetStatus() == PGCONN_BAD)
+ Disconnect();
+ }
+ return set;
+}
+
+
+wxString pgDatabase::ExecuteScalar(const wxString& sql)
+{
+ wxString str;
+ if (conn)
+ {
+ str = conn->ExecuteScalar(sql);
+ if (str.IsEmpty() && conn->GetStatus() == PGCONN_BAD)
+ Disconnect();
+ }
+ return str;
+}
+
+
+bool pgDatabase::ExecuteVoid(const wxString& sql)
+{
+ bool rc;
+ if (conn)
+ {
+ rc = conn->ExecuteVoid(sql);
+ if (!rc && conn->GetStatus() == PGCONN_BAD)
+ Disconnect();
+ }
+ return rc;
+}
+
+
wxString pgDatabase::GetSchemaPrefix(const wxString &name) const
{
if (name.IsEmpty())
@@ -144,12 +193,8 @@
bool pgDatabase::DropObject(wxFrame *frame, wxTreeCtrl *browser)
{
- if (conn)
- {
- delete conn;
- conn=0;
- connected = FALSE;
- }
+ Disconnect();
+
bool done=server->ExecuteVoid(wxT("DROP DATABASE ") + GetQuotedIdentifier() +
wxT(";"));
if (!done)
Connect();
---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]