This bypasses checking if the DB is in recovery for versions of postgres
that don't support pg_is_in_recovery() (anything pre-9.0, such as
Greenplum).

This patch depends on the "Refactor sql template version picking" patch.
diff --git a/web/pgadmin/browser/server_groups/servers/__init__.py 
b/web/pgadmin/browser/server_groups/servers/__init__.py
index 4e752d80..3913b95d 100644
--- a/web/pgadmin/browser/server_groups/servers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/__init__.py
@@ -44,6 +44,19 @@ def has_any(data, keys):
     return False
 
 
+def recovery_state(connection, postgres_version):
+    recovery_check_sql = 
render_template("connect/sql/#{0}#/check_recovery.sql".format(postgres_version))
+
+    status, result = connection.execute_dict(recovery_check_sql)
+    if status:
+        in_recovery = result['rows'][0]['inrecovery']
+        wal_paused = result['rows'][0]['isreplaypaused']
+    else:
+        in_recovery = None
+        wal_paused = None
+    return in_recovery, wal_paused
+
+
 class ServerModule(sg.ServerGroupPluginModule):
     NODE_TYPE = "server"
     LABEL = gettext("Servers")
@@ -74,21 +87,7 @@ class ServerModule(sg.ServerGroupPluginModule):
             in_recovery = None
             wal_paused = None
             if connected:
-                status, result = conn.execute_dict("""
-                    SELECT CASE WHEN usesuper
-                           THEN pg_is_in_recovery()
-                           ELSE FALSE
-                           END as inrecovery,
-                           CASE WHEN usesuper AND pg_is_in_recovery()
-                           THEN pg_is_xlog_replay_paused()
-                           ELSE FALSE
-                           END as isreplaypaused
-                    FROM pg_user WHERE usename=current_user""")
-
-                if len(result['rows']):
-                    in_recovery = result['rows'][0]['inrecovery']
-                    wal_paused = result['rows'][0]['isreplaypaused']
-
+                in_recovery, wal_paused = recovery_state(conn, manager.version)
             yield self.generate_browser_node(
                 "%d" % (server.id),
                 gid,
@@ -231,19 +230,7 @@ class ServerNode(PGChildNodeView):
             connected = conn.connected()
 
             if connected:
-                status, result = conn.execute_dict("""
-                    SELECT CASE WHEN usesuper
-                           THEN pg_is_in_recovery()
-                           ELSE FALSE
-                           END as inrecovery,
-                           CASE WHEN usesuper AND pg_is_in_recovery()
-                           THEN pg_is_xlog_replay_paused()
-                           ELSE FALSE
-                           END as isreplaypaused
-                    FROM pg_user WHERE usename=current_user""")
-
-                in_recovery = result['rows'][0]['inrecovery'];
-                wal_paused = result['rows'][0]['isreplaypaused']
+                in_recovery, wal_paused = recovery_state(conn, manager.version)
             else:
                 in_recovery = None
                 wal_paused = None
@@ -274,6 +261,7 @@ class ServerNode(PGChildNodeView):
 
         return make_json_response(result=res)
 
+
     def node(self, gid, sid):
         """Return a JSON document listing the server groups for the user"""
         server = Server.query.filter_by(user_id=current_user.id,
@@ -296,19 +284,7 @@ class ServerNode(PGChildNodeView):
         connected = conn.connected()
 
         if connected:
-            status, result = conn.execute_dict("""
-                SELECT CASE WHEN usesuper
-                    THEN pg_is_in_recovery()
-                    ELSE FALSE
-                    END as inrecovery,
-                    CASE WHEN usesuper AND pg_is_in_recovery()
-                    THEN pg_is_xlog_replay_paused()
-                    ELSE FALSE
-                    END as isreplaypaused
-                FROM pg_user WHERE usename=current_user""")
-
-            in_recovery = result['rows'][0]['inrecovery'];
-            wal_paused = result['rows'][0]['isreplaypaused']
+            in_recovery, wal_paused = recovery_state(conn, manager.version)
         else:
             in_recovery = None
             wal_paused = None
@@ -849,22 +825,7 @@ class ServerNode(PGChildNodeView):
             current_app.logger.info('Connection Established for server: \
                 %s - %s' % (server.id, server.name))
             # Update the recovery and wal pause option for the server if 
connected successfully
-            status, result = conn.execute_dict("""
-                    SELECT CASE WHEN usesuper
-                           THEN pg_is_in_recovery()
-                           ELSE FALSE
-                           END as inrecovery,
-                           CASE WHEN usesuper AND pg_is_in_recovery()
-                           THEN pg_is_xlog_replay_paused()
-                           ELSE FALSE
-                           END as isreplaypaused
-                    FROM pg_user WHERE usename=current_user""")
-            if status:
-                in_recovery = result['rows'][0]['inrecovery'];
-                wal_paused = result['rows'][0]['isreplaypaused']
-            else:
-                in_recovery = None
-                wal_paused = None
+            in_recovery, wal_paused = recovery_state(conn, manager.version)
 
             return make_json_response(
                 success=1,
diff --git a/web/pgadmin/browser/server_groups/servers/templates/__init__.py 
b/web/pgadmin/browser/server_groups/servers/templates/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git 
a/web/pgadmin/browser/server_groups/servers/templates/connect/__init__.py 
b/web/pgadmin/browser/server_groups/servers/templates/connect/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git 
a/web/pgadmin/browser/server_groups/servers/templates/connect/sql/8.3_plus/check_recovery.sql
 
b/web/pgadmin/browser/server_groups/servers/templates/connect/sql/8.3_plus/check_recovery.sql
new file mode 100644
index 00000000..7dd62fc5
--- /dev/null
+++ 
b/web/pgadmin/browser/server_groups/servers/templates/connect/sql/8.3_plus/check_recovery.sql
@@ -0,0 +1 @@
+SELECT FALSE as inrecovery, FALSE as isreplaypaused;
\ No newline at end of file
diff --git 
a/web/pgadmin/browser/server_groups/servers/templates/connect/sql/9.0_plus/check_recovery.sql
 
b/web/pgadmin/browser/server_groups/servers/templates/connect/sql/9.0_plus/check_recovery.sql
new file mode 100644
index 00000000..740f191c
--- /dev/null
+++ 
b/web/pgadmin/browser/server_groups/servers/templates/connect/sql/9.0_plus/check_recovery.sql
@@ -0,0 +1,9 @@
+SELECT CASE WHEN usesuper
+       THEN pg_is_in_recovery()
+       ELSE FALSE
+       END as inrecovery,
+       CASE WHEN usesuper AND pg_is_in_recovery()
+       THEN pg_is_xlog_replay_paused()
+       ELSE FALSE
+       END as isreplaypaused
+FROM pg_user WHERE usename=current_user
\ No newline at end of file
diff --git 
a/web/pgadmin/browser/server_groups/servers/templates/connect/sql/__init__.py 
b/web/pgadmin/browser/server_groups/servers/templates/connect/sql/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git 
a/web/pgadmin/browser/server_groups/servers/templates/connect/sql/tests/__init__.py
 
b/web/pgadmin/browser/server_groups/servers/templates/connect/sql/tests/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git 
a/web/pgadmin/browser/server_groups/servers/templates/connect/sql/tests/test_check_recovery.py
 
b/web/pgadmin/browser/server_groups/servers/templates/connect/sql/tests/test_check_recovery.py
new file mode 100644
index 00000000..6f4bb5dd
--- /dev/null
+++ 
b/web/pgadmin/browser/server_groups/servers/templates/connect/sql/tests/test_check_recovery.py
@@ -0,0 +1,39 @@
+import os
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression import test_utils
+
+
+class TestCheckRecovery(BaseTestGenerator):
+
+    versions_to_test = ["8.3_plus", "9.0_plus"]
+
+    def runTest(self):
+        self.server = {
+            "db": "postgres",
+            "host": "localhost",
+            "username": "pivotal",
+            "db_password": "",
+            "port": 5432
+        }
+        cursor = test_utils.get_db_connection(self.server['db'],
+                                              self.server['username'],
+                                              self.server['db_password'],
+                                              self.server['host'],
+                                              self.server['port']).cursor()
+
+        for version in self.versions_to_test:
+            template_file = os.path.join(os.path.dirname(__file__), "..", 
version, "check_recovery.sql")
+
+            cursor.execute(open(template_file, 'r').read())
+            fetch_result = cursor.fetchall()
+
+            first_row = {}
+            for index, description in enumerate(cursor.description):
+                first_row[description.name] = fetch_result[0][index]
+
+            in_recovery = first_row['inrecovery']
+            wal_paused = first_row['isreplaypaused']
+
+            self.assertEqual(False, in_recovery)
+            self.assertEqual(False, wal_paused)
diff --git a/web/pgadmin/browser/utils.py b/web/pgadmin/browser/utils.py
index 39e1181c..0dc2d010 100644
--- a/web/pgadmin/browser/utils.py
+++ b/web/pgadmin/browser/utils.py
@@ -346,9 +346,7 @@ class PGChildNodeView(NodeView):
         """
 
         # Set the sql_path
-        sql_path = ''
-        if conn.manager.version >= 90100:
-            sql_path = 'depends/sql/9.1_plus'
+        sql_path = 'depends/sql/#{0}#'.format(conn.manager.version)
 
         if where is None:
             where_clause = "WHERE dep.objid={0}::oid".format(object_id)
diff --git a/web/pgadmin/utils/tests/test_versioned_template_loader.py 
b/web/pgadmin/utils/tests/test_versioned_template_loader.py
index 14c7cd28..3117c336 100644
--- a/web/pgadmin/utils/tests/test_versioned_template_loader.py
+++ b/web/pgadmin/utils/tests/test_versioned_template_loader.py
@@ -2,6 +2,7 @@ import os
 
 from flask import Flask
 from jinja2 import FileSystemLoader
+from jinja2 import TemplateNotFound
 
 from pgadmin import VersionedTemplateLoader
 from pgadmin.utils.route import BaseTestGenerator
@@ -35,11 +36,19 @@ class TestVersionedTemplateLoader(BaseTestGenerator):
         self.assertIn("some_feature/sql/9.1_plus/some_action.sql", filename)
 
     def 
test_get_source_when_the_version_is_9_3_and_there_are_templates_for_9_2_and_9_1_returns_9_2_template(self):
+
         content, filename, up_to_dateness = self.loader.get_source(None, 
"some_feature/sql/#90300#/some_action.sql")
 
         self.assertEqual("Some 9.2 SQL", content)
         self.assertIn("some_feature/sql/9.2_plus/some_action.sql", filename)
 
+    def 
test_raise_not_found_exception_when_postgres_version_less_than_all_available_sql_templates(self):
+
+        try:
+            self.loader.get_source(None, 
"some_feature/sql/#10100#/some_action.sql")
+            self.fail("No exception raised")
+        except TemplateNotFound, e:
+            return
 
 class FakeApp(Flask):
     def __init__(self):
diff --git a/web/pgadmin/utils/versioned_template_loader.py 
b/web/pgadmin/utils/versioned_template_loader.py
index 7e1ec290..88922f37 100644
--- a/web/pgadmin/utils/versioned_template_loader.py
+++ b/web/pgadmin/utils/versioned_template_loader.py
@@ -12,7 +12,9 @@ class VersionedTemplateLoader(DispatchingJinjaLoader):
             {'name': "9.4_plus", 'number': 90400},
             {'name': "9.3_plus", 'number': 90300},
             {'name': "9.2_plus", 'number': 90200},
-            {'name': "9.1_plus", 'number': 90100}
+            {'name': "9.1_plus", 'number': 90100},
+            {'name': "9.0_plus", 'number': 90000},
+            {'name': "8.3_plus", 'number': 80300}
         )
 
         if len(template_path_parts) == 1:
@@ -29,3 +31,4 @@ class VersionedTemplateLoader(DispatchingJinjaLoader):
                     return super(VersionedTemplateLoader, 
self).get_source(environment, template_path)
                 except TemplateNotFound:
                     continue
+            raise TemplateNotFound(template)
\ No newline at end of file
-- 
Sent via pgadmin-hackers mailing list (pgadmin-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers

Reply via email to