Hi, Please find updated patch for RM2244.
Changes: View Data was broken in last patch when table contains more that 1 column. -- *Harshal Dhumal* *Software Engineer* EnterpriseDB India: http://www.enterprisedb.com The Enterprise PostgreSQL Company On Mon, Mar 20, 2017 at 4:10 PM, Dave Page <dp...@pgadmin.org> wrote: > Hi > > On Sat, Mar 18, 2017 at 2:57 PM, Harshal Dhumal > <harshal.dhu...@enterprisedb.com> wrote: > > > > Please find attached patch for RM2244. > > If I run View Data on the table below, I see the following exception > and no grid is rendered: > > CREATE TABLE public.varchar_test > ( > id integer NOT NULL DEFAULT nextval('varchar_test_id_seq'::regclass), > data character varying(10) COLLATE pg_catalog."default", > CONSTRAINT varchar_test_pkey PRIMARY KEY (id) > ) > WITH ( > OIDS = FALSE > ) > TABLESPACE pg_default; > > ALTER TABLE public.varchar_test > OWNER to postgres; > > > > > 2017-03-20 10:37:49,711: SQL pgadmin: Execute (async) for server #1 - > CONN:1470698 (Query-id: 4557394): > SELECT * FROM public.varchar_test > ORDER BY id ASC > 2017-03-20 10:37:49,714: INFO werkzeug: 127.0.0.1 - - [20/Mar/2017 > 10:37:49] "GET /sqleditor/view_data/start/2408862 HTTP/1.1" 200 - > 2017-03-20 10:37:49,749: SQL pgadmin: Polling result for (Query-id: > 4557394) > 2017-03-20 10:37:49,749: SQL pgadmin: Status message for (Query-id: > 4557394) > 2017-03-20 10:37:49,750: INFO werkzeug: 127.0.0.1 - - [20/Mar/2017 > 10:37:49] "GET /sqleditor/poll/2408862 HTTP/1.1" 200 - > 2017-03-20 10:37:49,779: INFO werkzeug: 127.0.0.1 - - [20/Mar/2017 > 10:37:49] "GET /sqleditor/columns/2408862 HTTP/1.1" 200 - > 2017-03-20 10:37:49,808: SQL pgadmin: Execute (dict) for server #1 - > CONN:1470698 (Query-id: 9451779): > SELECT oid, format_type(oid,null) as typname FROM pg_type WHERE oid IN > (%s) ORDER BY oid; > > 2017-03-20 10:37:49,814: INFO werkzeug: 127.0.0.1 - - [20/Mar/2017 > 10:37:49] "GET /sqleditor/fetch/types/2408862 HTTP/1.1" 500 - > Traceback (most recent call last): > File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site- > packages/flask/app.py", > line 2000, in __call__ > return self.wsgi_app(environ, start_response) > File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site- > packages/flask/app.py", > line 1991, in wsgi_app > response = self.make_response(self.handle_exception(e)) > File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site- > packages/flask/app.py", > line 1567, in handle_exception > reraise(exc_type, exc_value, tb) > File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site- > packages/flask/app.py", > line 1988, in wsgi_app > response = self.full_dispatch_request() > File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site- > packages/flask/app.py", > line 1641, in full_dispatch_request > rv = self.handle_user_exception(e) > File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site- > packages/flask/app.py", > line 1544, in handle_user_exception > reraise(exc_type, exc_value, tb) > File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site- > packages/flask/app.py", > line 1639, in full_dispatch_request > rv = self.dispatch_request() > File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site- > packages/flask/app.py", > line 1625, in dispatch_request > return self.view_functions[rule.endpoint](**req.view_args) > File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site- > packages/flask_login.py", > line 792, in decorated_view > return func(*args, **kwargs) > File "/Users/dpage/git/pgadmin4/web/pgadmin/tools/sqleditor/__ > init__.py", > line 558, in fetch_pg_types > """, tuple(oid)) > File "/Users/dpage/git/pgadmin4/web/pgadmin/utils/driver/ > psycopg2/__init__.py", > line 938, in execute_dict > self.__internal_blocking_execute(cur, query, params) > File "/Users/dpage/git/pgadmin4/web/pgadmin/utils/driver/ > psycopg2/__init__.py", > line 595, in __internal_blocking_execute > cur.execute(query, params) > File "/Users/dpage/git/pgadmin4/web/pgadmin/utils/driver/ > psycopg2/cursor.py", > line 176, in execute > return _cursor.execute(self, query, params) > TypeError: not all arguments converted during string formatting > > > > -- > Dave Page > Blog: http://pgsnake.blogspot.com > Twitter: @pgsnake > > EnterpriseDB UK: http://www.enterprisedb.com > The Enterprise PostgreSQL Company >
diff --git a/web/pgadmin/tools/sqleditor/__init__.py b/web/pgadmin/tools/sqleditor/__init__.py index 3f87cac..70750c9 100644 --- a/web/pgadmin/tools/sqleditor/__init__.py +++ b/web/pgadmin/tools/sqleditor/__init__.py @@ -26,14 +26,14 @@ from pgadmin.utils.sqlautocomplete.autocomplete import SQLAutoComplete from pgadmin.misc.file_manager import Filemanager -from config import PG_DEFAULT_DRIVER, SERVER_MODE +from config import PG_DEFAULT_DRIVER MODULE_NAME = 'sqleditor' -# import unquote from urlib for python2.x and python3.x +# import unquote from urllib for python2.x and python3.x try: from urllib import unquote -except Exception as e: +except ImportError: from urllib.parse import unquote # Async Constants @@ -476,8 +476,6 @@ def poll(trans_id): status, result = conn.poll() if status == ASYNC_OK: status = 'Success' - if 'primary_keys' in session_obj: - primary_keys = session_obj['primary_keys'] rows_affected = conn.rows_affected() # if transaction object is instance of QueryToolCommand @@ -500,11 +498,10 @@ def poll(trans_id): status = 'NotConnected' result = error_msg - """ - Procedure/Function output may comes in the form of Notices from the - database server, so we need to append those outputs with the - original result. - """ + # Procedure/Function output may comes in the form of Notices from the + # database server, so we need to append those outputs with the + # original result. + if status == 'Success' and result is None: result = conn.status_message() messages = conn.messages() @@ -549,31 +546,26 @@ def fetch_pg_types(trans_id): status, error_msg, conn, trans_obj, session_obj = check_transaction_status(trans_id) if status and conn is not None \ and trans_obj is not None and session_obj is not None: - - # List of oid for which we need type name from pg_type - oid = '' res = {} if 'columns_info' in session_obj \ and session_obj['columns_info'] is not None: - for col in session_obj['columns_info']: - type_obj = session_obj['columns_info'][col] - oid += str(type_obj['type_code']) + ',' - - # Remove extra comma - oid = oid[:-1] - status, res = conn.execute_dict( - """SELECT oid, format_type(oid,null) as typname FROM pg_type WHERE oid IN ({0}) ORDER BY oid; -""".format(oid)) - - if status: - # iterate through pg_types and update the type name in session object - for record in res['rows']: - for col in session_obj['columns_info']: - type_obj = session_obj['columns_info'][col] - if type_obj['type_code'] == record['oid']: - type_obj['type_name'] = record['typname'] - - update_session_grid_transaction(trans_id, session_obj) + + oids = [session_obj['columns_info'][col]['type_code'] for col in session_obj['columns_info']] + + if oids: + status, res = conn.execute_dict( + u"""SELECT oid, format_type(oid,null) as typname FROM pg_type WHERE oid IN %s ORDER BY oid; +""", [tuple(oids)]) + + if status: + # iterate through pg_types and update the type name in session object + for record in res['rows']: + for col in session_obj['columns_info']: + type_obj = session_obj['columns_info'][col] + if type_obj['type_code'] == record['oid']: + type_obj['type_name'] = record['typname'] + + update_session_grid_transaction(trans_id, session_obj) else: status = False res = error_msg @@ -604,8 +596,10 @@ def save(trans_id): # If there is no primary key found then return from the function. if len(session_obj['primary_keys']) <= 0 or len(changed_data) <= 0: return make_json_response( - data={'status': False, - 'result': gettext('No primary key found for this object, so unable to save records.')} + data={ + 'status': False, + 'result': gettext('No primary key found for this object, so unable to save records.') + } ) status, res, query_res, _rowid = trans_obj.save(changed_data) @@ -615,11 +609,13 @@ def save(trans_id): query_res = None return make_json_response( - data={ 'status': status, - 'result': res, - 'query_result': query_res, - '_rowid': _rowid } - ) + data={ + 'status': status, + 'result': res, + 'query_result': query_res, + '_rowid': _rowid + } + ) @blueprint.route('/filter/get/<int:trans_id>', methods=["GET"])
-- Sent via pgadmin-hackers mailing list (pgadmin-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgadmin-hackers