Skip to content

Commit 9ba60ae

Browse files
authored
Akamath46297/scripting/functions (microsoft#82)
* Initial scripting changes for functions * Additional changes * Fixed comments
1 parent 4e5ca05 commit 9ba60ae

File tree

39 files changed

+457
-96
lines changed

39 files changed

+457
-96
lines changed

pgsmo/objects/functions/function_base.py

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,16 @@
77
from typing import Optional
88

99
import pgsmo.objects.node_object as node
10+
import pgsmo.utils.querying as querying
11+
import pgsmo.utils.templating as templating
1012
from pgsmo.objects.server import server as s # noqa
1113

1214

1315
class FunctionBase(node.NodeObject, metaclass=ABCMeta):
1416
"""Base class for Functions. Provides basic properties for all Function types"""
1517

18+
MACRO_ROOT = templating.get_template_root(__file__, 'macros')
19+
1620
@classmethod
1721
def _from_node_query(cls, server: 's.Server', parent: node.NodeObject, **kwargs) -> 'FunctionBase':
1822
"""
@@ -45,6 +49,15 @@ def __init__(self, server: 's.Server', parent: node.NodeObject, name: str):
4549
self._owner: Optional[str] = None
4650

4751
# PROPERTIES ###########################################################
52+
@property
53+
def extended_vars(self):
54+
template_vars = {
55+
'scid': self.parent.oid,
56+
'did': self.parent.parent.oid,
57+
'datlastsysoid': 0 # temporary until implemented
58+
}
59+
return template_vars
60+
4861
# -BASIC PROPERTIES ####################################################
4962
@property
5063
def description(self) -> Optional[str]:
@@ -57,3 +70,186 @@ def language_name(self) -> Optional[str]:
5770
@property
5871
def owner(self) -> Optional[str]:
5972
return self._owner
73+
74+
@property
75+
def arguments(self) -> Optional[list]:
76+
return self._full_properties.get("arguments")
77+
78+
@property
79+
def proretset(self):
80+
return self._full_properties.get("proretset")
81+
82+
@property
83+
def prorettypename(self):
84+
return self._full_properties.get("prorettypename")
85+
86+
@property
87+
def procost(self):
88+
return self._full_properties.get("procost")
89+
90+
@property
91+
def provolatile(self):
92+
return self._full_properties.get("provolatile")
93+
94+
@property
95+
def proleakproof(self):
96+
return self._full_properties.get("proleakproof")
97+
98+
@property
99+
def proisstrict(self):
100+
return self._full_properties.get("proisstrict")
101+
102+
@property
103+
def prosecdef(self):
104+
return self._full_properties.get("prosecdef")
105+
106+
@property
107+
def proiswindow(self):
108+
return self._full_properties.get("proiswindow")
109+
110+
@property
111+
def proparallel(self):
112+
return self._full_properties.get("proparallel")
113+
114+
@property
115+
def prorows(self):
116+
return self._full_properties.get("prorows")
117+
118+
@property
119+
def variables(self):
120+
return self._full_properties.get("variables")
121+
122+
@property
123+
def probin(self):
124+
return self._full_properties.get("probin")
125+
126+
@property
127+
def prosrc_c(self):
128+
return self._full_properties.get("prosrc_c")
129+
130+
@property
131+
def prosrc(self):
132+
return self._full_properties.get("prosrc")
133+
134+
@property
135+
def func_args_without(self):
136+
return self._full_properties.get("func_args_without")
137+
138+
@property
139+
def acl(self):
140+
return self._full_properties.get("acl")
141+
142+
@property
143+
def seclabels(self):
144+
return self._full_properties.get("seclabels")
145+
146+
@property
147+
def change_func(self):
148+
return self._full_properties.get("change_func")
149+
150+
@property
151+
def merged_variables(self):
152+
return self._full_properties.get("merged_variables")
153+
154+
@property
155+
def cascade(self):
156+
return self._full_properties.get("cascade")
157+
158+
# SCRIPTING METHODS ##############################################################
159+
def create_script(self, connection: querying.ServerConnection) -> str:
160+
""" Function to retrieve create scripts for a functions """
161+
data = self._create_query_data()
162+
query_file = "create.sql"
163+
return self._get_template(connection, query_file, data, paths_to_add=[self.MACRO_ROOT])
164+
165+
def delete_script(self, connection: querying.ServerConnection) -> str:
166+
""" Function to retrieve delete scripts for a functions"""
167+
data = self._delete_query_data()
168+
query_file = "delete.sql"
169+
return self._get_template(connection, query_file, data)
170+
171+
def update_script(self, connection: querying.ServerConnection) -> str:
172+
""" Function to retrieve update scripts for a functions"""
173+
data = self._update_query_data()
174+
query_file = "update.sql"
175+
return self._get_template(connection, query_file, data, paths_to_add=[self.MACRO_ROOT])
176+
177+
def _create_query_data(self) -> dict:
178+
""" Provides data input for create script """
179+
data = {"data": {
180+
"name": self.name,
181+
"pronamespace": self.parent.name,
182+
"arguments": self.arguments,
183+
"proretset": self.proretset,
184+
"prorettypename": self.prorettypename,
185+
"lanname": self.language_name,
186+
"procost": self.procost,
187+
"provolatile": self.provolatile,
188+
"proleakproof": self.proleakproof,
189+
"proisstrict": self.proisstrict,
190+
"prosecdef": self.prosecdef,
191+
"proiswindow": self.proiswindow,
192+
"proparallel": self.proparallel,
193+
"prorows": self.prorows,
194+
"variables": self.variables,
195+
"probin": self.probin,
196+
"prosrc_c": self.prosrc_c,
197+
"prosrc": self.prosrc,
198+
"funcowner": self.owner,
199+
"func_args_without": self.func_args_without,
200+
"description": self.description,
201+
"acl": self.acl,
202+
"seclabels": self.seclabels
203+
}}
204+
return data
205+
206+
def _delete_query_data(self) -> dict:
207+
""" Provides data input for delete script """
208+
data = {
209+
"scid": self.parent.oid,
210+
"fnid": self.oid,
211+
"cascade": self.cascade,
212+
}
213+
return data
214+
215+
def _update_query_data(self) -> dict:
216+
""" Function that returns data for update script """
217+
data = {
218+
"data": {
219+
"name": self.name,
220+
"pronamespace": self.parent.name,
221+
"arguments": self.arguments,
222+
"lanname": self.language_name,
223+
"procost": self.procost,
224+
"provolatile": self.provolatile,
225+
"proisstrict": self.proisstrict,
226+
"prosecdef": self.prosecdef,
227+
"proiswindow": self.proiswindow,
228+
"prorows": self.prorows,
229+
"variables": self.variables,
230+
"probin": self.probin,
231+
"prosrc": self.prosrc,
232+
"funcowner": self.owner,
233+
"description": self.description,
234+
"acl": self.acl,
235+
"seclabels": self.seclabels,
236+
"change_func": self.change_func,
237+
"merged_variables": self.merged_variables
238+
},
239+
"o_data": {
240+
"name": "",
241+
"pronamespace": "",
242+
"proargtypenames": "",
243+
"lanname": "",
244+
"provolatile": "",
245+
"proisstrict": "",
246+
"prosecdef": "",
247+
"proiswindow": "",
248+
"procost": "",
249+
"prorows": "",
250+
"probin": "",
251+
"prosrc_c": "",
252+
"prosrc": ""
253+
}
254+
}
255+
return data
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{##############################################}
2+
{# Macros for Privileges (functions module) #}
3+
{##############################################}
4+
{% macro SET(conn, type, role, param, privs, with_grant_privs, schema, func_args) -%}
5+
{% if privs %}
6+
GRANT {{ privs|join(', ') }} ON {{ type }} {{ conn|qtIdent(schema, param) }}({{func_args}}) TO {{role }};
7+
{% endif %}
8+
{% if with_grant_privs %}
9+
GRANT {{ with_grant_privs|join(', ') }} ON {{ type }} {{ conn|qtIdent(schema, param) }}({{func_args}}) TO {{ role }} WITH GRANT OPTION;
10+
{% endif %}
11+
{%- endmacro %}
12+
{% macro UNSETALL(conn, type, role, param, schema, func_args) -%}
13+
REVOKE ALL ON {{ type }} {{ conn|qtIdent(schema, param) }}({{func_args}}) FROM {{role }};
14+
{%- endmacro %}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{#################################################}
2+
{# Macros for Security Labels (functions module) #}
3+
{#################################################}
4+
{% macro SET(conn, type, name, provider, label, schema, func_args) -%}
5+
SECURITY LABEL{% if provider and provider != '' %} FOR {{ conn|qtIdent(provider) }}{% endif %} ON {{ type }} {{ conn|qtIdent(schema, name) }}({{func_args}}) IS {{ label|qtLiteral }};
6+
{%- endmacro %}
7+
{% macro UNSET(conn, type, name, provider, schema, func_args) -%}
8+
SECURITY LABEL FOR {{ provider }} ON {{ type }} {{ conn|qtIdent(schema, name) }}({{func_args}}) IS NULL;
9+
{%- endmacro %}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{################################################}
2+
{# Macros for Variables (functions module) #}
3+
{################################################}
4+
{% macro SET(conn, object_type, object_name, options, schema, func_args) -%}
5+
6+
{% for opt in options %}
7+
ALTER {{object_type}} {{ conn|qtIdent(schema, object_name) }}({{func_args}})
8+
SET {{ conn|qtIdent(opt.name) }}={{ opt.value|qtLiteral }};
9+
10+
{% endfor %}
11+
{%- endmacro %}
12+
{% macro UNSET(conn, object_type, object_name, options, schema, func_args) -%}
13+
14+
{% for opt in options %}
15+
ALTER {{object_type}} {{ conn|qtIdent(schema, object_name) }}({{func_args}})
16+
RESET {{ conn|qtIdent(opt.name) }};
17+
18+
{% endfor %}
19+
{%- endmacro %}

pgsmo/objects/functions/templates_functions/pg/+default/create.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
# Copyright (C) 2013 - 2017, The pgAdmin Development Team
55
# This software is released under the PostgreSQL Licence
66
#}
7-
{% import 'macros/functions/security.macros' as SECLABEL %}
8-
{% import 'macros/functions/privilege.macros' as PRIVILEGE %}
9-
{% import 'macros/functions/variable.macros' as VARIABLE %}
7+
{% import 'security.macros' as SECLABEL %}
8+
{% import 'privilege.macros' as PRIVILEGE %}
9+
{% import 'variable.macros' as VARIABLE %}
1010
{% set is_columns = [] %}
1111
{% if data %}
1212
{% if query_for == 'sql_panel' and func_def is defined %}

pgsmo/objects/functions/templates_functions/pg/+default/update.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
# Copyright (C) 2013 - 2017, The pgAdmin Development Team
55
# This software is released under the PostgreSQL Licence
66
#}
7-
{% import 'macros/functions/security.macros' as SECLABEL %}
8-
{% import 'macros/functions/privilege.macros' as PRIVILEGE %}
9-
{% import 'macros/functions/variable.macros' as VARIABLE %}{% if data %}
7+
{% import 'security.macros' as SECLABEL %}
8+
{% import 'privilege.macros' as PRIVILEGE %}
9+
{% import 'variable.macros' as VARIABLE %}{% if data %}
1010
{% set name = o_data.name %}
1111
{% if data.name %}
1212
{% if data.name != o_data.name %}

pgsmo/objects/functions/templates_functions/pg/9.2_plus/create.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
# Copyright (C) 2013 - 2017, The pgAdmin Development Team
55
# This software is released under the PostgreSQL Licence
66
#}
7-
{% import 'macros/functions/security.macros' as SECLABEL %}
8-
{% import 'macros/functions/privilege.macros' as PRIVILEGE %}
9-
{% import 'macros/functions/variable.macros' as VARIABLE %}
7+
{% import 'security.macros' as SECLABEL %}
8+
{% import 'privilege.macros' as PRIVILEGE %}
9+
{% import 'variable.macros' as VARIABLE %}
1010
{% set is_columns = [] %}
1111
{% if data %}
1212
{% if query_for == 'sql_panel' and func_def is defined %}

pgsmo/objects/functions/templates_functions/pg/9.2_plus/update.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
# Copyright (C) 2013 - 2017, The pgAdmin Development Team
55
# This software is released under the PostgreSQL Licence
66
#}
7-
{% import 'macros/functions/security.macros' as SECLABEL %}
8-
{% import 'macros/functions/privilege.macros' as PRIVILEGE %}
9-
{% import 'macros/functions/variable.macros' as VARIABLE %}{% if data %}
7+
{% import 'security.macros' as SECLABEL %}
8+
{% import 'privilege.macros' as PRIVILEGE %}
9+
{% import 'variable.macros' as VARIABLE %}{% if data %}
1010
{% set name = o_data.name %}
1111
{% if data.name %}
1212
{% if data.name != o_data.name %}

pgsmo/objects/functions/templates_functions/pg/9.5_plus/create.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
# Copyright (C) 2013 - 2017, The pgAdmin Development Team
55
# This software is released under the PostgreSQL Licence
66
#}
7-
{% import 'macros/functions/security.macros' as SECLABEL %}
8-
{% import 'macros/functions/privilege.macros' as PRIVILEGE %}
9-
{% import 'macros/functions/variable.macros' as VARIABLE %}
7+
{% import 'security.macros' as SECLABEL %}
8+
{% import 'privilege.macros' as PRIVILEGE %}
9+
{% import 'variable.macros' as VARIABLE %}
1010
{% set is_columns = [] %}
1111
{% if data %}
1212
{% if query_for == 'sql_panel' and func_def is defined %}

pgsmo/objects/functions/templates_functions/pg/9.5_plus/update.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
# Copyright (C) 2013 - 2017, The pgAdmin Development Team
55
# This software is released under the PostgreSQL Licence
66
#}
7-
{% import 'macros/functions/security.macros' as SECLABEL %}
8-
{% import 'macros/functions/privilege.macros' as PRIVILEGE %}
9-
{% import 'macros/functions/variable.macros' as VARIABLE %}{% if data %}
7+
{% import 'security.macros' as SECLABEL %}
8+
{% import 'privilege.macros' as PRIVILEGE %}
9+
{% import 'variable.macros' as VARIABLE %}{% if data %}
1010
{% set name = o_data.name %}
1111
{% if data.name %}
1212
{% if data.name != o_data.name %}

0 commit comments

Comments
 (0)