From f59af7d29e6769f520e55188ff9bdc004d0128b9 Mon Sep 17 00:00:00 2001
From: Michael Scherer <mscherer@users.noreply.github.com>
Date: Wed, 31 Aug 2016 17:08:12 +0200
Subject: [PATCH] Port postgresql module to python3 (#4579)

Iteritems is no longer a dict method in Python3, replace it with
the six wrapper.
---
 .../database/postgresql/postgresql_db.py      |  3 +-
 .../database/postgresql/postgresql_user.py    | 35 +++++++++----------
 2 files changed, 18 insertions(+), 20 deletions(-)

diff --git a/lib/ansible/modules/database/postgresql/postgresql_db.py b/lib/ansible/modules/database/postgresql/postgresql_db.py
index bfb2f7e0951..33e812bc560 100644
--- a/lib/ansible/modules/database/postgresql/postgresql_db.py
+++ b/lib/ansible/modules/database/postgresql/postgresql_db.py
@@ -114,6 +114,7 @@ except ImportError:
     postgresqldb_found = False
 else:
     postgresqldb_found = True
+from ansible.module_utils.six import iteritems
 
 class NotSupportedError(Exception):
     pass
@@ -261,7 +262,7 @@ def main():
         "login_password":"password",
         "port":"port"
     }
-    kw = dict( (params_map[k], v) for (k, v) in module.params.iteritems()
+    kw = dict( (params_map[k], v) for (k, v) in iteritems(module.params)
               if k in params_map and v != '' )
 
     # If a login_unix_socket is specified, incorporate it here.
diff --git a/lib/ansible/modules/database/postgresql/postgresql_user.py b/lib/ansible/modules/database/postgresql/postgresql_user.py
index 2254d3b9249..b3c264f28a7 100644
--- a/lib/ansible/modules/database/postgresql/postgresql_user.py
+++ b/lib/ansible/modules/database/postgresql/postgresql_user.py
@@ -170,6 +170,7 @@ except ImportError:
     postgresqldb_found = False
 else:
     postgresqldb_found = True
+from ansible.module_utils.six import iteritems
 
 _flags = ('SUPERUSER', 'CREATEROLE', 'CREATEUSER', 'CREATEDB', 'INHERIT', 'LOGIN', 'REPLICATION')
 VALID_FLAGS = frozenset(itertools.chain(_flags, ('NO%s' % f for f in _flags)))
@@ -421,15 +422,13 @@ def revoke_privileges(cursor, user, privs):
 
     changed = False
     for type_ in privs:
-        revoke_func = {
-            'table':revoke_table_privilege,
-            'database':revoke_database_privilege
-        }[type_]
-        for name, privileges in privs[type_].iteritems():
-            for privilege in privileges:
-                changed = revoke_func(cursor, user, name, privilege)\
-                        or changed
-
+        for name, privileges in iteritems(privs[type_]):
+            # Check that any of the privileges requested to be removed are
+            # currently granted to the user
+            differences = check_funcs[type_](cursor, user, name, privileges)
+            if differences[0]:
+                revoke_funcs[type_](cursor, user, name, privileges)
+                changed = True
     return changed
 
 def grant_privileges(cursor, user, privs):
@@ -441,15 +440,13 @@ def grant_privileges(cursor, user, privs):
 
     changed = False
     for type_ in privs:
-        grant_func = {
-            'table':grant_table_privilege,
-            'database':grant_database_privilege
-        }[type_]
-        for name, privileges in privs[type_].iteritems():
-            for privilege in privileges:
-                changed = grant_func(cursor, user, name, privilege)\
-                        or changed
-
+        for name, privileges in iteritems(privs[type_]):
+            # Check that any of the privileges requested for the user are
+            # currently missing
+            differences = check_funcs[type_](cursor, user, name, privileges)
+            if differences[2]:
+                grant_funcs[type_](cursor, user, name, privileges)
+                changed = True
     return changed
 
 def parse_role_attrs(role_attr_flags):
@@ -574,7 +571,7 @@ def main():
         "port":"port",
         "db":"database"
     }
-    kw = dict( (params_map[k], v) for (k, v) in module.params.iteritems()
+    kw = dict( (params_map[k], v) for (k, v) in iteritems(module.params)
               if k in params_map and v != "" )
 
     # If a login_unix_socket is specified, incorporate it here.