Added support for the CREATE script for View and Materialized View, and

SELECT & INSERT support for the Materialized View Node.
pull/3/head
Surinder Kumar 2016-05-24 23:53:16 +05:30 committed by Ashesh Vashi
parent af84ba5a4f
commit 3b3cf7502b
3 changed files with 142 additions and 1 deletions
web/pgadmin/browser/server_groups/servers/databases/schemas/views
templates
mview/js
view/js

View File

@ -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):
"""

View File

@ -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,

View File

@ -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,