From 06e881570a2861cd2b679ec3cc637eab2577d941 Mon Sep 17 00:00:00 2001 From: Murtuza Zabuawala Date: Tue, 26 Jul 2016 15:05:14 +0100 Subject: [PATCH] Fix numerous encoding issues. Fixes #1307. Fixes #1479 --- requirements_py2.txt | 2 +- requirements_py3.txt | 2 +- web/pgadmin/__init__.py | 2 +- web/pgadmin/browser/server_groups/__init__.py | 11 +- .../browser/server_groups/servers/__init__.py | 17 ++- .../servers/databases/__init__.py | 34 ++--- .../servers/databases/casts/__init__.py | 15 ++- .../databases/event_triggers/__init__.py | 15 ++- .../servers/databases/extensions/__init__.py | 13 +- .../foreign_data_wrappers/__init__.py | 15 ++- .../foreign_servers/__init__.py | 14 ++- .../foreign_servers/user_mapping/__init__.py | 14 ++- .../servers/databases/languages/__init__.py | 8 +- .../servers/databases/schemas/__init__.py | 29 +++-- .../databases/schemas/collations/__init__.py | 10 +- .../databases/schemas/domains/__init__.py | 8 +- .../domains/domain_constraints/__init__.py | 6 +- .../schemas/foreign_tables/__init__.py | 16 +-- .../schemas/fts_configurations/__init__.py | 10 +- .../schemas/fts_dictionaries/__init__.py | 10 +- .../databases/schemas/fts_parser/__init__.py | 8 +- .../schemas/fts_templates/__init__.py | 8 +- .../databases/schemas/functions/__init__.py | 10 +- .../databases/schemas/sequences/__init__.py | 12 +- .../databases/schemas/tables/__init__.py | 43 ++++--- .../schemas/tables/column/__init__.py | 15 ++- .../constraints/check_constraint/__init__.py | 16 ++- .../exclusion_constraint/__init__.py | 16 ++- .../constraints/foreign_key/__init__.py | 18 ++- .../constraints/index_constraint/__init__.py | 16 ++- .../schemas/tables/indexes/__init__.py | 15 ++- .../schemas/tables/rules/__init__.py | 12 +- .../schemas/tables/triggers/__init__.py | 19 ++- .../databases/schemas/types/__init__.py | 15 ++- .../databases/schemas/views/__init__.py | 21 ++-- .../servers/resource_groups/__init__.py | 12 +- .../server_groups/servers/roles/__init__.py | 6 +- .../servers/tablespaces/__init__.py | 19 ++- web/pgadmin/tools/backup/__init__.py | 10 +- web/pgadmin/tools/datagrid/__init__.py | 6 +- web/pgadmin/tools/debugger/__init__.py | 10 +- web/pgadmin/tools/import_export/__init__.py | 6 +- web/pgadmin/tools/maintenance/__init__.py | 6 +- web/pgadmin/tools/restore/__init__.py | 6 +- web/pgadmin/tools/sqleditor/__init__.py | 26 ++-- web/pgadmin/tools/user_management/__init__.py | 10 +- web/pgadmin/utils/driver/psycopg2/__init__.py | 119 +++++++++++------- 47 files changed, 463 insertions(+), 268 deletions(-) diff --git a/requirements_py2.txt b/requirements_py2.txt index 3d0d700cf..4d6c03aa4 100644 --- a/requirements_py2.txt +++ b/requirements_py2.txt @@ -21,7 +21,7 @@ linecache2==1.0.0 MarkupSafe==0.23 passlib==1.6.2 pbr==1.9.1 -psycopg2==2.5.2 +psycopg2==2.6.2 pycrypto==2.6.1 pyrsistent==0.11.13 python-dateutil==2.5.0 diff --git a/requirements_py3.txt b/requirements_py3.txt index 1f3ab95a3..462ed19f4 100644 --- a/requirements_py3.txt +++ b/requirements_py3.txt @@ -20,7 +20,7 @@ linecache2==1.0.0 MarkupSafe==0.23 passlib==1.6.2 pbr==1.9.1 -psycopg2==2.5.2 +psycopg2==2.6.2 pycrypto==2.6.1 pyrsistent==0.11.13 python-dateutil==2.5.0 diff --git a/web/pgadmin/__init__.py b/web/pgadmin/__init__.py index fe9e69c1a..d4c174a87 100644 --- a/web/pgadmin/__init__.py +++ b/web/pgadmin/__init__.py @@ -147,7 +147,7 @@ def create_app(app_name=config.APP_NAME): logger.setLevel(logging.INFO) # File logging - fh = logging.FileHandler(config.LOG_FILE) + fh = logging.FileHandler(config.LOG_FILE, encoding='utf-8') fh.setLevel(config.FILE_LOG_LEVEL) fh.setFormatter(logging.Formatter(config.FILE_LOG_FORMAT)) app.logger.addHandler(fh) diff --git a/web/pgadmin/browser/server_groups/__init__.py b/web/pgadmin/browser/server_groups/__init__.py index 97d261faa..faff488e2 100644 --- a/web/pgadmin/browser/server_groups/__init__.py +++ b/web/pgadmin/browser/server_groups/__init__.py @@ -8,7 +8,7 @@ ########################################################################## """Defines views for management of server groups""" -import json +import simplejson as json from abc import ABCMeta, abstractmethod import six @@ -156,7 +156,9 @@ class ServerGroupView(NodeView): user_id=current_user.id, id=gid).first() - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) if servergroup is None: return make_json_response( @@ -201,7 +203,10 @@ class ServerGroupView(NodeView): ) def create(self): - data = request.form if request.form else json.loads(request.data.decode()) + """Creates new server-group """ + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) if data[u'name'] != '': try: check_sg = ServerGroup.query.filter_by( diff --git a/web/pgadmin/browser/server_groups/servers/__init__.py b/web/pgadmin/browser/server_groups/servers/__init__.py index 6290158ab..5128e74c6 100644 --- a/web/pgadmin/browser/server_groups/servers/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/__init__.py @@ -7,7 +7,7 @@ # ########################################################################## -import json +import simplejson as json import traceback import pgadmin.browser.server_groups as sg @@ -400,7 +400,9 @@ class ServerNode(PGChildNodeView): } idx = 0 - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) from pgadmin.utils.driver import get_driver manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid) @@ -554,7 +556,9 @@ class ServerNode(PGChildNodeView): u'role' ] - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) for arg in required_args: if arg not in data: @@ -740,8 +744,9 @@ class ServerNode(PGChildNodeView): if user is None: return unauthorized(gettext("Unauthorized request.")) - data = request.form if request.form else json.loads(request.data) if \ - request.data else {} + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) if request.data else {} password = None save_password = False @@ -969,7 +974,7 @@ class ServerNode(PGChildNodeView): sid: Server id """ try: - data = json.loads(request.form['data']) + data = json.loads(request.form['data'], encoding='utf-8') if data and ('password' not in data or data['password'] == '' or 'newPassword' not in data or diff --git a/web/pgadmin/browser/server_groups/servers/databases/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/__init__.py index e35d076c6..33f1d15a7 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/__init__.py @@ -9,7 +9,7 @@ """Implements the Database Node""" -import json +import simplejson as json import re from functools import wraps @@ -186,11 +186,12 @@ class DatabaseView(PGChildNodeView): return internal_server_error(errormsg=rset) for row in rset['rows']: - if self.manager.db == row['name']: + dbname = row['name'] + if self.manager.db == dbname: connected = True canDrop = canDisConn = False else: - conn = self.manager.connection(row['name']) + conn = self.manager.connection(dbname) connected = conn.connected() canDrop = canDisConn = True @@ -441,7 +442,9 @@ class DatabaseView(PGChildNodeView): u'name' ] - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) for arg in required_args: if arg not in data: @@ -516,7 +519,7 @@ class DatabaseView(PGChildNodeView): """Update the database.""" data = request.form if request.form else json.loads( - request.data.decode() + request.data, encoding='utf-8' ) info = "nothing to update." @@ -636,7 +639,7 @@ class DatabaseView(PGChildNodeView): data = {} for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v try: @@ -708,7 +711,7 @@ class DatabaseView(PGChildNodeView): acls = render_template( "/".join([self.template_path, 'allowed_privs.json']) ) - acls = json.loads(acls) + acls = json.loads(acls, encoding='utf-8') except Exception as e: current_app.logger.exception(e) @@ -741,7 +744,7 @@ class DatabaseView(PGChildNodeView): acls = render_template( "/".join([self.template_path, 'allowed_privs.json']) ) - acls = json.loads(acls) + acls = json.loads(acls, encoding='utf-8') except Exception as e: current_app.logger.exception(e) @@ -864,17 +867,20 @@ class DatabaseView(PGChildNodeView): frmtd_variables = parse_variables_from_db(res1['rows']) result.update(frmtd_variables) - sql_header = """ --- Database: {0} + sql_header = "-- Database: {0}\n\n-- ".format(result['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') --- DROP DATABASE {0}; - -""".format(result['name']) + sql_header += render_template( + "/".join([self.template_path, 'delete.sql']), + datname=result['name'], conn=self.conn + ) SQL = self.get_new_sql(gid, sid, result, did) SQL = re.sub('\n{2,}', '\n\n', SQL) - SQL = sql_header + SQL + SQL = sql_header + '\n' + SQL SQL = SQL.strip('\n') + return ajax_response(response=SQL) @check_precondition() diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py index ac8b47656..86a7eca78 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py @@ -9,7 +9,7 @@ """Implements Cast Node""" -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases as databases @@ -345,7 +345,9 @@ class CastView(PGChildNodeView): 'trgtyp' ] - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) for arg in required_args: if arg not in data: return make_json_response( @@ -396,7 +398,9 @@ class CastView(PGChildNodeView): :param gid: group id :return: """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) sql = self.get_sql(gid, sid, did, data, cid) try: if sql and sql.strip('\n') and sql.strip(' '): @@ -560,7 +564,10 @@ class CastView(PGChildNodeView): :return: """ res = [] - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) + sql = render_template("/".join([self.template_path, 'functions.sql']), srctyp=data['srctyp'], trgtyp=data['trgtyp']) diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py index 5ae5a0fba..9f434e14d 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py @@ -7,7 +7,7 @@ # ########################################################################## -import json +import simplejson as json import re from functools import wraps @@ -327,7 +327,10 @@ class EventTriggerView(PGChildNodeView): Returns: """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) + required_args = { 'name': 'Name', 'eventowner': 'Owner', @@ -390,7 +393,9 @@ class EventTriggerView(PGChildNodeView): Returns: """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) try: sql = self.get_sql(data, etid) @@ -500,7 +505,7 @@ class EventTriggerView(PGChildNodeView): data = {} for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v try: @@ -601,6 +606,8 @@ class EventTriggerView(PGChildNodeView): return internal_server_error(errormsg=db_name) sql_header = "-- Event Trigger: {0} on database {1}\n\n-- ".format(result['name'], db_name) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') sql_header += render_template( "/".join([self.template_path, 'delete.sql']), diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/__init__.py index 1f70a1a37..888393c28 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/extensions/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/__init__.py @@ -9,7 +9,7 @@ """ Implements Extension Node """ -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases as databases @@ -216,8 +216,10 @@ class ExtensionView(PGChildNodeView): 'name' ] - data = request.form if request.form else \ - json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) + for arg in required_args: if arg not in data: return make_json_response( @@ -263,8 +265,9 @@ class ExtensionView(PGChildNodeView): """ This function will update an extension object """ - data = request.form if request.form else \ - json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) SQL = self.getSQL(gid, sid, data, did, eid) try: diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py index 2103f5032..d4494a1f7 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py @@ -9,7 +9,7 @@ """Implements Foreign Data Wrapper Node""" -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers as servers @@ -355,7 +355,9 @@ class ForeignDataWrapperView(PGChildNodeView): 'name' ] - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) for arg in required_args: if arg not in data: return make_json_response( @@ -422,7 +424,9 @@ class ForeignDataWrapperView(PGChildNodeView): did: Database ID fid: foreign data wrapper ID """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) sql = self.get_sql(gid, sid, data, did, fid) try: if sql and sql.strip('\n') and sql.strip(' '): @@ -524,7 +528,7 @@ class ForeignDataWrapperView(PGChildNodeView): data = {} for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v @@ -677,6 +681,9 @@ class ForeignDataWrapperView(PGChildNodeView): """.format(res['rows'][0]['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') + sql = sql_header + sql return ajax_response(response=sql) diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/__init__.py index 66a1ad203..f51975f1b 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/__init__.py @@ -9,7 +9,7 @@ """Implements Foreign Server Node""" -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases as databases @@ -356,7 +356,9 @@ class ForeignServerView(PGChildNodeView): 'name' ] - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) for arg in required_args: if arg not in data: return make_json_response( @@ -428,7 +430,9 @@ class ForeignServerView(PGChildNodeView): fsid: foreign server ID """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) sql = self.get_sql(gid, sid, data, did, fid, fsid) try: if sql and sql.strip('\n') and sql.strip(' '): @@ -538,7 +542,7 @@ class ForeignServerView(PGChildNodeView): data = {} for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v @@ -715,6 +719,8 @@ class ForeignServerView(PGChildNodeView): -- DROP SERVER {0} """.format(res['rows'][0]['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') sql = sql_header + sql diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/__init__.py index 369d2a4e8..c0e3f582d 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/__init__.py @@ -9,7 +9,7 @@ """Implements User Mapping Node""" -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers as servers @@ -361,7 +361,9 @@ class UserMappingView(PGChildNodeView): 'name' ] - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) for arg in required_args: if arg not in data: return make_json_response( @@ -435,7 +437,9 @@ class UserMappingView(PGChildNodeView): umid: User mapping ID """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) sql = self.get_sql(gid, sid, data, did, fid, fsid, umid) try: if sql and sql.strip('\n') and sql.strip(' '): @@ -565,7 +569,7 @@ class UserMappingView(PGChildNodeView): data = {} for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v @@ -725,6 +729,8 @@ class UserMappingView(PGChildNodeView): -- DROP USER MAPPING FOR {0} SERVER {1} """.format(res['rows'][0]['name'], fdw_data['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') sql = sql_header + sql diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/languages/__init__.py index 47ef5fe59..07c04e948 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/languages/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/languages/__init__.py @@ -9,7 +9,7 @@ """Implements Language Node""" -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases as databases @@ -354,7 +354,9 @@ class LanguageView(PGChildNodeView): did: Database ID lid: Language ID """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) sql = self.get_sql(data, lid) try: @@ -402,7 +404,7 @@ class LanguageView(PGChildNodeView): data = {} for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py index cf7d12607..4671897b1 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py @@ -7,7 +7,7 @@ # ########################################################################## -import json +import simplejson as json import re from functools import wraps @@ -262,7 +262,7 @@ class SchemaView(PGChildNodeView): acls = render_template( "/".join([self.template_path, 'allowed_privs.json']) ) - acls = json.loads(acls) + acls = json.loads(acls, encoding='utf-8') except Exception as e: current_app.logger.exception(e) @@ -490,8 +490,9 @@ It may have been removed by another user. sid: Server ID did: Database ID """ - data = request.form if request.form else \ - json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) required_args = { 'name': 'Name' @@ -559,7 +560,7 @@ It may have been removed by another user. scid: Schema ID """ data = request.form if request.form else json.loads( - request.data.decode() + request.data, encoding='utf-8' ) try: SQL = self.get_sql(gid, sid, data, scid) @@ -669,7 +670,7 @@ It may have been removed by another user. data = dict() for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v @@ -769,14 +770,16 @@ It may have been removed by another user. _=gettext, data=data, conn=self.conn ) - sql_header = """ --- SCHEMA: {0} + sql_header = "-- SCHEMA: {0}\n\n-- ".format(data['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') --- DROP SCHEMA {0}; + # drop schema + sql_header += render_template( + "/".join([self.template_path, 'sql/delete.sql']), + _=gettext, name=data['name'], conn=self.conn, cascade=False) -""".format(data['name']) - - SQL = sql_header + SQL + SQL = sql_header + '\n\n' + SQL return ajax_response(response=SQL.strip("\n")) @@ -959,6 +962,8 @@ It may have been removed by another user. -- DROP SCHEMA {0}; """.format(old_data['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') SQL = sql_header + SQL diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py index 29fbe616f..c4e7bc3f5 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py @@ -9,7 +9,7 @@ """ Implements Collation Node """ -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases as database @@ -378,7 +378,7 @@ class CollationView(PGChildNodeView): """ data = request.form if request.form else json.loads( - request.data.decode() + request.data, encoding='utf-8' ) required_args = [ @@ -502,7 +502,7 @@ class CollationView(PGChildNodeView): coid: Collation ID """ data = request.form if request.form else json.loads( - request.data.decode() + request.data, encoding='utf-8' ) SQL = self.get_sql(gid, sid, data, scid, coid) try: @@ -549,7 +549,7 @@ class CollationView(PGChildNodeView): data = dict() for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v @@ -622,6 +622,8 @@ class CollationView(PGChildNodeView): data=data, conn=self.conn) sql_header = "-- Collation: {0};\n\n-- ".format(data['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') sql_header += render_template("/".join([self.template_path, 'delete.sql']), name=data['name']) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py index 2345627d4..076e288e6 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py @@ -9,7 +9,7 @@ """Implements the Domain Node.""" -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases as databases @@ -189,7 +189,7 @@ class DomainView(PGChildNodeView, DataTypeReader): data = {} if request.data: - req = json.loads(request.data.decode()) + req = json.loads(request.data, encoding='utf-8') else: req = request.args or request.form @@ -218,7 +218,7 @@ class DomainView(PGChildNodeView, DataTypeReader): if key in list_params and req[key] != '' \ and req[key] is not None: # Coverts string into python list as expected. - data[key] = json.loads(req[key]) + data[key] = json.loads(req[key], encoding='utf-8') elif key == 'typnotnull': data[key] = True if req[key] == 'true' or req[key] is \ True else \ @@ -706,6 +706,8 @@ AND relkind != 'c'))""" -- DROP DOMAIN {0}; """.format(data['basensp'] + '.' + data['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') SQL = sql_header + SQL diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/__init__.py index cf5fa35cb..8eef4d196 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/__init__.py @@ -9,7 +9,7 @@ """Implements the Domain Constraint Module.""" -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases.schemas.domains \ @@ -193,7 +193,7 @@ class DomainConstraintView(PGChildNodeView): data = {} if request.data: - req = json.loads(request.data.decode()) + req = json.loads(request.data, encoding='utf-8') else: req = request.args or request.form @@ -571,6 +571,8 @@ class DomainConstraintView(PGChildNodeView): -- ALTER DOMAIN {1} DROP CONSTRAINT {0}; """.format(data['name'], schema + '.' + domain) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') SQL = sql_header + SQL diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py index a37210761..2665b624b 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py @@ -9,7 +9,7 @@ """Implements the Foreign Table Module.""" -import json +import simplejson as json import sys import traceback from functools import wraps @@ -232,7 +232,7 @@ class ForeignTableView(PGChildNodeView, DataTypeReader): data = {} if request.data: - req = json.loads(request.data.decode()) + req = json.loads(request.data, encoding='utf-8') else: req = request.args or request.form @@ -267,7 +267,7 @@ class ForeignTableView(PGChildNodeView, DataTypeReader): # Coverts string into python list as expected. data[key] = [] if \ type(req[key]) == list and len(req[key]) == 0 else \ - json.loads(req[key]) + json.loads(req[key], encoding='utf-8') if key == 'inherits': # Convert Table ids from unicode/string to int @@ -833,6 +833,8 @@ AND relkind != 'c'))""" -- DROP {0} {1}; """.format('FOREIGN TABLE', data['basensp'] + "." + data['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') SQL = sql_header + SQL @@ -1205,7 +1207,7 @@ AND relkind != 'c'))""" else: columns = '*' - sql = "SELECT {0}\n\tFROM {1};".format( + sql = u"SELECT {0}\n\tFROM {1};".format( columns, self.qtIdent(self.conn, data['basensp'], data['name']) ) @@ -1241,7 +1243,7 @@ AND relkind != 'c'))""" if len(columns) > 0: columns = ", ".join(columns) values = ", ".join(values) - sql = "INSERT INTO {0}(\n\t{1})\n\tVALUES ({2});".format( + sql = u"INSERT INTO {0}(\n\t{1})\n\tVALUES ({2});".format( self.qtIdent(self.conn, data['basensp'], data['name']), columns, values ) @@ -1282,7 +1284,7 @@ AND relkind != 'c'))""" columns = "=?, ".join(columns) columns += "=?" - sql = "UPDATE {0}\n\tSET {1}\n\tWHERE ;".format( + sql = u"UPDATE {0}\n\tSET {1}\n\tWHERE ;".format( self.qtIdent(self.conn, data['basensp'], data['name']), columns ) @@ -1308,7 +1310,7 @@ AND relkind != 'c'))""" """ data = self._fetch_properties(gid, sid, did, scid, foid) - sql = "DELETE FROM {0}\n\tWHERE ;".format( + sql = u"DELETE FROM {0}\n\tWHERE ;".format( self.qtIdent(self.conn, data['basensp'], data['name']) ) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py index 2aa6eca99..8c3202572 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py @@ -9,7 +9,7 @@ """Defines views for management of Fts Configuration node""" -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases as databases @@ -404,7 +404,8 @@ class FtsConfigurationView(PGChildNodeView): ] data = request.form if request.form else json.loads( - request.data.decode()) + request.data, encoding='utf-8' + ) for arg in required_args: if arg not in data: return make_json_response( @@ -484,7 +485,8 @@ class FtsConfigurationView(PGChildNodeView): :param cfgid: fts Configuration id """ data = request.form if request.form else json.loads( - request.data.decode()) + request.data, encoding='utf-8' + ) # Fetch sql query to update fts Configuration sql = self.get_sql(gid, sid, did, scid, data, cfgid) @@ -620,7 +622,7 @@ class FtsConfigurationView(PGChildNodeView): data = {} for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py index 5ff86a38b..b7dea0867 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py @@ -9,7 +9,7 @@ """Defines views for management of Fts Dictionary node""" -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases as databases @@ -409,7 +409,8 @@ class FtsDictionaryView(PGChildNodeView): ] data = request.form if request.form else json.loads( - request.data.decode()) + request.data, encoding='utf-8' + ) for arg in required_args: if arg not in data: return make_json_response( @@ -475,7 +476,8 @@ class FtsDictionaryView(PGChildNodeView): :param dcid: fts dictionary id """ data = request.form if request.form else json.loads( - request.data.decode()) + request.data, encoding='utf-8' + ) # Fetch sql query to update fts dictionary sql = self.get_sql(gid, sid, did, scid, data, dcid) @@ -606,7 +608,7 @@ class FtsDictionaryView(PGChildNodeView): data = {} for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/__init__.py index ec152ba17..cd3192246 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/__init__.py @@ -9,7 +9,7 @@ """Defines views for management of FTS Parser node""" -import json +import simplejson as json from functools import wraps from flask import render_template, request, jsonify, current_app @@ -345,7 +345,8 @@ class FtsParserView(PGChildNodeView): ] data = request.form if request.form else json.loads( - request.data.decode()) + request.data, encoding='utf-8' + ) for arg in required_args: if arg not in data: return make_json_response( @@ -413,7 +414,8 @@ class FtsParserView(PGChildNodeView): :param pid: fts parser id """ data = request.form if request.form else json.loads( - request.data.decode()) + request.data, encoding='utf-8' + ) # Fetch sql query to update fts parser sql = self.get_sql(gid, sid, did, scid, data, pid) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py index dfd1ae129..a349197ad 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py @@ -9,7 +9,7 @@ """Defines views for management of Fts Template node""" -import json +import simplejson as json from functools import wraps from flask import render_template, make_response, request, jsonify @@ -322,7 +322,8 @@ class FtsTemplateView(PGChildNodeView): ] data = request.form if request.form else json.loads( - request.data.decode()) + request.data, encoding='utf-8' + ) for arg in required_args: if arg not in data: return make_json_response( @@ -387,7 +388,8 @@ class FtsTemplateView(PGChildNodeView): :param tid: fts tempate id """ data = request.form if request.form else json.loads( - request.data.decode()) + request.data, encoding='utf-8' + ) # Fetch sql query to update fts template sql = self.get_sql(gid, sid, did, scid, data, tid) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py index c2a48a256..aadd46675 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py @@ -10,7 +10,7 @@ """Implements Functions/Procedures Node.""" import copy -import json +import simplejson as json import re import sys import traceback @@ -252,7 +252,7 @@ class FunctionView(PGChildNodeView, DataTypeReader): data = {} if request.data: - req = json.loads(request.data.decode()) + req = json.loads(request.data, encoding='utf-8') else: req = request.args or request.form @@ -280,7 +280,7 @@ class FunctionView(PGChildNodeView, DataTypeReader): if key in list_params and req[key] != '' \ and req[key] is not None: # Coverts string into python list as expected. - data[key] = json.loads(req[key]) + data[key] = json.loads(req[key], encoding='utf-8') elif ( key == 'proretset' or key == 'proisstrict' or key == 'prosecdef' or key == 'proiswindow' or @@ -971,6 +971,8 @@ class FunctionView(PGChildNodeView, DataTypeReader): -- DROP {0} {1}; """.format(object_type.upper(), name) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') SQL = sql_header + func_def SQL = re.sub('\n{2,}', '\n\n', SQL) @@ -1135,7 +1137,7 @@ class FunctionView(PGChildNodeView, DataTypeReader): if 'acl' in data: data['acl'] = parse_priv_to_db(data['acl'], ["X"]) - args = '' + args = u'' cnt = 1 if 'arguments' in data: for a in data['arguments']: diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py index c0e18fcf3..29be4fd75 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py @@ -9,7 +9,7 @@ """Implements Sequence Node""" -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases as database @@ -302,7 +302,9 @@ class SequenceView(PGChildNodeView): u'seqowner', ] - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) for arg in required_args: if arg not in data: @@ -429,7 +431,9 @@ class SequenceView(PGChildNodeView): Returns: """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) try: SQL = self.getSQL(gid, sid, did, data, scid, seid) SQL = SQL.strip('\n').strip(' ') @@ -481,7 +485,7 @@ class SequenceView(PGChildNodeView): data = {} for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py index fc838ac6c..d4d1885e1 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py @@ -9,7 +9,7 @@ """ Implements Table Node """ -import json +import simplejson as json import re from functools import wraps @@ -1348,11 +1348,13 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings): did: Database ID scid: Schema ID """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) for k, v in data.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except (ValueError, TypeError): data[k] = v @@ -1381,7 +1383,9 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings): # We will convert it again to list if 'coll_inherits' in data and \ isinstance(data['coll_inherits'], str): - data['coll_inherits'] = json.loads(data['coll_inherits']) + data['coll_inherits'] = json.loads( + data['coll_inherits'], encoding='utf-8' + ) if 'foreign_key' in data: for c in data['foreign_key']: @@ -1434,12 +1438,12 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings): tid: Table ID """ data = request.form if request.form else json.loads( - request.data.decode() + request.data, encoding='utf-8' ) for k, v in data.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except (ValueError, TypeError): data[k] = v @@ -1547,7 +1551,9 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings): tid: Table ID """ # Below will decide if it's simple drop or drop with cascade call - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) # Convert str 'true' to boolean type is_cascade = json.loads(data['cascade']) @@ -1593,7 +1599,9 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings): tid: Table ID """ # Below will decide if it's simple drop or drop with cascade call - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) # Convert str 'true' to boolean type is_enable = json.loads(data['enable']) @@ -1675,7 +1683,7 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings): data = dict() for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except (ValueError, TypeError): data[k] = v @@ -2397,9 +2405,10 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings): c['cltype'] = self._cltype_formatter(c['cltype']) c['hasSqrBracket'] = self.hasSqrBracket - sql_header = "-- Table: {0}\n\n-- ".format(self.qtIdent(self.conn, + sql_header = u"-- Table: {0}\n\n-- ".format(self.qtIdent(self.conn, data['schema'], data['name'])) + sql_header += render_template("/".join([self.template_path, 'delete.sql']), data=data, conn=self.conn) @@ -2490,6 +2499,9 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings): data['cols'] = ', '.join(cols) sql_header = "\n-- Index: {0}\n\n-- ".format(data['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') + sql_header += render_template("/".join([self.index_template_path, 'delete.sql']), data=data, conn=self.conn) @@ -2559,6 +2571,9 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings): data = trigger_definition(data) sql_header = "\n-- Trigger: {0}\n\n-- ".format(data['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') + sql_header += render_template("/".join([self.trigger_template_path, 'delete.sql']), data=data, conn=self.conn) @@ -2656,7 +2671,7 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings): else: columns = '*' - sql = "SELECT {0}\n\tFROM {1};".format( + sql = u"SELECT {0}\n\tFROM {1};".format( columns, self.qtIdent(self.conn, data['schema'], data['name']) ) @@ -2700,7 +2715,7 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings): if len(columns) > 0: columns = ", ".join(columns) values = ", ".join(values) - sql = "INSERT INTO {0}(\n\t{1})\n\tVALUES ({2});".format( + sql = u"INSERT INTO {0}(\n\t{1})\n\tVALUES ({2});".format( self.qtIdent(self.conn, data['schema'], data['name']), columns, values ) @@ -2749,7 +2764,7 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings): else: columns = "=?, ".join(columns) - sql = "UPDATE {0}\n\tSET {1}\n\tWHERE ;".format( + sql = u"UPDATE {0}\n\tSET {1}\n\tWHERE ;".format( self.qtIdent(self.conn, data['schema'], data['name']), columns ) @@ -2783,7 +2798,7 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings): data = res['rows'][0] - sql = "DELETE FROM {0}\n\tWHERE ;".format( + sql = u"DELETE FROM {0}\n\tWHERE ;".format( self.qtIdent(self.conn, data['schema'], data['name']) ) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/column/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/column/__init__.py index 2bd513dc8..78493b6ab 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/column/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/column/__init__.py @@ -9,7 +9,7 @@ """ Implements Column Node """ -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases as database @@ -505,12 +505,12 @@ class ColumnsView(PGChildNodeView, DataTypeReader): tid: Table ID """ data = request.form if request.form else json.loads( - request.data.decode() + request.data, encoding='utf-8' ) for k, v in data.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except (ValueError, TypeError): data[k] = v @@ -642,7 +642,9 @@ class ColumnsView(PGChildNodeView, DataTypeReader): tid: Table ID clid: Column ID """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) # Adding parent into data dict, will be using it while creating sql data['schema'] = self.schema @@ -699,7 +701,7 @@ class ColumnsView(PGChildNodeView, DataTypeReader): data = dict() for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v @@ -824,10 +826,11 @@ class ColumnsView(PGChildNodeView, DataTypeReader): SQL = self.get_sql(scid, tid, None, data) - sql_header = "-- Column: {0}\n\n-- ".format(self.qtIdent(self.conn, + sql_header = u"-- Column: {0}\n\n-- ".format(self.qtIdent(self.conn, data['schema'], data['table'], data['name'])) + sql_header += render_template("/".join([self.template_path, 'delete.sql']), data=data, conn=self.conn) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py index 2361d8988..8f0a815de 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py @@ -9,7 +9,7 @@ """Implements the Check Constraint Module.""" -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases as database @@ -396,11 +396,13 @@ class CheckConstraintView(PGChildNodeView): """ required_args = ['consrc'] - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) for k, v in data.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except (ValueError, TypeError): data[k] = v @@ -556,7 +558,9 @@ class CheckConstraintView(PGChildNodeView): tid: Table Id cid: Check Constraint Id """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) try: data['schema'] = self.schema @@ -643,6 +647,8 @@ class CheckConstraintView(PGChildNodeView): data=data) sql_header = "-- Constraint: {0}\n\n-- ".format(data['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') sql_header += render_template( "/".join([self.template_path, 'delete.sql']), @@ -672,7 +678,7 @@ class CheckConstraintView(PGChildNodeView): data = {} for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/__init__.py index 23f80d0f0..7a6396de5 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/__init__.py @@ -9,7 +9,7 @@ """Implements Exclusion constraint Node""" -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases as database @@ -441,11 +441,13 @@ class ExclusionConstraintView(PGChildNodeView): """ required_args = ['columns'] - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) for k, v in data.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except (ValueError, TypeError): data[k] = v @@ -546,7 +548,9 @@ class ExclusionConstraintView(PGChildNodeView): Returns: """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) try: data['schema'] = self.schema @@ -677,7 +681,7 @@ class ExclusionConstraintView(PGChildNodeView): data = {} for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v @@ -800,6 +804,8 @@ class ExclusionConstraintView(PGChildNodeView): "/".join([self.template_path, 'create.sql']), data=data) sql_header = "-- Constraint: {0}\n\n-- ".format(data['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') sql_header += render_template( "/".join([self.template_path, 'delete.sql']), diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/__init__.py index 446d2476a..b6d996bcb 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/__init__.py @@ -9,7 +9,7 @@ """Implements Foreign key constraint Node""" -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases as database @@ -464,11 +464,13 @@ class ForeignKeyConstraintView(PGChildNodeView): """ required_args = ['columns'] - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) for k, v in data.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except (ValueError, TypeError): data[k] = v @@ -598,7 +600,9 @@ class ForeignKeyConstraintView(PGChildNodeView): Returns: """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) try: data['schema'] = self.schema @@ -737,7 +741,7 @@ class ForeignKeyConstraintView(PGChildNodeView): data = {} for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v @@ -903,6 +907,8 @@ class ForeignKeyConstraintView(PGChildNodeView): "/".join([self.template_path, 'create.sql']), data=data) sql_header = "-- Constraint: {0}\n\n-- ".format(data['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') sql_header += render_template( "/".join([self.template_path, 'delete.sql']), @@ -1055,7 +1061,7 @@ class ForeignKeyConstraintView(PGChildNodeView): index = None try: if data and 'cols' in data: - cols = set(json.loads(data['cols'])) + cols = set(json.loads(data['cols'], encoding='utf-8')) index = self.search_coveringindex(tid, cols) return make_json_response( diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py index bab913718..37fb8f242 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py @@ -9,7 +9,7 @@ """Implements Primary key constraint Node""" -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases as database @@ -444,11 +444,13 @@ class IndexConstraintView(PGChildNodeView): [u'columns', u'index'] # Either of one should be there. ] - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) for k, v in data.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except (ValueError, TypeError): data[k] = v @@ -563,7 +565,9 @@ class IndexConstraintView(PGChildNodeView): Returns: """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) try: data['schema'] = self.schema @@ -699,7 +703,7 @@ class IndexConstraintView(PGChildNodeView): data = {} for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v @@ -827,6 +831,8 @@ class IndexConstraintView(PGChildNodeView): constraint_name=self.constraint_name) sql_header = "-- Constraint: {0}\n\n-- ".format(data['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') sql_header += render_template( "/".join([self.template_path, 'delete.sql']), diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py index 3b98dcf2d..fa6794746 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py @@ -9,7 +9,7 @@ """ Implements Index Node """ -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases as database @@ -522,12 +522,12 @@ class IndexesView(PGChildNodeView): tid: Table ID """ data = request.form if request.form else json.loads( - request.data.decode() + request.data, encoding='utf-8' ) for k, v in data.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except (ValueError, TypeError): data[k] = v @@ -683,7 +683,9 @@ class IndexesView(PGChildNodeView): tid: Table ID idx: Index ID """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) data['schema'] = self.schema data['table'] = self.table try: @@ -732,7 +734,7 @@ class IndexesView(PGChildNodeView): data = dict() for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v @@ -835,6 +837,9 @@ class IndexesView(PGChildNodeView): SQL = self.get_sql(scid, tid, None, data) sql_header = "-- Index: {0}\n\n-- ".format(data['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') + sql_header += render_template("/".join([self.template_path, 'delete.sql']), data=data, conn=self.conn) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py index ccd1a7708..d46245425 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py @@ -9,7 +9,7 @@ """Implements Rule Node""" -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases.schemas as schemas @@ -290,8 +290,9 @@ class RuleView(PGChildNodeView): 'name', ] - data = request.form if request.form else \ - json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) for arg in required_args: if arg not in data: return make_json_response( @@ -331,8 +332,9 @@ class RuleView(PGChildNodeView): """ This function will update a rule object """ - data = request.form if request.form else \ - json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) SQL = self.getSQL(gid, sid, data, tid, rid) try: if SQL and SQL.strip('\n') and SQL.strip(' '): diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py index ae8fb3f01..a639df066 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py @@ -9,7 +9,7 @@ """ Implements Trigger Node """ -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases as database @@ -537,12 +537,12 @@ class TriggerView(PGChildNodeView): tid: Table ID """ data = request.form if request.form else json.loads( - request.data.decode() + request.data, encoding='utf-8' ) for k, v in data.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except (ValueError, TypeError): data[k] = v @@ -668,7 +668,9 @@ class TriggerView(PGChildNodeView): tid: Table ID trid: Trigger ID """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) try: SQL = self.get_sql(scid, tid, trid, data) @@ -716,7 +718,7 @@ class TriggerView(PGChildNodeView): data = dict() for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v @@ -826,6 +828,9 @@ class TriggerView(PGChildNodeView): SQL = self.get_sql(scid, tid, None, data) sql_header = "-- Trigger: {0}\n\n-- ".format(data['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') + sql_header += render_template("/".join([self.template_path, 'delete.sql']), data=data, conn=self.conn) @@ -858,7 +863,9 @@ class TriggerView(PGChildNodeView): trid: Trigger ID """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) # Convert str 'true' to boolean type is_enable_flag = json.loads(data['enable']) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py index 472dfe7e4..8ea7aa9cd 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py @@ -9,7 +9,7 @@ """ Implements Type Node """ -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers.databases as database @@ -793,7 +793,9 @@ class TypeView(PGChildNodeView, DataTypeReader): scid: Schema ID tid: Type ID """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) required_args = { 'name': 'Name', 'typtype': 'Type' @@ -898,7 +900,9 @@ class TypeView(PGChildNodeView, DataTypeReader): tid: Type ID """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) try: SQL = self.get_sql(gid, sid, data, scid, tid) if SQL and SQL.strip('\n') and SQL.strip(' '): @@ -1015,7 +1019,7 @@ class TypeView(PGChildNodeView, DataTypeReader): # converting nested request data in proper json format for key, val in req.items(): if key in ['composite', 'enum', 'seclabels', 'typacl']: - data[key] = json.loads(val) + data[key] = json.loads(val, encoding='utf-8') else: data[key] = val @@ -1191,6 +1195,9 @@ class TypeView(PGChildNodeView, DataTypeReader): # We are appending headers here for sql panel sql_header = "-- Type: {0}\n\n-- ".format(data['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') + sql_header += render_template("/".join([self.template_path, 'delete.sql']), data=data, conn=self.conn) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py index f307e7c0a..317a488a4 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py @@ -466,8 +466,9 @@ class ViewNode(PGChildNodeView, VacuumSettings): 'definition' ] - data = request.form if request.form else \ - json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) for arg in required_args: if arg not in data: return make_json_response( @@ -511,8 +512,9 @@ class ViewNode(PGChildNodeView, VacuumSettings): """ This function will update a view object """ - data = request.form if request.form else \ - json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) SQL = self.getSQL(gid, sid, data, vid) try: if SQL and SQL.strip('\n') and SQL.strip(' '): @@ -637,7 +639,7 @@ class ViewNode(PGChildNodeView, VacuumSettings): data = {} for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v @@ -1139,7 +1141,7 @@ class ViewNode(PGChildNodeView, VacuumSettings): else: columns = '*' - sql = "SELECT {0}\n\tFROM {1};".format( + sql = u"SELECT {0}\n\tFROM {1};".format( columns, self.qtIdent(self.conn, data_view['schema'], data_view['name']) ) @@ -1196,7 +1198,7 @@ class ViewNode(PGChildNodeView, VacuumSettings): if len(columns) > 0: columns = ", ".join(columns) values = ", ".join(values) - sql = "INSERT INTO {0}(\n\t{1})\n\tVALUES ({2});".format( + sql = u"INSERT INTO {0}(\n\t{1})\n\tVALUES ({2});".format( self.qtIdent( self.conn, data_view['schema'], data_view['name'] ), @@ -1607,8 +1609,9 @@ class MViewNode(ViewNode, VacuumSettings): """ # Below will decide if it's refresh data or refresh concurrently - data = request.form if request.form else \ - json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) is_concurrent = json.loads(data['concurrent']) with_data = json.loads(data['with_data']) diff --git a/web/pgadmin/browser/server_groups/servers/resource_groups/__init__.py b/web/pgadmin/browser/server_groups/servers/resource_groups/__init__.py index 4f4de4fa6..749e54335 100644 --- a/web/pgadmin/browser/server_groups/servers/resource_groups/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/resource_groups/__init__.py @@ -9,7 +9,7 @@ """Implements Resource Groups for PPAS 9.4 and above""" -import json +import simplejson as json from functools import wraps import pgadmin.browser.server_groups.servers as servers @@ -312,7 +312,9 @@ class ResourceGroupView(NodeView): 'name' ] - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) for arg in required_args: if arg not in data: return make_json_response( @@ -370,7 +372,9 @@ class ResourceGroupView(NodeView): required_args = [ 'name', 'cpu_rate_limit', 'dirty_rate_limit' ] - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) try: sql = render_template("/".join([self.template_path, 'properties.sql']), rgid=rg_id) @@ -474,7 +478,7 @@ class ResourceGroupView(NodeView): data = dict() for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError: data[k] = v diff --git a/web/pgadmin/browser/server_groups/servers/roles/__init__.py b/web/pgadmin/browser/server_groups/servers/roles/__init__.py index 8becc4e20..bee3d02a3 100644 --- a/web/pgadmin/browser/server_groups/servers/roles/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/roles/__init__.py @@ -111,7 +111,7 @@ class RoleView(PGChildNodeView): data = None if request.data: - data = json.loads(request.data) + data = json.loads(request.data, encoding='utf-8') else: data = dict() req = request.args or request.form @@ -125,7 +125,7 @@ class RoleView(PGChildNodeView): u'rolcatupdate', u'variables', u'rolmembership', u'seclabels' ]: - data[key] = json.loads(val) + data[key] = json.loads(val, encoding='utf-8') else: data[key] = val @@ -685,7 +685,7 @@ rolmembership:{ def drop(self, gid, sid, rid): status, res = self.conn.execute_2darray( - "DROP ROLE {0};".format(self.qtIdent(self.conn, self.role)) + u"DROP ROLE {0};".format(self.qtIdent(self.conn, self.role)) ) if not status: return internal_server_error( diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py b/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py index 4ea284c1b..3bed5f9a6 100644 --- a/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py @@ -6,7 +6,7 @@ # This software is released under the PostgreSQL Licence # ########################################################################## -import json +import simplejson as json import re from functools import wraps @@ -252,7 +252,9 @@ class TablespaceView(PGChildNodeView): 'spclocation': 'Location' } - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) for arg in required_args: if arg not in data: @@ -318,7 +320,9 @@ class TablespaceView(PGChildNodeView): """ This function will update tablespace object """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) try: SQL = self.get_sql(gid, sid, data, tsid) @@ -411,7 +415,7 @@ class TablespaceView(PGChildNodeView): data = dict() for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError as ve: current_app.logger.exception(ve) data[k] = v @@ -527,6 +531,9 @@ class TablespaceView(PGChildNodeView): """.format(old_data['name']) + if hasattr(str, 'decode'): + sql_header = sql_header.decode('utf-8') + SQL = sql_header + SQL SQL = re.sub('\n{2,}', '\n\n', SQL) return ajax_response(response=SQL.strip('\n')) @@ -729,7 +736,7 @@ class TablespaceView(PGChildNodeView): sid: Server ID tsid: Tablespace ID """ - data = json.loads(request.form['data']) + data = json.loads(request.form['data'], encoding='utf-8') try: SQL = render_template("/".join( @@ -768,7 +775,7 @@ class TablespaceView(PGChildNodeView): data = dict() for k, v in request.args.items(): try: - data[k] = json.loads(v) + data[k] = json.loads(v, encoding='utf-8') except ValueError as ve: current_app.logger.exception(ve) data[k] = v diff --git a/web/pgadmin/tools/backup/__init__.py b/web/pgadmin/tools/backup/__init__.py index ece5d974d..771b3ff36 100644 --- a/web/pgadmin/tools/backup/__init__.py +++ b/web/pgadmin/tools/backup/__init__.py @@ -9,7 +9,7 @@ """Implements Backup Utility""" -import json +import simplejson as json import os from flask import render_template, request, current_app, \ @@ -233,9 +233,9 @@ def create_backup_job(sid): if request.form: # Convert ImmutableDict to dict data = dict(request.form) - data = json.loads(data['data'][0]) + data = json.loads(data['data'][0], encoding='utf-8') else: - data = json.loads(request.data.decode()) + data = json.loads(request.data, encoding='utf-8') backup_file = filename_with_file_manager_path(data['file']) @@ -327,9 +327,9 @@ def create_backup_objects_job(sid): if request.form: # Convert ImmutableDict to dict data = dict(request.form) - data = json.loads(data['data'][0]) + data = json.loads(data['data'][0], encoding='utf-8') else: - data = json.loads(request.data.decode()) + data = json.loads(request.data, encoding='utf-8') backup_file = filename_with_file_manager_path(data['file']) diff --git a/web/pgadmin/tools/datagrid/__init__.py b/web/pgadmin/tools/datagrid/__init__.py index aaaefdabf..b607143f0 100644 --- a/web/pgadmin/tools/datagrid/__init__.py +++ b/web/pgadmin/tools/datagrid/__init__.py @@ -10,7 +10,7 @@ """A blueprint module implementing the datagrid frame.""" MODULE_NAME = 'datagrid' -import json +import simplejson as json import pickle import random @@ -93,7 +93,7 @@ def initialize_datagrid(cmd_type, obj_type, sid, did, obj_id): """ if request.data: - filter_sql = json.loads(request.data.decode()) + filter_sql = json.loads(request.data, encoding='utf-8') else: filter_sql = request.args or request.form @@ -289,7 +289,7 @@ def validate_filter(sid, did, obj_id): obj_id: Id of currently selected object """ if request.data: - filter_sql = json.loads(request.data.decode()) + filter_sql = json.loads(request.data, encoding='utf-8') else: filter_sql = request.args or request.form diff --git a/web/pgadmin/tools/debugger/__init__.py b/web/pgadmin/tools/debugger/__init__.py index 4b9f0bc4d..18393c325 100644 --- a/web/pgadmin/tools/debugger/__init__.py +++ b/web/pgadmin/tools/debugger/__init__.py @@ -11,7 +11,7 @@ MODULE_NAME = 'debugger' -import json +import simplejson as json import random from flask import url_for, Response, render_template, request, session, current_app @@ -373,7 +373,7 @@ def initialize_target(debug_type, sid, did, scid, func_id): # Here we get the value in case of direct debugging so update the session variables accordingly # For indirect debugging user will provide the data from another session so below condition will be be required if request.method == 'POST': - data = json.loads(request.values['data']) + data = json.loads(request.values['data'], encoding='utf-8') if data: d = session['funcData'] d['args_value'] = data @@ -582,7 +582,7 @@ def start_debugger_listener(trans_id): # If user again start the same debug function with different arguments then we need to save that values to session # variable and database. if request.method == 'POST': - data = json.loads(request.values['data']) + data = json.loads(request.values['data'], encoding='utf-8') if data: function_data = session['functionData'] session_obj = function_data[str(trans_id)] @@ -1080,7 +1080,7 @@ def deposit_parameter_value(trans_id): if conn.connected(): # get the data sent through post from client - data = json.loads(request.values['data']) + data = json.loads(request.values['data'], encoding='utf-8') if data: sql = render_template("/".join([template_path, "deposit_value.sql"]), session_id=obj['session_id'], @@ -1223,7 +1223,7 @@ def set_arguments_sqlite(sid, did, scid, func_id): """ if request.values['data']: - data = json.loads(request.values['data']) + data = json.loads(request.values['data'], encoding='utf-8') try: for i in range(0, len(data)): diff --git a/web/pgadmin/tools/import_export/__init__.py b/web/pgadmin/tools/import_export/__init__.py index f04f562c4..e1dc06109 100644 --- a/web/pgadmin/tools/import_export/__init__.py +++ b/web/pgadmin/tools/import_export/__init__.py @@ -9,7 +9,7 @@ """A blueprint module implementing the import and export functionality""" -import json +import simplejson as json import os from flask import url_for, Response, render_template, request, current_app @@ -166,9 +166,9 @@ def create_import_export_job(sid): if request.form: # Convert ImmutableDict to dict data = dict(request.form) - data = json.loads(data['data'][0]) + data = json.loads(data['data'][0], encoding='utf-8') else: - data = json.loads(request.data.decode()) + data = json.loads(request.data, encoding='utf-8') # Fetch the server details like hostname, port, roles etc server = Server.query.filter_by( diff --git a/web/pgadmin/tools/maintenance/__init__.py b/web/pgadmin/tools/maintenance/__init__.py index b116bf938..8853c8bdd 100644 --- a/web/pgadmin/tools/maintenance/__init__.py +++ b/web/pgadmin/tools/maintenance/__init__.py @@ -9,7 +9,7 @@ """A blueprint module implementing the maintenance tool for vacuum""" -import json +import simplejson as json from flask import url_for, Response, render_template, request, current_app from flask_babel import gettext as _ @@ -171,9 +171,9 @@ def create_maintenance_job(sid, did): if request.form: # Convert ImmutableDict to dict data = dict(request.form) - data = json.loads(data['data'][0]) + data = json.loads(data['data'][0], encoding='utf-8') else: - data = json.loads(request.data.decode()) + data = json.loads(request.data, encoding='utf-8') index_name = None diff --git a/web/pgadmin/tools/restore/__init__.py b/web/pgadmin/tools/restore/__init__.py index 5cec8da42..0fa8bb8d2 100644 --- a/web/pgadmin/tools/restore/__init__.py +++ b/web/pgadmin/tools/restore/__init__.py @@ -9,7 +9,7 @@ """Implements Restore Utility""" -import json +import simplejson as json import os from flask import render_template, request, current_app, \ @@ -175,9 +175,9 @@ def create_restore_job(sid): if request.form: # Convert ImmutableDict to dict data = dict(request.form) - data = json.loads(data['data'][0]) + data = json.loads(data['data'][0], encoding='utf-8') else: - data = json.loads(request.data.decode()) + data = json.loads(request.data, encoding='utf-8') backup_file = filename_with_file_manager_path(data['file']) diff --git a/web/pgadmin/tools/sqleditor/__init__.py b/web/pgadmin/tools/sqleditor/__init__.py index 21b7e93af..215edb581 100644 --- a/web/pgadmin/tools/sqleditor/__init__.py +++ b/web/pgadmin/tools/sqleditor/__init__.py @@ -10,7 +10,7 @@ """A blueprint module implementing the sqleditor frame.""" MODULE_NAME = 'sqleditor' -import json +import simplejson as json import os import pickle import random @@ -238,7 +238,7 @@ def start_query_tool(trans_id): """ if request.data: - sql = json.loads(request.data.decode()) + sql = json.loads(request.data, encoding='utf-8') else: sql = request.args or request.form @@ -366,7 +366,7 @@ def preferences(trans_id): else: data = None if request.data: - data = json.loads(request.data.decode()) + data = json.loads(request.data, encoding='utf-8') else: data = request.args or request.form for k, v in data.items(): @@ -516,7 +516,7 @@ def save(trans_id): """ if request.data: - changed_data = json.loads(request.data.decode()) + changed_data = json.loads(request.data, encoding='utf-8') else: changed_data = request.args or request.form @@ -574,7 +574,7 @@ def apply_filter(trans_id): trans_id: unique transaction id """ if request.data: - filter_sql = json.loads(request.data.decode()) + filter_sql = json.loads(request.data, encoding='utf-8') else: filter_sql = request.args or request.form @@ -606,7 +606,7 @@ def append_filter_inclusive(trans_id): trans_id: unique transaction id """ if request.data: - filter_data = json.loads(request.data.decode()) + filter_data = json.loads(request.data, encoding='utf-8') else: filter_data = request.args or request.form @@ -649,7 +649,7 @@ def append_filter_exclusive(trans_id): trans_id: unique transaction id """ if request.data: - filter_data = json.loads(request.data.decode()) + filter_data = json.loads(request.data, encoding='utf-8') else: filter_data = request.args or request.form @@ -724,7 +724,7 @@ def set_limit(trans_id): trans_id: unique transaction id """ if request.data: - limit = json.loads(request.data.decode()) + limit = json.loads(request.data, encoding='utf-8') else: limit = request.args or request.form @@ -847,7 +847,7 @@ def set_auto_commit(trans_id): trans_id: unique transaction id """ if request.data: - auto_commit = json.loads(request.data.decode()) + auto_commit = json.loads(request.data, encoding='utf-8') else: auto_commit = request.args or request.form @@ -885,7 +885,7 @@ def set_auto_rollback(trans_id): trans_id: unique transaction id """ if request.data: - auto_rollback = json.loads(request.data.decode()) + auto_rollback = json.loads(request.data, encoding='utf-8') else: auto_rollback = request.args or request.form @@ -926,7 +926,7 @@ def auto_complete(trans_id): text_before_cursor = '' if request.data: - data = json.loads(request.data.decode()) + data = json.loads(request.data, encoding='utf-8') else: data = request.args or request.form @@ -1125,7 +1125,7 @@ def load_file(): reads the data and sends back in reponse """ if request.data: - file_data = json.loads(request.data.decode()) + file_data = json.loads(request.data, encoding='utf-8') file_path = unquote(file_data['file_name']) # retrieve storage directory path @@ -1182,7 +1182,7 @@ def save_file(): and then save the data to the file """ if request.data: - file_data = json.loads(request.data.decode()) + file_data = json.loads(request.data, encoding='utf-8') # retrieve storage directory path storage_manager_path = get_storage_directory() diff --git a/web/pgadmin/tools/user_management/__init__.py b/web/pgadmin/tools/user_management/__init__.py index b7096c29d..dbf010b81 100644 --- a/web/pgadmin/tools/user_management/__init__.py +++ b/web/pgadmin/tools/user_management/__init__.py @@ -9,7 +9,7 @@ """Implements pgAdmin4 User Management Utility""" -import json +import simplejson as json import re from flask import render_template, request, \ @@ -163,7 +163,9 @@ def create(): Returns: """ - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) for f in ('email', 'role', 'active', 'newPassword', 'confirmPassword'): if f in data and data[f] != '': @@ -265,7 +267,9 @@ def update(uid): if not usr: abort(404) - data = request.form if request.form else json.loads(request.data.decode()) + data = request.form if request.form else json.loads( + request.data, encoding='utf-8' + ) try: new_data = validate_user(data) diff --git a/web/pgadmin/utils/driver/psycopg2/__init__.py b/web/pgadmin/utils/driver/psycopg2/__init__.py index 4bf7506e4..41a7e62ab 100644 --- a/web/pgadmin/utils/driver/psycopg2/__init__.py +++ b/web/pgadmin/utils/driver/psycopg2/__init__.py @@ -250,13 +250,23 @@ class Connection(BaseConnection): password = password.decode() try: + if hasattr(str, 'decode'): + database = self.db.encode('utf-8') + user = mgr.user.encode('utf-8') + conn_id = self.conn_id.encode('utf-8') + else: + database = self.db + user = mgr.user + conn_id = self.conn_id + import os - os.environ['PGAPPNAME'] = '{0} - {1}'.format(config.APP_NAME, self.conn_id) + os.environ['PGAPPNAME'] = '{0} - {1}'.format(config.APP_NAME, conn_id) + pg_conn = psycopg2.connect( host=mgr.host, port=mgr.port, - database=self.db, - user=mgr.user, + database=database, + user=user, password=password, async=self.async ) @@ -277,7 +287,7 @@ class Connection(BaseConnection): Failed to connect to the database server(#{server_id}) for connection ({conn_id}) with error message as below: {msg}""".format( server_id=self.manager.sid, - conn_id=self.conn_id, + conn_id=conn_id, msg=msg ) ) @@ -310,7 +320,7 @@ SET client_encoding='UNICODE';""") return False, res if mgr.role: - status, res = self.execute_scalar("SET ROLE TO %s", [mgr.role]) + status, res = self.execute_scalar(u"SET ROLE TO %s", [mgr.role]) if not status: self.conn.close() @@ -320,7 +330,7 @@ Connect to the database server (#{server_id}) for connection ({conn_id}), but - {msg} """.format( server_id=self.manager.sid, - conn_id=self.conn_id, + conn_id=conn_id, msg=res ) ) @@ -343,7 +353,7 @@ Failed to fetch the version information on the established connection to the dat {msg} """.format( server_id=self.manager.sid, - conn_id=self.conn_id, + conn_id=conn_id, msg=res ) ) @@ -395,7 +405,10 @@ WHERE return True, None def __cursor(self, server_cursor=False): - cur = getattr(g, str(self.manager.sid) + '#' + self.conn_id, None) + cur = getattr(g, "{0}#{1}".format( + self.manager.sid, + self.conn_id.encode('utf-8') + ), None) if self.connected() and cur and not cur.closed: if not server_cursor or (server_cursor and cur.name): @@ -457,7 +470,7 @@ Attempting to reconnect to the database server (#{server_id}) for the connection status, cur = self.connect() if not status: msg = gettext( - """ + u""" Connection for server#{0} with database "{1}" was lost. Attempt to reconnect it failed with the error: {2}""" @@ -468,7 +481,7 @@ Attempt to reconnect it failed with the error: else: return False, errmsg - setattr(g, str(self.manager.sid) + '#' + self.conn_id, cur) + setattr(g, "{0}#{1}".format(self.manager.sid, self.conn_id.encode('utf-8')), cur) return True, cur @@ -498,7 +511,7 @@ Attempt to reconnect it failed with the error: query_id = random.randint(1, 9999999) current_app.logger.log(25, - "Execute (with server cursor) for server #{server_id} - {conn_id} (Query-id: {query_id}):\n{query}".format( + u"Execute (with server cursor) for server #{server_id} - {conn_id} (Query-id: {query_id}):\n{query}".format( server_id=self.manager.sid, conn_id=self.conn_id, query=query, @@ -511,7 +524,7 @@ Attempt to reconnect it failed with the error: cur.close() errmsg = self._formatted_exception_msg(pe, formatted_exception_msg) current_app.logger.error( - "Failed to execute query ((with server cursor) for the server #{server_id} - {conn_id} (Query-id: {query_id}):\nError Message:{errmsg}".format( + u"Failed to execute query ((with server cursor) for the server #{server_id} - {conn_id} (Query-id: {query_id}):\nError Message:{errmsg}".format( server_id=self.manager.sid, conn_id=self.conn_id, query=query, @@ -568,7 +581,7 @@ Attempt to reconnect it failed with the error: current_app.logger.log( 25, - "Execute (scalar) for server #{server_id} - {conn_id} (Query-id: {query_id}):\n{query}".format( + u"Execute (scalar) for server #{server_id} - {conn_id} (Query-id: {query_id}):\n{query}".format( server_id=self.manager.sid, conn_id=self.conn_id, query=query, @@ -582,7 +595,7 @@ Attempt to reconnect it failed with the error: cur.close() errmsg = self._formatted_exception_msg(pe, formatted_exception_msg) current_app.logger.error( - "Failed to execute query (execute_scalar) for the server #{server_id} - {conn_id} (Query-id: {query_id}):\nError Message:{errmsg}".format( + u"Failed to execute query (execute_scalar) for the server #{server_id} - {conn_id} (Query-id: {query_id}):\nError Message:{errmsg}".format( server_id=self.manager.sid, conn_id=self.conn_id, query=query, @@ -618,7 +631,7 @@ Attempt to reconnect it failed with the error: current_app.logger.log( 25, - "Execute (async) for server #{server_id} - {conn_id} (Query-id: {query_id}):\n{query}".format( + u"Execute (async) for server #{server_id} - {conn_id} (Query-id: {query_id}):\n{query}".format( server_id=self.manager.sid, conn_id=self.conn_id, query=query, @@ -632,7 +645,7 @@ Attempt to reconnect it failed with the error: res = self._wait_timeout(cur.connection, ASYNC_WAIT_TIMEOUT) except psycopg2.Error as pe: errmsg = self._formatted_exception_msg(pe, formatted_exception_msg) - current_app.logger.error(""" + current_app.logger.error(u""" Failed to execute query (execute_async) for the server #{server_id} - {conn_id} (Query-id: {query_id}):\nError Message:{errmsg} """.format( @@ -668,7 +681,7 @@ Failed to execute query (execute_async) for the server #{server_id} - {conn_id} current_app.logger.log( 25, - "Execute (void) for server #{server_id} - {conn_id} (Query-id: {query_id}):\n{query}".format( + u"Execute (void) for server #{server_id} - {conn_id} (Query-id: {query_id}):\n{query}".format( server_id=self.manager.sid, conn_id=self.conn_id, query=query, @@ -681,7 +694,7 @@ Failed to execute query (execute_async) for the server #{server_id} - {conn_id} except psycopg2.Error as pe: cur.close() errmsg = self._formatted_exception_msg(pe, formatted_exception_msg) - current_app.logger.error(""" + current_app.logger.error(u""" Failed to execute query (execute_void) for the server #{server_id} - {conn_id} (Query-id: {query_id}):\nError Message:{errmsg} """.format( @@ -708,7 +721,7 @@ Failed to execute query (execute_void) for the server #{server_id} - {conn_id} query_id = random.randint(1, 9999999) current_app.logger.log( 25, - "Execute (2darray) for server #{server_id} - {conn_id} (Query-id: {query_id}):\n{query}".format( + u"Execute (2darray) for server #{server_id} - {conn_id} (Query-id: {query_id}):\n{query}".format( server_id=self.manager.sid, conn_id=self.conn_id, query=query, @@ -721,7 +734,7 @@ Failed to execute query (execute_void) for the server #{server_id} - {conn_id} cur.close() errmsg = self._formatted_exception_msg(pe, formatted_exception_msg) current_app.logger.error( - "Failed to execute query (execute_2darray) for the server #{server_id} - {conn_id} (Query-id: {query_id}):\nError Message:{errmsg}".format( + u"Failed to execute query (execute_2darray) for the server #{server_id} - {conn_id} (Query-id: {query_id}):\nError Message:{errmsg}".format( server_id=self.manager.sid, conn_id=self.conn_id, query=query, @@ -753,7 +766,7 @@ Failed to execute query (execute_void) for the server #{server_id} - {conn_id} query_id = random.randint(1, 9999999) current_app.logger.log( 25, - "Execute (dict) for server #{server_id} - {conn_id} (Query-id: {query_id}):\n{query}".format( + u"Execute (dict) for server #{server_id} - {conn_id} (Query-id: {query_id}):\n{query}".format( server_id=self.manager.sid, conn_id=self.conn_id, query=query, @@ -766,7 +779,7 @@ Failed to execute query (execute_void) for the server #{server_id} - {conn_id} cur.close() errmsg = self._formatted_exception_msg(pe, formatted_exception_msg) current_app.logger.error( - "Failed to execute query (execute_dict) for the server #{server_id}- {conn_id} (Query-id: {query_id}):\nError Message:{errmsg}".format( + u"Failed to execute query (execute_dict) for the server #{server_id}- {conn_id} (Query-id: {query_id}):\nError Message:{errmsg}".format( server_id=self.manager.sid, conn_id=self.conn_id, query_id=query_id, @@ -1245,17 +1258,23 @@ class ServerManager(object): "Server has no active connection. Please connect to the server." ) - if database is None: + if database is not None: + if hasattr(str, 'decode') and \ + not isinstance(database, unicode): + database = database.decode('utf-8') + else: if did is None: database = self.db elif did in self.db_info: database = self.db_info[did]['datname'] + if hasattr(str, 'decode'): + database = database.decode('utf-8') else: - maintenance_db_id = 'DB:' + self.db + maintenance_db_id = u'DB:{0}'.format(self.db) if maintenance_db_id in self.connections: conn = self.connections[maintenance_db_id] if conn.connected(): - status, res = conn.execute_dict(""" + status, res = conn.execute_dict(u""" SELECT db.oid as did, db.datname, db.datallowconn, pg_encoding_to_char(db.encoding) AS serverencoding, @@ -1267,6 +1286,9 @@ WHERE db.oid = {0}""".format(did)) if status and len(res['rows']) > 0: for row in res['rows']: self.db_info[did] = row + if hasattr(str, 'decode'): + self.db_info[did]['datname'] = \ + self.db_info[did]['datname'].decode('utf-8') database = self.db_info[did]['datname'] if did not in self.db_info: @@ -1277,8 +1299,8 @@ WHERE db.oid = {0}""".format(did)) if database is None: raise Exception(msg_active_conn) - my_id = ('CONN:' + str(conn_id)) if conn_id is not None else \ - ('DB:' + str(database)) + my_id = (u'CONN:{0}'.format(conn_id)) if conn_id is not None else \ + (u'DB:{0}'.format(database)) self.pinged = datetime.datetime.now() @@ -1335,13 +1357,15 @@ WHERE db.oid = {0}""".format(did)) if did is not None: if did in self.db_info and 'datname' in self.db_info[did]: database = self.db_info[did]['datname'] + if hasattr(str, 'decode'): + database = database.decode('utf-8') if database is None: return False else: return False - my_id = ('CONN:' + str(conn_id)) if conn_id is not None else \ - ('DB:' + str(database)) if database is not None else None + my_id = (u'CONN:{0}'.format(conn_id)) if conn_id is not None else \ + (u'DB:{0}'.format(database)) if database is not None else None if my_id is not None: if my_id in self.connections: @@ -1564,14 +1588,22 @@ class Driver(BaseDriver): @staticmethod def qtLiteral(value): - - res = adapt(value).getquoted() + try: + res = adapt(value).getquoted() + except UnicodeEncodeError: + # We will handle special characters with utf8 encoding + adapted = adapt(value) + adapted.encoding = 'utf8' + res = adapted.getquoted() # Returns in bytes, we need to convert it in string if isinstance(res, bytes): - return res.decode() - else: - return res + try: + res = res.decode() + except UnicodeDecodeError: + res = res.decode('utf-8') + + return res @staticmethod def ScanKeywordExtraLookup(key): @@ -1607,17 +1639,12 @@ class Driver(BaseDriver): @staticmethod def needsQuoting(key, forTypes): - - # Python 3 does not require the decoding of value - if hasattr(str, 'decode'): - value = key.decode() - else: - value = key + value = key valNoArray = value # check if the string is number or not - if (isinstance(value, int)): - return True; + if isinstance(value, int): + return True # certain types should not be quoted even though it contains a space. Evilness. elif forTypes and value[-2:] == u"[]": valNoArray = value[:-2] @@ -1691,8 +1718,14 @@ class Driver(BaseDriver): for val in args: if type(val) == list: return map(lambda w: Driver.qtIdent(conn, w), val) + if hasattr(str, 'decode') and not isinstance(val, unicode): + # Handling for python2 + try: + val = str(val).encode('utf-8') + except UnicodeDecodeError: + # If already unicode, most likely coming from db + val = str(val).decode('utf-8') - val = str(val) if len(val) == 0: continue