diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py index 9e021464b..95e58b620 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py @@ -195,7 +195,9 @@ class SynonymView(PGChildNodeView): ) # we will set template path for sql scripts - self.template_path = 'synonym/sql/9.1_plus' + self.template_path = 'synonym/sql/' + self.template_path += '9.5_plus' if self.manager.version >= 90500 \ + else '9.1_plus' return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/js/synonym.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/js/synonym.js index c0de43420..fadc95afe 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/js/synonym.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/js/synonym.js @@ -90,91 +90,89 @@ function($, _, S, pgAdmin, pgBrowser, alertify) { disabled: true , control: 'node-list-by-name', node: 'schema' },{ - type: 'nested', control: 'fieldset', label: '{{ _('Definition') }}', - schema:[{ - id: 'targettype', label:'{{ _('Target Type') }}', cell: 'string', - disabled: 'inSchema', group: '{{ _('Definition') }}', - select2: { width: "50%", allowClear: false }, - options: function(obj) { - return [ - {label: "Table", value: "r"}, - {label: "Sequence", value: "S"}, - {label: "View", value: "v"}, - {label: "Function", value: "f"}, - {label: "Procedure", value: "p"}, - {label: "Public Synonym", value: "s"} - ] - }, - control: 'select2' - },{ - id: 'synobjschema', label:'{{ _('Target Schema') }}', cell: 'string', - type: 'text', mode: ['properties', 'create', 'edit'], - group: '{{ _('Definition') }}', deps: ['targettype'], - select2: { allowClear: false }, control: 'node-list-by-name', - node: 'schema', filter: function(d) { - // Exclude PPAS catalogs - var exclude_catalogs = ['pg_catalog', 'sys', 'dbo', - 'pgagent', 'information_schema', - 'dbms_job_procedure']; - return d && _.indexOf(exclude_catalogs, d.label) == -1; - }, - disabled: function(m) { - // If tagetType is synonym then disable it - if(!m.inSchema.apply(this, [m])) { - var is_synonym = (m.get('targettype') == 's'); - if(is_synonym) { - m.set('synobjschema', 'public', {silent: true}); - return true; - } else { - return false; - } - } - return true; - } - },{ - id: 'synobjname', label:'{{ _('Target Object') }}', cell: 'string', - type: 'text', disabled: 'inSchema', group: '{{ _('Definition') }}', - deps: ['targettype', 'synobjschema'], - control: 'node-ajax-options', - options: function(control) { - var trgTyp = control.model.get('targettype'); - var trgSchema = control.model.get('synobjschema'); - var res = []; - - var node = control.field.get('schema_node'), - _url = node.generate_url.apply( - node, [ - null, 'get_target_objects', control.field.get('node_data'), false, - control.field.get('node_info') ]); - $.ajax({ - type: 'GET', - timeout: 30000, - url: _url, - cache: false, - async: false, - data: {"trgTyp" : trgTyp, "trgSchema" : trgSchema}, - - // On success return function list from server - success: function(result) { - res = result.data; - return res; - }, - - // On failure show error appropriate error message to user - error: function(xhr, status, error) { - try { - var err = $.parseJSON(xhr.responseText); - if (err.success == 0) { - alertify.error(err.errormsg); - } - } catch (e) {} - } - }); - return res; - } - }] + id: 'targettype', label:'{{ _('Target type') }}', cell: 'string', + disabled: 'inSchema', group: '{{ _('Definition') }}', + select2: { width: "50%", allowClear: false }, + options: function(obj) { + return [ + {label: "Table", value: "r"}, + {label: "Sequence", value: "S"}, + {label: "View", value: "v"}, + {label: "Function", value: "f"}, + {label: "Procedure", value: "p"}, + {label: "Package", value: "P"}, + {label: "Public Synonym", value: "s"} + ] + }, + control: 'select2' },{ - id: 'is_public_synonym', label:'{{ _('Public Synonym?') }}', + id: 'synobjschema', label:'{{ _('Target schema') }}', cell: 'string', + type: 'text', mode: ['properties', 'create', 'edit'], + group: '{{ _('Definition') }}', deps: ['targettype'], + select2: { allowClear: false }, control: 'node-list-by-name', + node: 'schema', filter: function(d) { + // Exclude PPAS catalogs + var exclude_catalogs = ['pg_catalog', 'sys', 'dbo', + 'pgagent', 'information_schema', + 'dbms_job_procedure']; + return d && _.indexOf(exclude_catalogs, d.label) == -1; + }, + disabled: function(m) { + // If tagetType is synonym then disable it + if(!m.inSchema.apply(this, [m])) { + var is_synonym = (m.get('targettype') == 's'); + if(is_synonym) { + m.set('synobjschema', 'public', {silent: true}); + return true; + } else { + return false; + } + } + return true; + } + },{ + id: 'synobjname', label:'{{ _('Target object') }}', cell: 'string', + type: 'text', disabled: 'inSchema', group: '{{ _('Definition') }}', + deps: ['targettype', 'synobjschema'], + control: 'node-ajax-options', + options: function(control) { + var trgTyp = control.model.get('targettype'); + var trgSchema = control.model.get('synobjschema'); + var res = []; + + var node = control.field.get('schema_node'), + _url = node.generate_url.apply( + node, [ + null, 'get_target_objects', control.field.get('node_data'), false, + control.field.get('node_info') ]); + $.ajax({ + type: 'GET', + timeout: 30000, + url: _url, + cache: false, + async: false, + data: {"trgTyp" : trgTyp, "trgSchema" : trgSchema}, + + // On success return function list from server + success: function(result) { + res = result.data; + return res; + }, + + // On failure show error appropriate error message to user + error: function(xhr, status, error) { + try { + var err = $.parseJSON(xhr.responseText); + if (err.success == 0) { + alertify.error(err.errormsg); + } + } catch (e) {} + } + }); + return res; + } + },{ + id: 'is_public_synonym', label:'{{ _('Public synonym?') }}', disabled: true, type: 'switch', mode: ['properties'], cell: 'switch', options: { onText: 'Yes', offText: 'No', onColor: 'success', offColor: 'primary', size: 'mini'} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.1_plus/get_oid.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.1_plus/get_oid.sql deleted file mode 100644 index 0abdfe6dc..000000000 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.1_plus/get_oid.sql +++ /dev/null @@ -1,8 +0,0 @@ -{# Below will provide oid for newly created collation #} -{% if data %} -SELECT c.oid -FROM pg_collation c, pg_namespace n -WHERE c.collnamespace=n.oid AND - n.nspname = {{ data.schema|qtLiteral }} AND - c.collname = {{ data.name|qtLiteral }} -{% endif %} \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/create.sql new file mode 100644 index 000000000..33c24f350 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/create.sql @@ -0,0 +1,21 @@ +{% set is_public = False %} +{% if data.schema == 'public' %} +{% set is_public = True %} +{% endif %} +{% if comment %} +-- {% if is_public %}Public{% else %}Private{% endif %} synonym: {% if is_public %}{{ conn|qtIdent(data.name) }}; +{% else %}{{ conn|qtIdent(data.schema, data.name) }}; +{% endif %} + +-- DROP {% if is_public %}PUBLIC {% endif %}SYNONYM {% if is_public %}{{ conn|qtIdent(data.name) }}; +{% else %}{{ conn|qtIdent(data.schema, data.name) }}; +{% endif %} + +{% endif %} +CREATE OR REPLACE {% if is_public %} +PUBLIC SYNONYM {{ conn|qtIdent(data.name) }} +{% else %} +SYNONYM {{ conn|qtIdent(data.schema, data.name) }} +{% endif %} + FOR {{ conn|qtIdent(data.synobjschema, data.synobjname) }}; + diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/delete.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/delete.sql new file mode 100644 index 000000000..f6976976e --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/delete.sql @@ -0,0 +1,8 @@ +{% set is_public = False %} +{% if data.schema == 'public' %} +{% set is_public = True %} +{% endif %} +DROP {% if is_public %} +PUBLIC SYNONYM {{ conn|qtIdent(data.name) }}{% else %} +SYNONYM {{ conn|qtIdent(data.schema, data.name) }} +{% endif %}; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/get_objects.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/get_objects.sql new file mode 100644 index 000000000..0ae7aec79 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/get_objects.sql @@ -0,0 +1,56 @@ +{###########################################} +{### If Target Type is Function ###} +{###########################################} +{% if trgTyp == 'f' %} +SELECT DISTINCT proname AS name + FROM pg_proc p, pg_namespace n +WHERE p.pronamespace = n.oid AND + n.nspname = {{ trgSchema|qtLiteral }} AND + p.protype = '0' +ORDER BY proname; +{###########################################} +{### If Target Type is Procedure ###} +{###########################################} +{% elif trgTyp == 'p' %} +SELECT DISTINCT proname AS name + FROM pg_proc p, pg_namespace n +WHERE p.pronamespace = n.oid AND + n.nspname = {{ trgSchema|qtLiteral }} AND + p.protype = '1' +ORDER BY proname; +{###########################################} +{### If Target Type is Synonym ###} +{###########################################} +{% elif trgTyp == 's' %} +SELECT synname AS name + FROM pg_synonym +ORDER BY synname; +{###########################################} +{### If Target Type is Package ###} +{###########################################} +{% elif trgTyp == 'P' %} +SELECT nspname AS name + FROM pg_namespace +WHERE nspparent IN ( + SELECT oid + FROM pg_namespace + WHERE nspname = {{ trgSchema|qtLiteral }} LIMIT 1 + ) + AND nspobjecttype = 0 +ORDER BY nspname; +{% else %} +{###################################################} +{### If Target Type is Table/View/M.View/Sequnce ###} +{###################################################} +SELECT relname AS name + FROM pg_class c, pg_namespace n +WHERE c.relnamespace = n.oid AND + n.nspname = {{ trgSchema|qtLiteral }} AND +{% if trgTyp == 'v' %} +{# If view is select then we need to fetch both view and materialized view #} + (c.relkind = 'v' OR c.relkind = 'm') +{% else %} + c.relkind = {{ trgTyp|qtLiteral }} +{% endif %} +ORDER BY relname; +{% endif %} \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/nodes.sql new file mode 100644 index 000000000..1f8259b4a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/nodes.sql @@ -0,0 +1,5 @@ +SELECT synname as name +FROM pg_synonym s + JOIN pg_namespace ns ON s.synnamespace = ns.oid + AND s.synnamespace = {{scid}}::oid +ORDER BY synname; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/properties.sql new file mode 100644 index 000000000..ec2724a0a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/properties.sql @@ -0,0 +1,31 @@ +SELECT synname AS name, pg_get_userbyid(synowner) AS owner, + synobjschema, synobjname, ns.nspname as schema, + COALESCE( + (SELECT relkind + FROM pg_class c, pg_namespace n + WHERE c.relnamespace = n.oid + AND n.nspname = synobjschema + AND c.relname = synobjname), + -- For Function/Procedure + (SELECT CASE WHEN p.protype = '0' THEN 'f'::"char" ELSE 'p'::"char" END + FROM pg_proc p, pg_namespace n + WHERE p.pronamespace = n.oid + AND n.nspname = synobjschema + AND p.proname = synobjname LIMIT 1), + -- For Package + (SELECT CASE WHEN count(*) > 0 THEN 'P'::"char" END + FROM pg_namespace + WHERE nspparent IN (SELECT oid + FROM pg_namespace + WHERE nspname = synobjschema LIMIT 1) + AND nspname = synobjname + AND nspobjecttype = 0), + -- Default s = Synonym + 's') AS targettype, + CASE WHEN ns.nspname = 'public' THEN true ELSE false END AS is_public_synonym +FROM pg_synonym s JOIN pg_namespace ns ON s.synnamespace = ns.oid + WHERE s.synnamespace={{scid}}::oid + {% if syid %} + AND s.synname={{ syid|qtLiteral }} + {% endif %} +ORDER BY synname; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/update.sql new file mode 100644 index 000000000..de91b9413 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonym/sql/9.5_plus/update.sql @@ -0,0 +1,10 @@ +{% set is_public = False %} +{% if o_data.schema == 'public' %} +{% set is_public = True %} +{% endif %} +CREATE OR REPLACE {% if is_public %} +PUBLIC SYNONYM {{ conn|qtIdent(o_data.name) }} +{% else %} +SYNONYM {{ conn|qtIdent(o_data.schema, o_data.name) }} +{% endif %} + FOR {{ conn|qtIdent(data.synobjschema, data.synobjname) }}; \ No newline at end of file