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 fbaad8d79..de8d66f66 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 @@ -164,7 +164,9 @@ def check_precondition(f): # Here args[0] will hold self & kwargs will hold gid,sid,did self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( + pg_driver = get_driver(PG_DEFAULT_DRIVER) + self.qtIdent = pg_driver.qtIdent + self.manager = pg_driver.connection_manager( kwargs['sid'] ) self.conn = self.manager.connection(did=kwargs['did']) @@ -183,6 +185,12 @@ def check_precondition(f): self.pg_template_path(self.manager.version) ) + ver = self.manager.version + if ver >= 90200: + self.column_template_path = 'column/sql/9.2_plus' + else: + self.column_template_path = 'column/sql/9.1_plus' + return f(*args, **kwargs) return wrap @@ -232,6 +240,15 @@ class ViewNode(PGChildNodeView, VacuumSettings): - This function will generate sql to show it in sql pane for the view node. + * refresh_data(gid, sid, did, scid, vid): + - This function will refresh view object + + * select_sql(gid, sid, did, scid, vid): + - Returns select sql for Object + + * insert_sql(gid, sid, did, scid, vid): + - Returns INSERT Script sql for the object + * dependency(gid, sid, did, scid): - This function will generate dependency list show it in dependency pane for the selected view node. @@ -271,6 +288,8 @@ class ViewNode(PGChildNodeView, VacuumSettings): 'module.js': [{}, {}, {'get': 'module_js'}], 'configs': [{'get': 'configs'}], 'get_tblspc': [{'get': 'get_tblspc'}, {'get': 'get_tblspc'}], + 'select_sql': [{'get': 'select_sql'}, {'get': 'select_sql'}], + 'insert_sql': [{'get': 'insert_sql'}, {'get': 'insert_sql'}], 'get_table_vacuum': [ {'get': 'get_table_vacuum'}, {'get': 'get_table_vacuum'}], @@ -848,6 +867,8 @@ class ViewNode(PGChildNodeView, VacuumSettings): generate their sql and render into sql tab """ + from pgadmin.browser.server_groups.servers.databases.schemas.utils \ + import trigger_definition # Define template path self.trigger_temp_path = 'trigger' @@ -1047,6 +1068,124 @@ class ViewNode(PGChildNodeView, VacuumSettings): status=200 ) + @check_precondition + def select_sql(self, gid, sid, did, scid, vid): + """ + SELECT script sql for the object + + Args: + gid: Server Group Id + sid: Server Id + did: Database Id + scid: Schema Id + vid: View Id + + Returns: + SELECT Script sql for the object + """ + SQL = render_template( + "/".join([ + self.template_path, 'sql/properties.sql' + ]), + scid=scid, vid=vid, + datlastsysoid=self.datlastsysoid + ) + status, res = self.conn.execute_dict(SQL) + if not status: + return internal_server_error(errormsg=res) + data_view = res['rows'][0] + + SQL = render_template( + "/".join([ + self.column_template_path, 'properties.sql' + ]), + scid=scid, tid=vid, + datlastsysoid=self.datlastsysoid + ) + status, data = self.conn.execute_dict(SQL) + if not status: + return internal_server_error(errormsg=res) + + columns = [] + + # Now we have all list of columns which we need + data = data['rows'] + for c in data: + columns.append(self.qtIdent(self.conn, c['name'])) + + if len(columns) > 0: + columns = ", ".join(columns) + else: + columns = '*' + + sql = "SELECT {0}\n\tFROM {1};".format( + columns, + self.qtIdent(self.conn, data_view['schema'], data_view['name']) + ) + + return ajax_response(response=sql) + + @check_precondition + def insert_sql(self, gid, sid, did, scid, vid): + """ + INSERT script sql for the object + + Args: + gid: Server Group Id + sid: Server Id + did: Database Id + scid: Schema Id + foid: Foreign Table Id + + Returns: + INSERT Script sql for the object + """ + SQL = render_template( + "/".join([ + self.template_path, 'sql/properties.sql' + ]), + scid=scid, vid=vid, + datlastsysoid=self.datlastsysoid + ) + status, res = self.conn.execute_dict(SQL) + if not status: + return internal_server_error(errormsg=res) + data_view = res['rows'][0] + + SQL = render_template( + "/".join([ + self.column_template_path, 'properties.sql' + ]), + scid=scid, tid=vid, + datlastsysoid=self.datlastsysoid + ) + status, data = self.conn.execute_dict(SQL) + if not status: + return internal_server_error(errormsg=data) + + columns = [] + values = [] + + # Now we have all list of columns which we need + data = data['rows'] + for c in data: + columns.append(self.qtIdent(self.conn, c['name'])) + values.append('?') + + if len(columns) > 0: + columns = ", ".join(columns) + values = ", ".join(values) + sql = "INSERT INTO {0}(\n\t{1})\n\tVALUES ({2});".format( + self.qtIdent( + self.conn, data_view['schema'], data_view['name'] + ), + columns, values + ) + else: + sql = gettext('-- Please create column(s) first...') + + return ajax_response(response=sql) + class MaterializedViewNode(ViewNode, VacuumSettings): """ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mview/js/mview.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mview/js/mview.js index 83ea88ca4..f47e5b1c6 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mview/js/mview.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mview/js/mview.js @@ -41,6 +41,7 @@ function($, _, S, pgAdmin, alertify, pgBrowser, CodeMirror) { label: '{{ _("Materialized View") }}', hasSQL: true, hasDepends: true, + hasScriptTypes: ['create', 'select'], collection_type: 'coll-mview', canDrop: pgBrowser.Nodes['schema'].canChildDrop, canDropCascade: pgBrowser.Nodes['schema'].canChildDrop, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/view/js/view.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/view/js/view.js index 1d5e2dcd3..745afb52a 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/view/js/view.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/view/js/view.js @@ -41,6 +41,7 @@ function($, _, S, pgAdmin, pgBrowser, CodeMirror) { label: '{{ _("View") }}', hasSQL: true, hasDepends: true, + hasScriptTypes: ['create', 'select', 'insert'], collection_type: 'coll-view', canDrop: pgBrowser.Nodes['schema'].canChildDrop, canDropCascade: pgBrowser.Nodes['schema'].canChildDrop,